仿真的實(shí)驗(yàn)現(xiàn)象圖已經(jīng)放在后面了,大佬幫我看看問(wèn)題啊 現(xiàn)在就是LCD顯示的溫度和實(shí)際模擬溫度不一致, /**************************************************/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int #define delayNop(); {_nop_();_nop_();_nop_();_nop_();}; uchar code table[]=" ERROR!!! "; uchar code table1[]="xianzaiwendu "; uchar code table2[]="Temp= . Cent"; uchar code table3[10]="0123456789"; sbit lcd_rs=P1^0; //sbit lcd_rw=P1^1; sbit lcd_en=P2^5; sbit DQ=P2^2; uchar num,time; void delay(uint t) { unsigned char n; while(t--) { for(n = 0; n<250; n++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } void write_com(uchar com) //寫命令 { ////lcd_rw=0; //delay(5); lcd_rs=0; lcd_en=0; _nop_(); _nop_(); P0=com; delayNop(); lcd_en=1; delay(1); lcd_en=0; } void write_date(uchar date) //寫數(shù)據(jù) { //lcd_rw=0; // delay(5); lcd_rs=1; lcd_en=0; _nop_(); _nop_(); P0=date; delayNop(); lcd_en=1; delay(1); lcd_en=0; } void init() //初始化函數(shù) { // dula=0; // wela=0; lcd_en=0; //可以試試不加這一句看結(jié)果怎樣 write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } uchar init_DS18bB20() { bit flag; DQ=1; //人為拉高 for(time=0;time<2;time++); //稍微延時(shí)6US; DQ=0; //認(rèn)為拉低 for(time=0;time<200;time++); //延時(shí)600US給單片機(jī)檢測(cè) DQ=1; //被上拉電阻拉高 (仿真里面沒(méi)有上拉,有沒(méi)有都需要人為拉高) for(time=0;time<20;time++); // 延時(shí)60US檢測(cè) flag=DQ; //這時(shí)又被DS18B20拉低, for(time=0;time<200;time++); //延時(shí)600US檢測(cè)時(shí)間 return flag; //返回0表示存在 } void Write_Byte(uchar dat) //寫一個(gè)字節(jié),單片機(jī)向DS18B20寫命令,確定DS18B20的工作方法之類的 { unsigned char i=0; for (i=0; i<8; i++) { DQ =1; // 先將數(shù)據(jù)線拉高 _nop_(); //等待一個(gè)機(jī)器周期 DQ=0; //將數(shù)據(jù)線從高拉低時(shí)即啟動(dòng)寫時(shí)序 DQ=dat&0x01; //利用與運(yùn)算取出要寫的某位二進(jìn)制數(shù)據(jù), //并將其送到數(shù)據(jù)線上等待DS18B20采樣 for(time=0;time<10;time++) ;//延時(shí)約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣 DQ=1; //釋放數(shù)據(jù)線,也就是被上拉電阻拉高,反正就是要把這個(gè)口釋放,然后來(lái)執(zhí)行下一個(gè)命令 for(time=0;time<1;time++) ;//延時(shí)3us,兩個(gè)寫時(shí)序間至少需要1us的恢復(fù)期 dat>>=1; //將dat中的各二進(jìn)制位數(shù)據(jù)右移1位 } for(time=0;time<4;time++) ; //稍作延時(shí),給硬件一點(diǎn)反應(yīng)時(shí)間 } uchar Read_Byte() { uchar i=0; uchar dat;//用來(lái)儲(chǔ)存讀出的一個(gè)字節(jié),默認(rèn)為0 for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; //讀命令一定得是低電平 dat>>=1; //讀取數(shù)據(jù)是從高位開(kāi)始讀,dat默認(rèn)是0,也就是0000 0000, // 這是下標(biāo)是指向最高位的,所以得先右移一位讓出一個(gè)位置 _nop_(); //需要>1US; DQ=1; //又被上拉電阻拉高 for(time=0;time<2;time++); if(DQ==1) //由DQ發(fā)送的信號(hào)來(lái)決定,發(fā)送的是高電平還是低電平 dat|=0x80; //高電平就或0x80,1000 0000 else dat|=0x00; //低電平就或,0x00 for(time=0;time<5;time++);//延時(shí)10US左右,因?yàn)樾枰?5US內(nèi)完成讀取 } return dat; } void Readyread()//做好讀溫度準(zhǔn)備。。。?梢约釉谥骱瘮(shù)里面,但是分出來(lái)比較清晰明了 { init_DS18bB20(); Write_Byte(0xcc); //跳過(guò)讀序號(hào) Write_Byte(0x44); //啟動(dòng)溫度轉(zhuǎn)換 for(time=0;time<100;time++); init_DS18bB20(); //再初始化一下 Write_Byte(0xcc); //跳過(guò)讀序號(hào) Write_Byte(0xbe); //都溫度寄存器,前兩個(gè)分別是溫度的,低,高位 } void display() //顯示第一行說(shuō)明 { write_com(0x80); for(num=0;num<16;num++) { write_date(table[num]); // delay(1); } while(1); } void display1() //顯示第二行說(shuō)明 { write_com(0x80); for(num=0;num<16;num++) { write_date(table1[num]); // delay(1); } } void display2() { write_com(0x80+0x40); for(num=0;num<16;num++) { write_date(table2[num]); //delay(1); } } void display_temp(uchar x) //顯示溫度整數(shù)部分 { uchar bai,shi,ge; bai=x/100; shi=(x%100)/10; ge=x%10; write_com(0x80+0x46); write_date(table3[bai]); write_date(table3[shi]); write_date(table3[ge]); } void display1_temp(uchar x) //顯示溫度小數(shù)部分 { write_com(0x80+0x4a); write_date(table3[x]); } void main() { uchar TL;//儲(chǔ)存暫存器的溫度最高位 uchar TH;//儲(chǔ)存暫存器的溫度最低位 uchar TN; //儲(chǔ)存溫度整數(shù)部分 uchar TD; //儲(chǔ)存溫度小數(shù)部分 init(); if(init_DS18bB20()==1) display(); display1(); display2(); while(1) { Readyread(); TL=Read_Byte(); TH=Read_Byte(); TN=TH*16+TL/16; //實(shí)際溫度值=(TH*256+TL)/16,即:TH*16+TL/16 //這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了 TD=(TL%16)*10/16; //計(jì)算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整, //這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù)) display_temp(TN); display1_temp(TD); _nop_(); _nop_(); } } |
51hei圖片_20191227184425.png (57.36 KB, 下載次數(shù): 75)
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |