動態數碼管顯示DS18B20測溫顯示,折騰好幾天了,終于搞定了,開始要么不能正常顯示溫度,要么亂跳動。究其原因是DS18B20讀寫的時序太嚴格了,程序中動態數碼管顯示需要開定時中斷掃描顯示,折騰多天的問題就是這個定時中斷打斷了正常的讀寫時序。附上顯示正常的程序,供初學者參考
OK1.jpg (161.86 KB, 下載次數: 91)
下載附件
試驗成功的板子
2020-10-11 20:50 上傳
單片機源程序如下:
- /*********
- 測試DS18B20測溫數碼管動態顯示
- **********/
- #include<STC90C52.h>
- #include"ds18b20.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define LedDuan P0 /*定義數碼管段碼的控制腳*/
- #define LedWei P2 /*定義數碼管位碼的控制腳*/
- 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位驅動
- uchar data DisBuf[6]={0xff,0xff,0xff,0xff,0xff,0xff}; /*顯示段碼緩沖值*/
- uchar data DisBitCnt=0;//顯示第幾位選擇
- /*****************************************************************
- 函數名:毫秒級CPU延時函數
- 調 用:delay (?);
- 參 數:1~65535(參數不可為0)
- 返回值:無
- 結 果:占用CPU方式延時與參數數值相同的毫秒時間
- 備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
- /******************************************************************/
- void DelaymsN(uint t)
- {
- uint i; //定義變量
- for(;t>0;t--) //如果t大于0,t減1(外層循環)
- for(i=120;i>0;i--); //i等于124,如果i大于0,i減1
- }
- /******************************
- 初始化設置定時器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();//讀出設定的值
- EA=1; /*開總中斷*/
- TR0=1;
- }
- /********
- 顯示數據處理
- ************/
- /*******************************************************************************
- * 函 數 名 : LcdDisplay()
- * 函數功能 : LCD顯示讀取到的溫度
- * 輸 入 : v
- * 輸 出 : 無
- *******************************************************************************/
- void DisplayTablex(int temp) //lcd顯示
- {
- float tp;
- if(temp< 0) //當溫度值為負數
- {
- DisBuf[0] = 0xdf; //顯示-號
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數點后面。
-
- }
- else
- {
- DisBuf[0] = 0xff;
- tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數點后面。
- }
- 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];
- }
- /*****************
- 主函數
- ****************************/
- void main()
- {
- timeinit();//初始化
- while(1)
- {
- DisplayTablex(Ds18b20ReadTemp());
- DelaymsN(200);
- DelaymsN(200);
- }
- }
- /*****第一種顯示方式數據處理****
- 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產生中斷,2MS更新一次
- 因為使用晶振為12Mhz
- ------------------------------------------------*/
- void Display() interrupt 1 //using 3
- {
- TR0=0;//關定時器0
- TH0=0xf8;//(65535-1000)/256;//定時1MS*2_6Mhz=2Ms
- TL0=0x2f;//(65535-1000)%256;
- LedWei=0xff; /*關閉顯示*/
- TR0=1;//打開定時器0
- // Dis0();//第一種顯示方式
- /********開始顯示******************/
- LedDuan=DisBuf[DisBitCnt]; /*輸出段碼數據到數碼管*/
- LedWei=DisBit[DisBitCnt]; /*輸出位碼數據到數碼管*/
- DisBitCnt++;
- if(DisBitCnt>=6)
- DisBitCnt=0; /*6位數碼管全動態輸出*/
- }
復制代碼
附上打包的程序
DS18B20.rar
(35.67 KB, 下載次數: 59)
2020-10-11 20:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|