实现日期时间温度的显示万年历_第1页
实现日期时间温度的显示万年历_第2页
实现日期时间温度的显示万年历_第3页
实现日期时间温度的显示万年历_第4页
实现日期时间温度的显示万年历_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PZU .L3刊口P3 ! rXP rauiifio en hTTE如iO PBJi r !BE酊划JOPWM .U ETPi ID F2F-i.I TsPi JP3PPi 3E.pi JAlaJi.lAiA 1.1 I3 3 A 3B 円pshfze;円a川刃豊 M H 虛口 EpnEPIDEpc冋 E毡駁宅住“ BcBECEa温度值存放单元TEMP_ZH EQU 24HTEMPL EQU 25HTEMPH EQU 26H TEMP_TH EQU 27H TEMP_TL EQU 28H TEMPHC EQU 29HTEMPLC EQU 2AH实时温度值存放单元 低温度值存放单元 高温度值存放

2、单兀 高温报警值存放单兀 低温报警值存放单元 存十位数BCD码 存个位数BCD码=按键输入弓丨脚定义 =K1EQUP3.2K2EQUP3.3K3EQUP3.6K4EQUP3.7SPK EQU P3.5RELAY EQU 2FH =DS1302通信引脚定义=RST BIT p1.6SCLK BIT p1.4IO BIT p1.5=定义数据存储地址DS1302_ADDR DATA 30H ;地址寄存器DS1302_DATA DATA 31H ;数据寄存器TIME_YEAR DATA 32H ;年寄存器TIME_MONT DATA 33H ;月寄存器TIME_DAY DATA 34H ;天寄存器WE

3、EK_DATA DATA 35H ;星期寄存器HOURDATA 36H ;小时寄存器MINTUE DATA 37H ;分钟寄存器SECOND DATA 38H ;秒钟寄存器=显示数据缓冲地址 =YEAR_HBUF DATA 40HYEAR_LBUF DATA 41HMONT_HBUFDATA42HMONT_LBUFDATA43HDAY_HBUFDATA44HDAY_LBUFDATA 45HWEEK_HBUFDATA46HWEEK_LBUFDATA47HHOUR_HBUFDATA48HHOUR LBUFDATA49HMINTUE_HBUF DATA 4AH MINTUE_LBUF DATA 4B

4、H SECOND_HBUF DATA 4CH SECOND_LBUF DATA 4DHX EQU 2FH ;LCD地址变量;LCD控制引脚RS EQU P2.4RW EQU P2.5E EQU P2.6FLAG EQU 20H.0KEY_UD EQU 20H.1DQ EQU p2.7= 主程序=MAIN:ACALL SET_LCD ;LCD初始化设置子程序ACALL SET_1302;1302初始化TOOP: ACALL RESET_1820; 调用18B20复位子程序ACALL TEMP_BJ;显示温度标记CACALL MEU_OK;调用显示OK信息子程序TOOP2:ACALL RE_TEM

5、P;调用读取温度数据子程序ACALL SET_DATA ;调用处理显示温度数据子程序ACALL TEMP_BJ;显示温度标记子程序LCALL RD_DS1302LCALL DATA_BUFLCALL DISPLAYSJMP TOOP2;循环;读取温度数据子程序;读取温度数据子程序RE_TEMP:ACALL RESET_1820 ;18B20复位子程序MOV A,#0CCH;跳过ROME配ACALL WRITE_1820 ;写入子程序MOV A,#44H;发出温度转换命令ACALL WRITE_1820 ;调写入子程序ACALL RESET_1820 ;调复位子程序MOV A,#0CCH;跳过R

6、OME配ACALL WRITE_1820 ;写入子程序MOV A,#0BEH;发出读温度命令ACALL WRITE_1820 ;写入子程序ACALL READ_1820;调用读取子程序RET;温度数据处理显示子程序SET_DATA:ACALL CONV_TEMP ;处理温度BCD码子程序ACALL DISP_BCD ;显示区BCD码温度值刷新子程序ACALL CONV;LCD显示子程序RET 处理温度BCD码子程序CONV_TEMP:MOV A,TEMPHANL A,#80HJZ TC1;CLR C;C=0MOV A,TEMPL CPL A;ADD A,#01HMOV TEMPL,AMOV A

