標(biāo)題:
關(guān)于單片機(jī)驅(qū)動(dòng)ds18b20做體溫計(jì)的問(wèn)題
[打印本頁(yè)]
作者:
再帥也不是主角
時(shí)間:
2018-10-21 10:16
標(biāo)題:
關(guān)于單片機(jī)驅(qū)動(dòng)ds18b20做體溫計(jì)的問(wèn)題
樓主用ds18b20做體溫計(jì),要求的報(bào)警溫度是小于35度大于42度,可是程序中當(dāng)溫度低于30度時(shí)蜂鳴器會(huì)響,可是高于30度之后蜂鳴器就不會(huì)響了,上限報(bào)警時(shí)也是這樣,當(dāng)把報(bào)警溫度設(shè)置成29度時(shí),大于29度時(shí)蜂鳴器會(huì)響,超過(guò)30度之后蜂鳴器就不響了。把蜂鳴器的引腳接到led管上面發(fā)現(xiàn)一超過(guò)30度蜂鳴器的引腳就不會(huì)輸出電平了,請(qǐng)問(wèn)一下這是為什么,是代碼的問(wèn)題么,還是ds18b20設(shè)置的問(wèn)題。
單片機(jī)源程序如下:
#include<reg51.h>
#include"lcd.h"
#include"temp.h"
sbit Beep = P3^0 ;
void delay(unsigned int i) ;
void beep();
uchar CNCHAR[6] = "攝氏度";
void LcdDisplay(int);
void UsartConfiguration();
void main()
{
float ftp,ntp;
beep();
UsartConfiguration();
LcdInit(); //初始化LCD1602
LcdWriteCom(0x88); //寫(xiě)地址 80表示初始地址
LcdWriteData('*');
LcdWriteCom(0x89); //寫(xiě)地址 80表示初始地址
LcdWriteData('C');
ftp=Ds18b20ReadTemp();
Delay1ms(1000);
ftp=Ds18b20ReadTemp();
TiaoRu:
while(1)
{
ntp=Ds18b20ReadTemp();
if((ntp*0.0625)>(ftp*0.0625))
{
LcdDisplay(ntp);
ftp=ntp;
if(((ntp*0.0625)/10)<3.5)
{
goto TiaoChu;
}
if(((ntp*0.0625)/10)>4.2)
{
goto TiaoChu;
}
else
LcdDisplay(ntp);
}
else
{
LcdDisplay(ftp);
}
}
TiaoChu:
beep();
goto TiaoRu;
}
void LcdDisplay(int temp) //lcd顯示
{
unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
{
LcdWriteCom(0x80); //寫(xiě)地址 80表示初始地址
SBUF='-'; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
LcdWriteData('-'); //顯示負(fù)
//因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算由?.5,還是在小數(shù)點(diǎn)后面。
}
else
{
LcdWriteCom(0x80); //寫(xiě)地址 80表示初始地址
LcdWriteData('+'); //顯示正
SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while(!TI); //等待發(fā)送數(shù)據(jù)完成
TI=0; //清除發(fā)送完成標(biāo)志位
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
temp=tp*0.0625*100+0.5;
//留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
//后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算加上0.5,還是在小數(shù)點(diǎn)后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCom(0x82); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
SBUF = '0'+datas[0]; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x83); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
SBUF = '0'+datas[1]; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x84); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[2]); //個(gè)位
SBUF = '0'+datas[2]; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x85); //寫(xiě)地址 80表示初始地址
LcdWriteData('.'); //顯示 ‘.’
SBUF = '.'; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x86); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
SBUF = '0'+datas[3]; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
LcdWriteCom(0x87); //寫(xiě)地址 80表示初始地址
LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
SBUF = '0'+datas[4]; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
for(i=0; i<6; i++)
{
SBUF = CNCHAR[i]; //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
while (!TI); //等待發(fā)送數(shù)據(jù)完成
TI = 0;
}
}
void UsartConfiguration()
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
TL1=0XF3;
// ES=1; //打開(kāi)接收中斷
// EA=1; //打開(kāi)總中斷
TR1=1; //打開(kāi)計(jì)數(shù)器
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void beep()
{
int i;
while(i<3000)
{
Beep=1;
delay(5);
Beep=0;
delay(5);
i++;
}
}
復(fù)制代碼
作者:
wushiye54
時(shí)間:
2018-10-22 16:03
牛逼啊,居然敢使用goto語(yǔ)句寫(xiě)單片機(jī)。。
作者:
xuyaqi
時(shí)間:
2018-10-22 21:21
如果測(cè)溫度實(shí)現(xiàn)了,報(bào)警邏輯應(yīng)該很簡(jiǎn)單:
if(當(dāng)前溫度>42 || 當(dāng)前溫度<35 ){ 報(bào)警響;}
else{報(bào)警停;}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1