- ;张培
- ;本程序实现外控控数字钟
- ;功能:1.计时
- ; 2.3种显示模式
- ; 时间显示模式
- ; 月日显示模式
- ; 温度显示模式
- ;******************************************************
- ;字节单元定义
- TEMPER_L EQU 29H;用于保存读出温度的低8位
- TEMPER_H EQU 28H;用于保存读出温度的高8位
- FLAG1 EQU 38H;是否检测到DS18B20标志位
- a_bit EQU 20H;数码管个位数存放内存位置
- b_bit EQU 21H;数码管十位数存放内存位置
- PIANXUAN EQU P3 ;P3为片选口
- SHUCHU EQU P2 ;P2为输出
- MIAO EQU 30H;秒存储单元
- FEN EQU 31H;分存储单元
- SHI EQU 32H;时存储单元
- SHUZI EQU 33H;中转存储单元
- YUE EQU 34H;月存储单元
- CRI EQU 35H;日存储单元
- DAIMAZHI EQU 36H;代码存储单元
- LINGSHI EQU 37H;闹铃时存储单元
- LINGFEN EQU 50H;闹铃分存储单元
- KONGSHI EQU 39H;外部控制时存储单元
- KONGFEN EQU 61H;外部控制时存储单元
- QIEHUAN BIT 22H.0;切换标志位
- ANJIAN BIT 22H.1;按键1标志位
- ANJIAN1 BIT 22H.2;按键2标志位
- ANJIAN2 BIT 22H.3;按键3标志位
- ANJIAN3 BIT 22H.4;按键4标志位
- ANJIAN4 BIT 22H.5
- ANJIAN5 BIT 23H.2
- WENDU BIT 22H.6;温度标志位
- GONG BIT 22H.7
- C_0 BIT 23H.0;20MS的标志位
- SHANSHUO BIT 23H.1
- ;**********************************************************
- ;**************************主程序**************************
- ORG 0000H
- JMP START
- ORG 000BH
- JMP TT0
- ORG 0030H
- START: CALL CHUSHIHUA
-
- MAIN: JNB C_0,MAIN ;节拍等待
- CLR C_0
- CALL JIACHULI ;计算时间
- CALL SHJIAN_GN ;判断时间闹铃及控制功能
-
- CALL PANWENDU ;温度按键判断
- JNB WENDU,NEXT0 ;
- CALL XIANSHIWENDU ;温度标志位为1就显示温度
- JMP MAIN
-
- NEXT0:CALL PANGONGNENG ;判断功能键
- JNB GONG,NEXT1 ;没有功能键按下显示时间
- CALL CANSHU ;代码加一
- CALL XIANSHIMA ;有功能键按下,则显示功能代码
- CALL SHEZHI ;根据代码设置相应的功能
- JMP MAIN ;返回
-
- NEXT1:CALL PANANJIAN ;切换月日、时间显示
- JNB QIEHUAN,NEXT ;没有按键按下,则显示时间
- CALL XIANSHI2 ;显示月日
- JMP MAIN ;返回
- NEXT:CALL XIANSHI1 ;显示时间
- DEC 66H
- MOV A,66H
- CJNE A,#00,NEXT5
- MOV 66,#50
- CPL P2.7
- NEXT5:JMP MAIN ;返回
- ;========================设置子程序========================
- SHEZHI:MOV A,DAIMAZHI
- MOV DPTR,#TAB1
- JMP @A+DPTR
- TAB1:AJMP SUB0
- AJMP SUB1
- AJMP SUB2
- AJMP SUB3
- AJMP SUB4
- AJMP SUB5
- AJMP SUB6
- AJMP SUB7
- ;========================设置月份===========================
- SUB0:MOV SHUZI,YUE
- CALL XIANSHI3
- JB P1.3,PAN
- JB ANJIAN2,PAN
- SETB ANJIAN2
- INC YUE
- MOV R1,YUE
- CJNE R1,#13,PAN
- MOV YUE,#01
- PAN:JNB P1.3,PANJIAN1
- CLR ANJIAN2
- PANJIAN1:JB P1.4,TAIQI3
- JB ANJIAN3,TAIQI3
- SETB ANJIAN3
- DEC YUE
- MOV R1,YUE
- CJNE R1,#00,TAIQI3
- MOV YUE,#12
- TAIQI3:JNB P1.4,OUT7
- CLR ANJIAN3
- OUT7:RET
- ;=========================设置日=============================
- SUB1:MOV SHUZI,CRI
- CALL XIANSHI3
- JB P1.3,TAIQI4
- JB ANJIAN2,TAIQI4
- SETB ANJIAN2
- INC CRI
- MOV R1,CRI
- CJNE R1,#32,TAIQI4
- MOV CRI,#01
- TAIQI4:JNB P1.3,PANJIAN2
- CLR ANJIAN2
- PANJIAN2:JB P1.4,TAIQI5
- JB ANJIAN3,TAIQI5
- SETB ANJIAN3
- DEC CRI
- MOV R1,CRI
- CJNE R1,#00,TAIQI5
- MOV CRI,#32
- TAIQI5:JNB P1.4,OUT8
- CLR ANJIAN3
- OUT8:RET
- ;==========================设置分=============================
- SUB2:MOV SHUZI,FEN
- CALL XIANSHI3
- JB P1.3,TAIQI8
- JB ANJIAN2,TAIQI8
- SETB ANJIAN2
- INC FEN
- MOV R1,FEN
- CJNE R1,#60,TAIQI8
- MOV FEN,#01
- TAIQI8:JNB P1.3,PANJIAN4
- CLR ANJIAN2
- PANJIAN4:
- JB P1.4,TAIQI9
- JB ANJIAN3,TAIQI9
- SETB ANJIAN3
- DEC FEN
- MOV R1,FEN
- CJNE R1,#00,TAIQI9
- MOV FEN,#59
- TAIQI9:JNB P1.4,OUT10
- CLR ANJIAN3
- OUT10:RET
- ;==========================设置时===========================
- SUB3:MOV SHUZI,SHI
- CALL XIANSHI3
- JB P1.3,TAIQI6
- JB ANJIAN2,TAIQI6
- SETB ANJIAN2
- INC SHI
- MOV R1,SHI
- CJNE R1,#24,TAIQI6
- MOV SHI,#00
- TAIQI6:JNB P1.3,PANJIAN3
- CLR ANJIAN2
- PANJIAN3:JB P1.4,TAIQI7
- JB ANJIAN3,TAIQI7
- SETB ANJIAN3
- DEC SHI
- MOV R1,SHI
- CJNE R1,#00,TAIQI7
- MOV SHI,#23
- TAIQI7:JNB P1.4,OUT9
- CLR ANJIAN3
- OUT9:RET
- ;==========================设置闹铃时===========================
- SUB4:MOV SHUZI,LINGSHI
- CALL XIANSHI3
- JB P1.3,TAIQI10
- JB ANJIAN2,TAIQI10
- SETB ANJIAN2
- INC LINGSHI
- MOV R1,LINGSHI
- CJNE R1,#24,TAIQI10
- MOV LINGSHI,#00
- TAIQI10:JNB P1.3,PANJIAN5
- CLR ANJIAN2
- PANJIAN5:JB P1.4,TAIQI11
- JB ANJIAN3,TAIQI11
- SETB ANJIAN3
- DEC LINGSHI
- MOV R1,LINGSHI
- CJNE R1,#00,TAIQI11
- MOV LINGSHI,#23
- TAIQI11:JNB P1.4,OUT11
- CLR ANJIAN3
- OUT11:RET
- ;==========================设置闹铃分===========================
- SUB5:MOV SHUZI,LINGFEN
- CALL XIANSHI3
- JB P1.3,TAIQI12
- JB ANJIAN2,TAIQI12
- SETB ANJIAN2
- INC LINGFEN
- MOV R1,LINGFEN
- CJNE R1,#60,TAIQI12
- MOV LINGFEN,#01
- TAIQI12:JNB P1.3,PANJIAN6
- CLR ANJIAN2
- PANJIAN6:JB P1.4,TAIQI13
- JB ANJIAN3,TAIQI13
- SETB ANJIAN3
- DEC LINGFEN
- MOV R1,LINGFEN
- CJNE R1,#00,TAIQI13
- MOV LINGFEN,#59
- TAIQI13:JNB P1.4,OUT12
- CLR ANJIAN3
- OUT12:RET
- ;==========================设置控制时===========================
- SUB6:MOV SHUZI,KONGSHI
- CALL XIANSHI3
- JB P1.3,TAIQI14
- JB ANJIAN2,TAIQI14
- SETB ANJIAN2
- INC KONGSHI
- MOV R1,KONGSHI
- CJNE R1,#24,TAIQI14
- MOV KONGSHI,#00
- TAIQI14:JNB P1.3,PANJIAN7
- CLR ANJIAN2
- PANJIAN7:JB P1.4,TAIQI15
- JB ANJIAN3,TAIQI15
- SETB ANJIAN3
- DEC KONGSHI
- MOV R1,KONGSHI
- CJNE R1,#00,TAIQI15
- MOV KONGSHI,#23
- TAIQI15:JNB P1.4,OUT13
- CLR ANJIAN3
- OUT13:RET
- ;==========================设置控制分===========================
- SUB7:MOV SHUZI,KONGFEN
- CALL XIANSHI3
- JB P1.3,TAIQI16
- JB ANJIAN2,TAIQI16
- SETB ANJIAN2
- INC KONGFEN
- MOV R1,KONGFEN
- CJNE R1,#60,TAIQI16
- MOV KONGFEN,#01
- TAIQI16:JNB P1.3,PANJIAN8
- CLR ANJIAN2
- PANJIAN8:JB P1.4,TAIQI17
- JB ANJIAN3,TAIQI17
- SETB ANJIAN3
- DEC KONGFEN
- MOV R1,KONGFEN
- CJNE R1,#00,TAIQI17
- MOV KONGFEN,#59
- TAIQI17:JNB P1.4,OUT14
- CLR ANJIAN3
- OUT14:RET
- ;=======================闹铃与外部控制子程序====================
- SHJIAN_GN:MOV A,SHI
- CJNE A,LINGSHI,NEXT2
- MOV A,FEN
- CJNE A,LINGFEN,NEXT4
- SETB P1.6
- JMP NEXT2
- NEXT4:CLR P1.6
- NEXT2:MOV A,KONGSHI
- CJNE A,KONGSHI,NEXT3
- MOV A,FEN
- CJNE A,KONGFEN,NEXT3
- NEXT3:RET
- ;===============温度时间显示切换判断子程序=================
- PANWENDU:JB P1.5,TAIQI0
- JB ANJIAN4,TAIQI0
- SETB ANJIAN4
- CPL WENDU
- TAIQI0:JNB P1.5,KK
- CLR ANJIAN4
- KK:RET
- ;==========================显示3子程序==========================
- XIANSHI3:CALL JISUAN
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#04H;显示十位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- MOV A,B
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#08H;显示个位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
-
- MOV SHUCHU,#0BFH
- MOV PIANXUAN,#02H;
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- RET
- ;=======================参数键判断子程序========================
- CANSHU:JB P1.2,TAIQI2
- JB ANJIAN5,TAIQI2
- SETB ANJIAN5
- CALL DAIMA ;设置代码
- TAIQI2:JNB P1.2,OUT5
- CLR ANJIAN5
- OUT5:RET
- ;========================代码子程序=============================
- DAIMA:INC DAIMAZHI
- MOV R7,DAIMAZHI
- CJNE R7,#08,PP
- MOV DAIMAZHI,#00
- PP:RET
- ;========================显示代码===============================
- XIANSHIMA:MOV A,DAIMAZHI
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#01H
- CALL DELAY
- MOV PIANXUAN,#00
- RET
- ;=======================功能键判断子程序========================
- PANGONGNENG:JB P1.1,TAIQI1
- JB ANJIAN1,TAIQI1
- SETB ANJIAN1
- CPL GONG
- TAIQI1:JNB P1.1,OUT4
- CLR ANJIAN1
- OUT4:RET
- ;=========================按键判断子程序========================
- PANANJIAN:JB P1.0,TAIQI
- JB ANJIAN,TAIQI
- SETB ANJIAN
- CPL QIEHUAN
- TAIQI:JNB P1.0,OUT1
- CLR ANJIAN
- OUT1:RET
- ;***********************温度显示子程序*********************************
- ; 输入:
- ; 输出:
- ;实现功能:实现温度的显示
- XIANSHIWENDU:
- LCALL GET_TEMPER;调用读温度子程序
- ;进行温度显示
- ;显示范围00到99度,显示精度为1度
- ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
- ;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
- MOV A,29H
- MOV C,40H;将28H中的最低位移入C
- RRC A
- MOV C,41H
- RRC A
- MOV C,42H
- RRC A
- MOV C,43H
- RRC A
- MOV 29H,A
- LCALL DISPLAY;调用数码管显示子程序
- RET
- ; 这是DS18B20复位初始化子程序
- INIT_1820:
- SETB P3.5
- NOP
- CLR P3.5
- ;主机发出延时537微秒的复位低脉冲
- MOV R1,#3
- TSR1:
- MOV R0,#107
- DJNZ R0,$
- DJNZ R1,TSR1
- SETB P3.5;然后拉高数据线
- NOP
- NOP
- NOP
- MOV R0,#25H
- TSR2:
- JNB P3.5,TSR3;等待DS18B20回应
- DJNZ R0,TSR2
- LJMP TSR4 ; 延时
- TSR3:
- SETB FLAG1 ; 置标志位,表示DS1820存在
- LJMP TSR5
- TSR4:
- CLR FLAG1 ; 清标志位,表示DS1820不存在
- LJMP TSR7
- TSR5:
- MOV R0,#117
- TSR6:
- DJNZ R0,TSR6 ; 时序要求延时一段时间
- TSR7:
- SETB P3.5
- RET
- ; 读出转换后的温度值
- GET_TEMPER:
- SETB P3.5
- LCALL INIT_1820 ;先复位DS18B20
- JB FLAG1,TSS2
- RET ; 判断DS1820是否存在,若DS18B20不存在则返回
- TSS2:
- MOV A,#0CCH ; 跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#44H ; 发出温度转换命令
- LCALL WRITE_1820
- ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
- LCALL DISPLAY
- LCALL INIT_1820 ;准备读温度前先复位
- MOV A,#0CCH ; 跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ; 发出读温度命令
- LCALL WRITE_1820
- LCALL READ_18200 ; 将读出的温度数据保存到35H/36H
- RET
- ;写DS18B20的子程序(有具体的时序要求)
- WRITE_1820:
- MOV R2,#8;一共8位数据
- CLR C
- WR1:
- CLR P3.5
- MOV R3,#6
- DJNZ R3,$
- RRC A
- MOV P3.5,C
- MOV R3,#23
- DJNZ R3,$
- SETB P3.5
- NOP
- DJNZ R2,WR1
- SETB P3.5
- RET
- ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
- READ_18200:
- MOV R0,#2 ; 将温度高位和低位从DS18B20中读出
- MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
- RE00:
- MOV R2,#8;数据一共有8位
- RE01:
- CLR C
- SETB P3.5
- NOP
- NOP
- CLR P3.5
- NOP
- NOP
- NOP
- SETB P3.5
- MOV R3,#9
- RE10:
- DJNZ R3,RE10
- MOV C,P3.5
- MOV R3,#23
- RE20:
- DJNZ R3,RE20
- RRC A
- DJNZ R2,RE01
- MOV @R1,A
- DEC R1
- DJNZ R0,RE00
- RET
- ;**********************显示子程序*****************************
- display:
- mov a,29H ;将29H中的十六进制数转换成10进制
- mov b,#10 ;10进制/10=10进制
- div ab
- mov b_bit,a ;十位在a
- mov a_bit,b ;个位在b
- mov dptr,#numtab ;指定查表启始地址
- mov r0,#8
- dpl1:
- mov r1,#255 ;显示1000次
- dplop:
- mov a,a_bit ;取个位数
- MOVC A,@A+DPTR ;查个位数的7段代码
- mov p2,a ;送出个位的7段代码
-
- SETB p3.3 ;开个位显示
- acall d1ms ;显示1ms
- CLR p3.3
- mov a,b_bit ;取十位数
- MOVC A,@A+DPTR ;查十位数的7段代码
- mov p2,a ;送出十位的7段代码
- SETB p3.2 ;开十位显示
- acall d1ms ;显示1ms
- CLR p3.2
- djnz r1,dplop ;250次没完循环
- djnz r0,dpl1 ;4个250次没完循环
- ret
- ;*************************延时子程序***************************
- ; 输入:
- ; 输出:
- ;实现功能:1MS延时(按12MHZ算)
- ;**************************************************************
- D1MS:
- MOV R7,#80
- DJNZ R7,$
- RET
- ;************************查表代码*******************************
- numtab:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- ;************************显示时分子程序*************************
- ; 输入:FEN,YUE
- ; 输出:A
- ;实现功能:实现时分的显示
-
- XIANSHI1:
- MOV SHUZI,FEN
- CALL JISUAN
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#04H;显示分的十位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- MOV A,B
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#08H;显示分的个位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- MOV SHUZI,SHI
- CALL JISUAN
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#01H;显示时的十位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- MOV A,B
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#02H;显示时的个位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- RET
- ;************************显示月日子程序*************************
- ; 输入:CRI,YUE
- ; 输出:A
- ;实现功能:实现月日的显示
- XIANSHI2:
- MOV SHUZI,CRI
- CALL JISUAN
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#04H;显示日的十位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- MOV A,B
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#08H;显示日的个位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
-
- MOV SHUZI,YUE
- CALL JISUAN
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#01H;显示月的十位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- MOV A,B
- MOVC A,@A+DPTR
- MOV SHUCHU,A
- MOV PIANXUAN,#02H;显示月的个位
- CALL DELAY
- MOV PIANXUAN,#00H;关片选
- RET
- JIACHULI:
- DJNZ R4,OUT3;判断是否到一秒
- MOV R4,#50
- INC MIAO ;到一秒后秒位加1
- MOV R7,MIAO
- CJNE R7,#60,OUT3;判断是否到60秒
- MOV MIAO,#00
- INC FEN
- MOV R7,FEN
- CJNE R7,#60,OUT3;判断是否到60分
- MOV FEN,#00
- INC SHI
- MOV R7,SHI
- CJNE R7,#24,OUT3;判断是否都24小时
- MOV SHI,#00
- INC CRI;到24小时后把日加一
- MOV R7,CRI
- MOV R4,YUE
- CJNE R4,#01,JIXU1
- CJNE R7,#32,OUT3
- INC YUE
- MOV CRI,#00
- OUT3:JMP OUT2
- JIXU1:CJNE R4,#02,JIXU2
- CJNE R7,#29,OUT3
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU2:CJNE R4,#03,JIXU3
- CJNE R7,#32,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU3:CJNE R4,#04,JIXU4
- CJNE R7,#31,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU4:CJNE R4,#05,JIXU5
- CJNE R7,#32,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU5:CJNE R4,#06,JIXU6
- CJNE R7,#31,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU6:CJNE R4,#07,JIXU7
- CJNE R7,#32,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU7:CJNE R4,#08,JIXU8
- CJNE R7,#32,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU8:CJNE R4,#09,JIXU9
- CJNE R7,#31,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU9:CJNE R4,#10,JIXU10
- CJNE R7,#32,OUT2
- INC YUE
- JMP OUT2
- JIXU10:CJNE R4,#11,JIXU11
- CJNE R7,#31,OUT2
- INC YUE
- MOV CRI,#00
- JMP OUT2
- JIXU11:CJNE R4,#12,OUT2
- CJNE R7,#32,OUT2
- MOV YUE,#01
- MOV CRI,#00
- OUT2:RET
- ;**********************初始化子程序*************************
- CHUSHIHUA:MOV SP,#7FH
- MOV TMOD,#01H;T0工作方式1
- MOV TH0,#0B1H;20MS的初值
- MOV TL0,#0E0H
- SETB ET0;开启中断TO
- SETB EA ;开启中断总开关
- SETB TR0;定时器溢出标志位
- CLR QIEHUAN
- CLR ANJIAN
- CLR ANJIAN1
- CLR ANJIAN2
- CLR ANJIAN3
- CLR ANJIAN4
- CLR ANJIAN5
- CLR WENDU ;显示温度标志位清0
- CLR SHANSHUO
- CLR GONG
- CLR P1.6
- SETB C_0
- MOV MIAO,#55
- MOV FEN,#59
- MOV SHI,#21
- MOV YUE,#06
- MOV CRI,#23
- MOV DAIMAZHI,#00
- MOV LINGSHI,#00
- MOV LINGFEN,#00
- MOV KONGSHI,#00
- MOV KONGFEN,#00
- MOV DPTR,#TAB
- MOV R4,#50
- MOV 66H,#50
- RET
- ;///////计算子程序///////////////////////
- ;输入:"30H"
- ;输出:"A,B"
- ;实现的功能:查A在TAB位置的数
- JISUAN:
- MOV A,SHUZI
- MOV B,#10
- DIV AB
- RET
- ;/////////////////中断到来重置初值程序/////////////////////////
- ;输入;无
- ;输出: 无
- ;实现的功能中断到来重置初值
- TT0:
- MOV TH0,#0B1H
- MOV TL0,#0E0H
- SETB C_0
- RETI
- ;//////////////////////////延时程序/////////////////////////
- ;输入;无
- ;输出: 无
- ;实现的功能:延时一段时间
- DELAY:
- MOV R5,#20H
- L8: MOV R6,#20H
- DJNZ R6,$
- DJNZ R5,L8
- RET
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- ;///////结束//////////////////////////////
- END
复制代码
|