电子时钟日历本实例基于51单片机为控制器,程序采用汇编语言编写。
时钟芯片使用串行通信的DS1302、温度测量采用一线式总线的数字温度传感器DL18B20、显示模块用的是深圳耀宇公司的YM12864R内带字库、NE555用于闹钟时间到时驱动轰鸣器发声。
按键用于时间和闹钟设置,进入或退出设置时需按住设置键3秒以上。
电路原理图如下:实物照片汇编源程序如下:E BIT P1.0 ;使能端脉冲下降沿锁存数据RW BIT P1.1 ;读写控制0写1读RS BIT P1.2 ;指令数据选择0指令1数据DQ BIT P3.3 ;DS18B20数据输出端SZ BIT P2.0 ;设置及退出键YW BIT P2.1 ;移位键UP BIT P2.2 ;加一键KAL BIT P2.3 ;闹钟消警键LEDKG BIT P2.4 ;LCD背光控制开关LED BIT P2.7 ;LCD背光灯SCLK BIT P3.0 ;时钟线IO BIT P3.1 ;数据线RST BIT P3.2 ;复位线FGAL4 BIT 20H.0 ;闹钟报警标志位FLAG1 BIT 20H.1 ;DS18B20复位成功标志位WCOMD EQU 21H ;存放需写入LCD 的指令WDATA EQU 22H ;存放需写入LCD 的数据TEMP_L EQU 23H ;从DS18B20中读出的温度值的低字节TEMP_H EQU 24H ;从DS18B20中读出的温度值的高字节TEMP EQU 25H ;温度值TEMPBUF EQU 26H ;温度转换过程中的暂存单元WDB EQU 27H ;温度显示的百位值WDS EQU 28H ;温度显示的十位值WDG EQU 29H ;温度显示的个位值XQS EQU 2AH ;星期值显示的十位值SECG EQU 2CH ;秒显示的个位值SECS EQU 2DH ;秒显示的十位值MING EQU 2EH ;分钟显示的个位值MINS EQU 2FH ;分钟十位HOUG EQU 30H ;小时个位HOUS EQU 31H ;小时十位DA TEG EQU 32H ;日个位DA TES EQU 33H ;日十位MONG EQU 34H ;月个位MONS EQU 35H ;月十位YERG EQU 36H ;年个位YERS EQU 37H ;年十位SHIF EQU 38H ;移位键值WDATD EQU 39H ;写DS1302的数据缓存XQ EQU 3AH ;设定星期值的缓存单元SEC EQU 3BH ;秒MIN EQU 3CH ;分HOU EQU 3DH ;时DA TE EQU 3EH ;日MON EQU 3FH ;月YER EQU 40H ;年ALMIN EQU 41H ;从DS1302RAM区中读出的闹钟分值(用于设定闹钟后的比较)ALHOU EQU 42H ;从DS1302RAM区中读出的闹钟时值(用于设定闹钟后的比较)FGAL EQU 43H ;闹钟设定标志单元,“00H”表示未设定闹钟,“FFH”表示闹钟已设定ALMING EQU 44H ;闹钟设定时用于显示的分钟个位ALMINS EQU 45H ;闹钟设定时用于显示的分钟十位ALHOUG EQU 46H ;闹钟设定时用于显示的小时个位ALHOUS EQU 47H ;闹钟设定时用于显示的小时十位LZG EQU 48H ;闹钟设定时用于显示的开或关字LZS EQU 49H ;闹钟设定时用于显示的开或关字DR0 EQU 4AH ;DR1 EQU 4BH ;用于定时子程序中的计数用DR2 EQU 4CH ;用于定时子程序中的计数用DR3 EQU 4DH ;用于一秒钟更新一次显示屏的显示DR4 EQU 4EH ;用于定时子程序中的计数用DRF EQU 4FH ;用于计数JSQ1 EQU 50H ;用于显示字符个数的计数ORG 0000HMAIN: MOV 7FH,#0CLR P3.7MOV R0,#20HCLR AM1: MOV @R0,ACJNE R0,#51H,M1MOV P2,#0FFHMOV WDATD,#0MOV A,#8EH ;写控制寄存器,允许对DS1302进行读写操作LCALL WDS1302 ;调DS1302写子程序;MOV A,#80H ;初始化DS1302时才用,即全新的或断电后无备用电源供电的情况下才用来启动DS1302工着;LCALL WDS1302MOV A,#90HMOV WDATD,#0ABHLCALL WDS1302;从此处开始的34行为初始化DS1302时才用,即全新的或断电后无备用电源供电的情况,否则DS1302内部寄存器的值将不确定;MOV XQ,#01H ;向DS1302内部初值不能为0的寄存器写入初值;MOV DATE,#01H;MOV MON,#01H;MOV YER,#10H;MOV WDA TD,XQ;MOV A,#8AH ;写星期;LCALL WDS1302;MOV WDA TD,MIN;MOV A,#82H ;写分;LCALL WDS1302;MOV WDA TD,HOU;MOV A,#84H ;写时;LCALL WDS1302;MOV WDA TD,DA TE;MOV A,#86H ;写日;LCALL WDS1302;MOV WDA TD,MON;MOV A,#88H ;写月;LCALL WDS1302;MOV WDA TD,YER;MOV A,#8CH ;写年;LCALL WDS1302;MOV WDA TD,SEC;MOV A,#80H ;写秒;LCALL WDS1302;MOV WDA TD,ALMIN;MOV A,#0C0H ;写DS1302RAM 00H单元;LCALL WDS1302;MOV WDA TD,ALHOU;MOV A,#0C2H ;写DS1302RAM 01H单元;LCALL WDS1302;MOV WDA TD,FGAL;MOV A,#0C4H ;写DS1302RAM 02H单元;LCALL WDS1302LCALL INITLCDLCALL RDS1302MOV DR3,A ;用于存放前一次的秒钟值以便于每秒钟更新一次LCD显示M2: LCALL DATADIS ;调读DS1302时间数据子程序LCALL SDATA ;调显示数据处理子程序LCALL LCDDISP ;LCD显示更新子程序LCALL DS18B20TM ;“读温度子程序”LCALL KEY ;调按键处理子程序JB LEDKG,M7 ;判断LCD背光开关是否按下LCALL TIM10MSJB LEDKG,M7JNB LEDKG,$ ;按下背光开或关CPL LEDM7: JB FGAL4,M3LCALL ALCMP ;调定时比较子程序SJMP M2M3: JB KAL,M4LCALL TIM10MSJB KAL,M4JNB KAL,$CLR P3.7 ;关闭闹铃M4: MOV A,ALMIN ;若无人按下消警键,则将闹钟设定的小时值加一分钟后与实际分钟值比较,相等后消警;MOV A,ALHOU ;若无人按下消警键,则将闹钟设定的小时值加一小时后与实际小时值比较,相等后消警;ADD A,#1;DA A;CJNE A,#24H,M5;MOV A,#00H;M5: CJNE A,HOU,M6INC ADA ACJNE A,#60H,M5MOV A,#00HM5: CJNE A,MIN,M6CLR FGAL4CLR P3.7M6: LJMP M2;LCD忙标志检测子程序;占用P0口为数据端口BUSF: CLR ECLR RSSETB RWMOV P0,#0FFHNOPSETB ENOPNOPJB P0.7,$CLR ERET;向LCD写数据子程序WDATALCD: LCALL BUSFSETB RSCLR RWMOV P0,WDATANOPNOPSETB ENOPNOPCLR ENOPNOPRET;向LCD写指令子程序WCOMDLCD: LCALL BUSFCLR RSCLR RWMOV P0,WCOMDNOPNOPSETB ENOPNOPCLR ENOPNOPRET;LCD初始化子程序INITLCD: MOV WCOMD,#30H ;使用基本指令集,8位模式LCALL WCOMDLCD ;调向LCD写指令子程序MOV WCOMD,#02H ;位址计数器AC归零MOV WCOMD,#0CH ;显示开.光标关.光标位反白关LCALL WCOMDLCDMOV WCOMD,#01H ;清屏,显示地址计数器AC归零LCALL WCOMDLCDMOV WCOMD,#06H ;写入显示数据时光标右移LCALL WCOMDLCDRET;闹钟比较子程序ALCMP: MOV A,FGAL ;先判断闹钟功能是否开启,若未开启则不进行闹钟比较CJNE A,#0FFH,CP1MOV A,MINCJNE A,ALMIN,CP1MOV A,HOUCJNE A,ALHOU,CP1SETB P3.7SETB FGAL4CP1: RET;写DS1302;WDA TD为待写入数据缓存;DRF用于计数WDS1302: CLR RSTCLR SCLKSETB RSTCLR CMOV DRF,#8WLOOP1: RRC ACLR SCLKMOV IO,CNOPSETB SCLKDJNZ DRF,WLOOP1CLR SCLKMOV A,WDA TDMOV DRF,#8CLR CWLOOP2: RRC ACLR SCLKNOPMOV IO,CNOPSETB SCLKDJNZ DRF,WLOOP2CLR RSTRET;读2DS1302;DRF用于计数RDS1302: CLR RSTCLR SCLKSETB RSTCLR CMOV DRF,#8RLOOP1: RRC AMOV IO,CNOPSETB SCLKCLR SCLKDJNZ DRF,RLOOP1SETB IOMOV DRF,#8CLR CRLOOP2: CLR SCLKMOV C,IONOPRRC ASETB SCLKDJNZ DRF,RLOOP2CLR RSTRET;DS1302数据读取及处理子程序(用于显示)DA TADIS: MOV A,#8BH ;读出DS1302中须显示的单元LCALL RDS1302MOV XQ,AMOV A,#81HLCALL RDS1302MOV SEC,AMOV B,AANL A,#0FHMOV SECG,AMOV A,BSWAP AANL A,#0FHMOV SECS,AMOV A,#83HLCALL RDS1302MOV B,AMOV MIN,AMOV MING,AMOV A,BSWAP AANL A,#0FHMOV MINS,AMOV A,#85HLCALL RDS1302MOV B,AMOV HOU,AANL A,#0FHMOV HOUG,AMOV A,BSWAP AANL A,#0FHMOV HOUS,AMOV A,#87HLCALL RDS1302MOV DATE,AMOV B,AANL A,#0FHMOV DATEG,AMOV A,BSWAP AANL A,#03HMOV DATES,AMOV A,#89HLCALL RDS1302MOV MON,AMOV B,AANL A,#0FHMOV MONG,AMOV A,BSWAP AANL A,#01HMOV MONS,AMOV A,#8DHLCALL RDS1302MOV YER,AMOV B,AANL A,#0FHMOV YERG,AMOV A,BSWAP AANL A,#0FHMOV YERS,AMOV A,#0C1H ;读DS1302RAM 00H单元LCALL RDS1302MOV B,AANL A,#0FHMOV ALMING,AMOV A,BSWAP AANL A,#0FHMOV ALMINS,AMOV A,#0C3H ;读DS1302RAM 01H单元LCALL RDS1302MOV ALHOU,AMOV B,AANL A,#0FHMOV ALHOUG,AMOV A,BSWAP AANL A,#0FHMOV ALHOUS,AMOV A,#0C5H ;读DS1302RAM 02H单元LCALL RDS1302MOV FGAL,A ;判断闹钟功能是否开启,将对应的汉字代码写入显示缓存中CJNE A,#00H,D1MOV LZS,#0B9HMOV LZG,#0D8HSJMP D2D1: CJNE A,#0FFH,D2MOV LZS,#0BFHMOV LZG,#0AAHD2: RET;将显示内容查表,转换成LCD内部所对应的字库码SDATA: MOV A,XQCJNE A,#1,S2MOV XQS,#0D2H ;星期一MOV XQG,#0BBH;SJMP S8S2: CJNE A,#2,S3MOV XQS,#0B6HMOV XQG,#0FEHS3: CJNE A,#3,S4MOV XQS,#0C8HMOV XQG,#0FDHS4: CJNE A,#4,S5MOV XQS,#0CBHMOV XQG,#0C4HMOV XQS,#0CEHMOV XQG,#0E5HS6: CJNE A,#6,S7MOV XQS,#0C1HMOV XQG,#0F9HS7: CJNE A,#7,S8MOV XQS,#0C8HMOV XQG,#0D5HS8: MOV DPTR,#TABL2 ;LCD显示代码表MOV A,MINGMOVC A,@A+DPTRMOV MING,AMOV A,MINSMOVC A,@A+DPTRMOV MINS,AMOV A,HOUGMOVC A,@A+DPTRMOV HOUG,AMOV A,HOUSMOVC A,@A+DPTRMOV HOUS,AMOV A,DATEGMOVC A,@A+DPTRMOV DATEG,AMOV A,DATESMOVC A,@A+DPTRMOV DATES,AMOV A,MONGMOVC A,@A+DPTRMOV MONG,AMOV A,MONSMOVC A,@A+DPTRMOV MONS,AMOV A,YERGMOVC A,@A+DPTRMOV YERG,AMOV A,YERSMOVC A,@A+DPTRMOV YERS,AMOV A,SECGMOVC A,@A+DPTRMOV SECG,AMOV A,SECSMOVC A,@A+DPTRMOV SECS,AMOV A,ALMINGMOVC A,@A+DPTRMOV ALMING,AMOV A,ALMINSMOVC A,@A+DPTRMOV ALMINS,AMOV A,ALHOUGMOVC A,@A+DPTRMOV ALHOUG,AMOV A,ALHOUSMOVC A,@A+DPTRMOV ALHOUS,AMOV A,WDGMOVC A,@A+DPTRMOV WDG,AMOV A,WDSMOVC A,@A+DPTRMOV WDS,ARET;LCD显示更新子程序LCDDISP: MOV A,DR3CJNE A,SEC,DISP1RETDISP1: MOV DR3,SECMOV WCOMD,#81H ;从左上第一行第二字节处开始显示LCALL WCOMDLCDMOV WDATA,#32H ;2LCALL WDATALCDMOV WDATA,#30H ;0LCALL WDATALCDMOV WDATA,YERS ;年LCALL WDATALCDMOV WDATA,YERGLCALL WDATALCDMOV WDATA,#0C4H ;年字的汉字字模LCALL WDATALCDMOV WDATA,#0EAHLCALL WDATALCDMOV WDATA,MONS ;月LCALL WDATALCDMOV WDATA,MONGLCALL WDATALCDMOV WDATA,#0D4H ;月字的汉字字模LCALL WDATALCDMOV WDATA,#0C2HLCALL WDATALCDMOV WDATA,DATESLCALL WDATALCDMOV WDATA,#0C8H ;日字的汉字字模LCALL WDATALCDMOV WDATA,#0D5HLCALL WDATALCDMOV WCOMD,#92HLCALL WCOMDLCDMOV WDATA,HOUSLCALL WDATALCDMOV WDATA,HOUGLCALL WDATALCDMOV WDATA,#3AHLCALL WDATALCDMOV WDATA,#20HLCALL WDATALCDMOV WDATA,MINSLCALL WDATALCDMOV WDATA,MINGLCALL WDATALCDMOV WDATA,#3AHLCALL WDATALCDMOV WDATA,#20HLCALL WDATALCDMOV WDATA,SECSLCALL WDATALCDMOV WDATA,SECGLCALL WDATALCDMOV WCOMD,#88HLCALL WCOMDLCDMOV WDATA,#0D0H ;星LCALL WDATALCDMOV WDATA,#0C7HLCALL WDATALCDMOV WDATA,#0C6H ;期LCALL WDATALCDMOV WDATA,#0DAHLCALL WDATALCDMOV WDATA,XQSLCALL WDATALCDMOV WDATA,XQGLCALL WDATALCDMOV WCOMD,#8CHLCALL WCOMDLCDMOV WDATA,#0CEH ;温LCALL WDATALCDMOV WDATA,#0C2HLCALL WDATALCDMOV WDATA,#0C8H ;度LCALL WDATALCDMOV WDATA,WDS ;温度的十位LCALL WDATALCDMOV WDATA,WDGLCALL WDATALCDMOV WDATA,#0A1H ;CLCALL WDATALCDMOV WDATA,#0E6HLCALL WDATALCDMOV WCOMD,#98HLCALL WCOMDLCDMOV WDATA,#0C4H ;闹LCALL WDATALCDMOV WDATA,#0D6HLCALL WDATALCDMOV WDATA,#0D6H ;钟LCALL WDATALCDMOV WDATA,#0D3HLCALL WDATALCDMOV WDATA,LZSLCALL WDATALCDMOV WDATA,LZGLCALL WDATALCDMOV WCOMD,#9CHLCALL WCOMDLCDMOV WDATA,ALHOUSLCALL WDATALCDMOV WDATA,ALHOUGLCALL WDATALCDMOV WDATA,#3AHLCALL WDATALCDMOV WDATA,#20HLCALL WDATALCDMOV WDATA,ALMINSLCALL WDATALCDMOV WDATA,ALMINGLCALL WDATALCDMOV WDATA,#20HLCALL WDATALCDMOV WDATA,#20HLCALL WDATALCDRET;向DS1302写设定数据SWDS: MOV WDA TD,XQMOV A,#8AH ;写星期LCALL WDS1302MOV WDATD,MINMOV A,#82H ;写分LCALL WDS1302MOV WDATD,HOUMOV A,#84H ;写时LCALL WDS1302MOV WDATD,DATEMOV A,#86H ;写日LCALL WDS1302MOV WDATD,MONMOV A,#88H ;写月LCALL WDS1302MOV WDATD,YERMOV A,#8CH ;写年LCALL WDS1302MOV WDATD,SECMOV A,#80H ;写秒LCALL WDS1302MOV WDATD,ALMINMOV A,#0C0H ;写DS1302RAM 00H单元LCALL WDS1302MOV WDATD,ALHOUMOV A,#0C2H ;写DS1302RAM 01H单元LCALL WDS1302MOV WDATD,FGALMOV A,#0C4H ;写DS1302RAM 02H单元LCALL WDS1302RET;按键处理子程序KEY: JB SZ,KOUTLCALL TIM1SJB SZ,KOUTMOV SHIF,#0MOV WCOMD,#0FH ;开光标,且光标位闪烁LCALL WCOMDLCD ;调写LCD指令子程序MOV DPTR,#TABL1MOV A,SHIFMOVC A,@A+DPTR ;查表后取出需显示的光标位MOV WCOMD,ALCALL WCOMDLCDJNB SZ,$KSZ: JB SZ,KYW ;若再按下设置键则退出设置功能LCALL TIM1SJB SZ,KYWLCALL SWDSMOV WCOMD,#0CH ;关光标LCALL WCOMDLCDMOV SHIF,#0MOV DR3,SECJNB SZ,$KOUT: RETKYW: JB YW,KUPLCALL TIM10MSJB YW,KUPJNB YW,$INC SHIFMOV A,SHIFCJNE A,#10,KYW1MOV SHIF,#0KYW1: MOV DPTR,#TABL1MOV A,SHIFMOVC A,@A+DPTRMOV WCOMD,ALCALL WCOMDLCDSJMP KSZKUP: JB UP,KSZLCALL TIM10MSJB UP,KSZJNB UP,$MOV R3,SHIFCJNE R3,#0,KUP1LJMP KYERKUP1: CJNE R3,#1,KUP2LJMP KMONKUP2: CJNE R3,#2,KUP3LJMP KDATEKUP3: CJNE R3,#3,KUP4LJMP KHOUKUP4: CJNE R3,#4,KUP5LJMP KMINKUP5: CJNE R3,#5,KUP6LJMP KSECKUP6: CJNE R3,#6,KUP7LJMP KXQKUP7: CJNE R3,#7,KUP8LJMP KFGALKUP8: CJNE R3,#8,KUP9LJMP KALHOUKUP9: CJNE R3,#9,KUPALJMP KALMINKUPA: LJMP KSZKYER: MOV A,YERINC ADA AMOV YER,AANL A,#0FHMOV DPTR,#TABL2MOVC A,@A+DPTRMOV YERG,AMOV A,YERSWAP AANL A,#0FHMOVC A,@A+DPTRMOV YERS,AMOV WDATA,YERSLCALL WDATALCDMOV WDATA,YERGLCALL WDATALCDMOV WCOMD,#82H ;用于将光标反回原位LCALL WCOMDLCDLJMP KSZKMON: MOV A,MONINC ADA AMOV MON,ACJNE A,#13H,K1MOV MON,#01HK1: MOV A,MONANL A,#0FHMOV DPTR,#TABL2MOVC A,@A+DPTRMOV MONG,AMOV A,MONSWAP AANL A,#0FHMOVC A,@A+DPTRMOV MONS,AMOV WDATA,MONSLCALL WDATALCDMOV WDATA,MONGLCALL WDATALCDMOV WCOMD,#84HLCALL WCOMDLCDLJMP KSZKDATE: MOV A,DATE INC ADA AMOV DATE,ACJNE A,#32H,K2 MOV DATE,#01HK2: MOV A,DATE ANL A,#0FHMOV DPTR,#TABL2 MOVC A,@A+DPTR MOV DATEG,AMOV A,DATESWAP AANL A,#0FHMOVC A,@A+DPTR MOV DATES,AMOV WDATA,DATES LCALL WDATALCD MOV WDATA,DATEG LCALL WDATALCD MOV WCOMD,#86H LCALL WCOMDLCD LJMP KSZKHOU: MOV A,HOU INC ADA AMOV HOU,ACJNE A,#24H,K3 MOV HOU,#00HK3: MOV A,HOU ANL A,#0FHMOV DPTR,#TABL2 MOVC A,@A+DPTR MOV HOUG,AMOV A,HOUSWAP AANL A,#0FHMOVC A,@A+DPTR MOV HOUS,AMOV WDATA,HOUS LCALL WDATALCD MOV WDATA,HOUG LCALL WDATALCD MOV WCOMD,#92H LCALL WCOMDLCD LJMP KSZKMIN: MOV A,MININC ADA AMOV MIN,ACJNE A,#60H,K4 MOV MIN,#00HK4: MOV A,MIN ANL A,#0FHMOV DPTR,#TABL2 MOVC A,@A+DPTR MOV MING,AMOV A,MINSWAP AANL A,#0FHMOVC A,@A+DPTR MOV MINS,AMOV WDATA,MINS LCALL WDATALCD MOV WDATA,MING LCALL WDATALCD MOV WCOMD,#94H LCALL WCOMDLCD LJMP KSZKSEC: MOV A,SEC INC ADA AMOV SEC,ACJNE A,#60H,K5 MOV SEC,#00HK5: MOV A,SEC ANL A,#0FHMOV DPTR,#TABL2 MOVC A,@A+DPTR MOV SECG,AMOV A,SECSWAP AANL A,#0FHMOVC A,@A+DPTR MOV SECS,AMOV WDATA,SECS LCALL WDATALCD MOV WDATA,SECG LCALL WDATALCD MOV WCOMD,#96H LCALL WCOMDLCD LJMP KSZKXQ: MOV A,XQ INC AMOV XQ,ACJNE A,#8,KXQ1MOV XQ,#1KXQ1: MOV A,XQCJNE A,#1,KXQ2MOV XQS,#0D2HMOV XQG,#0BBHLJMP KXQ9KXQ2: CJNE A,#2,KXQ3MOV XQS,#0B6HMOV XQG,#0FEHLJMP KXQ9KXQ3: CJNE A,#3,KXQ4MOV XQS,#0C8HMOV XQG,#0FDHLJMP KXQ9KXQ4: CJNE A,#4,KXQ5MOV XQS,#0CBHMOV XQG,#0C4HLJMP KXQ9KXQ5: CJNE A,#5,KXQ6MOV XQS,#0CEHMOV XQG,#0E5HLJMP KXQ9KXQ6: CJNE A,#6,KXQ7MOV XQS,#0C1HMOV XQG,#0F9HLJMP KXQ9KXQ7: CJNE A,#7,KXQ9MOV XQS,#0C8HMOV XQG,#0D5HKXQ9: MOV WDA TA,XQS LCALL WDATALCDMOV WDATA,XQGLCALL WDATALCDMOV WCOMD,#8AHLCALL WCOMDLCDLJMP KSZKFGAL: MOV A,FGALCPL AMOV FGAL,ACJNE A,#0,KFGAL1MOV LZS,#0B9HMOV LZG,#0D8HSJMP KFGAL2KFGAL1: CJNE A,#0FFH,KFGAL2 MOV LZS,#0BFHMOV LZG,#0AAHKFGAL2: MOV WDA TA,LZSLCALL WDATALCD MOV WCOMD,#9AH LCALL WCOMDLCD LJMP KSZKALHOU: MOV A,ALHOU INC ADA AMOV ALHOU,ACJNE A,#24H,K6MOV ALHOU,#00HK6: MOV A,ALHOUANL A,#0FHMOV DPTR,#TABL2 MOVC A,@A+DPTR MOV ALHOUG,AMOV A,ALHOUSWAP AANL A,#0FHMOVC A,@A+DPTR MOV ALHOUS,AMOV WDATA,ALHOUS LCALL WDATALCD MOV WDATA,ALHOUG LCALL WDATALCD MOV WCOMD,#9CH LCALL WCOMDLCD LJMP KSZKALMIN: MOV A,ALMIN INC ADA AMOV ALMIN,ACJNE A,#60H,K7MOV ALMIN,#00HK7: MOV A,ALMINANL A,#0FHMOV DPTR,#TABL2 MOVC A,@A+DPTR MOV ALMING,AMOV A,ALMINSWAP AANL A,#0FHMOVC A,@A+DPTR MOV ALMINS,AMOV WDATA,ALMINS LCALL WDATALCD MOV WDATA,ALMINGLCALL WCOMDLCDLJMP KSZ;10豪秒延时子程序TIM10MS: MOV DR1,#10TD1: MOV DR2,#250TD2: NOPNOPDJNZ DR2,TD2DJNZ DR1,TD1RET;1秒延时子程序TIM1S: MOV R5,#1TD3: MOV R6,#100TD4: LCALL TIM10MSDJNZ R6,TD4DJNZ R5,TD3RET;LCD显示地址表TABL1: DB 82H,84H,86H,92H,94H,96H,8AH,9AH,9CH,9EH;LCD显示代码表TABL2: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H;“读温度子程序”DS18B20TM: LCALL STA18B20 ;调“DS18B20初始复位子程序”MOV A,#0CCHLCALL W18B20MOV A,#44HLCALL W18B20LCALL STA18B20MOV A,#0CCHLCALL W18B20MOV A,#0BEHLCALL W18B20LCALL R18B20LCALL TEMPCONVRET;“DS18B20初始复位子程序”STA18B20: SETB DQNOPNOPCLR DQLCALL T500USSETB DQNOPMOV DR4,#37STA1: JNB DQ,STA2DJNZ DR4,STA1JMP STA3STA2: SETB FLAG1JMP STA4STA3: CLR FLAG1JMP STA5STA4: MOV DR4,#100DJNZ DR4,$STA5: SETB DQRET;“写DS18B20子程序”W18B20: MOV DR1,#8CLR CYWR1: CLR DQMOV R7,#9DJNZ R7,$RRC AMOV DQ,CMOV R7,#23DJNZ R7,$SETB DQNOPDJNZ DR1,WR1SETB DQRET;“读DS18B20子程序”R18B20: MOV DR2,#2MOV R1,#TEMP_LRD1: MOV DR1,#8CLR ARD2: CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R7,#9DJNZ R7,$MOV C,DQMOV R7,#23DJNZ R7,$RRC ADJNZ DR1,RD2MOV @R1,AINC R1DJNZ DR2,RD1RET;“温度转换子程序”;读出温度高字节的低四位与低字节的高四位组合成一个字节即可得到温度的整数值TEMPCONV: MOV A,TEMP_LANL A,#0F0HSWAP AMOV TEMPBUF,AMOV A,TEMP_HANL A,#0FHSWAP AORL A,TEMPBUFMOV TEMP,AMOV B,#100DIV ABMOV WDB,AMOV A,#10XCH A,BDIV ABMOV WDS,AMOV WDG,BRET;500微秒延时子程序T500US: MOV R4,#250DJNZ R4,$RETEND。