找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2648|回复: 1
收起左侧

单片机酒精浓度测试程序+Proteus仿真原理图 注释很详细

[复制链接]
ID:942199 发表于 2021-7-7 22:14 | 显示全部楼层 |阅读模式
酒精传感器仿真中没有,其实就是传感器检测时相应的电阻值会变化,用滑动电位器代替就ok
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

单片机源程序如下:
  1. //程序头函数
  2. #include <reg52.h>
  3. //显示函数
  4. #include <display.h>
  5. #include <intrins.h>
  6. #include "eeprom52.h"
  7. #include "temp.h"

  8. //宏定义
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. #define Data_ADC0809 P1

  12. //管脚声明
  13. sbit P34=P3^4;//温度
  14. sbit LED_R= P2^2; //红指示灯
  15. sbit LED_G= P2^0; //绿色指示灯
  16. sbit FENG = P2^5; //蜂鸣器
  17. //ADC0809
  18. sbit ST=P3^3;
  19. sbit EOC=P3^6;
  20. sbit OE=P3^2;
  21. //按键
  22. sbit Key1=P2^6;        //设置按键
  23. sbit Key2=P2^7; //加
  24. sbit Key3=P3^7;        //减
  25. bit bdata flag;//指示灯和蜂鸣器闪烁报警标志位
  26. uchar set;          //设置标志位


  27. //函数声明
  28. extern uchar ADC0809();
  29. extern void Key();

  30. //酒精含量变量
  31. unsigned int temp=0;
  32. unsigned int WARNING=25; // 初始报警值
  33. /******************把数据保存到单片机内部eeprom中******************/
  34. void write_eeprom()
  35. {
  36.         SectorErase(0x2000);
  37.         byte_write(0x2000, WARNING);
  38.         byte_write(0x2060, a_a);        
  39. }

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

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

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

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

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

仿真程序51hei提供下载:
酒精浓度检测仪.zip (620.73 KB, 下载次数: 87)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:957243 发表于 2021-9-21 15:37 | 显示全部楼层
请问中断函数计时的作用是什么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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