找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12c5A60s2单片机DHT11+LCD12864+JQ8400语音播报环境检测程序

[复制链接]
跳转到指定楼层
楼主
ID:919912 发表于 2021-10-26 12:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.    
  6. sbit sda = P2^1; /*一线串口发送引脚  */
  7. sbit RS = P1^1;
  8. sbit RW = P1^2;
  9. sbit  E = P1^3;
  10. sbit RST = P1^4;
  11. sbit PSB = P1^5;
  12. sbit GZJC = P1^6;  
  13. sbit LED1 = P1^7;
  14. sbit TRH = P2^0;   //THD11接口


  15. char str1[]={"   "};
  16. char str2[]={"   "};
  17. int TH_temp,TL_temp,RH_temp,RL_temp,CK_temp,respond,com_data,temp;
  18. uchar i,j;
  19. unsigned char num1 = 1;
  20. unsigned char num2 = 1;


  21. void Car_toon();   //开机动画
  22. void LCD_BusyCheck();//检忙
  23. void LCD_WCMD(unsigned char cmd);//写屏幕指令
  24. void LCD_WDAT(unsigned char dat);//字库--字符
  25. void LCD_SetPos(unsigned char x,unsigned char y);  //屏幕定位
  26. void LCD_HZ(unsigned char *s);//汉字
  27. void DHT11_receive();
  28. char DHT11_rec_byte();
  29. void delay(int ms);
  30. void Delay1us(int T);

  31. void SendData ( unsigned addr )
  32. {
  33.     unsigned i;

  34.     EA = 0;/*发送时关掉中断,防止中断影响时序  */

  35.     sda = 1;/*开始拉搞  */
  36.     Delay1us ( 1000 );
  37.     sda = 0;/*开始引导码*/
  38.     Delay1us ( 2200 );/*此处延时最少要大于2ms,此参数延时为310ms  */

  39.     for ( i = 0; i < 8; i++ ) /*总共8位数据  */
  40.     {
  41.         sda = 1;
  42.         if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示  */
  43.         {
  44.             Delay1us ( 500 );
  45.             sda = 0;
  46.             Delay1us ( 210 );
  47.         }
  48.         else              /*1:3表示数据位0 ,每个位用两个脉冲表示  */
  49.         {
  50.             Delay1us ( 210 );
  51.             sda = 0;
  52.             Delay1us ( 500 );
  53.         }
  54.         addr >>= 1;
  55.     }
  56.     sda = 1;
  57.     EA = 1;
  58. }

  59. void Delay1us(int T)
  60. {
  61.     while(T--);
  62. }

  63. void main()
  64. {
  65.     RST = 1;
  66.     PSB = 1;
  67.     GZJC = 1;
  68.     LED1 = 0;
  69.     Car_toon();
  70.    
  71.    
  72.     LCD_WCMD(0X30);  //基本指令
  73.     LCD_WCMD(0X0c);  //打开显示
  74.     LCD_WCMD(0X01);  //清屏
  75.    
  76.     LCD_SetPos(0,0);
  77.     LCD_HZ("光照:");
  78.    
  79.     LCD_SetPos(1,0);
  80.     LCD_HZ("温湿度:");
  81.    
  82.     LCD_SetPos(2,0);
  83.     LCD_HZ("照明系统:");
  84.    
  85.     LCD_SetPos(3,0);
  86.     LCD_HZ("通风系统:");
  87.    
  88.     DHT11_receive();
  89.       
  90.     while(1)
  91.     {
  92.         DHT11_receive();
  93.         LCD_SetPos(1,4);
  94.         LCD_WDAT(str2[0]);
  95.         LCD_WDAT(str2[1]);
  96.         
  97.         LCD_SetPos(1,6);
  98.         LCD_WDAT(str1[0]);
  99.         LCD_WDAT(str1[1]);


  100.         if( ((TH_temp/10)*10+(TH_temp%10)) > 27)
  101.         {
  102.             SendData(0x0a);
  103.             SendData(0x03);
  104.             SendData(0x0b);
  105.             delay(15000);
  106.         }
  107.         
  108.         if(GZJC == 1)
  109.         {
  110.           num1 = 1;
  111.           LCD_SetPos(2,5);
  112.           LCD_HZ("开");
  113.             
  114.             
  115.           LCD_SetPos(0,3);
  116.           LCD_HZ("弱");
  117.             LED1 = 1;
  118.             if(num2==1)    //一线串口语音
  119.             {
  120.             SendData(0x0a);
  121.             SendData(0x01);
  122.             SendData(0x0b);
  123.             delay(12000);
  124.                 num1=1;
  125.                 num2=0;
  126.             }

  127.         }
  128.         else
  129.          {
  130.          
  131.           LCD_SetPos(2,5);
  132.           LCD_HZ("关");
  133.          
  134.           LCD_SetPos(0,3);
  135.           LCD_HZ("强");
  136.             LED1 = 0;
  137.             if(num1==1)   //一线串口语音
  138.             {
  139.             SendData(0x0a);
  140.             SendData(0x02);
  141.             SendData(0x0b);
  142.             delay(12000);
  143.                 num2=1;
  144.                 num1=0;
  145.             }
  146.   
  147.    
  148.             
  149.         
  150.         }
  151.         
  152.     }
  153. }

  154. void Car_toon()     //开机动画
  155. {
  156.     LCD_SetPos(0,1);
  157.     LCD_HZ("学院技能大赛");
  158.    
  159.     LCD_SetPos(1,1);
  160.     LCD_HZ("智能控制系统");
  161.    
  162.     LCD_WCMD(0x34); //切换到扩展指令
  163.     LCD_WCMD(0x03); //允许输入滚动地址
  164.    
  165.     delay(5000); //1秒
  166.    
  167.     for(i=0x40;i<0x60;i++)
  168.    {
  169.     LCD_WCMD(i); //滚动内容
  170.     delay(1000); //1秒
  171.    }
  172. }


  173. void LCD_BusyCheck()  //检测是否繁忙
  174. {
  175.     unsigned char temp;
  176.     P0 = 0xFF;
  177.     RS = 0;
  178.     RW = 1;
  179.     while(1)
  180.     {
  181.         E = 1;
  182.         temp = P0;
  183.         E = 0;
  184.         if((temp & 0x80) == 0)
  185.             break;
  186.     }
  187. }

  188. void LCD_WCMD(unsigned char cmd)
  189. {
  190.     LCD_BusyCheck();
  191.     RS = 0;
  192.     RW = 0;
  193.     P0 = cmd;
  194.     E = 1;
  195.     E = 0;
  196. }


  197. void LCD_WDAT(unsigned char dat)//写数据
  198. {
  199.     LCD_BusyCheck();
  200.     RS = 1;
  201.     RW = 0;
  202.     P0 = dat;
  203.     E = 1;
  204.     E = 0;
  205. }

  206. void LCD_SetPos(unsigned char x,unsigned char y)  //定位
  207. {
  208.     unsigned char pos;
  209.     switch(x)
  210.     {
  211.         case 0 : x = 0x80;break;
  212.         case 1 : x = 0x90;break;
  213.         case 2 : x = 0x88;break;
  214.         case 3 : x = 0x98;break;
  215.         default:break;
  216.     }
  217.     pos = x+y;    //x范围:0~3,y范围:0~7
  218.     LCD_WCMD(pos);
  219. }

  220. void LCD_HZ(unsigned char *s)
  221. {
  222.     while(*s)
  223.         LCD_WDAT(*s++);
  224. }

  225. /*---------DHT11所用延时----------*/
  226. void Delay10u()
  227. {
  228.     unsigned char i;
  229.     _nop_();
  230.     _nop_();
  231.     _nop_();        
  232.     i = 24;
  233.     while (--i);
  234. }

  235. void Delay18ms()        //@11.0592MHz
  236. {
  237.     unsigned char i, j, k;

  238.     _nop_();
  239.     _nop_();
  240.     i = 1;
  241.     j = 194;
  242.     k = 159;
  243.     do
  244.     {
  245.         do
  246.         {
  247.             while (--k);
  248.         } while (--j);
  249.     } while (--i);
  250. }
  251. /*---------开机动画所用延时----------*/
  252. void delay(int ms)
  253. {
  254.     while(ms--)
  255.    {
  256.      for(j=0;j<120;j++);
  257.    }
  258. }


  259. char DHT11_rec_byte()
  260. {   
  261.           char i;
  262.           com_data=0;
  263.           for(i=0;i<=7;i++)   
  264.          {
  265.                     respond=2;
  266.                     while((!TRH)&&respond++);
  267.             Delay10u();
  268.                                  Delay10u();
  269.                                  Delay10u();
  270.                     if(TRH)
  271.                     {
  272.                               temp=1;
  273.                               respond=2;
  274.                               while((TRH)&&respond++);
  275.                     }
  276.                     else
  277.                               temp=0;
  278.                     com_data<<=1;
  279.                     com_data|=temp;   
  280.           }
  281.           return(com_data);  
  282. }

  283. /****************************************************************************/
  284. //温湿度读取子程序
  285. //温度高8位== TH_data
  286. //温度低8位== TL_data
  287. //湿度高8位== RH_data
  288. //湿度低8位== RL_data
  289. //校验 8位 == CK_data
  290. //调用的程序有 delay();, Delay_5us();,RECEIVE();
  291. /***************************************************************************/
  292. void DHT11_receive()
  293. {
  294.           //主机拉低18ms
  295.          TRH=0;
  296.          Delay18ms();
  297.          TRH=1;
  298.           //DATA总线由上拉电阻拉高 主机延时50us
  299.          Delay10u();
  300.          Delay10u();
  301.           //delay_us();delay_us();delay_us();delay_us();
  302.           //主机设为输入 判断从机响应信号
  303.             TRH=1;
  304.           //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行   
  305.          if(!TRH)   
  306.          {
  307.                   respond=2;
  308.                   //判断DHT11发出 80us 的低电平响应信号是否结束
  309.                while((!TRH)&& respond++);
  310.                  respond=2;
  311.                  //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  312.                 while(TRH && respond++);
  313.                  //数据接收状态   
  314.                 RH_temp = DHT11_rec_byte();
  315.                 RL_temp = DHT11_rec_byte();
  316.                 TH_temp = DHT11_rec_byte();
  317.                 TL_temp = DHT11_rec_byte();
  318.                 CK_temp = DHT11_rec_byte();
  319.                 TRH=1; //数据校验
  320.         }
  321.         //湿度整数部分      
  322.          str1[0] = (char)(0X30+RH_temp/10);
  323.          str1[1] = (char)(0X30+RH_temp%10);
  324.          //温度整数部分
  325.          str2[0] = (char)(0X30+TH_temp/10);
  326.          str2[1] = (char)(0X30+TH_temp%10);                                       
  327. }
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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