初级会员

- 积分
- 58
- 金钱
- 58
- 注册时间
- 2015-9-22
- 在线时间
- 3 小时
|
5金钱
各位大神好,我现在想做一个烟雾报警器,1602显示18B20的温度。用mq-2检测可燃气体的浓度,当浓度达到设定值的时候led小灯点亮、蜂鸣器响。很简单
但是当代码写好后发现蜂鸣器响声有点闷。当程序改的蜂鸣器响的声音效果好的时候,1602显示的温度就会乱码。总之1602显示的温度和蜂鸣器不能很好的
同时工作。请问怎么回事?新人一枚问的问题比较简单,多多指教。代码如下(程序是51的,水平有限,想先用51做出效果后再用32做)
#include<reg51.h>
#include"lcd.h"
#include"temp.h"
void LcdDisplay(int);
sbit LED=P1^0;//指示端
sbit DOUT=P2^0;//传感器的输入端
sbit Beep=P3^0;
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void delay_ms(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main()
{
EA=1; //开启总中断
// ET0=1; //允许T0中断
EX0=1; //打开外部中断0中断
IT0=1; //外部中断0触发方式选择打开 下降沿有效
TR0=0;
LcdInit(); //初始化LCD1602
LcdWriteCom(0x88); //写地址 80表示初始地址
LcdWriteData('C');
while(1)
{
LED=1;//熄灭P1.0口灯
if(DOUT==0)//当高于设定值时 ,执行条件函数
{
LED=0;
// delay(20);//延时抗干扰
Beep= 1;
delay_ms(50);
Beep= 0;
delay_ms(50);
}
if(DOUT==1)//确定 浓度低于设定值时 ,执行条件函数
{
LED=1;//点亮P1.0口灯
// delay(20);
}
LcdDisplay(Ds18b20ReadTemp());
// Delay1ms(1000);//1s钟刷一次
}
}
/*******************************************************************************
* 函数名 : LcdDisplay()
* 函数功能 : LCD显示读取到的温度
* 输入 : v
* 输出 : 无
*******************************************************************************/
void in0() interrupt 0
{
EX0=0;
}
void LcdDisplay(int temp) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0) //当温度值为负数
{
LcdWriteCom(0x80); //写地址 80表示初始地址
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('+'); //显示正
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]); //百位
LcdWriteCom(0x83); //写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
LcdWriteCom(0x84); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
LcdWriteCom(0x85); //写地址 80表示初始地址
LcdWriteData('.'); //显示 ‘.’
LcdWriteCom(0x86); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
LcdWriteCom(0x87); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
}
望大神指点下,感激不尽
|
|