7、,TEMPHCPL AADDC A,#00HMOV TEMPH,AJMP TC2判温度是否零下 温度零转TC1处二进制数求补(双字节)取反加1TC1: MOV TEMPHC,#0AHTC2: MOV A,TEMPHC高、低位交换乘 0.0625SWAP A;MOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;MOV DPTR,#DOTTABMOVC A,A+DPTRMOV TEMPLC,A ;TEMPLC LOW= 小数部分 BCDMOV A,TEMPL;整数部分ANL A,#0F0H;取出咼四位SWAP A;高、低位交换MOV TEMPL,AMOV A,TEMPHANL A

8、,#0FH;取出低四位SWAP A;高、低位交换ORL A,TEMPL;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0H;取出咼四位SWAP A;高、低位交换ORL A,TEMPHC;TEMPHC LOW =十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FH;取出低四位SWAP A;高、低位交换ORL A,TEMPLC;TEMPLC HI =个位数BCDMOV TEMPLC,AMOV A,R4JZ TC3ANL A,#0FH ;取出低四位SWAP A;高、低位交换MOV R4,AMOV A,TEMPHC ;T

9、EMPHC HI =百位数 BCDANL A,#0FH ;取出低四位ORL A,R4MOV TEMPHC,ATC3:RETHEX2BCD1:MOV B,#064H;十六进制- BCDDIV AB;B= A % 100MOV R4,A;R4 =百位数MOV A,#0AHXCH A,BDIV AB;B = A % BSWAP A;高、低位交换ORL A,BRET小数部分码表DOTTAB:DB 00H,00H,01H,01H,02H,03H,03H,04HDB 05H,05H,06H,06H,07H,08H,08H,09H 显示区BCD码温度值刷新子程序DISP_BCD:MOV A,TEMPLCAN

10、L A,#0FHMOV 70H,AMOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,AMOV A,TEMPHCANL A,#0FHMOV 72H,AMOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,AMOV A,TEMPHCANL A,#0F0H个位数BCD码送入A 取低位码小数位高、低位交换取结果数的高位个位取低位码十位高、低位交换取结果数的高位百位取低位码CJNE A,#010H,DI0JMP DI2DI0: MOV A,TEMPHC取低位码十位数是0ANL A,#0FHJNZ DI2;MOV A,TEMPHCSWAP AANL A,#0FHMO

11、V 73H,#0AHMOV 72H,A高、低位交换 取结果数的高位 符号位不显示 十位数显示符号DI2: RET=读 1302 子程序=RD_DS1302:MOV DS1302_ADDR,#8DH ; 读 DS1302 中的年LCALL READ ;调用读DS1302子程序MOV TIME_YEAR, DS1302_DATA ;把读出的年数据存入年寄存器中MOV DS1302_ADDR,#8BH ; 读 DS1302 中的星期LCALL READMOV WEEK_DATA, DS1302_DATA ;把读出的星期数据存入星期寄存器中MOV DS1302_ADDR,#89H ; 读 DS1302

12、 中的月LCALL READMOV TIME_MONT, DS1302_DATA ;把读出的月数据存入月寄存器中MOV DS1302_ADDR,#87H ;读 DS1302 中的天LCALL READMOV TIME_DAY, DS1302_DATA ;把读出的天数据存入天寄存器中MOV DS1302_ADDR,#85H ; 读 DS1302 中的小时LCALL READMOV HOUR, DS1302_DATA ;把读出的天数据存入小时寄存器中MOV DS1302_ADDR,#83H ; 读 DS1302 中的分钟LCALL READMOV MINTUE, DS1302_DATA ;把读出的

13、天数据存入分钟寄存器中MOV DS1302_ADDR,#81H ; 读 DS1302 中的秒钟LCALL READMOV SECOND, DS1302_DATA ;把读出的天数据存入秒钟寄存器中RET=按键子程序=数据分离后送显示缓存DATA_BUF:MOV RO,TIME_YEAR ; LCALL DIVIDE ;MOV YEAR_HBUF,R1MOV YEAR_LBUF,R2MOV RO,TIME_MONTLCALL DIVIDEMOV MONT_HBUF,R1MOV MONT_LBUF,R2MOV R0,TIME_DAY ;LCALL DIVIDEMOV DAY_HBUF,R1MOV D

