找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的温度和可燃气体探测的仿真模型+源码

  [复制链接]
跳转到指定楼层
楼主
    本系统主要实现的功能为:温度采集电路实时采集环境中的温度,气体监测电路实时监测环境中的可燃气体(如甲烷、丙烷等),监测到的温度数据和可燃气体数据通过相应的传感器转换为模拟电信号送到AD转换器中,AD转换器将模拟信号转换为数字信号送到MCU中进行处理,MCU根据AD转换器送来的数字信号计算出温度值和有害气体浓度等级并送到显示模块进行显示,当温度值超过设定值时,风扇电路启动风扇工作,当可燃气体浓度超过设定等级时,报警电路启动蜂鸣器报警。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <math.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define LCD1602_IO P0
  7. #define GPIO_MOTOR P1

  8. sbit LCD1602_RS=P2^0;
  9. sbit LCD1602_RW=P2^1;
  10. sbit LCD1602_E=P2^2;

  11. sbit ADC0832_CS=P1^5;
  12. sbit ADC0832_CLK=P1^6;
  13. sbit ADC0832_DO=P1^7;      //将CS置高电平禁用芯片

  14. sbit MOTOR_CS=P2^3;
  15. sbit BUZZER_CS=P3^2;

  16. void Delay1ms(uint c);

  17. void LcdInit();
  18. void LcdWriteCom(uchar com);
  19. void LcdWriteData(uchar dat);
  20. uchar Get_AD_Result(bit channel);
  21. void  Motor_stepper();

  22. uchar line1[]={'C','H','0',' ','T','E','P',':',' ','0','0','.','0',' ',0xdf,'C'};
  23. uchar line2[]={'C','H','1',' ','L','E','V','E','L',':',' ','0',' ',' ',' ',' '};

  24.                                   
  25. void main(void)
  26. {
  27.         uint i;
  28.         double ADCdata,NTCr,t;
  29.         int t_temp;
  30.         bit channel;
  31.         LcdInit();
  32.         for(i=0;i<16;i++)
  33.         {
  34.                 LcdWriteData(line1[i]);       
  35.         }
  36.         LcdWriteCom(0x80|0x40);  //设置数据指针起点为第二行
  37.         for(i=0;i<16;i++)
  38.         {
  39.                 LcdWriteData(line2[i]);       
  40.         }
  41.         MOTOR_CS=1;
  42.         BUZZER_CS=0;
  43.         while(1)
  44.         {       
  45.                 channel = 0;
  46.                  ADCdata = Get_AD_Result(channel)*5.0/256;
  47.                 NTCr= 10*ADCdata/(5-ADCdata);
  48.                 t=1/(log(NTCr/10)/3900+1/(25+273.15))-273.15;        //B=3435
  49.                
  50.                 if(t>=25)
  51.                 {
  52.                         MOTOR_CS=0;                //开风扇
  53.                 }               
  54.                 else
  55.                 {
  56.                         MOTOR_CS=1;                //关风扇       
  57.                 }
  58.                
  59.                 if(t<0)
  60.                 {
  61.                         line1[8]='-';
  62.                         t=-t;
  63.                 }
  64.                 else
  65.                 {
  66.                          line1[8]=' ';
  67.                 }
  68.                                
  69.                 t_temp=t*10;
  70.                 line1[9]=t_temp/100+'0';
  71.                 line1[10]=t_temp/10%10+'0';
  72.                 line1[12]=t_temp%10+'0';

  73.           LcdWriteCom(0x80);
  74.                 for(i=0;i<16;i++)
  75.                 {
  76.                         LcdWriteData(line1[i]);       
  77.                 }

  78.                 channel = 1;
  79.                  ADCdata = Get_AD_Result(channel)*5.0/256;

  80.           if(ADCdata<=0.5)
  81.                         line2[11]='0';
  82.                 else if(ADCdata>0.5&&ADCdata<=1)       
  83.                         line2[11]='1';
  84.                 else if(ADCdata>1&&ADCdata<=2)       
  85.                         line2[11]='2';
  86.                 else if(ADCdata>2&&ADCdata<=3)       
  87.                         line2[11]='3';
  88.                 else if(ADCdata>3&&ADCdata<=4)       
  89.                         line2[11]='4';
  90.                 else       
  91.                         line2[11]='5';

  92.                 if(ADCdata>1)
  93.                         BUZZER_CS=1;
  94.                 else
  95.                         BUZZER_CS=0;

  96.           LcdWriteCom(0x80|0x40);
  97.                 for(i=0;i<16;i++)
  98.                 {
  99.                         LcdWriteData(line2[i]);       
  100.                 }

  101.         }       
  102.                        
  103. }


  104. void Delay1ms(uint c)   //误差 0us
  105. {
  106.     uint a,b;
  107.         for (; c>0; c--)
  108.         {
  109.                  for (b=199;b>0;b--)
  110.                  {
  111.                           for(a=1;a>0;a--);
  112.                  }      
  113.         }
  114.            
  115. }

  116. void LcdInit()                                                  //LCD初始化子程序
  117. {
  118.         LcdWriteCom(0x38);  //开显示,8位数据端口、两行显示、5x7点阵字符
  119.         LcdWriteCom(0x0c);  //开显示不显示光标
  120.         LcdWriteCom(0x06);  //写一个指针加1
  121.         LcdWriteCom(0x01);  //清屏
  122.         LcdWriteCom(0x80);  //设置数据指针起点为第一行第一个字符
  123. }


  124. /*******************************************************************************
  125. * 函 数 名         : LcdWriteCom
  126. * 函数功能                   : 向LCD写入一个字节的命令
  127. * 输    入         : com
  128. * 输    出         : 无
  129. *******************************************************************************/
  130. void LcdWriteCom(uchar com)          //写入命令
  131. {
  132.         LCD1602_E = 0;     //使能
  133.         LCD1602_RS = 0;           //选择发送命令
  134.         LCD1602_RW = 0;           //选择写入
  135.        
  136.         LCD1602_IO = com;     //放入命令
  137.         Delay1ms(1);                //等待数据稳定

  138.         LCD1602_E = 1;                  //写入时序
  139.         Delay1ms(5);          //保持时间
  140.         LCD1602_E = 0;
  141. }

  142. /*******************************************************************************
  143. * 函 数 名         : LcdWriteData
  144. * 函数功能                   : 向LCD写入一个字节的数据
  145. * 输    入         : dat
  146. * 输    出         : 无
  147. *******************************************************************************/                             
  148. void LcdWriteData(uchar dat)                        //写入数据
  149. {
  150.         LCD1602_E = 0;        //使能清零
  151.         LCD1602_RS = 1;        //选择输入数据
  152.         LCD1602_RW = 0;        //选择写入

  153.         LCD1602_IO = dat; //写入数据
  154.         Delay1ms(1);

  155.         LCD1602_E = 1;   //写入时序
  156.         Delay1ms(5);   //保持时间
  157.         LCD1602_E = 0;
  158. }

  159. uchar Get_AD_Result(bit channel)
  160. {
  161.         uchar i;
  162.         int data1=0x00,data2=0x00;
  163.         ADC0832_CLK=0;      //初始化
  164.         ADC0832_DO=1;
  165.         _nop_();
  166.         ADC0832_CS=0;
  167.         _nop_();
  168.         ADC0832_CLK=1;
  169.         _nop_();
  170.                                                 //在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能
  171.         ADC0832_CLK=0;             //通道第一位
  172.         ADC0832_DO=1;
  173.         _nop_();
  174.         ADC0832_CLK=1;
  175.         _nop_();
  176.         ADC0832_CLK=0;             //通道0的第二位
  177.         ADC0832_DO=channel;
  178.         _nop_();
  179.         ADC0832_CLK=1;
  180.         _nop_();
  181.          
  182.         ADC0832_CLK=0;
  183.         ADC0832_DO=1;
  184.         for(i=0;i<8;i++)     //读取前8位的值 先高位后低位
  185.         {
  186.                  _nop_();
  187.                   data1<<=1;
  188.                   ADC0832_CLK=1;
  189.                   _nop_();
  190.                   ADC0832_CLK=0;
  191.                   if(ADC0832_DO)
  192.                            data1|=0x01;
  193.                   else
  194.                            data1|=0x00;
  195.          }

  196.         for(i=0;i<8;i++)     //读取后8位的值 先低位后高位
  197.         {
  198.                   data2>>=1;
  199.                   if(ADC0832_DO)
  200.                            data2|=0x80;
  201.                   else
  202.                            data2|=0x00;
  203.                   _nop_();
  204.                   ADC0832_CLK=1;
  205.                   _nop_();
  206.                   ADC0832_CLK=0;
  207.         }

  208.         _nop_();
  209.         ADC0832_CS=1;              //将CS置高电平禁用芯片
  210.         ADC0832_DO=1;
  211.         ADC0832_CLK=1;
  212.         return (data1 == data2) ? data1:0;
  213. }
复制代码

所有资料51hei提供下载:
信息采集与处理-温度和可燃气体浓度采集模型.rar (102.83 KB, 下载次数: 187)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:399521 发表于 2018-10-24 11:49 | 只看该作者
很棒,感谢楼主分享
回复

使用道具 举报

板凳
ID:462149 发表于 2019-1-4 21:30 | 只看该作者
很好用, 谢谢楼主分享
回复

使用道具 举报

地板
ID:253493 发表于 2019-2-27 15:06 | 只看该作者
按键怎么没有了
回复

使用道具 举报

5#
ID:405625 发表于 2019-3-24 20:44 | 只看该作者
可以用,感谢分享
回复

使用道具 举报

6#
ID:405625 发表于 2019-3-24 20:46 | 只看该作者
建议用一些带AD收集的芯片,省很多事
回复

使用道具 举报

7#
ID:754005 发表于 2020-5-17 14:57 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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