這是用1602來顯示的,程序是修改前面幾個(gè)實(shí)驗(yàn)的,當(dāng)溫度<40度時(shí)電風(fēng)扇不轉(zhuǎn),當(dāng)>=40度時(shí)電風(fēng)扇轉(zhuǎn)動(dòng),為參加電子比賽做的單片機(jī)系統(tǒng)實(shí)驗(yàn)。程序?yàn)閰R編語言(ASM),帶詳細(xì)注釋,值得新手朋友參考!全部程序:ORG 0000H;單片機(jī)內(nèi)存分配申明!TEMPER_L EQU 29H;用于保存讀出溫度的低8位TEMPER_H EQU 28H;用于保存讀出溫度的高8位FLAG1 EQU 38H;是否檢測到DS18B20標(biāo)志位a_bit equ 20h ;數(shù)碼管個(gè)位數(shù)存放內(nèi)存位置b_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置RS EQU P3.7;確定具體硬件的連接方式RW EQU P3.6 ;確定具體硬件的連接方式E EQU P3.5 ;確定具體硬件的連接方式;主程序MAIN:LCALL GET_TEMPER;調(diào)用讀溫度子程序MOV A,29HMOV C,40H;將28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,Aclr csetb p3.0;zhelikais從這里開始是我填加的溫度控制CJNE A,#28H,FITSETB P3.0AJMP DISLEDFIT:CPL CMOV P3.0,C;jiesu到這里結(jié)束DISLED:LCALL DISPLAY;調(diào)用數(shù)碼管顯示子程序AJMP MAIN;DS18B20復(fù)位初始化子程序INIT_1820:SETB P2.2NOPCLR P2.2;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P2.2;然后拉高數(shù)據(jù)線NOPNOPNOPMOV R0,#25HTSR2:JNB P2.2,TSR3;等待DS18B20回應(yīng)DJNZ R0,TSR2LJMP TSR4 ; 延時(shí)TSR3:SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在CLR P1.7;檢查到DS18B20就點(diǎn)亮P1.7LED,與傳感器通信成功LJMP TSR5TSR4:CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在CLR P1.1;未檢查到DS18B20就點(diǎn)亮P1.1LED,與傳感器通信失敗LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 時(shí)序要求延時(shí)一段時(shí)間TSR7:SETB P2.2RET;讀出轉(zhuǎn)換后的溫度值的子程序GET_TEMPER:SETB P2.2LCALL INIT_1820;先復(fù)位DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判斷DS1820是否存在?若DS18B20不存在則返回TSS2:CLR P1.3;DS18B20已經(jīng)被檢測到!MOV A,#0CCH ; 跳過ROM匹配LCALL WRITE_1820MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令LCALL WRITE_1820LCALL DISPLAY;這里通過調(diào)用顯示子程序?qū)崿F(xiàn)延時(shí)一段時(shí)間,等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒LCALL INIT_1820;準(zhǔn)備讀溫度前先復(fù)位MOV A,#0CCH ; 跳過ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 發(fā)出讀溫度命令LCALL WRITE_1820LCALL READ_18200; 將讀出的溫度數(shù)據(jù)保存到35H/36HCLR P1.4RET
評(píng)論