找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2040|回复: 0
打印 上一主题 下一主题
收起左侧

这个烟雾传感器的单片机程序我想加一个继电器带风扇 怎么做?

[复制链接]
跳转到指定楼层
楼主
ID:297587 发表于 2018-5-22 20:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这个是温度与烟雾传感器的程序,可以实现读取温度、调温度的报警值,当温度或者烟雾传感器达到设定值后蜂鸣器会报警。现在我想让他实现报警的时候继电器也通电,8颗流水灯快速闪烁。我的实验板继电器是P1.4口,八颗led灯是P2口。请教大神该怎么改啊。

  1. #include <reg52.h>
  2. #include "18b20.h"
  3. #include <intrins.h>
  4. #define uint unsigned int//宏定义
  5. #define uchar unsigned char//宏定义
  6. #define date P0   //数码管段选
  7. uint temp,alarm_temp;//定义温度,设定温度
  8. bit key_lock,chang_flag;
  9. bit zerotemp_flag; //负温度标志位
  10. uchar code LED[] = {0xC0,0xF9,0xA4,
  11. 0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //三位共阳极数码管0~9的断码
  12. //数码管位定义
  13. sbit ge  = P1^3;//个位
  14. sbit shi = P1^2;//十位
  15. sbit bai = P1^1;//百位
  16. sbit bell = P1^5;//蜂鸣器定义
  17. sbit MQ = P1^6;//MQ-2定义
  18. sbit DQ = P3^2;//18B20定义
  19. //按键定义
  20. sbit key0 = P3^2;
  21. sbit key1 = P3^3;
  22. sbit key2 = P3^4;
  23. sbit key3 = P3^5;
  24. void delay_ms(uint xms)
  25. {//延时子程序
  26. uint i,j;
  27. for(i=xms;i>0;i--)//i=xms即延时约xms;
  28.   for(j=110;j>0;j--);
  29. }
  30. void delay_us(uint z)
  31. {//微妙级延时
  32.     while(z--)
  33.         _nop_();
  34. }
  35. void display(uint x)
  36. {//数码管显示子程序
  37. //取一温度值x
  38. uint temp1;
  39. temp1 = x;
  40. temp1 = temp1%1000;//使温度值不超过三位有效数
  41. //动态显示
  42. //显示个位
  43. ge = 0;//开显示
  44. date = LED[temp1%10];//将temp1的个位显示出来
  45. delay_ms(2);//延时2ms
  46. ge = 1;//关显示
  47. //显示十位  
  48. shi = 0;//开显示
  49. date = LED[temp1%100/10]&0x7f;  //将temp1的十位显示出来,并显示小数点dp位
  50. delay_ms(2);//延时2ms
  51. shi = 1;//关显示
  52. //显示百位
  53. bai = 0;//开显示
  54. date = LED[temp1/100];//将temp1的百位显示出来
  55. delay_ms(2);//延时2ms
  56. bai = 1; //关显示
  57. }
  58. void alarm(void)
  59. {//报警子程序
  60. if((temp>alarm_temp)|(MQ == 0))//如果温度大于设定值或MQ2=0
  61. {         
  62.   bell = 0;//蜂鸣器响
  63.   
  64. }
  65. else
  66.   bell = 1;//蜂鸣器不响
  67.   
  68. }
  69. /*****************18B20程序******************/
  70. void fuwei(void)
  71. {//18B20复位
  72.     DQ = 0;
  73.     delay_us(50);    //600us
  74.     DQ = 1;
  75.     delay_us(5);     //70us
  76. }
  77. uchar read_18B20(void)
  78. {//从18B20读取8位数据
  79.     uchar i,dat;             //从最低位开始接收
  80.     for(i = 0;i<8;i++)
  81.     {
  82.         dat>>=1;             //数据右移一位
  83.         DQ = 0;
  84.         _nop_();             //延时1us
  85.         DQ = 1;              //释放总线        
  86.         _nop_();             //延时2us后在读取,不然读取值会紊乱,很关键!!!
  87.         _nop_();
  88.         if(DQ)
  89.             dat|=0x80;       //如果接收到的是1,则最高位置为1
  90.         delay_us(2);         //延时40us
  91.     }
  92.     return dat;
  93. }
  94. void write_18B20(uchar dat)
  95. {//对18B20写8位数据
  96.     uchar i;
  97.     for(i = 0;i<8;i++)
  98.     {
  99.         DQ = 0;
  100.         _nop_();//延时10us
  101.         DQ = (bit)(dat&0x01);  //从最低位开始发送
  102.         dat>>=1;              //右移一位
  103.         delay_us(1);          //延时40us
  104.         DQ = 1;               //释放总线
  105.     }
  106.    
  107. }
  108. void changetemp(void)
  109. {//温度值转换
  110.     uint Temp_L,Temp_H;
  111.     Temp_L = read_18B20();//读取低八位
  112.     Temp_H = read_18B20();//读取高八位,当温度为负数时 temp(7~4)为1,反之为0
  113.     if(((bit)(Temp_H&0x80)))
  114.     {
  115.         zerotemp_flag = 1; //温度为负数标志位
  116.         //负温度计算
  117.         Temp_H &= 0x0f;
  118.         temp = (Temp_H<<8|Temp_L)*0.625;
  119.     }
  120.    
  121.     temp = (Temp_H<<8|Temp_L)*0.625; //保存一位小数
  122. }
  123. void read_temp(void)
  124. {//从18B20读取温度   
  125.      fuwei();       //复位
  126.      delay_us(10);   //延时
  127.      write_18B20(0xcc);//跳过读取序列号   
  128.      write_18B20(0x44);//开始转换温度
  129.      fuwei();       //复位
  130.      delay_us(10);   //延时
  131.      write_18B20(0xcc);//跳过读取序列号
  132.      write_18B20(0xbe);//读暂存指令
  133.      changetemp();  //读取转换温度
  134.      fuwei();      //复位
  135. }
  136. int main(void)
  137. {//主程序
  138. alarm_temp = 300;//设定温度初始值
  139. read_temp();//18b20测温
  140. delay_ms(500);//延迟500ms
  141. while(1)
  142. {
  143.   read_temp();//18b20测温
  144.   display(temp);//显示测到的温度
  145.   alarm();//报警
  146.   if(!key0)//如果key0=0,则进入温度修改状态
  147.   {
  148.    delay_ms(2);//延迟2ms,消抖
  149.    if(!key0)//如果key0=0,则确定键按下,显示温度
  150.     chang_flag = 1;
  151.   }
  152.   while(chang_flag)
  153.   {
  154.    if(key1&key2)
  155.     key_lock = 1;//如果key1&key2=1,则无效
  156.    if(!key1)
  157.    {
  158.     delay_ms(2);//延迟2ms,消抖
  159.     if(!key1)
  160.     {
  161.      if(key_lock)
  162.      {
  163.       alarm_temp+=10; //alarm_temp+10=alarm_temp(温度加1)
  164.       if(alarm_temp>990)//如果数码管前两位大于99,则清零
  165.        alarm_temp = 0;
  166.       key_lock = 0;
  167.      }
  168.     }
  169.    }
  170.    if(!key2)
  171.    {
  172.     delay_ms(2);//延迟2ms,消抖
  173.     if(!key2)
  174.     {
  175.      if(key_lock)
  176.      {
  177.       alarm_temp-=10; //alarm_temp+10=alarm_temp(温度减1)
  178.       if(alarm_temp>1000)//如果三位数码管都是0,则减一后变为990
  179.        alarm_temp = 990;
  180.       key_lock = 0;
  181.      }
  182.     }
  183.    }
  184.    if(!key3)
  185.    {
  186.     delay_ms(2);//延迟2ms,消抖
  187.     if(!key3)
  188.     {
  189.      if(key_lock)
  190.      {
  191.       chang_flag = 0;
  192.       key_lock = 0;
  193.      }
  194.     }
  195.    }
  196.    display(alarm_temp);//显示设定温度
  197.   }
  198. }
  199. }
复制代码


   


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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