找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5456|回复: 6
收起左侧

单片机数码显示酒精浓度测试仪的仿真程序设计与制作

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

数码管显示酒精测试仪元件清单
1)    9*15万用板
2)    STC89C51单片机
3)    AD0809
4)    40脚IC座
5)    28脚IC座
6)    MQ-3酒精传感器
7)    103排阻
8)    0.56四位一体共阳数码管
9)    9012三极管*5
10)    2.2k电阻*6
11)    220欧姆电阻
12)    10k电阻
13)    10uf电容
14)    30pf电容*2
15)    12M晶振
16)    5mm红LED
17)    按键*3
18)    蜂鸣器
19)    自锁开关
20)    DC电源插口
21)    导线若干
22)    焊锡若干
23)    USB电源线或电池盒+DC插头

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

  3. //宏定义
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define Data_ADC0809 P1                   //定义P1口为Data_ADC0809

  7. //管脚声明
  8. sbit Feng = P3^0;                   //蜂鸣器
  9. //ADC0809
  10. sbit ST=P3^3;
  11. sbit EOC=P3^4;
  12. sbit OE=P3^2;
  13. //按键
  14. sbit Key1=P3^5;
  15. sbit Key2=P3^6;
  16. sbit Key3=P3^7;
  17. bit shan=0;                                   //闪烁标志位

  18. //显示数组                0-9+F
  19. uchar Data_[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71,0x3f};         //共阴显示数组
  20. sbit Wei1 = P2^7;
  21. sbit Wei2 = P2^6;
  22. sbit Wei3 = P2^5;
  23. sbit Wei4 = P2^4;                                 //四个数码管的位选端口
  24. //函数声明
  25. extern uchar ADC0809();
  26. void Display(uchar X,uchar Data);
  27. void delay(uint t);

  28. //酒精含量变量
  29. uchar temp=0;
  30. //蜂鸣器变量
  31. uchar FF=10;
  32. //显示模式
  33. uchar Mode=0;
  34. uchar p;

  35. void main()                                  //主函数
  36. {
  37.         TH0=0x3c;
  38.         TL0=0xb0;//赋初值50ms
  39.         TMOD=0x01;//设置工作方式
  40.         EA=1;//打开中断总开关
  41.         ET0=1;//打开允许开关
  42.         TR0=1;        //打开定时器定时开关
  43.         while(1)           //进入循环,括号内为1,所以程序进入循环就不会出来了,所以就叫死循环
  44.         {
  45.                 //正常模式
  46.                 if(Mode==0)
  47.                 {
  48.                         //读取AD值
  49.                         temp=ADC0809();
  50.                         for(p=0;p<30;p++)           //调用三十次显示函数
  51.                         Display(0,temp);
  52.                         //判断是否报警
  53.                         if((shan==1)&&(temp>FF))   //闪烁变量为1时并且大于报警值
  54.                         {
  55.                                 Feng=0;                                   //蜂鸣器响
  56.                         }
  57.                         if(shan==0)                                   //闪烁变量为0时
  58.                         {
  59.                                 Feng=1;                                   //关闭蜂鸣器
  60.                         }                                                                   //(闪烁变量shan受定时器控制,500ms取反一次,达到1秒响一下的效果)
  61.                 }
  62.                 //调整模式
  63.                 else
  64.                 {
  65.                         Display(1,FF);                //显示报警值界面
  66.                 }
  67.                 //功能键
  68.                 if(Key3==0)                                   //设置键按下(按键一端接地,一端接单片机IO口,当按键按下时,单片机的IO口就会检测到低电平)
  69.                 {
  70.                         Feng=0;                                        //蜂鸣器响
  71.                         delay(100);                                //延时去抖
  72.                         while(Key3==0)                        //判断按键是否按下
  73.                         {
  74.                                 if(Mode==0)                        //正常模式
  75.                                         Display(0,temp);//显示正常界面       
  76.                                 else                                //设置报警值
  77.                                         Display(1,FF);        //显示报警值界面                                                               
  78.                         }
  79.                         if(Mode==0)                                //如果是正常模式,按下设置键,就切换到设置模式
  80.                                 Mode=1;
  81.                         else                                        //如果是设置模式,按下设置键,就切换到正常模式
  82.                                 Mode=0;
  83.                         Feng=1;                                        //关闭蜂鸣器
  84.                 }
  85.                 //增加
  86.                 if(Key2==0&&Mode==1)                //加键按下
  87.                 {
  88.                         Feng=0;                                        //蜂鸣器响
  89.                         delay(100);
  90.                         while(Key2==0)
  91.                         {
  92.                                         Display(1,FF);        //显示设置界面                                                               
  93.                         }
  94.                         FF++;                                        //报警值加
  95.                         if(FF>=251)                                //最大加到250
  96.                                 FF=250;       
  97.                         Feng=1;                                        //关闭蜂鸣器
  98.                 }
  99.                 //减少
  100.                 if(Key1==0&&Mode==1)                //减按键按下,注释参考加按键注释
  101.                 {
  102.                         Feng=0;
  103.                         delay(100);
  104.                         while(Key1==0)
  105.                         {
  106.                                         Display(1,FF);                                                                       
  107.                         }
  108.                         FF--;
  109.                         if(FF==0xff)                        //报警值减到小于0
  110.                                 FF=0;                                //最小值就是0
  111.                         Feng=1;
  112.                 }
  113.         }
  114. }
  115. //ADC0809读取信息
  116. uchar ADC0809()
  117. {
  118.         uchar temp_=0x00;
  119.         //初始化高阻太
  120.         OE=0;
  121.         //转化初始化
  122.         ST=0;
  123.         //开始转换
  124.         ST=1;
  125.         ST=0;
  126.         //外部中断等待AD转换结束
  127.         while(EOC==0)
  128.         //读取转换的AD值
  129.         OE=1;
  130.         temp_=Data_ADC0809;
  131.         OE=0;
  132.         return temp_;
  133. }
  134. //延时
  135. void delay(uint t)
  136. {
  137.         uint i,j;
  138.         for(i=0;i<t;i++)
  139.                 for(j=0;j<10;j++);
  140. }

  141. //显示       X表示状态     Data表示数据
  142. void Display(uchar X,uchar Data)
  143. {
  144.         Wei1=1;
  145.         Wei2=1;
  146.         Wei3=1;
  147.         Wei4=1;
  148.         P0=0xff;                        //关闭显示

  149.         //正常模式
  150.         if(X==0)
  151.         {
  152.                 P0=~Data_[11];         //显示0,也就是正常模式时,第一个位置显示0
  153.         }
  154.         //非正常
  155.         else                                 
  156.         {
  157.                 P0=~Data_[10];         //设置模式,第一位显示字母F
  158.         }
  159.         Wei1=0;                                 //选中第一位,其他位关闭
  160.         Wei2=1;
  161.         Wei3=1;
  162.         Wei4=1;
  163.         delay(10);                         //延时
  164.         Wei1=1;                                 //关闭所有位
  165.         Wei2=1;
  166.         Wei3=1;
  167.         Wei4=1;

  168.         P0=~Data_[Data/100]; //显示数值的百位,例如数据是123,除以100的商是1,这里显示的就是数字1
  169.         Wei1=1;
  170.         Wei2=0;                                 //选中第二位
  171.         Wei3=1;
  172.         Wei4=1;
  173.         delay(10);                         //延时
  174.         Wei1=1;                                 //关闭所有位
  175.         Wei2=1;
  176.         Wei3=1;
  177.         Wei4=1;


  178.         P0=~Data_[Data%100/10];//显示数值的十位,数值是123,取余的作用就是除以100后的余数,是23,23再除以10得到的商是2,这里显示的就是2
  179.         Wei1=1;
  180.         Wei2=1;
  181.         Wei3=0;
  182.         Wei4=1;
  183.         delay(10);
  184.         Wei1=1;
  185.         Wei2=1;
  186.         Wei3=1;
  187.         Wei4=1;

  188.         P0=~Data_[Data%10];          //显示数值的个位,数值是123,取余10就是数值除以10的余数就是3,这里显示的就是3
  189.         Wei1=1;
  190.         Wei2=1;
  191.         Wei3=1;
  192.         Wei4=0;
  193.         delay(10);
  194.         Wei1=1;
  195.         Wei2=1;
  196.         Wei3=1;
  197.         Wei4=1;

  198. }
  199. void time0() interrupt 1//定时器函数
  200. {
  201.         uchar m;
  202.         TH0=0x3c;
  203.         TL0=0xb0;//重新赋初值
  204.         m++;          //定时器进入一次是50ms,m加一次
  205.         if(m==10)  //加10次,也就是500ms
  206.         {
  207.                 shan=~shan;          //控制shan变量取反,就是0变1,1变0
  208.                 m=0;                  //m清零
  209.         }
  210. }
