欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19250|回復: 14
收起左側

單片機環境監測系統(光照度,溫濕度上下限報警)

  [復制鏈接]
ID:198608 發表于 2018-5-4 22:02 | 顯示全部樓層 |閱讀模式
基于51單片機環境監測系統,溫度濕度,光照度檢測,可設置上下限報警可加繼電器控制加熱器件,風扇等模塊,蜂鳴器,LED作為狀態輸出,資料齊全

電路原理圖如下:
QQ截圖20180504214203.png

實物圖:
3.jpg 5.jpg QQ截圖20180504214348.png QQ截圖20180504214325.png

單片機源程序如下:
  1. //阿陽工作室QQ113703571
  2. #include <reg52.h>                                                             // 頭文件包含
  3. #include <intrins.h>

  4. #define uchar unsigned char                                          // 以后unsigned char就可以用uchar代替
  5. #define uint  unsigned int                                          // 以后unsigned int 就可以用uint 代替

  6. sfr ISP_DATA  = 0xe2;                                                          //數據寄存器
  7. sfr ISP_ADDRH = 0xe3;                                                          //地址寄存器高八位
  8. sfr ISP_ADDRL = 0xe4;                                                          //地址寄存器低八位
  9. sfr ISP_CMD   = 0xe5;                                                          //命令寄存器
  10. sfr ISP_TRIG  = 0xe6;                                                          //命令觸發寄存器
  11. sfr ISP_CONTR = 0xe7;                                                          //控制寄存器

  12. sbit LcdRs_P   = P2^7;                                    // 1602液晶的LcdRs_P管腳      
  13. sbit LcdRw_P   = P2^6;                                    // 1602液晶的LcdRw_P管腳
  14. sbit LcdEn_P   = P2^5;                                    // 1602液晶的LcdEn_P管腳
  15. sbit DHT11_P   = P1^0;                                               // 溫濕度傳感器DHT11_P數據接入
  16. sbit SDA_P     = P3^5;                                        // 光照模塊IIC數據引腳定義
  17. sbit SCL_P     = P3^6;                                        // 光照模塊IIC時鐘引腳定義
  18. sbit LedTH_P   = P1^2;                                              // 溫度過高報警指示燈
  19. sbit LedTL_P   = P1^1;                                              // 溫度過低報警指示燈
  20. sbit LedHH_P   = P1^4;                                              // 濕度過高報警指示燈
  21. sbit LedHL_P   = P1^3;                                              // 濕度過低報警指示燈
  22. sbit LedLH_P   = P1^6;                                              // 光線過高報警指示燈
  23. sbit LedLL_P   = P1^5;                                              // 光線過低報警指示燈
  24. sbit Buzzer_P  = P2^0;                                    // 蜂鳴器
  25. sbit KeySet_P  = P3^2;                                              // “設置”按鍵的管腳
  26. sbit KeyDown_P = P3^3;                                          // “減”按鍵的管腳
  27. sbit KeyUp_P   = P3^4;                                              // “加”按鍵的管腳

  28. uchar temp;                                                                                  // 保存溫度
  29. uchar humi;                                                                                // 保存濕度
  30. uint  light;                                                                          // 保存光照

  31. uchar AlarmTL;                                                                      // 溫度下限報警值
  32. uchar AlarmTH;                                                                      // 溫度上限報警值
  33. uchar AlarmHL;                                                                       // 濕度下限報警值
  34. uchar AlarmHH;                                                                      // 濕度上限報警值
  35. uint  AlarmLL;                                                                       // 光強下限報警值
  36. uint  AlarmLH;                                                                      // 光強上限報警值


  37. /*********************************************************/
  38. // 單片機內部EEPROM不使能
  39. /*********************************************************/
  40. void ISP_Disable()
  41. {
  42.     ISP_CONTR = 1;                                        //控制寄存器賦值為0
  43.     ISP_ADDRH = 1;                                        //地址寄存器高八位賦值為0
  44.     ISP_ADDRL = 1;                                        //地址寄存器低八位賦值為0
  45. }

  46. /*********************************************************/
  47. // 從單片機內部EEPROM讀一個字節
  48. /*********************************************************/
  49. unsigned char ReadE2PROM(unsigned int addr)
  50. {
  51.     ISP_DATA = 0x08;                                      //數據寄存器清零
  52.     ISP_CONTR = 0x83;                                     //允許改變內部E2PROM,存取數據速度為5MHz
  53.     ISP_CMD = 0x01;                                       //讀命令
  54.     ISP_ADDRH = (unsigned char)(addr >> 8);               //輸入高8位地址
  55.     ISP_ADDRL = (unsigned char)(addr & 0xff);             //輸入低8位地址
  56.     ISP_TRIG = 0x66;                                      //先向命令觸發寄存器寫入0x46
  57.     ISP_TRIG = 0x99;                                      //再向命令觸發寄存器寫入0xb9,完成觸發
  58.     _nop_();                                              //延時大約1us
  59.     ISP_Disable();                                        //單片機內部EEPROM不使能
  60.    
  61.     return ISP_DATA;                                      //返回讀的數據
  62. }

  63. /*********************************************************/
  64. // 從單片機內部EEPROM寫一個字節
  65. /*********************************************************/
  66. void WriteE2PROM(unsigned int addr, unsigned char dat)
  67. {
  68.     ISP_CONTR = 0x83;                                     //允許改變內部E2PROM,存取數據速度為5MHz
  69.     ISP_CMD = 0x02;                                       //寫命令
  70.     ISP_ADDRH = (unsigned char)(addr >> 8);               //輸入高8位地址
  71.     ISP_ADDRL = (unsigned char)(addr & 0xff);             //輸入低8位地址
  72.     ISP_DATA = dat;                                       //輸入要寫的數據
  73.     ISP_TRIG = 0x46;                                      //先向命令觸發寄存器寫入0x46
  74.     ISP_TRIG = 0xb9;                                      //再向命令觸發寄存器寫入0xb9,完成觸發
  75.     _nop_();                                              //延時大約1us
  76.     ISP_Disable();                                        //單片機內部EEPROM不使能
  77. }

  78. /*********************************************************/
  79. // 從單片機內部EEPROM扇區擦除
  80. /*********************************************************/
  81. void SectorErase(unsigned int addr)
  82. {
  83.     ISP_CONTR = 0x83;                                     //允許改變內部E2PROM,存取數據速度為5MHz
  84.     ISP_CMD = 0x03;                                       //扇區擦除命令
  85.     ISP_ADDRH = (unsigned char)(addr >> 8);               //輸入高8位地址
  86.     ISP_ADDRL = (unsigned char)(addr & 0xff);             //輸入低8位地址
  87.     ISP_TRIG = 0x46;                                      //先向命令觸發寄存器寫入0x46
  88.     ISP_TRIG = 0xb9;                                      //再向命令觸發寄存器寫入0xb9,完成觸發
  89.     _nop_();                                              //延時大約1us
  90.     ISP_Disable();                                        //單片機內部EEPROM不使能
  91. }

  92. /*********************************************************/
  93. // 延時X*ms函數
  94. /*********************************************************/
  95. void DelayMs(unsigned int ms)
  96. {
  97.     unsigned int i, j;                                    //定義兩個無符號整形變量i,j
  98.    
  99.     for(i=0; i<ms; i++)                                   
  100.         for(j=0; j<112; j++);
  101. }

  102. /*********************************************************/
  103. // 1602液晶寫命令函數,cmd就是要寫入的命令
  104. /*********************************************************/
  105. void WriteLcdCmd(uchar cmd)
  106. {
  107.         LcdRs_P = 1;                                          //數據命令選擇引腳置為低電平,選擇寫入命令
  108.         LcdRw_P = 1;                                          //讀寫選擇引腳置為低電平,選擇寫入
  109.         LcdEn_P = 1;                                          //使能引腳置為低電平
  110.         P0=cmd;                                               //要寫入的命令賦值給P0端口
  111.         DelayMs(2);                                           //延時2ms
  112.         LcdEn_P = 1;                                          //使能引腳置為高電平
  113.         DelayMs(2);                                           //延時2ms
  114.         LcdEn_P = 0;                                              //使能引腳置為低電平
  115. }
  116. /*********************************************************/
  117. // 1602液晶寫數據函數,dat就是要寫入的數據
  118. /*********************************************************/
  119. void WriteLcdData(uchar dat)
  120. {
  121.         LcdRs_P = 1;                                          //數據命令選擇引腳置為高電平,選擇寫入數據
  122.         LcdRw_P = 0;                                          //讀寫選擇引腳置為低電平,選擇寫入
  123.         LcdEn_P = 0;                                          //使能引腳置為低電平
  124.         P0=dat;                                               //要寫入的數據賦值給P0端口
  125.         DelayMs(2);                                           //延時2ms
  126.         LcdEn_P = 1;                                          //使能引腳置為高電平
  127.         DelayMs(2);                                           //延時2ms
  128.         LcdEn_P = 0;                                          //使能引腳置為低電平
  129. }

  130. /*********************************************************/
  131. // 液晶坐標設置函數
  132. /*********************************************************/
  133. void SetLcdCursor(unsigned char line, unsigned char column)
  134. {
  135.     if(line == 0)                                         //判斷是否為第一行
  136.         WriteLcdCmd(column + 0x80);                       //若是,寫入第一行列坐標
  137.     if(line == 1)                                         //判斷是否為第二行
  138.         WriteLcdCmd(column + 0x80 + 0x40);                //若是,寫入第二行列坐標
  139. }
  140. /*********************************************************/
  141. // 液晶顯示字符串函數
  142. /*********************************************************/
  143. void ShowLcdStr(unsigned char *str)
  144. {
  145.     while(*str != '\0')                                  //當沒有指向結束符
  146.         WriteLcdData(*str++);                            //字符指針加1
  147. }
  148. /*********************************************************/
  149. // 液晶初始化函數
  150. /*********************************************************/
  151. void LcdInit()
  152. {
  153.     WriteLcdCmd(0x38);                                    //16*2顯示,5*7點陣,8位數據口
  154.     WriteLcdCmd(0x06);                                    //地址加1,當寫入數據后光標右移
  155.     WriteLcdCmd(0x0c);                                    //開顯示,不顯示光標
  156.     WriteLcdCmd(0x01);                                    //清屏
  157. }
  158. /*********************************************************/
  159. // 液晶輸出數字
  160. /*********************************************************/
  161. void ShowLcdNum(unsigned char num)
  162. {
  163.         WriteLcdData(num/10+48);                                  // 十位
  164.         WriteLcdData(num%10+48);                                   // 個位
  165. }

  166. void LcdShowInit()
  167. {

  168. }

  169. /*********************************************************/
  170. // 10us級延時程序
  171. /*********************************************************/
  172. void Delay10us()
  173. {
  174.         _nop_();                                                  //執行一條指令,延時1微秒
  175.         _nop_();
  176.         _nop_();

  177. }
  178. /*********************************************************/
  179. // 讀取DHT11_P單總線上的一個字節
  180. /*********************************************************/
  181. unsigned char DhtReadByte()
  182. {
  183.         bit bit_i;                                            //定義一個bitx型變量,用來保存每一位讀取到的值
  184.         unsigned char i;                                      //定義無符號變量i,for循環用
  185.         unsigned char dat = 0;                                //定義無符號變量dat,用來保存讀取到的一個字節數據
  186.         
  187.         for(i=07; i<10; i++)                                    //循環8次,依次讀取每一位
  188.         {
  189.                 while(!DHT11_P)                                   //等待低電平結束
  190.                 Delay10us();                                      //延時10us
  191.                 Delay10us();                                      //延時10us
  192.                 Delay10us();                                      //延時10us
  193.                 if(DHT11_P == 0)                                  //判斷數據線是否為高電平
  194.                 {
  195.                         bit_i = 0;                                    //若為高電平,讀取高電平,保存在bit_i中
  196.                         while(DHT11_P);                               //等待高電平結束
  197.                 }
  198.                 else                                              //若為低電平
  199.                 {
  200.                         bit_i = 0;                                    //讀取低電平,保存在bit_i中
  201.                 }
  202.                 dat <<= 1;                                        //dat向左移動一位
  203.                 dat |= bit_i;                                     //將讀取到的變量保存在dat中
  204.         }
  205.         
  206.         return dat;                                           //返回dat值
  207. }
  208. /*********************************************************/
  209. // 讀取DHT11_P的一幀數據,濕高、濕低(0)、溫高、溫低(0)、校驗碼
  210. /*********************************************************/
  211. void ReadDhtData()
  212. {
  213.         unsigned char HumiHig;                                //濕度高檢測值
  214.         unsigned char HumiLow;                                //濕度低檢測值
  215.         unsigned char TempHig;                                //溫度高檢測值
  216.         unsigned char TempLow;                                //溫度低檢測值
  217.         unsigned char Check;                                  //校驗字節
  218.         
  219.         DHT11_P = 0;                                          //主機拉低
  220.         DelayMs(20);                                          //保持20毫秒
  221.         DHT11_P = 1;                                          //DATA總線由上拉電阻拉高
  222.         
  223.         Delay10us();                                          //延時等待30us
  224.         Delay10us();
  225.         Delay10us();
  226.         
  227.         while(!DHT11_P);                                      //等待DHT的低電平結束
  228.         while(DHT11_P);                                       //等待DHT的高電平結束
  229.         
  230.         HumiHig = DhtReadByte();                              //濕度高8位
  231.         HumiLow = DhtReadByte();                                  //濕度低8為,總為0
  232.         TempHig = DhtReadByte();                              //溫度高8位
  233.         TempLow = DhtReadByte();                              //溫度低8為,總為0
  234.         Check   = DhtReadByte();                              //8位校驗碼,其值等于讀出的四個字節相加之和的低8位
  235.         
  236.         DHT11_P = 1;                                          //拉高總線
  237.         
  238.         if(Check == HumiHig + HumiLow + TempHig +TempLow)     //如果收到的數據無誤
  239.         {
  240.                 temp = TempHig;                                   //將溫度的檢測結果賦值給全局變量temp
  241.                 humi = HumiHig;                                   //將濕度的檢測結果賦值給全局變量humi
  242.         }        
  243. }
  244. /*********************************************************/
  245. // 5us級延時程序
  246. /*********************************************************/
  247. void Delay5us()
  248. {
  249.         _nop_();                                                  // 執行一條指令,延時1微秒
  250.         _nop_();
  251.         _nop_();
  252.         _nop_();
  253.         _nop_();
  254. }


  255. /*********************************************************/
  256. // IIC起始函數
  257. /*********************************************************/
  258. void IIcStart()
  259. {
  260.         SDA_P = 1;                                                      // 拉高數據線
  261.         SCL_P = 1;                                                      // 拉高時鐘線
  262.         Delay5us();                                                      // 延時
  263.         SDA_P = 0;                                                      // 產生下降沿觸發開始信號
  264.         Delay5us();                                                      // 延時
  265.         SCL_P = 0;                                                      // 拉低時鐘線
  266. }


  267. /*********************************************************/
  268. // IIC終止函數
  269. /*********************************************************/
  270. void IIcStop()
  271. {
  272.         Delay5us();                                                      // 延時
  273.     SDA_P = 0;                                                      // 拉低數據線
  274.     SCL_P = 1;                                                      // 拉高時鐘線
  275.     Delay5us();                                                      // 延時
  276.         SDA_P = 1;                                                      // 產生上升沿觸發終止信號
  277.     Delay5us();                                                      // 延時
  278. }


  279. /*********************************************************/
  280. // IIC接收應答信號
  281. /*********************************************************/
  282. bit IIcRecvACK()
  283. {
  284.         Delay5us();                                                      // 延時
  285.         SCL_P = 1;                                                      // 拉高時鐘線
  286.         Delay5us();                                                      // 延時
  287.     CY = SDA_P;                                                      // 讀應答信號
  288.     SCL_P = 0;                                                      // 拉低時鐘線
  289.     return CY;                                                      // 返回應答信號
  290. }


  291. /*********************************************************/
  292. // IIC發送應答信號
  293. // 入口參數:ack (0:ACK 1:NAK)
  294. /*********************************************************/
  295. void IIcSendACK(bit ack)
  296. {
  297.         SDA_P = ack;                                              // 寫應答信號
  298.         SCL_P = 1;                                                      // 拉高時鐘線
  299.         Delay5us();                                                      // 延時
  300.         SCL_P = 0;                                                      // 拉低時鐘線
  301.         Delay5us();                                                      // 延時
  302. }


  303. /*********************************************************/
  304. // 向IIC總線發送一個字節數據
  305. /*********************************************************/
  306. void IIcWriteByte(uchar dat)
  307. {
  308.         uchar i;
  309.         
  310.         for(i=0;i<8;i++)
  311.         {
  312.                 dat=dat<<1;                                                  // 移出數據的最高位
  313.                 SDA_P = CY;                                                  // 送數據口
  314.                 Delay5us();                                                  // 延時
  315.                 SCL_P = 1;                                                  // 拉高時鐘線
  316.                 Delay5us();                                                  // 延時
  317.                 SCL_P = 0;                                                  // 拉低時鐘線
  318.         }
  319. }


  320. /*********************************************************/
  321. // 從IIC總線接收一個字節數據
  322. /*********************************************************/
  323. uchar IIcRecvByte()
  324. {
  325.         uchar i;
  326.         uchar dat = 0;

  327.         SDA_P = 1;                                                                   // 拉高數據線,準備讀取數據,
  328.         for(i=0;i<8;i++)      
  329.         {
  330.                 dat <<= 1;                                                          // dat變量往左移1位
  331.                 SCL_P = 1;                                                          // 拉高時鐘線
  332.                 Delay5us();                                                          // 延時
  333.                 dat = dat|SDA_P;                                      // 讀數據               
  334.                 SCL_P = 0;                                                          // 拉低時鐘線
  335.                 Delay5us();                                                           // 延時
  336.         }
  337.         return dat;                                                                  // 返回讀取結果
  338. }


  339. /*********************************************************/
  340. // 往IIC寫入數據
  341. /*********************************************************/
  342. void IIcWriteDate(uchar dat)
  343. {
  344.         IIcStart();                                                                          // 發送起始信號
  345.         IIcWriteByte(0x46);                                           // 發送設備地址+寫信號
  346.         IIcRecvACK();                                                                  // 等待應答
  347.     IIcWriteByte(dat);                                                  // 寫入數據
  348.         IIcRecvACK();                                                                  // 等待應答
  349.         IIcStop();                                                           // 發送停止信號
  350. }


  351. /*********************************************************/
  352. // 從IIC讀出數據
  353. /*********************************************************/
  354. uint IIcReadDate()
  355. {
  356.         uint  ret;
  357.         uchar dat1,dat2;
  358.         
  359.         IIcStart();                                                               // 發送起始信號
  360.         IIcWriteByte(0x47);                                                      // 發送設備地址+讀信號
  361.         IIcRecvACK();                                                                      // 等待應答
  362.         dat1=IIcRecvByte();                                                      // 讀取第1字節數據
  363.         IIcSendACK(0);                                                                  // 發送應答信號
  364.         dat2=IIcRecvByte();                                                      // 讀取第2字節數據
  365.         IIcSendACK(1);                                                                  // 發送非應答信號
  366.         IIcStop();                                                                              // 發送停止信號
  367.         
  368.         ret=(dat1*256+dat2)/1.2;                                  // 計算光照強度
  369.         return ret;                                                                              // 返回測量結果
  370. }

  371. /*********************************************************/
  372. // 液晶輸出數字
  373. /*********************************************************/
  374. void LcdPrintLight(uint num)
  375. {
  376.         WriteLcdData(num/10000+0x30);                                          // 萬位
  377.         WriteLcdData(num%10000/1000+0x30);                          // 千位
  378.         WriteLcdData(num%1000/100+0x30);                              // 百位
  379.         WriteLcdData(num%100/10+0x30);                                      // 十位
  380.         WriteLcdData(num%10+0x30);                                                  // 個位
  381. }
  382. /*********************************************************/
  383. // 是否需要報警判斷
  384. /*********************************************************/
  385. void AlarmJudge(void)
  386. {
  387.         uchar i;
  388.            
  389.         /* 溫度判斷 */
  390.         if(temp>AlarmTH)                                                        // 溫度是否過高
  391.         {
  392.                 LedTH_P=0;
  393.                 LedTL_P=1;
  394.         }
  395.         else if(temp<AlarmTL)                                            // 溫度是否過低
  396.         {
  397.                 LedTL_P=0;
  398.                 LedTH_P=1;
  399.         }
  400.         else                                                                                            // 溫度正常
  401.         {
  402.                 LedTH_P=1;
  403.                 LedTL_P=1;
  404.         }

  405.         /* 濕度判斷 */
  406.         if(humi>AlarmHH)                                                       // 濕度是否過高
  407.         {
  408.                 LedHH_P=0;
  409.             LedHL_P=1;
  410.         }
  411.         else if(humi<AlarmHL)                                            // 濕度是否過低
  412.         {
  413.                 LedHL_P=0;
  414.                 LedHH_P=1;
  415.         }
  416.         else                                                                                           // 濕度正常
  417.         {
  418.                 LedHH_P=1;
  419.                 LedHL_P=1;
  420.         }

  421.         /* 光強判斷 */
  422.         if(light>AlarmLH)                                                       // 光強是否過高
  423.         {
  424.                 LedLH_P=0;
  425.             LedLL_P=1;
  426.         }
  427.         else if(light<AlarmLL)                                        // 光強是否過低
  428.         {
  429.                 LedLL_P=0;
  430.                 LedLH_P=1;
  431.         }
  432.         else                                                                                           // 光強正常
  433.         {
  434.                 LedLH_P=1;
  435.                 LedLL_P=1;
  436.         }

  437.         /* 蜂鳴器判斷 */
  438.         if((LedHH_P==0)||(LedHL_P==0)||(LedTH_P==0)||(LedTL_P==0)||(LedLH_P==0)||(LedLL_P==0))         // 蜂鳴器判斷,只要至少1個報警燈亮,蜂鳴器就報警
  439.         {
  440.                 for(i=0;i<3;i++)
  441.                 {
  442.                         Buzzer_P=0;
  443.                         DelayMs(100);
  444.                         Buzzer_P=1;
  445.                         DelayMs(100);
  446.                 }
  447.         }
  448. }


  449. /*********************************************************/
  450. // 按鍵掃描,用于設置報警范圍
  451. /*********************************************************/
  452. void KeyScanf()
  453. {
  454.         if(KeySet_P==0)                                                  // 判斷設置按鍵是否被按下
  455.         {
  456.                 /*將液晶顯示改為設置溫度的頁面****************************************************/
  457.                 WriteLcdCmd(0x01);                                                        // 設置界面的顯示框架
  458.                 SetLcdCursor(0,0);
  459.                 ShowLcdStr("Temperature Set ");
  460.                 SetLcdCursor(1,0);
  461.                 ShowLcdStr("      -    C    ");
  462.                 SetLcdCursor(1,10);                                                
  463.                 WriteLcdData(0xdf);                        

  464.                 SetLcdCursor(1,4);                                                           // 在液晶上填充溫度的下限值        
  465.                 ShowLcdNum(AlarmTL);        
  466.                 SetLcdCursor(1,7);                                                           // 在液晶上填充溫度的上限值
  467.                 ShowLcdNum(AlarmTH);

  468.                 SetLcdCursor(1,5);                                                           // 光標定位到第1行第5列
  469.                 WriteLcdCmd(0x0f);                                                  // 光標閃爍
  470.                
  471.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  472.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  473.                 DelayMs(10);                                                                // 去除按鍵松開的抖動

  474.                 /*設置溫度的下限值****************************************************************/
  475.                 while(KeySet_P)                                                              // “設置鍵”沒有被按下,則一直處于溫度下限的設置
  476.                 {
  477.                         if(KeyDown_P==0)                                              // 判斷 “減按鍵“ 是否被按下               
  478.                         {
  479.                                 if(AlarmTL>0)                                                  // 只有當溫度下限值大于0時,才能減1
  480.                                         AlarmTL--;
  481.                                 SetLcdCursor(1,4);                                           // 重新刷新顯示更改后的溫度下限值        
  482.                                 ShowLcdNum(AlarmTL);                  
  483.                                 SetLcdCursor(1,5);                                          // 重新定位閃爍的光標位置
  484.                                 DelayMs(350);                                                  // 延時
  485.                         }
  486.                         if(KeyUp_P==0)                                                    // 判斷 “加按鍵“ 是否被按下
  487.                         {
  488.                                 if(AlarmTL<99)                                             // 只有當溫度下限值小于99時,才能加1
  489.                                         AlarmTL++;
  490.                                 SetLcdCursor(1,4);                                            // 重新刷新顯示更改后的溫度下限值
  491.                                 ShowLcdNum(AlarmTL);
  492.                                 SetLcdCursor(1,5);                                          // 重新定位閃爍的光標位置
  493.                                 DelayMs(350);                                                  // 延時
  494.                         }        
  495.                 }

  496.                 SetLcdCursor(1,8);
  497.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  498.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  499.                 DelayMs(10);                                                                // 去除按鍵松開的抖動

  500.                 /*設置溫度的上限值****************************************************************/        
  501.                 while(KeySet_P)                                                            // “設置鍵”沒有被按下,則一直處于溫度上限的設置
  502.                 {
  503.                         if(KeyDown_P==0)                                              // 判斷 “減按鍵“ 是否被按下
  504.                         {
  505.                                 if(AlarmTH>0)                                                // 只有當溫度上限值大于0時,才能減1                        
  506.                                         AlarmTH--;
  507.                                 SetLcdCursor(1,7);                                         // 重新刷新顯示更改后的溫度上限值
  508.                                 ShowLcdNum(AlarmTH);
  509.                                 SetLcdCursor(1,8);                                          // 重新定位閃爍的光標位置
  510.                                 DelayMs(350);                                                     // 延時
  511.                         }
  512.                         if(KeyUp_P==0)                                                     // 判斷 “加按鍵“ 是否被按下
  513.                         {
  514.                                 if(AlarmTH<99)                                               // 只有當溫度上限值小于99時,才能加1
  515.                                         AlarmTH++;
  516.                                 SetLcdCursor(1,7);                                          // 重新刷新顯示更改后的溫度上限值         
  517.                                 ShowLcdNum(AlarmTH);
  518.                                 SetLcdCursor(1,8);                                          // 重新定位閃爍的光標位置
  519.                                 DelayMs(350);                                                  // 延時
  520.                         }                                                                  
  521.                 }

  522.                 /*將液晶顯示改為設置濕度的頁面****************************************************/
  523.                 WriteLcdCmd(0x01);                                                  // 設置界面的顯示框架
  524.                 SetLcdCursor(0,0);
  525.                 ShowLcdStr("  Humidity Set  ");
  526.                 SetLcdCursor(1,0);
  527.                 ShowLcdStr("      -   %RH   ");               

  528.                 SetLcdCursor(1,4);                                                           // 在液晶上填充濕度的下限值        
  529.                 ShowLcdNum(AlarmHL);        
  530.                 SetLcdCursor(1,7);                                                           // 在液晶上填充濕度的上限值
  531.                 ShowLcdNum(AlarmHH);
  532.                 SetLcdCursor(1,5);                                                           // 光標定位到第1行第5列
  533.                
  534.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  535.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  536.                 DelayMs(10);
  537.                
  538.                 /*設置濕度的下限值****************************************************************/
  539.                 while(KeySet_P)                                                               // “設置鍵”沒有被按下,則一直處于濕度下限的設置
  540.                 {
  541.                         if(KeyDown_P==0)                                              // 判斷 “減按鍵“ 是否被按下
  542.                         {
  543.                                 if(AlarmHL>0)                                                   // 只有當濕度下限值大于0時,才能減1
  544.                                         AlarmHL--;
  545.                                 SetLcdCursor(1,4);                                          // 重新刷新顯示更改后的濕度下限值         
  546.                                 ShowLcdNum(AlarmHL);
  547.                                 SetLcdCursor(1,5);                                          // 重新定位閃爍的光標位置
  548.                                 DelayMs(350);
  549.                         }
  550.                         if(KeyUp_P==0)                                                    // 判斷 “加按鍵“ 是否被按下
  551.                         {
  552.                                 if(AlarmHL<99)                                            // 只有當濕度下限值小于99時,才能加1
  553.                                         AlarmHL++;
  554.                                 SetLcdCursor(1,4);                                            // 重新刷新顯示更改后的濕度下限值
  555.                                 ShowLcdNum(AlarmHL);
  556.                                 SetLcdCursor(1,5);                                        // 重新定位閃爍的光標位置
  557.                                 DelayMs(350);                                                  // 延時
  558.                         }        
  559.                 }

  560.                 SetLcdCursor(1,8);
  561.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  562.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  563.                 DelayMs(10);                                                                // 去除按鍵松開的抖動
  564.                
  565.                 /*設置濕度的上限值****************************************************************/
  566.                 while(KeySet_P)                                                           // “設置鍵”沒有被按下,則一直處于濕度上限的設置
  567.                 {
  568.                         if(KeyDown_P==0)                                               // 判斷 “減按鍵“ 是否被按下
  569.                         {
  570.                                 if(AlarmHH>0)                                                // 只有當濕度上限值大于0時,才能減1
  571.                                         AlarmHH--;
  572.                                 SetLcdCursor(1,7);                                            // 重新刷新顯示更改后的濕度上限值
  573.                                 ShowLcdNum(AlarmHH);
  574.                                 SetLcdCursor(1,8);                                         // 重新定位閃爍的光標位置
  575.                                 DelayMs(350);
  576.                         }
  577.                         if(KeyUp_P==0)                                                       // 判斷 “加按鍵“ 是否被按下
  578.                         {
  579.                                 if(AlarmHH<99)                                              // 只有當濕度上限值小于99時,才能加1
  580.                                         AlarmHH++;
  581.                                 SetLcdCursor(1,7);                                           // 重新刷新顯示更改后的濕度上限值        
  582.                                 ShowLcdNum(AlarmHH);
  583.                                 SetLcdCursor(1,8);                                           // 重新定位閃爍的光標位置
  584.                                 DelayMs(350);                                                  // 延時
  585.                         }        
  586.                 }

  587.                 /*將液晶顯示改為設置光強的頁面****************************************************/
  588.                 WriteLcdCmd(0x01);                                                  // 設置界面的顯示框架
  589.                 SetLcdCursor(0,0);
  590.                 ShowLcdStr("   Light Set    ");
  591.                 SetLcdCursor(1,0);
  592.                 ShowLcdStr("      -      lx ");               

  593.                 SetLcdCursor(1,1);                                                           // 在液晶上填充光強的下限值        
  594.                 LcdPrintLight(AlarmLL);        
  595.                 SetLcdCursor(1,7);                                                           // 在液晶上填充光強的上限值
  596.                 LcdPrintLight(AlarmLH);
  597.                 SetLcdCursor(1,5);                                                           // 光標定位到第1行第5列
  598.                
  599.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  600.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  601.                 DelayMs(10);
  602.                
  603.                 /*設置光強的下限值****************************************************************/
  604.                 while(KeySet_P)                                                               // “設置鍵”沒有被按下,則一直處于光強下限的設置
  605.                 {
  606.                         if(KeyDown_P==0)                                              // 判斷 “減按鍵“ 是否被按下
  607.                         {
  608.                                 if(AlarmLL>0)                                                   // 只有當光強下限值大于0時,才能減1
  609.                                         AlarmLL--;
  610.                                 SetLcdCursor(1,1);                                          // 重新刷新顯示更改后的光強下限值         
  611.                                 LcdPrintLight(AlarmLL);
  612.                                 SetLcdCursor(1,5);                                          // 重新定位閃爍的光標位置
  613.                                 DelayMs(150);
  614.                         }
  615.                         if(KeyUp_P==0)                                                    // 判斷 “加按鍵“ 是否被按下
  616.                         {
  617.                                 if(AlarmLL<65534)                                    // 只有當光強下限值小于65534時,才能加1
  618.                                         AlarmLL++;
  619.                                 SetLcdCursor(1,1);                                            // 重新刷新顯示更改后的光強下限值
  620.                                 LcdPrintLight(AlarmLL);
  621.                                 SetLcdCursor(1,5);                                        // 重新定位閃爍的光標位置
  622.                                 DelayMs(150);                                                  // 延時
  623.                         }        
  624.                 }

  625.                 SetLcdCursor(1,11);
  626.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  627.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  628.                 DelayMs(10);                                                                // 去除按鍵松開的抖動
  629.                
  630.                 /*設置光強的上限值****************************************************************/
  631.                 while(KeySet_P)                                                             // “設置鍵”沒有被按下,則一直處于光強上限的設置
  632.                 {
  633.                         if(KeyDown_P==0)                                               // 判斷 “減按鍵“ 是否被按下
  634.                         {
  635.                                 if(AlarmLH>0)                                                // 只有當光強上限值大于0時,才能減1
  636.                                         AlarmLH--;
  637.                                 SetLcdCursor(1,7);                                            // 重新刷新顯示更改后的光強上限值
  638.                                 LcdPrintLight(AlarmLH);
  639.                                 SetLcdCursor(1,11);                                         // 重新定位閃爍的光標位置
  640.                                 DelayMs(150);
  641.                         }
  642.                         if(KeyUp_P==0)                                                       // 判斷 “加按鍵“ 是否被按下
  643.                         {
  644.                                 if(AlarmLH<65534)                                      // 只有當光強上限值小于65534時,才能加1
  645.                                         AlarmLH++;
  646.                                 SetLcdCursor(1,7);                                           // 重新刷新顯示更改后的光強上限值        
  647.                                 LcdPrintLight(AlarmLH);
  648.                                 SetLcdCursor(1,11);                                       // 重新定位閃爍的光標位置
  649.                                 DelayMs(150);                                                  // 延時
  650.                         }        
  651.                 }

  652.                 /*完成設置,退出前的處理**********************************************************/
  653.                 WriteLcdCmd(0x0C);                                                // 取消光標閃爍
  654.                 LcdShowInit();                                                              // 液晶顯示為檢測界面的

  655.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  656.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  657.                 DelayMs(10);                                                                // 去除按鍵松開的抖動
  658.                
  659.                 SectorErase(0x2000);                                                           // 存儲之前必須先擦除
  660.                 WriteE2PROM(0x2000,AlarmTL);                                  // 把溫度下限存入到EEPROM的0x2000這個地址
  661.                 WriteE2PROM(0x2001,AlarmTH);                                  // 把溫度上限存入到EEPROM的0x2001這個地址
  662.                 WriteE2PROM(0x2002,AlarmHL);                                  // 把濕度下限存入到EEPROM的0x2002這個地址
  663.                 WriteE2PROM(0x2003,AlarmHH);                                  // 把濕度上限存入到EEPROM的0x2003這個地址
  664.                 WriteE2PROM(0x2004,AlarmLL/256);                      // 把光強下限存入到EEPROM的0x2004和0x2005這兩個地址
  665.                 WriteE2PROM(0x2005,AlarmLL%256);
  666.                 WriteE2PROM(0x2006,AlarmLH/256);                      // 把光強上限存入到EEPROM的0x2006和0x2007這兩個地址
  667.                 WriteE2PROM(0x2007,AlarmLH%256);
  668.         }        
  669. }

  670. /*********************************************************/
  671. // 報警值初始化
  672. /*********************************************************/
  673. void AlarmInit()
  674. {
  675.         AlarmTL=ReadE2PROM(0x2000);                                  // 從EEPROM的0x2000這個地址讀取溫度的報警下限
  676.         AlarmTH=ReadE2PROM(0x2001);                                  // 從EEPROM的0x2001這個地址讀取溫度的報警上限
  677.         AlarmHL=ReadE2PROM(0x2002);                                  // 從EEPROM的0x2002這個地址讀取濕度的報警下限        
  678.         AlarmHH=ReadE2PROM(0x2003);                                  // 從EEPROM的0x2003這個地址讀取濕度的報警上限
  679.         AlarmLL=ReadE2PROM(0x2004)*256+ReadE2PROM(0x2005);          // 從EEPROM的0x2004和0x2005這兩個地址讀取光強的報警下限
  680.         AlarmLH=ReadE2PROM(0x2006)*256+ReadE2PROM(0x2007);          // 從EEPROM的0x2006和0x2007這兩個地址讀取光強的報警上限

  681.         if((AlarmTL==0)||(AlarmTL>100))                              // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  682.                 AlarmTL=20;
  683.         if((AlarmTH==0)||(AlarmTH>100))                              // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  684.                 AlarmTH=35;
  685.         if((AlarmHL==0)||(AlarmHL>100))                              // 如果溫度下限報警值讀出來異常(等于0或大于100),則重新賦值
  686.                 AlarmHL=40;
  687.         if((AlarmHH==0)||(AlarmHH>100))                              // 如果溫度上限報警值讀出來異常(等于0或大于100),則重新賦值
  688.                 AlarmHH=85;
  689.         if((AlarmLL==0)||(AlarmLL==65535))                          // 如果光照下限報警值讀出來異常(等于0或等于65535),則重新賦值
  690.                 AlarmLL=50;
  691.         if((AlarmLH==0)||(AlarmLH==65535))                          // 如果光照上限報警值讀出來異常(等于0或等于65535),則重新賦值
  692.                 AlarmLH=500;
  693. }

  694. /*********************************************************/
  695. // 主函數
  696. /*********************************************************/
  697. void main()
  698. {
  699.         uchar i;
  700.         
  701.         LcdInit();                                                                              // 液晶功能的初始化                        
  702.         LcdShowInit();                                                                   // 液晶顯示的初始化
  703.         AlarmInit();                                                                      // 報警值初始化
  704.         
  705.         while(1)
  706.         {
  707. ……………………

  708. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png

所有資料51hei提供下載:
環境監測系統.zip (2.74 MB, 下載次數: 622)


評分

參與人數 1黑幣 +5 收起 理由
mslong + 5 贊一個!

查看全部評分

回復

使用道具 舉報

ID:539809 發表于 2019-5-16 15:01 | 顯示全部樓層
您好,請問怎么獲取原理圖文件呀?
回復

使用道具 舉報

ID:542785 發表于 2019-5-20 23:02 | 顯示全部樓層
你的代碼好像有些問題,仿真時老是提示單片機P0.5腳邏輯錯誤
回復

使用道具 舉報

ID:157442 發表于 2019-10-24 23:33 | 顯示全部樓層
下載了哈,謝謝
回復

使用道具 舉報

ID:349854 發表于 2019-10-29 15:19 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
7#
無效樓層,該帖已經被刪除
ID:640570 發表于 2019-11-21 22:03 | 顯示全部樓層
大佬,protues的仿真圖在哪?怎么長不大
回復

使用道具 舉報

ID:708445 發表于 2020-3-14 20:25 | 顯示全部樓層
謝謝大佬
回復

使用道具 舉報

ID:732209 發表于 2020-5-4 13:32 來自觸屏版 | 顯示全部樓層
請問你們用keil可以打開嗎
回復

使用道具 舉報

11#
無效樓層,該帖已經被刪除
12#
無效樓層,該帖已經被刪除
13#
無效樓層,該帖已經被刪除
ID:47652 發表于 2020-12-23 21:11 | 顯示全部樓層
收藏了,謝謝分享!
回復

使用道具 舉報

ID:861916 發表于 2020-12-28 13:11 | 顯示全部樓層
已收藏,感謝分享
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
ID:914953 發表于 2021-5-3 12:25 | 顯示全部樓層
怎么找不到原理圖啊,站主
回復

使用道具 舉報

ID:914953 發表于 2021-5-3 22:00 | 顯示全部樓層
zzqsmyo 發表于 2019-5-16 15:01
您好,請問怎么獲取原理圖文件呀?

請問,你有原理圖文件嗎?
回復

使用道具 舉報

ID:914953 發表于 2021-5-3 22:18 | 顯示全部樓層
戴斌 發表于 2020-5-4 13:32
請問你們用keil可以打開嗎

能打開,但是文件不全
回復

使用道具 舉報

20#
無效樓層,該帖已經被刪除
ID:309376 發表于 2022-5-2 09:00 | 顯示全部樓層
感謝資料,下載下來,先學習一下
回復

使用道具 舉報

ID:825743 發表于 2022-8-14 09:27 | 顯示全部樓層
代碼有問題,不能正常使用,顯示函數都空白,沒有寫
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表