OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4510|回复: 3

烟雾报警器中蜂鸣器和1602显示温度不能同时很好的工作

[复制链接]

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-9-22
在线时间
3 小时
发表于 2015-10-18 09:23:45 | 显示全部楼层 |阅读模式
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]); //显示小数点  
}
望大神指点下,感激不尽

最佳答案

查看完整内容[请看2#楼]

回复【2楼】guset_03: 谢了,我找到问题的所在了,蜂鸣器加了个for循环,问题轻松搞定。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-9-22
在线时间
3 小时
 楼主| 发表于 2015-10-18 09:23:46 | 显示全部楼层
回复【2楼】guset_03:
谢了,我找到问题的所在了,蜂鸣器加了个for循环,问题轻松搞定。
回复

使用道具 举报

1

主题

374

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1325
金钱
1325
注册时间
2014-7-23
在线时间
421 小时
发表于 2015-10-18 12:57:39 | 显示全部楼层
吧不用的中断关掉先。。。。。。。。。。
回复

使用道具 举报

7

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-7-13
在线时间
5 小时
发表于 2019-11-17 20:47:47 | 显示全部楼层
你好,请问你用32做出来了吗?刚刚入门32能把源码给我看一看吗,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 21:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表