当前位置:文档之家› 数字显示温度计程序

数字显示温度计程序

TIMEL EQU 0E0HTIMEH EQU 0B1HTEMPHEAD EQU 36H;*********************************************************** ; 工作内存定义;*********************************************************** BITST DATA 20HTIME1SOK BIT BITST.1TEMPONEOK BIT BITST.2TEMPL DATA 26HTEMPH DATA 27HTEMPHC DATA 28HTEMPLC DATA 29H;********************************************************** ; 引脚定义;********************************************************** TEMPDIN BIT P3.4TH BIT P1.3TL BIT P1.4;*********************************************************** ; 中断向量区;*********************************************************** ORG 0000HLJMP STARTORG 00BHLJMP T0IT;************************************************************ ; 系统初始化;************************************************************ ORG 0100HSTART: MOV SP,#60HCLSMEM: MOV R0,#20HMOV R1,#60HCLSMEM1: MOV @R0,#00HINC R0DJNZ R1,CLSMEM1MOV TMOD,#00100001BMOV TH0,#TIMEHMOV TL0,#TIMELSJMP INITERROR: NOPLJMP STARTNOPINIT: NOPSETB ET0SETB TR0SETB EAMOV PSW,#00HCLR TEMPONEOKMOV 80H,#00HMOV 79H,#28HMOV 78H,#0BHMOV 77H,#01HMOV P1,#00HLJMP MAIN;************************************************************ ; 定时器0中断程序;************************************************************ T0IT: PUSH PSWMOV PSW,#10HMOV TH0,#TIMEHMOV TL0,#TIMELINC R7CJNE R7,#32H,TOIT1MOV R7,#00HSETB TIME1SOKTOIT1: POP PSWRETI;************************************************************ ; 主程序;************************************************************ MAIN: LCALL DISP1JNB TIME1SOK,MAINCLR TIME1SOKJNB TEMPONEOK,MAIN2LCALL READTEMP1LCALL CONVTEMPLCALL DISPBCDLCALL DISP1MAIN2: LCALL READTEMPSETB TEMPONEOKLCALL KEYLCALL SHENGJIANGLCALL SHENGJIANG1LJMP MAIN;********************************; 数值比较子程序;********************************SHENGJIANG:CLR CCLR THMOV A,#0AHCJNE A,73H,MANMOV A,#0AHCJNE A,72H,MAN4LJMP MAN1MAN4: JNC MAN2LJMP SSMAN: JNC MAN2 ;C=0 跳转 LJMP SSMAN3: CLR CMOV A,80HANL A,#0FHCJNE A,73H,MAXMAN2: CLR CMOV A,79HSWAP AANL A,#0FHCJNE A,72H,MAXMAN1: CLR CMOV A,79HANL A,#0FHCJNE A,71H,MAXCLR THJMP SSMAX: JC BJCLR THJMP SSBJ: SETB THLCALL DELAY10retSS: RET;****************************** SHENGJIANG1:CLR CCLR TLMOV A,78HANL A,#0FHCJNE A,73H,MAX1CLR CMOV A,77HSWAP AANL A,#0FHCJNE A,72H,MAX1CLR CMOV A,77HANL A,#0FHSUBB A,71HCJNE A,71H,MAX1JC BJCLR TLJMP SSMAX1: JC BJ1CLR TLJMP SS1BJ1: setb TLLCALL DELAY10retSS1: RETDELAY10: MOV R5,#200DEL:MOV R6,#123NOPDJNZ R6,$DJNZ R5,DELRET;******************************** ; 按键;********************************KEY: MOV P1,#0E7HKEY0: JB P1.0, KEE ;设置MOV 75H,#01HCALL D10MSJNB P1.0,$KKK: MOV A,80H ;上限ANL A,#0FHMOV 73H,AMOV A,79HSWAP AANL A,#0FHMOV 72H,AMOV A,79HANL A,#0FHMOV 71H,AMOV A,#00HANL A,#0FHMOV 70H,ALCALL DISP1LCALL KEY1JB P1.0,KKKMOV 75H,#01HCALL D10MSJNB P1.0,$KYY: MOV A,78H ;下限ANL A,#0FHMOV 73H,AMOV A,77HSWAP AANL A,#0FHMOV 72H,AMOV A,77HANL A,#0FHMOV 71H,AMOV A,#00HANL A,#0FHMOV 70H,ALCALL DISP1LCALL KEEY1JB P1.0,KYYMOV 75H,#01HCALL D10MSJNB P1.0,$KEE: MOV P1,#00HRET;KEY1: JB P1.1,KEY2 ;加CALL D10MSJNB P1.1,$CLR CMOV 75H,#01HMOV A,79HADDC A,75HDA AMOV 79H,AJNC LSMOV A,80HADDC A,#00HDA AMOV 80H,ALS: JMP KYKKKEY2: JB P1.2,KYKK ;减CALL D10MSJNB P1.2,$CLR CMOV 75H,#01HMOV A,79HSUBB A,75HMOV 76H,ACJNE A,#00H,LSASMOV A,#09HORL A,#09HLSAS: MOV 79H,AJNC LSSMOV A,80HSUBB A,#00HDA AMOV 80H,ALSS: JMP KYKKKYKK: RET;KEEY1: JB P1.2,KEEY2 ;加CALL D10MSJNB P1.2,$CLR CMOV 75H,#01HMOV A,77HADDC A,75HDA AMOV 77H,AJNC LS1MOV A,78HADDC A,#00HDA AMOV 78H,ALS1: JMP KYKKKEEY2: JB P1.1,KYKKK ;减CALL D10MSJNB P1.1,$MOV 75H,#01HMOV A,76HSUBB A,75HMOV 76H,AJMP KYKKKKYKKK: RET;***************************; 子程序区;***************************; RESET DS18B20;***************************INITDS1820:SETB TEMPDINNOPNOPCLR TEMPDINMOV R6,#0A0HDJNZ R6,$MOV R6,#0A0HDJNZ R6,$SETB TEMPDINMOV R6,#32HDJNZ R6,$MOV R6,#3CHLOOP1820: MOV C,TEMPDINJC INITDS1820OUTDJNZ R6,LOOP1820MOV R6,#64HDJNZ R6,$SJMP INITDS1820RET;INITDS1820OUT: SETB TEMPDINRET;;********************************;读DS18B20的程序,从DS18B20中读出一个字节的数据;**********************************READDS1820:MOV R7,#08HSETB TEMPDINNOPNOPREADDS1820LOOP: CLR TEMPDINNOPNOPNOPSETB TEMPDINMOV R6,#07HDJNZ R6,$MOV C,TEMPDINMOV R6,#3CHDJNZ R6,$RRC ASETB TEMPDINDJNZ R7,READDS1820LOOPMOV R6,#3CHDJNZ R6,$RET;;**************************************;写DS1820的程序,从DS18B20中写一个字节的数据;************************************** WRITEDS1820: MOV R7,#08HSETB TEMPDINNOPNOPWRITEDS1820LOP: CLR TEMPDINMOV R6,#07HDJNZ R6,$RRC AMOV TEMPDIN, CMOV R6,#34HDJNZ R6,$SETB TEMPDINDJNZ R7,WRITEDS1820LOPRET;*********************************************** ; READ TEMP;*********************************************** READTEMP: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$MOV A,#44HLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$RET;READTEMP1: LCALL INITDS1820MOV A,#0CCHLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$MOV A,#0BEHLCALL WRITEDS1820MOV R6,#34HDJNZ R6,$MOV R5,#09HMOV R0,#TEMPHEADMOV B,#00HREADTEMP2: LCALL READDS1820MOV @R0,AINC R0READTEMP21: LCALL CRC8CALDJNZ R5,READTEMP2MOV A,BJNZ READTEMPOUTMOV A,TEMPHEAD+0MOV TEMPL,AMOV A,TEMPHEAD+1MOV TEMPH,A READTEMPOUT: RET;******************************************** ; 处理温度BCD码子程序;******************************************** CONVTEMP: MOV A,TEMPHANL A,#80HJZ TEMPC1CLR CMOV A,TEMPLCPL AADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BHSJMP TEMPPC11TEMPC1: MOV TEMPHC,#0AH TEMPPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FHMOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,AMOV A,TEMPLANL A,#0F0HSWAP AMOV TEMPL,AMOV A,TEMPHANL A,#0FHSWAP AORL A,TEMPLLCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHCMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP AORL A,TEMPLCMOV TEMPLC,AMOV A,R7JZ TEMPC12ANL A,#0FHSWAP AMOV R7,AMOV A,TEMPHCANL A,#0FHORL A,R7MOV TEMPHC,ATEMPC12: RET;;*********************************************; 小数部分码表;********************************************* TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09H;;*********************************************; 显示区BCD码温度值刷新子程序;*********************************************;DISPBCD: MOV A,TEMPLCANL 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,#0F0HCJNE A,#010H,DISPBCD0SJMP DISPBCD2DISPBCD0: MOV A,TEMPHCANL A,#0FHJNZ DISPBCD2MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,#0AHMOV 72H,ADISPBCD2: RET;*****************************/* 显示子程序*/;*****************************;用6位LED共阳数码管显示,P1口输出段码数据,P3口作扫描控制,每个LED数码管亮1ms时间再逐位循环;DISP: MOV A,R0ANL A,#0FHMOV 71H,AMOV A,R0SWAP AANL A,#0FHMOV 72H,ADISP1: MOV R5,#01HMOV R1,#70HPLAY: MOV A,R5MOV P2,AMOV A,@R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,AMOV A,R5JNB ACC.1,LOOP5CLR P0.7LOOP5: LCALL DL1MSMOV A,R5RL AMOV R5,AINC R1JNB ACC.4,PLAYRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;共阳段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "一" ;DL1MS: MOV R6,#2DL1: MOV R7,#16DL2: DJNZ R7,DL2DJNZ R6,DL1RETD10MS:MOV R5,#10HD1MS:MOV R4,#249DL: NOPNOPDJNZ R4,DLDJNZ R5,D1MSRET;****************************************; 单字节十六进制转BCD;****************************************HEX2BCD1: MOV B,#064HDIV ABMOV R7,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRET;;****************************************; CRC校验;;**************************************** CRC8CAL: PUSH ACCMOV R7,#08HCRC8LOOP1: XRL A,BRRC AMOV A,BJNC CRC8LOOP2XRL A,#18HCRC8LOOP2: RRC AMOV B,APOP ACCRR APUSH ACCDJNZ R7,CRC8LOOP1POP ACCRETEND。

相关主题