|
動態(tài)數(shù)碼管顯示DS18B20測溫顯示,折騰好幾天了,終于搞定了,開始要么不能正常顯示溫度,要么亂跳動。究其原因是DS18B20讀寫的時序太嚴格了,程序中動態(tài)數(shù)碼管顯示需要開定時中斷掃描顯示,折騰多天的問題就是這個定時中斷打斷了正常的讀寫時序。附上顯示正常的程序,供初學(xué)者參考
OK1.jpg (161.86 KB, 下載次數(shù): 91)
下載附件
試驗成功的板子
2020-10-11 20:50 上傳
單片機源程序如下:
- /*********
- 測試DS18B20測溫數(shù)碼管動態(tài)顯示
- **********/
- #include<STC90C52.h>
- #include"ds18b20.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define LedDuan P0 /*定義數(shù)碼管段碼的控制腳*/
- #define LedWei P2 /*定義數(shù)碼管位碼的控制腳*/
- sbit Out0=P3^2;//增氧泵控制輸出
- uchar code NumTab[]={//顯示段碼共陽碼64231750
- 0x21,0xEB,0x85,0x83,0x4B,0x13,0x11,0xAB,0x01,0x03, //"9"
- 0x09,0x51,0x35,0xC1,0x15,0x1D,0x49,0x75,0x29,0x61,0x0D,0xD1,0xDF,0xFF,0x3D,0xD9};
- //A B C D E F H I N U P o - 熄滅 T n
- uchar code DisBit[]={/*0xfe,*/0xfd,0xfb,0xf7,0xef,0xdf,0xbf/*,0x7f*/};//LED位驅(qū)動
- uchar data DisBuf[6]={0xff,0xff,0xff,0xff,0xff,0xff}; /*顯示段碼緩沖值*/
- uchar data DisBitCnt=0;//顯示第幾位選擇
- /*****************************************************************
- 函數(shù)名:毫秒級CPU延時函數(shù)
- 調(diào) 用:delay (?);
- 參 數(shù):1~65535(參數(shù)不可為0)
- 返回值:無
- 結(jié) 果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間
- 備 注:應(yīng)用于1T單片機時i<600,應(yīng)用于12T單片機時i<125
- /******************************************************************/
- void DelaymsN(uint t)
- {
- uint i; //定義變量
- for(;t>0;t--) //如果t大于0,t減1(外層循環(huán))
- for(i=120;i>0;i--); //i等于124,如果i大于0,i減1
- }
- /******************************
- 初始化設(shè)置定時器0,2MS at 12Mhz
- ******************************/
- void timeinit() /*定義中斷方式*/
- {
- TMOD=0x01; /*定時0,1工作在方式1*/
- TH0=0xf8;//(65535-1000)/256;//定時1MS*2_6Mhz=2Ms
- TL0=0x2f;//(65535-1000)%256;
- ET0=1; /*開定時器0中斷*/
- // ClearEPROM();
- // ReadE2P();//讀出設(shè)定的值
- EA=1; /*開總中斷*/
- TR0=1;
- }
- /********
- 顯示數(shù)據(jù)處理
- ************/
- /*******************************************************************************
- * 函 數(shù) 名 : LcdDisplay()
- * 函數(shù)功能 : LCD顯示讀取到的溫度
- * 輸 入 : v
- * 輸 出 : 無
- *******************************************************************************/
- void DisplayTablex(int temp) //lcd顯示
- {
- float tp;
- if(temp< 0) //當(dāng)溫度值為負數(shù)
- {
- DisBuf[0] = 0xdf; //顯示-號
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數(shù)點后面。
-
- }
- else
- {
- DisBuf[0] = 0xff;
- tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點后面。
- }
- DisBuf[1]= NumTab[temp / 10000];
- DisBuf[2]= NumTab[temp % 10000 / 1000];
- DisBuf[3]= NumTab[temp % 1000 / 100] &0xfe;
- DisBuf[4]= NumTab[temp % 100 / 10];
- DisBuf[5]= NumTab[temp % 10];
- }
- /*****************
- 主函數(shù)
- ****************************/
- void main()
- {
- timeinit();//初始化
- while(1)
- {
- DisplayTablex(Ds18b20ReadTemp());
- DelaymsN(200);
- DelaymsN(200);
- }
- }
- /*****第一種顯示方式數(shù)據(jù)處理****
- void Dis0()
- {
- DisBuf[0]=NumTab[0];//O
- DisBuf[1]=NumTab[15];//F
- DisBuf[2]=NumTab[15];//F
- DisBuf[3]=0xff;
- DisBuf[4]=0xff;
- DisBuf[5]=0xff;
- } */
- /*-----------------------------------------------
- 顯示部分程序,采用定時器0產(chǎn)生中斷,2MS更新一次
- 因為使用晶振為12Mhz
- ------------------------------------------------*/
- void Display() interrupt 1 //using 3
- {
- TR0=0;//關(guān)定時器0
- TH0=0xf8;//(65535-1000)/256;//定時1MS*2_6Mhz=2Ms
- TL0=0x2f;//(65535-1000)%256;
- LedWei=0xff; /*關(guān)閉顯示*/
- TR0=1;//打開定時器0
- // Dis0();//第一種顯示方式
- /********開始顯示******************/
- LedDuan=DisBuf[DisBitCnt]; /*輸出段碼數(shù)據(jù)到數(shù)碼管*/
- LedWei=DisBit[DisBitCnt]; /*輸出位碼數(shù)據(jù)到數(shù)碼管*/
- DisBitCnt++;
- if(DisBitCnt>=6)
- DisBitCnt=0; /*6位數(shù)碼管全動態(tài)輸出*/
- }
復(fù)制代碼
附上打包的程序
DS18B20.rar
(35.67 KB, 下載次數(shù): 59)
2020-10-11 20:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|