找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2172|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STC12c5A60s2單片機(jī)DHT11+LCD12864+JQ8400語(yǔ)音播報(bào)環(huán)境檢測(cè)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:919912 發(fā)表于 2021-10-26 12:55 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.    
  6. sbit sda = P2^1; /*一線串口發(fā)送引腳  */
  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();   //開(kāi)機(jī)動(dòng)畫(huà)
  22. void LCD_BusyCheck();//檢忙
  23. void LCD_WCMD(unsigned char cmd);//寫(xiě)屏幕指令
  24. void LCD_WDAT(unsigned char dat);//字庫(kù)--字符
  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;/*發(fā)送時(shí)關(guān)掉中斷,防止中斷影響時(shí)序  */

  35.     sda = 1;/*開(kāi)始拉搞  */
  36.     Delay1us ( 1000 );
  37.     sda = 0;/*開(kāi)始引導(dǎo)碼*/
  38.     Delay1us ( 2200 );/*此處延時(shí)最少要大于2ms,此參數(shù)延時(shí)為310ms  */

  39.     for ( i = 0; i < 8; i++ ) /*總共8位數(shù)據(jù)  */
  40.     {
  41.         sda = 1;
  42.         if ( addr & 0x01 ) /*3:1表示數(shù)據(jù)位1,每個(gè)位用兩個(gè)脈沖表示  */
  43.         {
  44.             Delay1us ( 500 );
  45.             sda = 0;
  46.             Delay1us ( 210 );
  47.         }
  48.         else              /*1:3表示數(shù)據(jù)位0 ,每個(gè)位用兩個(gè)脈沖表示  */
  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);  //打開(kāi)顯示
  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("照明系統(tǒng):");
  84.    
  85.     LCD_SetPos(3,0);
  86.     LCD_HZ("通風(fēng)系統(tǒng):");
  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("開(kāi)");
  113.             
  114.             
  115.           LCD_SetPos(0,3);
  116.           LCD_HZ("弱");
  117.             LED1 = 1;
  118.             if(num2==1)    //一線串口語(yǔ)音
  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("關(guān)");
  133.          
  134.           LCD_SetPos(0,3);
  135.           LCD_HZ("強(qiáng)");
  136.             LED1 = 0;
  137.             if(num1==1)   //一線串口語(yǔ)音
  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()     //開(kāi)機(jī)動(dòng)畫(huà)
  155. {
  156.     LCD_SetPos(0,1);
  157.     LCD_HZ("學(xué)院技能大賽");
  158.    
  159.     LCD_SetPos(1,1);
  160.     LCD_HZ("智能控制系統(tǒng)");
  161.    
  162.     LCD_WCMD(0x34); //切換到擴(kuò)展指令
  163.     LCD_WCMD(0x03); //允許輸入滾動(dòng)地址
  164.    
  165.     delay(5000); //1秒
  166.    
  167.     for(i=0x40;i<0x60;i++)
  168.    {
  169.     LCD_WCMD(i); //滾動(dòng)內(nèi)容
  170.     delay(1000); //1秒
  171.    }
  172. }


  173. void LCD_BusyCheck()  //檢測(cè)是否繁忙
  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)//寫(xiě)數(shù)據(jù)
  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所用延時(shí)----------*/
  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. /*---------開(kāi)機(jī)動(dòng)畫(huà)所用延時(shí)----------*/
  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. //校驗(yàn) 8位 == CK_data
  290. //調(diào)用的程序有 delay();, Delay_5us();,RECEIVE();
  291. /***************************************************************************/
  292. void DHT11_receive()
  293. {
  294.           //主機(jī)拉低18ms
  295.          TRH=0;
  296.          Delay18ms();
  297.          TRH=1;
  298.           //DATA總線由上拉電阻拉高 主機(jī)延時(shí)50us
  299.          Delay10u();
  300.          Delay10u();
  301.           //delay_us();delay_us();delay_us();delay_us();
  302.           //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
  303.             TRH=1;
  304.           //判斷DHT11是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行   
  305.          if(!TRH)   
  306.          {
  307.                   respond=2;
  308.                   //判斷DHT11發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
  309.                while((!TRH)&& respond++);
  310.                  respond=2;
  311.                  //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
  312.                 while(TRH && respond++);
  313.                  //數(shù)據(jù)接收狀態(tài)   
  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; //數(shù)據(jù)校驗(yàn)
  320.         }
  321.         //濕度整數(shù)部分      
  322.          str1[0] = (char)(0X30+RH_temp/10);
  323.          str1[1] = (char)(0X30+RH_temp%10);
  324.          //溫度整數(shù)部分
  325.          str2[0] = (char)(0X30+TH_temp/10);
  326.          str2[1] = (char)(0X30+TH_temp%10);                                       
  327. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表