欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機動態數碼管顯示DS18B20測溫顯示程序
[打印本頁]
作者:
zkele
時間:
2020-10-11 20:51
標題:
單片機動態數碼管顯示DS18B20測溫顯示程序
動態數碼管顯示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
作者:
supermcu8
時間:
2021-1-26 22:01
謝謝分享,有空下載一份學習一下
作者:
Toxicosis
時間:
2021-1-28 13:38
謝謝分享,初學正好能拿來借鑒學習
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1