14、AY_LBUF,R2MOV RO,WEEK_DATALCALL DIVIDEMOV WEEK_HBUF,R1MOV WEEK_LBUF,R2MOV R0,HOUR ;LCALL DIVIDEMOV HOUR_HBUF,R1MOV HOUR_LBUF,R2MOV R0,MINTUE ;LCALL DIVIDEMOV MINTUE_HBUF,R1MOV MINTUE_LBUF,R2MOV R0,SECOND ;LCALL DIVIDEMOV SECOND_HBUF,R1MOV SECOND_LBUF,R2 RET年数据分离,送显示缓存 调用数据分离子程序月数据分离,送显示缓存日数据分离,送显示缓存

15、星期数据分离,送显示缓存小时数据分离,送显示缓存分钟数据分离,送显示缓存秒钟数据分离,送显示缓存;=日历显示子程序=;=年显示=DISPLAY:MOV A,#10000001B ;设定年第1位的显示地址为第 1行,第1列LCALL WR_COMM ;调用写指令到液晶子程序MOV A, #32H数字2的ASCII码LCALL WR_DATA调用写数据到液晶子程序MOV A,#10000010B ;设定年第2位的显示地址为第 1行,第2列LCALL WR_COMMMOV A, #30H;数字 0 的 ASCII 码LCALL WR_DATAMOV A,#10000011B ;设定年第3位的显示地址

16、为第 1行,第3列LCALL WR_COMMMOV A, YEAR_LBUF ;年的低位缓存数据ADD A,#30H;力口 30H修正取 ASCII 码LCALL WR_DATAMOV A,#10000100B ;设定年第4位的显示地址为第 1行,第4列LCALL WR_COMMMOV A, YEAR_HBUF ;年的高位缓存数据ADD A,#30H;力口 30H 修正取 ASCII 码LCALL WR_DATA=斜线显示=MOV A,#10000101B ;设定斜线的显示地址为第1行,第5列LCALL WR_COMMMOV A,#2FH ;斜线的 ASCII 码LCALL WR_DATA=显

17、示月=MOV A,#10000110B ;设定月第1位的显示地址为第 1行,第6列LCALL WR_COMMMOV A, MONT_LBUF ;月的低位缓存数据ADD A,#30H;力口 30H修正取 ASCII 码LCALL WR_DATAMOV A,#10000111B ;设定月第2位的显示地址为第 1行,第7列LCALL WR_COMMMOV A, MONT_HBUF ;月的高位缓存数据ADD A,#30H;力口 30H修正取 ASCII 码LCALL WR_DATA =斜线显示=MOV A,#10001000B ;设定斜线的显示地址为第 1行,第8列LCALL WR_COMMMOV A

18、,#2FH ;斜线的 ASCII 码LCALL WR_DATA=天显示=MOV A,#10001001B ;设定天第1位的显示地址为第1行,第9列LCALL WR_COMMMOV A, DAY_LBUF ; ADD A,#30H;LCALL WR_DATAMOV A,#10001010B ;LCALL WR COMM天的低位缓存数据加30H修正取ASCII码设定天第2位的显示地址为第1行,第10列MOV A, DAY_HBUF ;ADD A,#30H;LCALL WR DATA天的高位缓存数据加30H修正取ASCII码=星期显示=MOV A,#10001111B ;设定星期第2位的显示地址为第

19、 1行,第LCALL WR_COMMMOV A, WEEK_DATA ;SUBB A,#1ADD A,#30H;LCALL WR DATA星期的高位缓存数据加30H修正取ASCII码13列MOV A,#11000000B ;LCALL WR_COMMMOV A, HOUR_LBUF ;ADD A,#30H;LCALL WR DATA=小时显示=设定小时第1位的显示地址为第 2行,第小时的低位缓存数据加30H修正取ASCII码MOV A,#11000001B ;LCALL WR_COMMMOV A, HOUR_HBUFADD A,#30H;LCALL WR DATA设定小时第2位的显示地址为第

20、2行,小时的高位缓存数据加30H修正取ASCII码冒号的显示=MOV A,#11000010B ;LCALL WR_COMMMOV A, #3AH ;LCALL WR DATA冒号的ASCII码设定冒号的显示地址为第2行,第2列=分钟显示=MOV A,#11000011B ;设定分钟第1位的显示地址为第 2行,LCALL WR_COMM分钟的低位缓存数据加30H修正取ASCII码MOV A, MINTUE_LBUF ;ADD A,#30H;LCALL WR DATAMOV A,#11000100B ;设定分钟第2位的显示地址为第 2行,第4列LCALL WR_COMMMOV A, MINTUE

