找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机温湿度及co检测源码

[复制链接]
ID:237859 发表于 2018-4-26 17:47 | 显示全部楼层 |阅读模式
这是我们课程设计做的,温湿度检测应该没问题,co的话可以点烟试一下,也应该好使

单片机源码:
  1. #include <reg52.h>
  2. #include <wenshidu.h>
  3. #define LCD_DB P2
  4. unsigned char s1[5];
  5. unsigned char s2[5];
  6. typedef unsigned char  U8;   
  7. typedef unsigned int   U16;

  8. U16 temp;

  9. //uchar count1=70,count2=35;
  10. //uchar moshicount=0;
  11. uchar TD=0;//定时次数
  12. U8  FLAG;
  13. U8  count,U8temp;
  14. U8  T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
  15. U8  T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;
  16. U8  comdata;
  17. void LCD_init(void);//初始化函数
  18. void LCD_write_command(uchar command); //写指令函数
  19. void LCD_write_data(uchar dat);//写数据函数
  20. void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
  21. void delay_n40us(uint n);//延时函数
  22. void sendit();
  23.         void salve_init();
  24. void LCD_init(void)//液晶初始化函数
  25. {
  26. LCD_write_command(0x38);//设置 8 位格式,2 行,5x7
  27. LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  28. LCD_write_command(0x06);//设定输入方式,增量不移位
  29. LCD_write_command(0x03);//清除屏幕显示
  30. delay_n40us(100);
  31. }
  32. void timerinit()//定时器初始化函数
  33. {
  34. TMOD=0x01;
  35. TH0=-50000/256;
  36. TL0=-50000%6;
  37. EA=1;
  38. ET0=1;
  39. }



  40. void LCD_write_command(uchar dat)//写指令函数
  41. {
  42.   LCD_DB=dat;
  43.   LCD_RS=0;//指令
  44.   LCD_RW=0;//写入
  45.   LCD_E=1;//允许
  46.   delay_n40us(1);
  47.   LCD_E=0;
  48.   delay_n40us(1);
  49. }
  50. void LCD_write_data(uchar dat)//写数据函数
  51. {
  52.   LCD_DB=dat;
  53.   LCD_RS=1;//数据
  54.   LCD_RW=0;//写入
  55.   LCD_E=1;//允许
  56.   delay_n40us(1);
  57.   LCD_E=0;
  58.   delay_n40us(1);
  59. }
  60. void LCD_disp_char(uchar x,uchar y,uchar dat)//显示一个字符函数
  61. {
  62.   uchar address;
  63.   if(y==1)
  64.     address=0x80+x;
  65.   else
  66.     address=0xc0+x;
  67.   LCD_write_command(address);
  68.   LCD_write_data(dat);
  69. }
  70. void delay_n40us(uint n)
  71. {  
  72.    uint i;
  73.    uchar j;            
  74.    for(i=n;i>0;i--)
  75.      for(j=0;j<2;j++);
  76. }
  77. void  Delay_10us(void)
  78. {
  79.     U8 i;
  80.     i--;
  81.     i--;
  82.     i--;
  83.     i--;
  84.     i--;
  85.     i--;
  86. }


  87. void Delay(U16 j)
  88. {     
  89.   U8 i;
  90.    for(;j>0;j--)
  91.      for(i=0;i<27;i++);
  92. }


  93. //*******一字节数据传送函数*********
  94. void  COM(void)
  95. {
  96.      U8 i;
  97.      for(i=0;i<8;i++)   
  98.     {
  99.        FLAG=2;
  100.         while((!io)&&FLAG++);
  101.       Delay_10us();
  102.        Delay_10us();
  103.       Delay_10us();
  104.       temp=0;
  105.         if(io)temp=1;
  106.         FLAG=2;
  107.         while((io)&&FLAG++);
  108.          //超时则跳出for循环   
  109.          if(FLAG==1)break;
  110.          //判断数据位是0还是1
  111. // 如果高电平高过预定0高电平值则数据位为 1
  112.         comdata<<=1;
  113.          comdata|=temp;      
  114.      }
  115. }

  116. void RH(void)
  117. {
  118.     //主机拉低18ms
  119.      io=0;
  120.     Delay(180);
  121.     io=1;
  122. //总线由上拉电阻拉高 主机延时20us
  123.     Delay_10us();
  124.     Delay_10us();
  125.     Delay_10us();
  126.     Delay_10us();
  127.    //主机设为输入判断从机响应信号      
  128.     io=1;
  129.   //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行  
  130.     if(!io)   //T !  
  131.     {
  132.         FLAG=2;
  133.   //判断从机是否发出 80us 的低电平响应信号是否结束      
  134.         while((!io)&&FLAG++);
  135.         FLAG=2;
  136. //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态              
  137.         while((io)&&FLAG++);
  138.         //数据接收状态  
  139.         COM();
  140.         RH_data_H_temp=comdata;
  141.         COM();
  142.         RH_data_L_temp=comdata;
  143.         COM();
  144.         T_data_H_temp=comdata;
  145.         COM();
  146.         T_data_L_temp=comdata;
  147.         COM();
  148.         checkdata_temp=comdata;
  149.         io=1;
  150. //数据校验   
  151. temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
  152.     if(temp==checkdata_temp)
  153.     {        
  154.       RH_data_H=RH_data_H_temp;      
  155.                         RH_data_L=RH_data_L_temp;
  156.       T_data_H=T_data_H_temp;
  157.       T_data_L=T_data_L_temp;
  158.       checkdata=checkdata_temp;
  159.     }
  160.      //湿度整数部分   
  161.    s1[0] = (char)(0X30+RH_data_H/10);
  162.    s1[1] = (char)(0X30+RH_data_H%10);   
  163.     //湿度小数部分
  164.    s1[2] = (char)(0X30+RH_data_L/10);
  165.     //温度整数部分        
  166.    s2[0] = (char)(0X30+T_data_H/10);
  167.    s2[1] = (char)(0X30+T_data_H%10);      
  168.     //温度小数部分            
  169.    s2[2] = (char)(0X30+T_data_L/10);
  170. }
  171. }
  172. void disp()//液晶显示函数
  173. {
  174. /*  LCD_disp_char(0,1,'s');
  175.    LCD_disp_char(1,1,'h');
  176.    LCD_disp_char(2,1,'i');
  177.    LCD_disp_char(3,1,'d');
  178.    LCD_disp_char(4,1,'u');
  179.    LCD_disp_char(5,1,':');
  180.    LCD_disp_char(6,1,s1[0]);
  181.    LCD_disp_char(7,1,s1[1]);
  182.    LCD_disp_char(8,1,'.');
  183.    LCD_disp_char(9,1,s1[2]);
  184.    LCD_disp_char(10,1,'%');
  185.    LCD_disp_char(11,1,'R');
  186.    LCD_disp_char(12,1,'H');
  187.    LCD_disp_char(0,2,'w');
  188.    LCD_disp_char(1,2,'e');
  189.    LCD_disp_char(2,2,'n');
  190.    LCD_disp_char(3,2,'d');
  191.    LCD_disp_char(4,2,'u');
  192.    LCD_disp_char(5,2,':');
  193.    LCD_disp_char(6,2,s2[0]);
  194.    LCD_disp_char(7,2,s2[1]);
  195.    LCD_disp_char(8,2,'.');
  196.    LCD_disp_char(9,2,s2[2]);
  197.    LCD_disp_char(10,2,0xDF);
  198.     LCD_disp_char(11,2,'C');
  199.                 */
  200.          LCD_disp_char(0,1,'s');
  201.    LCD_disp_char(1,1,'d');
  202.    LCD_disp_char(2,1,':');
  203.    LCD_disp_char(3,1,s1[0]);
  204.    LCD_disp_char(4,1,s1[1]);
  205.    LCD_disp_char(5,1,'%');
  206.    LCD_disp_char(0,2,'w');
  207.    LCD_disp_char(1,2,'d');
  208.    LCD_disp_char(2,2,':');
  209.    LCD_disp_char(3,2,s2[0]);
  210.    LCD_disp_char(4,2,s2[1]);
  211.    LCD_disp_char(5,2,0xDF);
  212.    LCD_disp_char(6,2,'C');
  213. }
  214. //阈值设置函数
  215. /*void shezhi()
  216. {
  217.    //初值
  218.    s1[3] = (char)(0X30+count1/10);
  219.    s1[4] = (char)(0X30+count1%10);
  220.    //初值
  221.    s2[3] = (char)(0X30+count2/10);
  222.    s2[4] = (char)(0X30+count2%10);
  223.    moshi=1;
  224.    if(moshi==0)
  225.    {
  226.      Delay_10us();
  227.      while(moshi==0);
  228.      moshicount++;
  229.     }
  230.     switch(moshicount)
  231.     {
  232.      case 1:
  233.      {
  234.        INC=1;DEC=1;
  235.        if(INC==0)
  236.        {
  237.          Delay_10us();
  238.          while(INC==0);
  239.          count1++;
  240.         }
  241.         else if(DEC==0)
  242.         {
  243.           Delay_10us();
  244.           while(DEC==0);
  245.           count1--;
  246.          }
  247.         LCD_disp_char(14,1,s1[3]);
  248.         LCD_disp_char(15,1,s1[4]);
  249.         LCD_disp_char(14,2,s2[3]);
  250.         LCD_disp_char(15,2,s2[4]);
  251.       }break;
  252.       case 2:
  253.       {
  254.          //moshicount=0;
  255.          INC=1;DEC=1;
  256.          if(INC==0)
  257.          {
  258.            Delay_10us();
  259.            while(INC==0);
  260.            count2++;
  261.            }
  262.            else if(DEC==0)
  263.            {
  264.               Delay_10us();
  265.               while(DEC==0);
  266.               count2--;
  267.             }
  268.          LCD_disp_char(14,1,s1[3]);
  269.          LCD_disp_char(15,1,s1[4]);
  270.          LCD_disp_char(14,2,s2[3]);
  271.          LCD_disp_char(15,2,s2[4]);
  272.       }break;
  273.       case 3:
  274.       {
  275.         moshicount=0;
  276.         LCD_disp_char(14,1,' ');
  277.         LCD_disp_char(15,1,' ');
  278.         LCD_disp_char(14,2,' ');
  279.         LCD_disp_char(15,2,' ');
  280.        }break;
  281.   default :break;
  282.   }
  283. }

  284. */


  285. //定时器0中断程序,每次定时50ms
  286. timer0() interrupt 1
  287. {
  288. TD++;
  289. if(TD>=100)
  290. {
  291.    TH0=-50000/256;
  292.    TL0=-50000%6;
  293.    TR0=0;
  294.    TD=0;
  295. }
  296. TH0=-50000/256;
  297. TL0=-50000%6;
  298. }


  299. //主函数
  300. void main(void)
  301. {
  302.   LCD_init();
  303.   timerinit();
  304.   Delay(4);
  305.   while(1)
  306.   {
  307.                 salve_init();
  308.                 sendit();
  309.     RH();
  310.     disp();
  311.     TR0=1;
  312.   /*  while((TD>=1)&&(TD<=100))
  313.    {
  314.        shezhi();
  315.    }*/
  316.   }
  317. }
  318. void salve_init()
  319. {
  320.         TMOD=0x20;
  321.         TH1=0xfd;
  322.         TL1=0xfd;
  323.         PCON=0x00;
  324.         TR1=1;
  325.         SCON=0x50;
  326. }
  327. void sendit()
  328. {
  329.         SBUF=s1[0];
  330.         while(!TI);
  331.         TI=0;
  332.         SBUF=s1[1];
  333.         while(!TI);
  334.         TI=0;
  335.         SBUF=s2[0];
  336.         while(!TI);
  337.         TI=0;
  338.         SBUF=s2[1];
  339.         while(!TI);
  340.         TI=0;
  341. }
  342.        
复制代码

所有资料51hei提供下载:
温湿度检测.rar (12.86 KB, 下载次数: 22)
回复

使用道具 举报

ID:1 发表于 2018-4-26 18:36 | 显示全部楼层
用的传感器类型 及接口 介绍一下 行吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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