复制代码

所有资料51hei提供下载:
数码管酒精浓度测试仪.rar (2.8 MB, 下载次数: 110)

评分

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

查看全部评分

回复

使用道具 举报

ID:555934 发表于 2019-6-5 22:40 | 显示全部楼层
您好,为什么protuce仿真不出来?
回复

使用道具 举报

ID:555934 发表于 2019-6-6 09:37 来自手机
您好,急用啊,马上交课程设计了,请问为啥仿真不出来?

ID:640963 发表于 2019-11-22 17:09 | 显示全部楼层
请问有p'c'b
回复

使用道具 举报

ID:66679 发表于 2020-2-27 21:46 | 显示全部楼层
JKlxr 发表于 2019-6-5 22:40
您好,为什么protuce仿真不出来?

不好意思,一直没登录,可以仿真出来。
回复

使用道具 举报

ID:747411 发表于 2020-5-9 14:41 | 显示全部楼层
不能仿真运行
回复

使用道具 举报

ID:747411 发表于 2020-5-9 22:20 来自手机 | 显示全部楼层
hyjxxy 发表于 2020-2-27 21:46
不好意思,一直没登录,可以仿真出来。

运行不了,运行后不显示数字
回复

使用道具 举报

ID:935804 发表于 2021-6-10 09:06 | 显示全部楼层
运行不了还需要怎么修改啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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