久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開始

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

做的環(huán)境監(jiān)測(cè)裝置,為什么仿真的時(shí)候顯示屏顯示的數(shù)據(jù)和傳感器數(shù)據(jù)不一樣呢

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
200黑幣

采用的是dht11溫濕度傳感器
代碼如下:
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號(hào)整型 宏定義        變量范圍0~65535

  4. sbit beep = P1^4;   //蜂鳴器IO口定義

  5. bit flag_300ms ;

  6. sbit CS=P2^2;                //CS定義為P2口的第4位腳,連接ADC0832CS腳
  7. sbit SCL=P2^1;                //SCL定義為P2口的第3位腳,連接ADC0832SCL腳
  8. sbit DO=P2^0;                //DO定義為P2口的第4位腳,連接ADC0832DO腳

  9. //  按鍵的IO變量的定義
  10. uchar key_can;                 //按鍵值的變量


  11. uchar menu_1;        //菜單設(shè)計(jì)的變量
  12. uint t_high = 30,t_low = 10;        //溫度報(bào)警參數(shù)
  13. uint s_high = 90,s_low = 10;        //濕度報(bào)警參數(shù)
  14. uint yanwu_h;
  15. long yanwu;
  16. uchar flag_w_bj_en,flag_s_bj_en;

  17. /***************************************************************
  18. * 名稱 : delay_1ms()
  19. * 功能 : 延時(shí)1ms函數(shù)
  20. * 輸入 : q
  21. * 輸出 : 無
  22. ****************************************************************/
  23. void delay_1ms(uint q)
  24. {
  25.         uint i,j;
  26.         for(i=0;i<q;i++)
  27.                 for(j=0;j<120;j++);
  28. }

  29. sbit dht11=P1^5;         //溫度傳感器IO口定義
  30. uchar table_dht11[5]={1,2,3,4,5};


  31. uchar code table_num[]="0123456789abcdefg";

  32. sbit rs=P1^0;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  33. sbit rw=P1^1;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  34. sbit e =P1^2;         //片選信號(hào)   下降沿觸發(fā)

  35. /********************************************************************
  36. * 名稱 : delay_uint()
  37. * 功能 : 小延時(shí)。
  38. * 輸入 : 無
  39. * 輸出 : 無
  40. ***********************************************************************/
  41. void delay_uint(uint q)
  42. {
  43.         while(q--);
  44. }

  45. /********************************************************************
  46. * 名稱 : write_com(uchar com)
  47. * 功能 : 1602命令函數(shù)
  48. * 輸入 : 輸入的命令值
  49. * 輸出 : 無
  50. ***********************************************************************/
  51. void write_com(uchar com)
  52. {
  53.         e=0;
  54.         rs=0;
  55.         rw=0;
  56.         P0=com;
  57.         delay_uint(25);
  58.         e=1;
  59.         delay_uint(100);
  60.         e=0;
  61. }

  62. /********************************************************************
  63. * 名稱 : write_data(uchar dat)
  64. * 功能 : 1602寫數(shù)據(jù)函數(shù)
  65. * 輸入 : 需要寫入1602的數(shù)據(jù)
  66. * 輸出 : 無
  67. ***********************************************************************/
  68. void write_data(uchar dat)
  69. {
  70.         e=0;
  71.         rs=1;
  72.         rw=0;
  73.         P0=dat;
  74.         delay_uint(25);
  75.         e=1;
  76.         delay_uint(100);
  77.         e=0;        
  78. }


  79. /***********************lcd1602上顯示特定的字符****0XDF 度********************/
  80. void write_zifu(uchar hang,uchar add,uchar date)
  81. {
  82.         if(hang==1)   
  83.                 write_com(0x80+add);
  84.         else
  85.                 write_com(0x80+0x40+add);
  86.         write_data(date);        
  87. }

  88. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  89. void write_sfm2(uchar hang,uchar add,uint date)
  90. {
  91.         if(hang==1)   
  92.                 write_com(0x80+add);
  93.         else
  94.                 write_com(0x80+0x40+add);
  95.         write_data(0x30+date/10%10);
  96.         write_data(0x30+date%10);        
  97. }


  98. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  99. void write_sfm_yanwu(uchar hang,uchar add,uint date)
  100. {
  101.         if(hang==1)   
  102.                 write_com(0x80+add);
  103.         else
  104.                 write_com(0x80+0x40+add);
  105.         if(date/100%10 == 0)
  106.                 write_data(' ');
  107.         else
  108.                 write_data(0x30+date/100%10);
  109.         write_data(0x30+date/10%10);
  110.         write_data(0x30+date%10);        
  111. }




  112. /***********************lcd1602上顯示這字符函數(shù)************************/
  113. void write_string(uchar hang,uchar add,uchar *p)
  114. {
  115.         if(hang==1)   
  116.                 write_com(0x80+add);
  117.         else
  118.                 write_com(0x80+0x40+add);
  119.                 while(1)                                                                                                                 
  120.                 {
  121.                         if(*p == '\0')  break;
  122.                         write_data(*p);
  123.                         p++;
  124.                 }        
  125. }

  126. /***********************lcd1602初始化設(shè)置************************/
  127. void init_1602()        //lcd1602初始化
  128. {
  129.         write_com(0x38);        
  130.         write_com(0x0c);
  131.         write_com(0x06);
  132.         delay_uint(1000);
  133.         write_string(1,0,"    YW:000PPM     ");        
  134.         write_string(2,0,"  W:    S:  %RH    ");        
  135.         write_zifu(2,6,0xdf);        //顯示度               
  136. }

  137. /***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/        
  138. //請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的
  139. unsigned char ad0832read(bit SGL,bit ODD)
  140. {
  141.         unsigned char i=0,value=0,value1=0;               
  142.         SCL=0;
  143.         DO=1;
  144.         CS=0;                //開始
  145.         SCL=1;                //第一個(gè)上升沿        
  146.         SCL=0;
  147.         DO=ODD;
  148.         SCL=1;          //第二個(gè)上升沿
  149.         SCL=0;
  150.         DO=SGL;
  151.         for(i=0;i<8;i++)
  152.         {
  153.                 SCL=0; //開始從第四個(gè)下降沿接收數(shù)據(jù)
  154.                 value<<=1;
  155.                 SCL=1;
  156.                 if(DO)
  157.                         value++;                                                
  158.         }
  159.         return value;
  160. }

  161. /*************定時(shí)器0初始化程序***************/
  162. void time_init()         
  163. {
  164.         EA   = 1;                   //開總中斷
  165.         TMOD = 0X01;          //定時(shí)器0、定時(shí)器1工作方式1
  166.         ET0  = 1;                  //開定時(shí)器0中斷
  167.         TR0  = 1;                  //允許定時(shí)器0定時(shí)
  168. }

  169. /********************獨(dú)立按鍵程序*****************/
  170. uchar key_can;         //按鍵值

  171. void key()             //獨(dú)立按鍵程序
  172. {
  173.         static uchar key_new;
  174.         key_can = 20;               //按鍵值還原
  175.         P3 |= 0xf0;
  176.         if((P3 & 0xf0) != 0xf0)                //按鍵按下
  177.         {
  178.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  179.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  180.                 {                                                //確認(rèn)是按鍵按下
  181.                         key_new = 0;
  182.                         switch(P3 & 0xf0)
  183.                         {
  184.                                 case 0xa0: key_can = 1; break;           //得到k1鍵值
  185.                                 case 0xc0: key_can = 2; break;           //得到K2鍵值
  186.                                 case 0x80: key_can = 3; break;           //得到k3鍵值
  187.                         }
  188.                 }                        
  189.         }
  190.         else
  191.                 key_new = 1;        
  192. }

  193. /****************按鍵顯示函數(shù)***************/
  194. void key_with()
  195. {
  196.         if(key_can == 1)           //設(shè)置鍵
  197.         {
  198.                 menu_1 ++;
  199.                 if(menu_1 > 5)
  200.                 {
  201.                         menu_1 = 0;
  202.                         init_1602();  //lcd1602初始化                        
  203.                 }
  204.                 if(menu_1 == 1)                                 //初始化顯示
  205.                 {
  206.                         write_string(1,0," WH:    WL:     ");
  207.                         write_string(2,0," SH:  % SL:  %  ");
  208.                         write_zifu(1,6,0xdf);          //顯示度               
  209.                         write_zifu(1,13,0xdf);          //顯示度               
  210.                         write_sfm2(1,4,t_high);          //顯示溫度
  211.                         write_sfm2(1,11,t_low);          //顯示溫度
  212.                         write_sfm2(2,4,s_high);   //顯示濕度        
  213.                         write_sfm2(2,11,s_low);   //顯示濕度        
  214.                 }
  215.                 if(menu_1 == 5)                                 //初始化顯示
  216.                 {
  217.                         write_string(1,0,"   Set Yanwu    ");
  218.                         write_string(2,0,"     000PPM     ");

  219.                 }
  220.         }
  221.         if(menu_1 == 1)                        //設(shè)置高溫報(bào)警
  222.         {
  223.                 if(key_can == 2)
  224.                 {
  225.                         t_high ++ ;                //設(shè)置高溫值加1         
  226.                         if(t_high > 99)
  227.                                 t_high = 99;
  228.                 }
  229.                 if(key_can == 3)
  230.                 {
  231.                         t_high -- ;                //設(shè)置高溫值減1         
  232.                         if(t_high <= t_low)
  233.                                 t_high = t_low + 1;
  234.                 }
  235.                 write_sfm2(1,4,t_high);           //顯示溫度
  236.                 write_com(0x80+3);             //將光標(biāo)移動(dòng)到秒個(gè)位
  237.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍        
  238.         }        
  239.         if(menu_1 == 2)                        //設(shè)置低溫報(bào)警
  240.         {
  241.                 if(key_can == 2)
  242.                 {
  243.                         t_low ++ ;                        //設(shè)置低溫值加1
  244.                         if(t_low >= t_high)
  245.                                 t_low = t_high - 1;
  246.                 }
  247.                 if(key_can == 3)                         //設(shè)置高溫值減1
  248.                 {
  249.                         t_low -- ;                        
  250.                         if(t_low <= 1)
  251.                                 t_low = 1;
  252.                 }
  253.                 write_sfm2(1,11,t_low);   //顯示濕度        
  254.                 write_com(0x80+10);            //將光標(biāo)移動(dòng)到秒個(gè)位
  255.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍        
  256.         }
  257.         if(menu_1 == 3)                        //設(shè)置高濕報(bào)警
  258.         {
  259.                 if(key_can == 2)
  260.                 {
  261.                         s_high ++ ;                //設(shè)置高濕值加1         
  262.                         if(s_high > 99)
  263.                                 s_high = 99;
  264.                 }
  265.                 if(key_can == 3)
  266.                 {
  267.                         s_high -- ;                //設(shè)置高濕值減1         
  268.                         if(s_high <= s_low)
  269.                                 s_high = s_low + 1;
  270.                 }
  271.                 write_sfm2(2,4,s_high);           //顯示濕度
  272.                 write_com(0x80+0x40+3);             //將光標(biāo)移動(dòng)到秒個(gè)位
  273.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍        
  274.         }        
  275.         if(menu_1 == 4)                        //設(shè)置低濕報(bào)警
  276.         {
  277.                 if(key_can == 2)
  278.                 {
  279.                         s_low ++ ;                        //設(shè)置低濕值加1
  280.                         if(s_low >= s_high)
  281.                                 s_low = s_high - 1;
  282.                 }
  283.                 if(key_can == 3)                         //設(shè)置低濕值減1
  284.                 {
  285.                         s_low -- ;                        
  286.                         if(s_low <= 1)
  287.                                 s_low = 1;
  288.                 }
  289.                 write_sfm2(2,11,s_low);           //顯示濕度
  290.                 write_com(0x80+0x40+10);            //將光標(biāo)移動(dòng)到秒個(gè)位
  291.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍        
  292.         }
  293.         if(menu_1 == 5)                        //設(shè)置煙物
  294.         {
  295.                 if(key_can == 2)
  296.                 {
  297.                         yanwu_h ++ ;                        //設(shè)置煙物加1
  298.                         if(yanwu_h >= 999)
  299.                                 yanwu_h = 999;
  300.                 }
  301.                 if(key_can == 3)                         //設(shè)置煙物減1
  302.                 {
  303.                         yanwu_h -- ;                        
  304.                         if(yanwu_h <= 1)
  305.                                 yanwu_h = 1;
  306.                 }
  307.                 write_sfm_yanwu(2,5,yanwu_h);           //顯示濕度
  308.                 write_com(0x80+0x40+7);            //將光標(biāo)移動(dòng)到秒個(gè)位
  309.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍        
  310.         }
  311.                         
  312. }

  313. /*****************讀溫濕度傳感器程序****************/
  314. void dst11()
  315. {
  316.         static uint value;
  317.         uchar i,j;                         //讀溫濕度時(shí)不能打開中斷
  318.         dht11 = 0;        
  319.         delay_1ms(18);
  320.         dht11 = 1;
  321.         delay_uint(4);         //50us
  322.         if(dht11 == 0)          //判斷是否響應(yīng)    0 為響應(yīng)
  323.         {
  324.                 while(dht11 == 1);          //等待響應(yīng)時(shí)間過完
  325.                 for(i=0;i<5;i++)
  326.                 {
  327.                         for(j=0;j<8;j++)
  328.                         {
  329.                                 table_dht11[i] <<= 1;
  330.                                 value = 0;
  331.                                 while(dht11 == 0);
  332.                                 delay_uint(4);         //50us         數(shù)據(jù)1的高電平時(shí)間為110us 低為27us
  333.                                 if(dht11 == 1)
  334.                                 {
  335.                                         table_dht11[i] |= 0x01;
  336.                                         value = 0;
  337.                                         while(dht11 == 1);          //等待響應(yīng)時(shí)間過完
  338.                                 }                        
  339.                         }                        
  340.                 }                        
  341.         }
  342.         dht11 = 0;
  343. }


  344. /****************報(bào)警函數(shù)***************/
  345. void clock_h_l()
  346. {
  347.         if((table_dht11[2] >= t_high))           //溫度上限報(bào)警
  348.         {                        
  349.                 flag_w_bj_en = 1;
  350.         }
  351.         else if((table_dht11[2] <= t_low))          //溫度下限報(bào)警
  352.         {                        
  353.                 flag_w_bj_en = 1;
  354.         }
  355.         else
  356.         {        
  357.                 flag_w_bj_en = 0;
  358.         }

  359.         if((table_dht11[0] >= s_high))          //濕度上限報(bào)警
  360.         {
  361.                 flag_s_bj_en = 1;
  362.         }else if((table_dht11[0] <= s_low))         //濕度下限報(bào)警
  363.         {
  364.                 flag_s_bj_en = 1;
  365.         }else
  366.         {        
  367.                 flag_s_bj_en = 0;
  368.         }

  369.         if((flag_w_bj_en == 1) || (flag_s_bj_en == 1) || (yanwu >= yanwu_h))
  370.         {
  371.                 beep = ~beep;           //蜂鳴器報(bào)警
  372.         }
  373.         else
  374.         {
  375.                 beep = 1;
  376.         }
  377. }


  378. /******************主程序**********************/           
  379. void main()
  380. {               
  381.         beep = 0;                                //開機(jī)叫一聲   
  382.         delay_1ms(150);
  383.         P0 = P1 = P2 = P3 = 0xff;
  384.         time_init();          //定時(shí)器初始化
  385.         init_1602();        //lcd1602初始化
  386.         dst11();            //先讀出溫濕度的值
  387.         while(1)
  388.         {
  389.                 if(flag_300ms == 1)
  390.                 {
  391.                         flag_300ms = 0;
  392.                         if(menu_1 == 0)           //開始界面顯示的內(nèi)容
  393.                         {               
  394.                                 if(beep == 1)
  395.                                         dst11();                //先讀出溫濕度的值
  396.                                 yanwu = ad0832read(1,0);        
  397.                                 yanwu = yanwu * 450 / 255.0;
  398.                                 yanwu = yanwu - 100;              //首先減去零點(diǎn)漂移,一般是1V
  399.                                 if(yanwu < 0)
  400.                                         yanwu = 0;        
  401.                                 write_sfm2(2,10,table_dht11[0]);   //顯示濕度        
  402.                                 write_sfm2(2,4,table_dht11[2]);           //顯示溫度
  403.                                 write_sfm_yanwu(1,7,yanwu);                           //顯示煙物
  404.                         }        
  405.                         clock_h_l();   //報(bào)警函數(shù)
  406.                 }
  407.                 key();
  408.                 if(key_can < 10)
  409.                 {
  410.                         key_with();                            //設(shè)置報(bào)警溫度        
  411.                 }
  412.                 delay_1ms(1);
  413.         }
  414. }

  415. /*************定時(shí)器0中斷服務(wù)程序***************/
  416. void time0_int() interrupt 1
  417. {        
  418.         static uchar value;
  419.         TH0 = 0x3c;
  420.         TL0 = 0xb0;     // 50ms
  421.         value ++;         
  422.         if(value % 6 == 0)
  423.         {
  424.                 flag_300ms = 1;           //300ms        
  425.                 value = 0;        
  426.         }
  427. }
