标题:
关于单片机驱动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.51hei.com/bbs/)
Powered by Discuz! X3.1