工程设计 -- 基于单片机的测温小时钟的实现

2012-12-18 17:08:12   最后更新: 2016-03-28 15:39:00   访问数量:954




作品是在去年十一期间为了一个名为“电子产品设计与制作”的学院任选课做的,到了今年,学院的工程设计要求要有一个单片机作品,于是又拿出了原来的作品偷懒

 

可是去年在写程序的时候忘记了写文档与完善的注释,虽然结构化很好,也有少量重要的注释,但是还是让今年重新拿起的时候有些烦恼,重新编辑了程序,增加了大量的注释,这样一目了然,当然了,毕竟已经一年多了,现在所能想起的去年那时的思路可能并不准确,有可能某些注释存在偏差,当然了,正常来讲的话不会有问题

 

 

 

 

;author: 龙泉居士 ; ;date: 2011、10、02 ; ;envoriment: uVision4 ; 共阳极数码管 ; P0为正极端,低4位控制 ; p2为负极端 ; 0 0A0H ; 1 0BBH ; 2 062H ; 3 02AH ; 4 039H ; 5 02CH ; 6 024H ; 7 0BAH ; 8 020H ; 9 028H ; 循环次数 20H ; 数码管各位数值对应的内存存储地址 ; 秒个 21H ; 秒十 22H ; 分个 23H ; 分十 24H ; 时个 25H ; 时十 26H ; 变量的宏定义 N1 EQU 30H N2 EQU 31H N3 EQU 32H ;两位整数和一位小数 TEMPER_L EQU 29H ;用于保存读出温度的低8位 TEMPER_H EQU 28H ;用于保存读出温度的高8位 FLAG1 EQU F0 ;是否检测到DS18B20标志位 DQ BIT P0.6 ;数据脚P0.7 NUM:DB 0A0H,0BBH,062H,02AH,039H,02CH,024H,0BAH,020H,028H ORG 0000H AJMP MAIN ;主函数 ;中断向量表 ORG 0003H AJMP INTZSRV ORG 000BH ;T0中断入口 AJMP TZSRV ;T0中断过程 ORG 0013H AJMP INTOSRV ORG 0002BH ;跳过地址向量区 ; 主函数 MAIN: ; 初始化 MOV TMOD,#01H MOV 20H,#14H ;初始化T0中断循环次数为14H即20次 ;初始化时间为23:26:58 MOV 21H,#08H MOV 22H,#05H MOV 23H,#06H MOV 24H,#02H MOV 25H,#03H MOV 26H,#02H SETB ET0 ;允许T0中断 SETB EX0 SETB IT0 SETB EX1 SETB IT1 SETB EA ;允许CPU中断 SETB TR0 ; 给T0寄存器置初值,使T0中断周期为50ms MOV TL0,#0B0H MOV TH0,#03CH L1: LCALL GET_TEMPER ;调用读温度子程序 acall CHANGE CALL DISPLAY ;显式时间、温度于数码管 SJMP L1 ; T0中断响应函数 TZSRV: ;给T0寄存器置初值,使T0中断周期为50ms MOV TL0,#0B0H MOV TH0,#03CH ; 如果T0已触发20次,说明延时达到1S,则更新时间内存存储区增加1S DJNZ 20H,RETURNTZ MOV 20H,#14H CALL ADDSC RETURNTZ: RETI ; INT外部响应函数 INTZSRV: CALL ADDHR RETI INTOSRV: CALL ADDMN RETI ; 显式时间、温度到数码管 DISPLAY: ;显式秒数个位 MOV P0,#01H MOV A,21H ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P2,A MOV A,#0E4H ;储存待显示数 至 A MOV P1,A ;显式秒数十位 CALL DELAYA MOV P0,#02H MOV A,22H ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P2,A MOV A,N1 ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P1,A ;显式分数个位 CALL DELAYA MOV P0,#04H MOV A,23H ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P2,A ;显式分数十位 MOV A,N2 ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR ANL A,#0DFH MOV P1,A ;显式时数个位 CALL DELAYA MOV P0,#08H MOV A,24H ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P2,A MOV A,N3 ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P1,A ;显式时数十位 CALL DELAYA MOV P0,#10H MOV A,25H ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P2,A ;显式温度 CALL DELAYA MOV P0,#20H MOV A,26H ;储存待显示数 至 A MOV DPTR,#NUM MOVC A,@A+DPTR MOV P2,A ;延时已更新显式 CALL DELAYA RET ; 为更新显式的延时函数 DELAYA: MOV R7,#0FFH L3: NOP DJNZ R7,L3 RET ; 增加1秒 ADDSC: MOV A,#01H ADD A,21H MOV 21H,A SUBB A,#0AH JNZ RETURN MOV 21H,#0 MOV A,#01H ADD A,22H MOV 22H,A SUBB A,#06H JNZ RETURN MOV 22H,#0 ; 增加1分钟 ADDMN: MOV A,#01H ADD A,23H MOV 23H,A SUBB A,#0AH JNZ RETURN MOV 23H,#0 MOV A,#01H ADD A,24H MOV 24H,A SUBB A,#06H JNZ RETURN MOV 24H,#0 ; 增加1小时 ADDHR: MOV A,#01H ADD A,25H MOV 25H,A SUBB A,#04H JZ L2 MOV A,25H SUBB A,#0AH JNZ RETURN MOV 25H,#0 MOV A,#01H ADD A,26H MOV 26H,A SJMP RETURN L2: MOV A,26H SUBB A,#02H JNZ RETURN MOV 25H,#0 MOV 26H,#0 RETURN: RET ; 温度获取函数 ; 初始化DS18B20 INIT_1820: CLR A MOV R5,A SETB DQ MOV R7,#8 MOV R6,A LCALL DELAY CLR DQ ;主机发出延时537微秒的复位低脉冲 MOV R7,#50H MOV R6,#0 LCALL DELAY SETB DQ;然后拉高数据线 MOV R7,#0EH MOV R6,#0 LCALL DELAY MOV C,DQ CLR A RLC A MOV R5,A MOV R7,#14H MOV R6,#0 LJMP DELAY ;读出转换后的温度值 GET_TEMPER: CLR A LCALL INIT_1820;先复位DS18B20 MOV R7,#0CCH ;跳过ROM匹配 LCALL WRITE_1820 MOV R7,#44H ;发出温度转换命令 LCALL WRITE_1820 ;读 LCALL INIT_1820;准备读温度前先复位 MOV R7,#0CCH ;跳过ROM匹配 LCALL WRITE_1820 MOV R7,#0BEH ;发出读温度命令 LCALL WRITE_1820 LCALL READ_18200;将读出的温度数据保存到35H/36H MOV 28H,R7 LCALL READ_18200 MOV 29H,R7 RET ;写DS18B20的子程序(有具体的时序要求) WRITE_1820: MOV R5,07H MOV R3,#8;一共8位数据 WR1: CLR DQ MOV A,R5 RRC A MOV DQ,C MOV R7,#5 MOV R6,#0 LCALL DELAY ;yf延时 SETB DQ MOV A,R5 CLR C RRC A MOV R5,A DJNZ R3,WR1 MOV R7,#04 MOV R6,#0 LJMP DELAY READ_18200: ;读DS18B20的程序,从DS18B20中读出两个字节的温度数据 CLR A MOV R3,A MOV R5,#8 RE01: CLR DQ MOV A,R3 CLR C RRC A MOV R3,A SETB DQ JNB DQ,L995 ORL 03H,#80H L995: MOV R7,#4 MOV R6,#0 LCALL DELAY DJNZ R5,RE01 MOV R7,03H MOV R6,#0H RET ; 将内存中存储的十六进制数转换为十进制 CHANGE: CLR A MOV N1,A MOV A,28H ANL A,#1000B JZ L089A MOV A,#032H ADD A,N1 MOV N1,A L089A: MOV A,028H ANL A,#0100B JZ L08A5 MOV A,#019H ADD A,N1 MOV N1,A L08A5: MOV A,028H ANL A,#0010B JZ L08B0 MOV A,#0DH ADD A,N1 MOV N1,A L08B0: MOV A,028H ANL A,#0001B JZ L08BB MOV A,#06H ADD A,N1 MOV N1,A L08BB: MOV A,N1 MOV B,#0AH DIV AB MOV N1,A MOV A,028H SWAP A ANL A,#0FH MOV 028H,A MOV A,029H SWAP A ANL A,#0F0H MOV 029H,A MOV A,028H ORL 029H,A MOV A,029H MOV B,#0AH DIV AB MOV N2,B MOV N3,A RET DELAY: MOV A,R7 DEC R7 MOV R4,06H JNZ L09D3 DEC R6 L09D3: ORL A,R4 JNZ DELAY RET END

 

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

 






技术帖      技术分享      89c52      89c51      单片机      电子工程      工程设计     


京ICP备15018585号