復(fù)制代碼


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 青青草社区 | 中文字幕精品一区二区三区精品 | 欧美成人一级 | 欧美一级免费看 | 精品国产欧美一区二区三区成人 | 日韩一区二区在线视频 | 国产日韩一区二区三区 | 国产精品成人一区二区 | 亚洲欧美综合精品久久成人 | 婷婷久久精品一区二区 | 爱高潮www亚洲精品 中文字幕免费视频 | 中文字幕在线精品 | 91视视频在线观看入口直接观看 | 久久久久亚洲精品中文字幕 | 成人一区二区三区在线观看 | 五月天天丁香婷婷在线中 | 伊人无码高清 | 高清国产午夜精品久久久久久 | 亚洲精品免费在线观看 | 亚洲一区二区久久 | 欧美亚洲另类丝袜综合网动图 | 日干夜干| 免费国产网站 | 久久国产婷婷国产香蕉 | av天空| 一区二区在线 | 亚洲人成人一区二区在线观看 | 精品久久久久一区二区国产 | 国产精品免费一区二区三区四区 | 人人人人人爽 | 一二区成人影院电影网 | 在线成人| 欧州一区二区三区 | 免费看啪啪网站 | 国产午夜在线 | 欧美激情精品久久久久久免费 | 日本午夜在线视频 | 91久久国产精品 | 中文一区 | 久久伊人精品 | 天天天天操 |