久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
關于單片機驅動ds18b20做體溫計的問題
[打印本頁]
作者:
再帥也不是主角
時間:
2018-10-21 10:16
標題:
關于單片機驅動ds18b20做體溫計的問題
樓主用ds18b20做體溫計,要求的報警溫度是小于35度大于42度,可是程序中當溫度低于30度時蜂鳴器會響,可是高于30度之后蜂鳴器就不會響了,上限報警時也是這樣,當把報警溫度設置成29度時,大于29度時蜂鳴器會響,超過30度之后蜂鳴器就不響了。把蜂鳴器的引腳接到led管上面發現一超過30度蜂鳴器的引腳就不會輸出電平了,請問一下這是為什么,是代碼的問題么,還是ds18b20設置的問題。
單片機源程序如下:
#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); //寫地址 80表示初始地址
LcdWriteData('*');
LcdWriteCom(0x89); //寫地址 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}; //定義數組
float tp;
if(temp< 0) //當溫度值為負數
{
LcdWriteCom(0x80); //寫地址 80表示初始地址
SBUF='-'; //將接收到的數據放入到發送寄存器
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
LcdWriteData('-'); //顯示負
//因為讀取的溫度是實際溫度的補碼,所以減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
{
LcdWriteCom(0x80); //寫地址 80表示初始地址
LcdWriteData('+'); //顯示正
SBUF='+';//將接收到的數據放入到發送寄存器
while(!TI); //等待發送數據完成
TI=0; //清除發送完成標志位
tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
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); //寫地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
SBUF = '0'+datas[0]; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x83); //寫地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
SBUF = '0'+datas[1]; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x84); //寫地址 80表示初始地址
LcdWriteData('0'+datas[2]); //個位
SBUF = '0'+datas[2]; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x85); //寫地址 80表示初始地址
LcdWriteData('.'); //顯示 ‘.’
SBUF = '.'; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x86); //寫地址 80表示初始地址
LcdWriteData('0'+datas[3]); //顯示小數點
SBUF = '0'+datas[3]; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
LcdWriteCom(0x87); //寫地址 80表示初始地址
LcdWriteData('0'+datas[4]); //顯示小數點
SBUF = '0'+datas[4]; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
for(i=0; i<6; i++)
{
SBUF = CNCHAR[i]; //將接收到的數據放入到發送寄存器
while (!TI); //等待發送數據完成
TI = 0;
}
}
void UsartConfiguration()
{
SCON=0X50; //設置為工作方式1
TMOD=0X20; //設置計數器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //計數器初始值設置,注意波特率是4800的
TL1=0XF3;
// ES=1; //打開接收中斷
// EA=1; //打開總中斷
TR1=1; //打開計數器
}
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++;
}
}
復制代碼
作者:
wushiye54
時間:
2018-10-22 16:03
牛逼啊,居然敢使用goto語句寫單片機。。
作者:
xuyaqi
時間:
2018-10-22 21:21
如果測溫度實現了,報警邏輯應該很簡單:
if(當前溫度>42 || 當前溫度<35 ){ 報警響;}
else{報警停;}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
91视频中文
|
黄色av网站在线观看
|
91xxx在线观看
|
国产在线视频在线观看
|
久久99精品久久久久蜜桃tv
|
亚洲视频中文字幕
|
91视频网址
|
最近中文字幕第一页
|
日韩精品免费一区
|
国产精品国色综合久久
|
日韩精品中文字幕一区二区三区
|
成人免费看黄
|
日韩在线三级
|
日韩精品
|
国产精品毛片
|
www.日日操
|
亚洲精品日韩精品
|
一区二区成人
|
色视频网站
|
亚洲一区二区久久久
|
亚洲天堂中文字幕
|
国产精品久久久久久久久久久久
|
国产精品免费观看视频
|
日韩不卡在线观看
|
在线播放国产视频
|
久久性色
|
亚洲欧美一区二区在线观看
|
成人永久免费视频
|
久久久国产一区二区三区
|
久久里面有精品
|
综合激情av
|
天堂在线www
|
亚洲精选一区二区
|
日日干日日操
|
亚洲天堂中文字幕
|
久久久久久久久91
|
成人欧美一区二区三区在线观看
|
日韩一级免费看
|
国产三区精品
|
欧美一区二区三
|
成人午夜免费视频
|