找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机便携式瓦斯监测仪设计(程序及Proteus仿真)

[复制链接]
ID:747757 发表于 2020-5-9 16:27 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

瓦斯传感器放大输出0~70MV,放大51倍后为0~3.57V
0~3.57V对应单片机采样码值为0~357,精度0.2MV
  1. /*烟雾检测系统程序,单片机通过ADC0808检测3路烟雾传感器信号,并通过液晶显示,超过设定门限就声光报警*/
  2. #include<reg52.h>
  3. #include "LCD1602.h"
  4. #include "da1302.h"

  5. unsigned int i;
  6. unsigned int j;
  7. unsigned char V_getdata1;         //传感器电压采集变量
  8. unsigned long V_temp1,alarm_temp;//传感器电压采集变量和设定报警值
  9. unsigned int alarm,speak;
  10. unsigned char V_temp1Buffer[10],alarm_tempBuffer[10];

  11. SYSTEMTIME CurrentTime ;        //建立时间结构体

  12. unsigned char count;  
  13. sbit ST=P3^0;
  14. sbit OE=P3^1;
  15. sbit EOC=P3^2;
  16. sbit AD_CLK=P3^3;        //ADC0809时钟
  17. sbit ADDA=P3^4;            //ADC0809选择通道口
  18. sbit ADDB=P3^5;
  19. sbit ADDC=P3^6;
  20. sbit ALARM=P3^7;
  21. sbit key1=P2^3;  //加1按钮
  22. sbit key2=P2^4;          //减1按钮

  23. void TimeInitial();
  24. void Delay(unsigned int i);

  25. void TimeInitial()                 //系统时钟初始化
  26. { TMOD=0x10;
  27.   TH1=(65536-200)/256;
  28.   TL1=(65536-200)%256;
  29.   EA=1;
  30.   ET1=1;
  31.   TR1=1;
  32. }
  33. void Delay(unsigned int i)
  34. {
  35.   unsigned int j;
  36.   for(;i>0;i--)
  37.   {
  38.   for(j=0;j<125;j++)
  39.   {;}
  40.   }
  41. }

  42. /******************************************/
  43. /*              LCD 显示转换字符程序              */
  44. /******************************************/
  45. void IntToStr(unsigned int t, unsigned char *str, unsigned char n)         //将整型数据转换成字符指针,在液晶上显示
  46. {
  47.         unsigned char a[3]; char i, j;                                                                                    
  48.         a[0]=(t/100)%10;                                             
  49.         a[1]=(t/10)%10;                                               
  50.         a[2]=(t/1)%10;                                                

  51.         for(i=0; i<3; i++)         //转成ASCII码                     
  52.                 a[i]=a[i]+'0';                                            
  53.         for(i=0; a[i]=='0' && i<=3; i++);                             
  54.         for(j=3-n; j<i; j++)       //填充空格                        
  55.                 { *str=' ';  str++; }                                    
  56.         for(; i<3; i++)                                               
  57.                 { *str=a[i]; str++; }  //加入有效的数字                  
  58.         *str='\0';
  59. }

  60. /******************************************/
  61. /*              延时子程序                */
  62. /******************************************/
  63. void Delay1ms(unsigned int count)
  64. {
  65.         unsigned int i,j;
  66.         for(i=0;i<count;i++)
  67.         for(j=0;j<120;j++);
  68. }

  69. /******************************************/
  70. /*              AD转换程序                    */
  71. /******************************************/

  72. void Voltaget_AD1() //第一路电压AD采样 IN0
  73. {
  74.     ST=0;
  75.         OE=0;
  76.         ST=1;
  77.         ST=0;
  78.         ADDA=0;                   //000设置A采样端口IN0
  79.         ADDB=0;
  80.         ADDC=0;
  81.         while(EOC==0);        //等待转换结束
  82.         OE=1;                        //允许转换输出
  83.         V_getdata1=P0;        //读取转换结果8位二进制数
  84.         OE=0;
  85.         V_temp1=V_getdata1*1.0/255*500;          //对采样结果进行常规变换
  86.         V_getdata1=0;
  87.         Delay(10);
  88. }


  89. void main()
  90. {
  91.    V_getdata1=0;
  92.    V_temp1=0; //传感器采集变量
  93.    ALARM=0;   //报警信号
  94.    alarm_temp=250; //初始化报警门限值250,对应电压为2.5V

  95.    TimeInitial();
  96.    LCD_Initial();                   //液晶屏初始化

  97.    GotoXY(0,0);                       //定位液晶显示位置第一行第一列
  98.    Print("The 1602 COUNTER");  //系统开机显示logo
  99.    GotoXY(0,1);
  100.    Print(" BY BF-SHNU  ");
  101.    Delay1ms(1000);
  102.    GotoXY(0,0);
  103.    Print("                 ");          //清空液晶屏
  104.    GotoXY(0,1);
  105.    Print("                 ");
  106.    while(1)
  107.    {
  108.                 Voltaget_AD1();                //电压采样一通道
  109.                 Delay(10);
  110.                
  111.                 IntToStr(V_temp1,&V_temp1Buffer[0],3);  //将采集到的电压数转换为液晶显示字符        
  112.                 IntToStr(alarm_temp,&alarm_tempBuffer[0],3);  //将采集到的电压数转换为液晶显示字符alarm_tempBuffer[10]
  113.             GotoXY(0,0);                   //设定液晶显示的位置,第1列第1行
  114.             Print("WSND:");                       //第一路采集瓦斯浓度:
  115.             Print(&V_temp1Buffer[0]);         //显示采集码值
  116.                 Print("/10000");
  117.                 GotoXY(0,1);                  //设定液晶显示的位置,第1列第2行
  118.             Print("ALARM:");                  //第一路采集瓦斯浓度:
  119.             Print(&alarm_tempBuffer[0]);         //显示采集码值        
  120.                 Print("/10000");   
  121.             Delay1ms(7);

  122.                 if(key1==0)                           //报警值加1按钮
  123.                 {
  124.                   Delay1ms(10);                  //按钮消抖动
  125.                   while(key1==0);          //等待按键松开
  126.                   alarm_temp=alarm_temp+10;        //报警值加1
  127.                 }
  128.                 if(key2==0)                                        //报警值减1按钮
  129.                 {
  130.                   Delay1ms(10);                                //按钮消抖动
  131.                   while(key2==0);                        //等待按键松开
  132.                   alarm_temp=alarm_temp-10;        //报警值加1
  133.                 }
  134.                
  135.                                  
  136. /*--------------------------------------------------------------------------------------------*/
  137. /*--------------------------------------------------------------------------------------------*/
  138.                 if(V_temp1>=alarm_temp) //判断是否超过设定门限,设定瓦斯传感器输出2.5V为报警判断值,对应码值为250
  139.                 {
  140.                    ALARM=1;                  //烟雾报警灯亮 ,蜂鸣器响  
  141.                 }
  142.                 else ALARM=0;
  143.    }                                 
  144. }        

  145. void t1(void) interrupt 3 using 0
  146. {
  147.   TH1=(65536-200)/256;
  148.   TL1=(65536-200)%256;
  149.   AD_CLK=~AD_CLK;
  150.   }
复制代码

全部资料51hei下载地址:
1400基于单片机的便携式瓦斯检测仪结题各项资料.rar (111.15 KB, 下载次数: 75)

评分

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

查看全部评分

回复

使用道具 举报

ID:748874 发表于 2020-5-11 14:06 | 显示全部楼层
您好,才学着用proteus。打开里面有很多的程序,把哪一个导入进去呀,拜托了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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