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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機環(huán)境監(jiān)測系統(tǒng)(光照度,溫濕度上下限報警)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:198608 發(fā)表于 2018-5-4 22:02 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機環(huán)境監(jiān)測系統(tǒng),溫度濕度,光照度檢測,可設(shè)置上下限報警可加繼電器控制加熱器件,風(fēng)扇等模塊,蜂鳴器,LED作為狀態(tài)輸出,資料齊全

電路原理圖如下:


實物圖:


單片機源程序如下:
  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;                                                          //數(shù)據(jù)寄存器
  7. sfr ISP_ADDRH = 0xe3;                                                          //地址寄存器高八位
  8. sfr ISP_ADDRL = 0xe4;                                                          //地址寄存器低八位
  9. sfr ISP_CMD   = 0xe5;                                                          //命令寄存器
  10. sfr ISP_TRIG  = 0xe6;                                                          //命令觸發(fā)寄存器
  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數(shù)據(jù)接入
  16. sbit SDA_P     = P3^5;                                        // 光照模塊IIC數(shù)據(jù)引腳定義
  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;                                              // “設(shè)置”按鍵的管腳
  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. // 單片機內(nèi)部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. // 從單片機內(nèi)部EEPROM讀一個字節(jié)
  48. /*********************************************************/
  49. unsigned char ReadE2PROM(unsigned int addr)
  50. {
  51.     ISP_DATA = 0x08;                                      //數(shù)據(jù)寄存器清零
  52.     ISP_CONTR = 0x83;                                     //允許改變內(nèi)部E2PROM,存取數(shù)據(jù)速度為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;                                      //先向命令觸發(fā)寄存器寫入0x46
  57.     ISP_TRIG = 0x99;                                      //再向命令觸發(fā)寄存器寫入0xb9,完成觸發(fā)
  58.     _nop_();                                              //延時大約1us
  59.     ISP_Disable();                                        //單片機內(nèi)部EEPROM不使能
  60.    
  61.     return ISP_DATA;                                      //返回讀的數(shù)據(jù)
  62. }

  63. /*********************************************************/
  64. // 從單片機內(nèi)部EEPROM寫一個字節(jié)
  65. /*********************************************************/
  66. void WriteE2PROM(unsigned int addr, unsigned char dat)
  67. {
  68.     ISP_CONTR = 0x83;                                     //允許改變內(nèi)部E2PROM,存取數(shù)據(jù)速度為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;                                       //輸入要寫的數(shù)據(jù)
  73.     ISP_TRIG = 0x46;                                      //先向命令觸發(fā)寄存器寫入0x46
  74.     ISP_TRIG = 0xb9;                                      //再向命令觸發(fā)寄存器寫入0xb9,完成觸發(fā)
  75.     _nop_();                                              //延時大約1us
  76.     ISP_Disable();                                        //單片機內(nèi)部EEPROM不使能
  77. }

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

  92. /*********************************************************/
  93. // 延時X*ms函數(shù)
  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液晶寫命令函數(shù),cmd就是要寫入的命令
  104. /*********************************************************/
  105. void WriteLcdCmd(uchar cmd)
  106. {
  107.         LcdRs_P = 1;                                          //數(shù)據(jù)命令選擇引腳置為低電平,選擇寫入命令
  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液晶寫數(shù)據(jù)函數(shù),dat就是要寫入的數(shù)據(jù)
  118. /*********************************************************/
  119. void WriteLcdData(uchar dat)
  120. {
  121.         LcdRs_P = 1;                                          //數(shù)據(jù)命令選擇引腳置為高電平,選擇寫入數(shù)據(jù)
  122.         LcdRw_P = 0;                                          //讀寫選擇引腳置為低電平,選擇寫入
  123.         LcdEn_P = 0;                                          //使能引腳置為低電平
  124.         P0=dat;                                               //要寫入的數(shù)據(jù)賦值給P0端口
  125.         DelayMs(2);                                           //延時2ms
  126.         LcdEn_P = 1;                                          //使能引腳置為高電平
  127.         DelayMs(2);                                           //延時2ms
  128.         LcdEn_P = 0;                                          //使能引腳置為低電平
  129. }

  130. /*********************************************************/
  131. // 液晶坐標(biāo)設(shè)置函數(shù)
  132. /*********************************************************/
  133. void SetLcdCursor(unsigned char line, unsigned char column)
  134. {
  135.     if(line == 0)                                         //判斷是否為第一行
  136.         WriteLcdCmd(column + 0x80);                       //若是,寫入第一行列坐標(biāo)
  137.     if(line == 1)                                         //判斷是否為第二行
  138.         WriteLcdCmd(column + 0x80 + 0x40);                //若是,寫入第二行列坐標(biāo)
  139. }
  140. /*********************************************************/
  141. // 液晶顯示字符串函數(shù)
  142. /*********************************************************/
  143. void ShowLcdStr(unsigned char *str)
  144. {
  145.     while(*str != '\0')                                  //當(dāng)沒有指向結(jié)束符
  146.         WriteLcdData(*str++);                            //字符指針加1
  147. }
  148. /*********************************************************/
  149. // 液晶初始化函數(shù)
  150. /*********************************************************/
  151. void LcdInit()
  152. {
  153.     WriteLcdCmd(0x38);                                    //16*2顯示,5*7點陣,8位數(shù)據(jù)口
  154.     WriteLcdCmd(0x06);                                    //地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移
  155.     WriteLcdCmd(0x0c);                                    //開顯示,不顯示光標(biāo)
  156.     WriteLcdCmd(0x01);                                    //清屏
  157. }
  158. /*********************************************************/
  159. // 液晶輸出數(shù)字
  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_();                                                  //執(zhí)行一條指令,延時1微秒
  175.         _nop_();
  176.         _nop_();

  177. }
  178. /*********************************************************/
  179. // 讀取DHT11_P單總線上的一個字節(jié)
  180. /*********************************************************/
  181. unsigned char DhtReadByte()
  182. {
  183.         bit bit_i;                                            //定義一個bitx型變量,用來保存每一位讀取到的值
  184.         unsigned char i;                                      //定義無符號變量i,for循環(huán)用
  185.         unsigned char dat = 0;                                //定義無符號變量dat,用來保存讀取到的一個字節(jié)數(shù)據(jù)
  186.         
  187.         for(i=07; i<10; i++)                                    //循環(huán)8次,依次讀取每一位
  188.         {
  189.                 while(!DHT11_P)                                   //等待低電平結(jié)束
  190.                 Delay10us();                                      //延時10us
  191.                 Delay10us();                                      //延時10us
  192.                 Delay10us();                                      //延時10us
  193.                 if(DHT11_P == 0)                                  //判斷數(shù)據(jù)線是否為高電平
  194.                 {
  195.                         bit_i = 0;                                    //若為高電平,讀取高電平,保存在bit_i中
  196.                         while(DHT11_P);                               //等待高電平結(jié)束
  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的一幀數(shù)據(jù),濕高、濕低(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;                                  //校驗字節(jié)
  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的低電平結(jié)束
  228.         while(DHT11_P);                                       //等待DHT的高電平結(jié)束
  229.         
  230.         HumiHig = DhtReadByte();                              //濕度高8位
  231.         HumiLow = DhtReadByte();                                  //濕度低8為,總為0
  232.         TempHig = DhtReadByte();                              //溫度高8位
  233.         TempLow = DhtReadByte();                              //溫度低8為,總為0
  234.         Check   = DhtReadByte();                              //8位校驗碼,其值等于讀出的四個字節(jié)相加之和的低8位
  235.         
  236.         DHT11_P = 1;                                          //拉高總線
  237.         
  238.         if(Check == HumiHig + HumiLow + TempHig +TempLow)     //如果收到的數(shù)據(jù)無誤
  239.         {
  240.                 temp = TempHig;                                   //將溫度的檢測結(jié)果賦值給全局變量temp
  241.                 humi = HumiHig;                                   //將濕度的檢測結(jié)果賦值給全局變量humi
  242.         }        
  243. }
  244. /*********************************************************/
  245. // 5us級延時程序
  246. /*********************************************************/
  247. void Delay5us()
  248. {
  249.         _nop_();                                                  // 執(zhí)行一條指令,延時1微秒
  250.         _nop_();
  251.         _nop_();
  252.         _nop_();
  253.         _nop_();
  254. }


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


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


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


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


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


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

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


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


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

  371. /*********************************************************/
  372. // 液晶輸出數(shù)字
  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. // 按鍵掃描,用于設(shè)置報警范圍
  451. /*********************************************************/
  452. void KeyScanf()
  453. {
  454.         if(KeySet_P==0)                                                  // 判斷設(shè)置按鍵是否被按下
  455.         {
  456.                 /*將液晶顯示改為設(shè)置溫度的頁面****************************************************/
  457.                 WriteLcdCmd(0x01);                                                        // 設(shè)置界面的顯示框架
  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);                                                           // 光標(biāo)定位到第1行第5列
  469.                 WriteLcdCmd(0x0f);                                                  // 光標(biāo)閃爍
  470.                
  471.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  472.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  473.                 DelayMs(10);                                                                // 去除按鍵松開的抖動

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

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

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

  522.                 /*將液晶顯示改為設(shè)置濕度的頁面****************************************************/
  523.                 WriteLcdCmd(0x01);                                                  // 設(shè)置界面的顯示框架
  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);                                                           // 光標(biāo)定位到第1行第5列
  533.                
  534.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  535.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  536.                 DelayMs(10);
  537.                
  538.                 /*設(shè)置濕度的下限值****************************************************************/
  539.                 while(KeySet_P)                                                               // “設(shè)置鍵”沒有被按下,則一直處于濕度下限的設(shè)置
  540.                 {
  541.                         if(KeyDown_P==0)                                              // 判斷 “減按鍵“ 是否被按下
  542.                         {
  543.                                 if(AlarmHL>0)                                                   // 只有當(dāng)濕度下限值大于0時,才能減1
  544.                                         AlarmHL--;
  545.                                 SetLcdCursor(1,4);                                          // 重新刷新顯示更改后的濕度下限值         
  546.                                 ShowLcdNum(AlarmHL);
  547.                                 SetLcdCursor(1,5);                                          // 重新定位閃爍的光標(biāo)位置
  548.                                 DelayMs(350);
  549.                         }
  550.                         if(KeyUp_P==0)                                                    // 判斷 “加按鍵“ 是否被按下
  551.                         {
  552.                                 if(AlarmHL<99)                                            // 只有當(dāng)濕度下限值小于99時,才能加1
  553.                                         AlarmHL++;
  554.                                 SetLcdCursor(1,4);                                            // 重新刷新顯示更改后的濕度下限值
  555.                                 ShowLcdNum(AlarmHL);
  556.                                 SetLcdCursor(1,5);                                        // 重新定位閃爍的光標(biāo)位置
  557.                                 DelayMs(350);                                                  // 延時
  558.                         }        
  559.                 }

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

  587.                 /*將液晶顯示改為設(shè)置光強的頁面****************************************************/
  588.                 WriteLcdCmd(0x01);                                                  // 設(shè)置界面的顯示框架
  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);                                                           // 光標(biāo)定位到第1行第5列
  598.                
  599.                 DelayMs(10);                                                                // 去除按鍵按下的抖動
  600.                 while(!KeySet_P);                                                       // 等待按鍵釋放
  601.                 DelayMs(10);
  602.                
  603.                 /*設(shè)置光強的下限值****************************************************************/
  604.                 while(KeySet_P)                                                               // “設(shè)置鍵”沒有被按下,則一直處于光強下限的設(shè)置
  605.                 {
  606.                         if(KeyDown_P==0)                                              // 判斷 “減按鍵“ 是否被按下
  607.                         {
  608.                                 if(AlarmLL>0)                                                   // 只有當(dāng)光強下限值大于0時,才能減1
  609.                                         AlarmLL--;
  610.                                 SetLcdCursor(1,1);                                          // 重新刷新顯示更改后的光強下限值         
  611.                                 LcdPrintLight(AlarmLL);
  612.                                 SetLcdCursor(1,5);                                          // 重新定位閃爍的光標(biāo)位置
  613.                                 DelayMs(150);
  614.                         }
  615.                         if(KeyUp_P==0)                                                    // 判斷 “加按鍵“ 是否被按下
  616.                         {
  617.                                 if(AlarmLL<65534)                                    // 只有當(dāng)光強下限值小于65534時,才能加1
  618.                                         AlarmLL++;
  619.                                 SetLcdCursor(1,1);                                            // 重新刷新顯示更改后的光強下限值
  620.                                 LcdPrintLight(AlarmLL);
  621.                                 SetLcdCursor(1,5);                                        // 重新定位閃爍的光標(biāo)位置
  622.                                 DelayMs(150);                                                  // 延時
  623.                         }        
  624.                 }

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

  652.                 /*完成設(shè)置,退出前的處理**********************************************************/
  653.                 WriteLcdCmd(0x0C);                                                // 取消光標(biāo)閃爍
  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. // 主函數(shù)
  696. /*********************************************************/
  697. void main()
  698. {
  699.         uchar i;
  700.         
  701.         LcdInit();                                                                              // 液晶功能的初始化                        
  702.         LcdShowInit();                                                                   // 液晶顯示的初始化
  703.         AlarmInit();                                                                      // 報警值初始化
  704.         
  705.         while(1)
  706.         {
  707. ……………………

  708. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
環(huán)境監(jiān)測系統(tǒng).zip (2.74 MB, 下載次數(shù): 622)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:539809 發(fā)表于 2019-5-16 15:01 | 只看該作者
您好,請問怎么獲取原理圖文件呀?
回復(fù)

使用道具 舉報

板凳
ID:542785 發(fā)表于 2019-5-20 23:02 | 只看該作者
你的代碼好像有些問題,仿真時老是提示單片機P0.5腳邏輯錯誤
回復(fù)

使用道具 舉報

地板
ID:157442 發(fā)表于 2019-10-24 23:33 | 只看該作者
下載了哈,謝謝
回復(fù)

使用道具 舉報

5#
ID:349854 發(fā)表于 2019-10-29 15:19 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

6#
ID:640570 發(fā)表于 2019-11-21 22:03 | 只看該作者
大佬,protues的仿真圖在哪?怎么長不大
回復(fù)

使用道具 舉報

7#
ID:708445 發(fā)表于 2020-3-14 20:25 | 只看該作者
謝謝大佬
回復(fù)

使用道具 舉報

8#
ID:732209 發(fā)表于 2020-5-4 13:32 來自觸屏版 | 只看該作者
請問你們用keil可以打開嗎
回復(fù)

使用道具 舉報

9#
ID:47652 發(fā)表于 2020-12-23 21:11 | 只看該作者
收藏了,謝謝分享!
回復(fù)

使用道具 舉報

10#
ID:861916 發(fā)表于 2020-12-28 13:11 | 只看該作者
已收藏,感謝分享
回復(fù)

使用道具 舉報

11#
ID:914953 發(fā)表于 2021-5-3 12:25 | 只看該作者
怎么找不到原理圖啊,站主
回復(fù)

使用道具 舉報

12#
ID:914953 發(fā)表于 2021-5-3 22:00 | 只看該作者
zzqsmyo 發(fā)表于 2019-5-16 15:01
您好,請問怎么獲取原理圖文件呀?

請問,你有原理圖文件嗎?
回復(fù)

使用道具 舉報

13#
ID:914953 發(fā)表于 2021-5-3 22:18 | 只看該作者
戴斌 發(fā)表于 2020-5-4 13:32
請問你們用keil可以打開嗎

能打開,但是文件不全
回復(fù)

使用道具 舉報

14#
ID:309376 發(fā)表于 2022-5-2 09:00 | 只看該作者
感謝資料,下載下來,先學(xué)習(xí)一下
回復(fù)

使用道具 舉報

15#
ID:825743 發(fā)表于 2022-8-14 09:27 | 只看該作者
代碼有問題,不能正常使用,顯示函數(shù)都空白,沒有寫
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久久久牛牛 | 日韩一级免费观看 | 中文字幕国产精品视频 | 成在线人视频免费视频 | 国产在线精品一区二区 | 久久在线免费 | 九九av | 在线区 | 美女一级毛片 | 在线观看视频福利 | 黄色毛片在线播放 | 少妇一级淫片aaaaaaaaa | 欧美一区二区精品 | 成人在线视频免费看 | 七七婷婷婷婷精品国产 | 亚洲色片网站 | 久久一二 | 午夜视频一区二区三区 | 夜夜爽99久久国产综合精品女不卡 | 亚洲精品免费看 | 国产精品美女久久久久久免费 | 黄视频在线网站 | 国产欧美一级二级三级在线视频 | 亚洲男人天堂av | 激情综合五月天 | 99久久精品视频免费 | 日韩精品久久 | 一区二区三区视频在线观看 | 伊人春色成人网 | 天啪 | 国产精品久久久久aaaa九色 | 国产成人精品高清久久 | 波波电影院一区二区三区 | 激情欧美一区二区三区 | 久久国内 | 精品国产综合 | 一级黄色裸片 | 亚洲三区在线 | 国产真实乱全部视频 | 欧美一级视频免费看 | 中日韩欧美一级片 |