21、_HBUF ;分钟的高位缓存数据ADD A,#30H;力口 30H修正取 ASCII 码LCALL WR DATA =冒号的显示=MOV A,#11000101B ;设定冒号的显示地址为第2行,第5列LCALL WR_COMMMOV A, #3AH ;冒号的 ASCII 码LCALL WR_DATA=秒钟显示=MOV A,#11000110B ;设定秒钟第1位的显示地址为第 2行,第6列LCALL WR_COMMMOV A, SECOND_LBUF ;秒钟的低位缓存数据ADD A,#30H;力口 30H修正取 ASCII 码LCALL WR_DATAMOV A,#11000111B ;设定秒钟

22、第2位的显示地址为第 2行,第7列LCALL WR_COMMMOV A, SECOND_HBUF ;秒钟的高位缓存数据ADD A,#30H;力口 30H 修正取 ASCII 码LCALL WR_DATARETDS18B20复位初始化子程序 RESET_1820:;复位(有具体的时序要求)SETB DQNOPCLR DQ ;主机发出延时537微秒的复位低脉冲MOV R1,#3DLY: MOV R0,#107DJNZ R0,$DJNZ R1,DLY ;然后拉高数据线SETB DQNOPNOPNOP ;等待DS18B20回应MOV R0,#25HT2: JNB DQ ,T5DJNZ RO, T2;时

23、序要求延时一段时间T5: MOV R0,#117T6: DJNZ R0,T6T7: SETB DQRET ;=DS1302 初始化=SET_1302:MOV DS1302_ADDR, #8EH ;写 DS1302控制指令MOV DS1302_DATA, #00H ;写数据到 DS1302的8E控制寄存器中,允许对其进行 写操作LCALL WRITE ;调用写DS1302子程序MOV DS1302_ADDR, #90H ; 写 DS1302控制指令MOV DS1302_DATA,#0A6H ;写数据到 DS1302的90控制寄存器中,对电池涓流充电,充电电流为 1.1mALCALL WRITE

24、;调用写DS1302子程序RET ;=查询忙碌标志= CHECK_BUSY:PUSH ACCBUSY_LOOP:CLR ESETB RWCLR RSSETB EMOV A, p0JB pO.7,BUSY_LOOPPOP ACCLCALL DELRET=延时程序=DEL:MOV R6,#5L1:MOV R7,#248DJNZ R7,$DJNZ R6,L1RET 写入DS18B20子程序;写入DS18B20(有具体的时序要求)WRITE_1820:MOV R2,#8;一共8位数据CLR C;C=0WR1:CLR DQ;总线低位,开始写入MOV R3,#6DJNZ R3,$;保持16微秒以上RRC

25、A;把字节DATA分成8个BIT环移给CMOV DQ, C;写入一个BITMOV R3,#23DJNZ R3,$;等待SETB DQ;重新释放总线NOPDJNZ R2,WR1;写入下一个BITSETB DQ;释放总线RET读出DS18B20子程序将温度值从DS18B2 0中读出(有具体的时序要求)READ_1820:MOV R4,#4MOV R1,#TEMPL;存入 25H 26H、27H 28HRE0:MOV R2,#8;数据一共有8位RE1:CLR CSETB DQNOPNOPCLR DQ;读前总线保持为低位NOPNOPNOPSETB DQ;总线释放MOV R3,#9DJNZ R3,$;延

26、时18微妙MOV C, DQ;从总线读到一个BITMOV R3,#23 ;DJNZ R3,$;RRC A;DJNZ R2,RE1MOV R1,AINC R1; R1等待50微秒把读得的位值环移给A读下一个BIT内数据递增DJNZ R4,RE0RETLCD 1602 显示程序= = = = = = = = = = =;初始化设置SET_LCD:CLR ECALL INIT_LCDCALL STORE_DATARET初始化LCD将自定义字符存入 LCD的CGRAMLCD初始化子程序 INIT_LCD:MOV A,#38HACALL WR_COMMACALL DELAY1MOV A,#0CHACAL

27、L WR_COMMACALL DELAY1MOV A,#01HACALL WR_COMMACALL DELAY1设置8位、2行、5x7点阵调用写指令子程序调用延时子程序开显示,光标不闪烁调用写指令子程序;调用延时子程序清除LCD显示屏调用写指令子程序;调用延时子程序RETTEMP_BJ:MOV A, #0CEHACALL WR_COMMMOV DPTR,#BJMOVR1 ,#0;MOVR0 ,#2;Tp0:MOVA,R1;AMOVC A,A+DPTR ACALL WR_DATAINC R1;R1DJNZ RO,TpO ;RET显示温度标记子程序 设定第二行起始地址;调用写指令子程序存代码表使指

