找回密码
 立即注册

QQ登录

只需一步,快速开始

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

之前做的酒精检测并lcd1602显示的单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:639814 发表于 2019-12-2 18:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机
2.采用AD0809模数转换芯片将MQ-3酒精传感器采集的电压信号转换成数字信号
3.液晶1602显示酒精浓度。可以按键设置报警值,蜂鸣器和LED报警
4.当浓度没有超过设置的阀值的时候绿灯闪亮,当超过上限值时候红灯闪烁并蜂鸣器报警。


单片机源程序如下:
  1. //程序头函数
  2. #include <reg52.h>
  3. //显示函数
  4. #include <display.h>

  5. #include <intrins.h>
  6. #include "eeprom52.h"
  7. //宏定义
  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. #define Data_ADC0809 P1

  11. //管脚声明
  12. sbit LED_R= P2^2; //红指示灯
  13. sbit LED_G= P2^0; //绿色指示灯
  14. sbit FENG = P2^5; //蜂鸣器
  15. //ADC0809
  16. sbit ST=P3^3;
  17. sbit EOC=P3^6;
  18. sbit OE=P3^2;
  19. //按键
  20. sbit Key1=P2^6;        //设置按键
  21. sbit Key2=P2^7; //加
  22. sbit Key3=P3^7;        //减

  23. bit bdata flag;//指示灯和蜂鸣器闪烁报警标志位
  24. uchar set;          //设置标志位


  25. //函数声明
  26. extern uchar ADC0809();
  27. extern void Key();

  28. //酒精含量变量
  29. uchar temp=0;



  30. uchar WARNING=25; // 初始报警值

  31. /******************把数据保存到单片机内部eeprom中******************/
  32. void write_eeprom()
  33. {
  34.         SectorErase(0x2000);
  35.         byte_write(0x2000, WARNING);
  36.         byte_write(0x2060, a_a);       
  37. }

  38. /******************把数据从单片机内部eeprom中读出来*****************/
  39. void read_eeprom()
  40. {
  41.         WARNING   = byte_read(0x2000);
  42.         a_a      = byte_read(0x2060);
  43. }

  44. /**************开机自检eeprom初始化*****************/
  45. void init_eeprom()
  46. {
  47.         read_eeprom();                //先读
  48.         if(a_a != 1)                //新的单片机初始单片机内问eeprom
  49.         {
  50.                 WARNING   = 25;
  51.                 a_a = 1;
  52.                 write_eeprom();           //保存数据
  53.         }       
  54. }
  55. //初始化函数
  56. void init()         
  57. {
  58.         TMOD=0x01; //定时器0方式1
  59.         TL0=0xb0;
  60.         TH0=0x3c;  //赋初值
  61.         EA=1;        //开总中断
  62.         ET0=1;        //允许定时器0中断
  63.         TR0=1;        //定时器0开
  64. }
  65. //主函数
  66. void main()
  67. {
  68.         Init1602();        //1602初始化
  69.         init_eeprom();  //开始初始化保存的数据
  70.         init();         //初始化函数
  71.         while(1)//主循环
  72.         {
  73.                 if(set==0) //如果没有按下设置(默认set是0,就是正常显示状态)
  74.                 {
  75.                         temp=ADC0809();        //读取酒精值
  76.                         Display_1602(temp,WARNING);         //显示酒精值
  77.                 }
  78.                 if(temp<WARNING&&set==0)        //如果实际的酒精值小于报警值且在正常显示状态下
  79.                 {
  80.                         flag=0;         //执行下面flag=0的(主要就是绿灯闪,关蜂鸣器和继电器)
  81.                 }
  82.                 else if(temp>WARNING&&set==0)  //如果实际的酒精值大于报警值且在正常显示状态下
  83.                 {
  84.                         flag=1;        //执行下面flag=1的(主要就是红灯闪,开蜂鸣器和继电器)
  85.                 }
  86.                 Key();//按键扫描
  87.         }
  88. }
  89. //ADC0809读取信息
  90. uchar ADC0809()
  91. {
  92.         uchar temp_=0x00;
  93.         //初始化高阻太

  94.         OE=0;
  95.         //转化初始化
  96.         ST=0;
  97.         //开始转换
  98.         ST=1;
  99.         ST=0;
  100.         //外部中断等待AD转换结束
  101.         while(EOC==0)
  102.         //读取转换的AD值
  103.         OE=1;
  104.         temp_=Data_ADC0809;
  105.         OE=0;
  106.         return temp_;
  107. }
  108. //按键函数
  109. void Key()
  110. {
  111.         if(Key1==0)        //如果设置按键按下
  112.         {
  113.                 while(Key1==0);//等待按键释放
  114.                 FENG=0;        //蜂鸣器响
  115.                 set++;        //设置的变量加1
  116.                 flag=0;        //绿灯闪
  117.                 TR0=0;        //关定时器0
  118.                 write_com(0x0f);//打开显示 无光标 光标闪烁
  119.                 write_com(0x80+0x40+13);//位置
  120. //                   write_com(0x06);//当读或写一个字符是指针后一一位
  121.                 FENG=1;        //蜂鸣器关
  122.         }
  123.         if(set>=2)        //又按了下设置
  124.         {
  125.                 set=0;        //正常显示状态
  126. //                write_com(0x38);//屏幕初始化
  127.                 write_com(0x0c);//打开显示 无光标 无光标闪烁
  128.                 FENG=1;        //蜂鸣器关
  129.                 flag=1;        //红灯闪
  130.                 TR0=1;        //定时器0开
  131.         }
  132.         if(Key2==0&&set!=0)          //在设置的状态下按下加
  133.         {
  134.                 while(Key2==0);          //等待按键释放
  135.                 FENG=0;                //蜂鸣器响
  136.                 WARNING++;        //报警值加1
  137.                 if(WARNING>=255)  //如果报警值大于等于255
  138.                 WARNING=0;                 //报警值归零
  139.                 write_com(0x80+0x40+11);
  140.                 write_data('0'+WARNING/100);
  141.                 write_data('0'+WARNING/10%10);
  142.                 write_data('0'+WARNING%10);           //显示报警值
  143.                 write_com(0x80+0x40+13);//调整位置
  144.                 FENG=1;         //蜂鸣器关
  145.                 write_eeprom();                           //保存数据
  146.         }
  147.         if(Key3==0&&set!=0)         //在设置的状态下按下减
  148.         {
  149.                 while(Key3==0);         //等待按键释放
  150.                 FENG=0;                 //蜂鸣器响
  151.                 WARNING--;         //报警值减1
  152.                 if(WARNING<=0)        //如果报警值小于等于0
  153.                 WARNING=255;        //那么报警值为255
  154.                 write_com(0x80+0x40+11);
  155.                 write_data('0'+WARNING/100);
  156.                 write_data('0'+WARNING/10%10);
  157.                 write_data('0'+WARNING%10);
  158.                 write_com(0x80+0x40+13);//调整位置
  159.                 FENG=1;         //蜂鸣器关
  160.                 write_eeprom();                           //保存数据
  161.         }
  162. }

  163. void  time1_int(void) interrupt 1 //定时器中断0
  164. {
  165.         uchar count;
  166.         TL0=0xb0;
  167.         TH0=0x3c;  //重赋初值50ms
  168.           count++;  ///溢出值加1
  169.         if(count==10)  //如果时间到半秒
  170.         {
  171.                 if(flag==0)          //如果flag为0
  172.                 {
  173.                         LED_G=0;  //绿灯亮
  174.                         LED_R=1;  //红灯灭
  175.                         FENG=1;          //蜂鸣器关
  176.                 }
  177.                 if(flag==1)           //如果flag为1
  178.                 {
  179.                         LED_G=1;   //绿灯关
  180.                         LED_R=0;   //红灯亮
  181.                         FENG=0;           //蜂鸣器开
  182.                 }
  183.         }

  184.            if(count==20)          //如果时间到1秒
  185.            {
  186.                 count=0;          //溢出值清零
  187.                 if(flag==0)         //如果flag为0
  188.                 {
  189.                         LED_G=1;        //绿灯关
  190.                         LED_R=1;        //红灯灭
  191.                         FENG=1;           //蜂鸣器关
  192.                 }
  193.                 if(flag==1)           //如果flag为1
  194.                 {
  195.                         LED_G=1;   //绿灯关
  196.                         LED_R=1;        //红灯灭
  197.                         FENG=1;           //蜂鸣器关
  198.                 }
  199.         }
  200. }
复制代码

所有资料51hei提供下载:
1-程序.zip (46.29 KB, 下载次数: 28)

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

使用道具 举报

沙发
ID:1 发表于 2019-12-4 18:17 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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