28、针指到表中第一个码取码次数为0; 取码调用写数据子程序值加1判断是否将代码读取完?BJ:;代码表DB 00H,C 自定义字符子程序 ;将自定义字符写入 LCD1602的CGRAM中STORE_DATA:MOVA,#40H;指定CG RAM起始地址ACALLWR_COMM ;将指令写入LCDMOVR2,#08H;图形数据长度8个字节MOVDPTR,#TAB ;存代码表MOVR3,#00H;使指针指到表中第一个码;_D: MOV A,R3;A为0MOVCA,A+DPTR ;读取表代码ACALLWR_DATA ;调用写入数据指令INC R3;R3值加1DJNZR2, S_D ;判断是否将代码读取完?

29、RETTAB:;代码表DB 0CH,12H,12H,0CHDB OOH,OOH,OOH,OOH显示OK信息子程序指针指到显示消息 显示在第一行显示指针指到显示消息 显示在第一行显示MEU_OK:MOV DPTR,#M_OK1 ;MOV A,#1;ACALL LCD_PRINT ;LCDMOV DPTR,#M_OK2 ;MOV A,#2;ACALL LCD_PRINT ;LCDRETM_OK1:DB - - WK: ,0M_OK2:DB - -,0; 菜单显示子程序 ;在LCD的第一行或第二行显示字符LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行清除该行字符数据设置LCD

30、的第一行地址 写入命令LINE1:ACALL CLR_LINEMOV A,#80HACALL WR_COMMJMP FILLLINE2:ACALL CLR_LINE;清除该行字符数据MOV A,#0C0H;设置LCD的第二行地址ACALL WR_COMMFILL:CLR A;填入字符MOVC A,A+DPTR;由消息区取出字符CJNE A,#0,LC1;判断是否为结束码RETLC1:ACALL WR_DATA;写入数据INC DPTR;指针加1JMP FILL;继续填入字符RET一LCD显示子程序CONV:MOV A,73H;加载百位数据MOV X,#9;设置位置CJNE A,#1,CO1JM

31、P CO2CO1:MOV A,#MOV B,XACALL LCDP2JMP CO3CO2:ACALL SHOW_LINE2;显示数据CO3: INC X;位加1MOV A,72H;十位ACALL SHOW_LINE2 ;显示数据INC X;位加1MOV A, 71H;个位ACALL SHOW_LINE2;显示数据INC X;位加1MOV A,#.MOV B,XACALL LCDP2;显示字符MOV A,70H;加载小数点位INC X;设置位置ACALL SHOW_LINE2;显示数据RET 显示第二行 ;在LCD的第二行显示数字SH0W_LINE2:ADD A,#30HMOV B,XACALL

32、 LCDP2RET在LCD的第二行显示字符放入堆栈设置显示地址设置LCD的第二行地址写入命令由堆栈取出A写入数据LCDP2:;PUSH ACCMOV A,B;ADD A,#0C0HACALL WR_COMMPOP ACC ;ACALL WR_DATARET写指令子程序 WR_COMM:MOV p0,A5写入指令CLR RS;RS=0,选择指令寄存器CLR RW;RW=0,选择写模式SETB E;E=1,允许读/写LCMACALL DELAY15延时5MSCLR E;E=0,禁止读/写LCMRET写数据子程序WR_DATA:MOV p0,A5写入数据SETB RS;RS=1,选择数据奇存器CLR

33、 RW;RW=0,选择写模式SETB E;E=1,允许读/写LCMACALL DE5延时0.5MSCLR E;E=0,禁止读/写LCMACALL DE5延时0.5MSRET 清除LCD的字符CLR_LINE:MOV R0,#24;设置计数值CL1: MOV A,#;载入空格符至LCDACALL WR_DATA ;输出字符至 LCDDJNZ R0,CL1 ;判断RETCLR_LINE1:;清除LCD的第一行字符MOV A,#80H;设置LCD的第一行地址ACALL WR_COMM ;调用写指令子程序MOV R0,#24C1: MOV A,#设置计数值 载入空格符至LCDACALL WR_DATADJNZ R0,C1;RET输出字符至LCD计数结束 *写 1302 序 *WRITE:CLR SCLKNOPSETB RSTNOPMOV A,DS13

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论