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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)花卉自動(dòng)澆水電路原理圖與源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:63146 發(fā)表于 2018-5-27 08:53 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
花卉自動(dòng)澆水系統(tǒng)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




我的畢業(yè)設(shè)計(jì),自動(dòng)澆水系統(tǒng)的仿真程序,是基于單片機(jī)的

單片機(jī)源碼如下:
  1. #include <reg52.h>
  2. #include <intrins.h>




  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. sbit         Key_Min=P3^5;
  6. sbit         Key_Add=P3^6;
  7. sbit         Key_Set=P3^7;
  8. sbit         Key_Mode=P1^0;


  9. sbit         Key_Low=P1^2;
  10. sbit         Key_High=P1^3;


  11. sbit led1=P3^2;        //綠燈,澆水狀態(tài),與繼電器同步
  12. sbit led2=P3^3;        //黃燈,水位上限
  13. sbit led3=P3^4;        //紅燈,水位下限
  14. //------------繼電器引腳-------------------
  15. sbit          JD=P2^1;
  16. sbit sw=P1^6;
  17. sbit BEEP=P2^0;
  18. uchar HumTab=0;                        //溫度澆水時(shí)上下限切換的標(biāo)志,記錄是上一個(gè)狀態(tài),0是缺少,1是盛水。
  19. sbit rs=P2^5;    //命令/數(shù)據(jù)選擇
  20. sbit rw=P2^6;    //讀寫口
  21. sbit  e=P2^7;    //鎖存控制


  22. sbit DQ = P1^5;
  23. bit DS18B20_IS_OK = 1; //DS18B20 正常標(biāo)志
  24. uchar Temp_Value[]={0x00,0x00}; //讀到的溫度值
  25. #define  NOP()   _nop_()   /* 定義空指令 */
  26. #define  _Nop()  _nop_()   /*定義空指令*/




  27. uchar ThresholdL=20;        //濕度閥值下限,低于這個(gè)值就開始澆水;
  28. uchar ThresholdH=50;        //濕度閥值上限,澆水超過這個(gè)值就停止?jié)菜?br />
  29. uchar code df_Table[]={ 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 };
  30. uchar Display_Digit[]={0,0,0,0};
  31. uchar CurrentT = 0;
  32. float time=0.0;
  33. long distance=0.0;
  34. int  num=0,num1=0;






  35. //**************************************************************************************************
  36. //延時(shí)函數(shù)
  37. //**************************************************************************************************
  38. void delay(uint time)         //int型數(shù)據(jù)為16位,所以最大值為65535            
  39. {
  40.   uint  i,j;             //定義變量i,j,用于循環(huán)語(yǔ)句
  41.   for(i=0;i<time;i++)    //for循環(huán),循環(huán)50*time次
  42.      for(j=0;j<100;j++); //for循環(huán),循環(huán)50次
  43. }
  44. void Delay1(uint x) //延時(shí) 2
  45. {
  46.         while(x--);
  47. }
  48. //**************************************************************************************************
  49. //向LCD寫一命令
  50. //**************************************************************************************************
  51. void wcode(uchar t)
  52. {
  53.   rs=0;           // 寫的是命令
  54.   rw=0;           // 寫狀態(tài)
  55.   e=1;            //使能
  56.   P0=t;           //寫入命令
  57.   delay(20);      //等待寫入,如果時(shí)間太短,會(huì)導(dǎo)致液晶無(wú)法顯示
  58.   e=0;            //數(shù)據(jù)的鎖定
  59. }


  60. //**************************************************************************************************
  61. //向LCD寫一數(shù)據(jù)
  62. //**************************************************************************************************
  63. void wdata(uchar t)
  64. {
  65.   rs=1;          // 寫的是數(shù)據(jù)
  66.   rw=0;          // 寫狀態(tài)
  67.   e=1;           //使能
  68.   P0=t;          //寫入數(shù)據(jù)
  69.   delay(20);     //等待寫入,如果時(shí)間太短,會(huì)導(dǎo)致液晶無(wú)法顯示
  70.   e=0;           //數(shù)據(jù)的鎖定
  71. }
  72. //**************************************************************************************************
  73. //LCD顯示第一行
  74. //**************************************************************************************************
  75. void xian1(uchar *dis)
  76. {
  77.   uchar i;
  78.   wcode(0x80);          //設(shè)置第一行顯示地址
  79.   for(i=0;i<16;i++)     //循環(huán)16次,寫完1行
  80.     {
  81.       wdata(dis[ i]);   //寫入該行數(shù)據(jù)[ i]
  82.     }
  83. }
  84. //**************************************************************************************************
  85. //LCD顯示第二行
  86. //**************************************************************************************************
  87. void xian2(uchar *str)
  88. {
  89.    uchar i;
  90.    wcode(0xc0);        //設(shè)置第二行顯示地址
  91.    for(i=0;i<16;i++)   //循環(huán)16次,寫完1行
  92.     {
  93.       wdata(str[ i]);  //寫入該行數(shù)據(jù)[ i]
  94.     }
  95. }
  96. //**************************************************************************************************
  97. //LCD 初始化
  98. //**************************************************************************************************
  99. void InitLCD()
  100.    {                  
  101.    wcode(0x01);          //清屏
  102.    wcode(0x06);   //輸入方式控制,增量光標(biāo)不移位
  103.    wcode(0x0c);   //顯示開關(guān)控制
  104.    wcode(0x38);   //功能設(shè)定:設(shè)置16x2顯示,5x7顯示,8位數(shù)據(jù)接口            
  105.    }  
  106. /*********************************************************/
  107. // 液晶光標(biāo)定位函數(shù)
  108. /*********************************************************/
  109. void LcdGotoXY(uchar line,uchar column)
  110. {
  111.     if(line==1)        // 第一行
  112.         wcode(0x80+column-1);
  113.     if(line==2)        // 第二行
  114.         wcode(0xC0+column-1);
  115. }
  116. /*********************************************************/
  117. // 液晶輸出數(shù)字
  118. /*********************************************************/
  119. void LcdPrintNum(uchar num)
  120. {


  121.         wdata(num/10%10+0x30);                    
  122.         wdata(num%10+0x30);        


  123. }


  124. void delay100us(void)   //誤差 0us
  125. {
  126.     unsigned char a,b;
  127.     for(b=19;b>0;b--)
  128.         for(a=1;a>0;a--);
  129. }




  130. uchar Init_DS18B20() //初始化(或者說(shuō)復(fù)位) DS18B20
  131. {
  132.         uchar status;
  133.         DQ = 1;
  134.         Delay1(8);
  135.         DQ = 0;
  136.         Delay1(90);
  137.         DQ = 1;
  138.         Delay1(8);
  139.         status=DQ;Delay1(100);
  140.         DQ = 1;
  141.         return status;
  142. }
  143. uchar ReadOneByte() //從 DS18B20 讀一字節(jié)數(shù)據(jù)
  144. {
  145.         uchar i,dat=0;
  146.         DQ = 1;
  147.         _nop_();
  148.         for(i=0;i<8;i++)
  149.         {
  150.                 DQ = 0;
  151.                 dat >>= 1;
  152.                 DQ = 1;
  153.                 _nop_();
  154.                 _nop_();
  155.                 if(DQ)
  156.                 dat |= 0X80;
  157.                 Delay1(30);
  158.                 DQ = 1;
  159.         }
  160.         return dat;
  161. }
  162. void WriteOneByte(uchar dat) //從 DS18B20 寫一字節(jié)數(shù)據(jù)
  163. {
  164.         uchar i;
  165.         for(i=0;i<8;i++)
  166.         {
  167.                 DQ = 0;
  168.                 DQ = dat& 0x01;
  169.                 Delay1(5);
  170.                 DQ = 1;
  171.                 dat >>= 1;
  172.         }
  173. }
  174. void Read_Temperature() //從 DS18B20 讀取溫度值
  175. {
  176.         if(Init_DS18B20()==1) //DS18B20 故障
  177.                 DS18B20_IS_OK=0;
  178.         else
  179.         {        
  180.                 WriteOneByte(0xcc); //跳過序列號(hào)命令
  181.                 WriteOneByte(0x44); //啟動(dòng)溫度轉(zhuǎn)換命令
  182.                 Init_DS18B20(); //復(fù)位 DS18B20 ( 每一次讀寫之前都要對(duì) DS18B20 進(jìn)行復(fù)位操作)
  183.                 WriteOneByte(0xcc); //跳過序列號(hào)命令
  184.                 WriteOneByte(0xbe); //讀取溫度寄存器
  185.                 Temp_Value[0] = ReadOneByte(); //讀取溫度低 8 位(先讀低字節(jié),再讀高字節(jié),)
  186.                 Temp_Value[1] = ReadOneByte();//讀取溫度高 8 位 (每次只能讀一個(gè)字節(jié))
  187.                 DS18B20_IS_OK=1; //DS18B20 正常
  188.         }
  189. }
  190. void Display_Temperature() //在 1602LCD 上顯示當(dāng)前溫度
  191. {
  192.         
  193.         uchar t = 150, ng = 0; //延時(shí)值與負(fù)數(shù)標(biāo)志
  194.         if((Temp_Value[1]&0xf8)==0xf8) //高字節(jié)高 5 位如果全為 1,則為負(fù)數(shù),為負(fù)數(shù)時(shí)取反
  195.         { //加 1,并設(shè)置負(fù)數(shù)標(biāo)志為 1
  196.                 Temp_Value[1] = ~Temp_Value[1];
  197.                 Temp_Value[0] = ~Temp_Value[0]+1;
  198.                 if(Temp_Value[0]==0x00) //若低字節(jié)進(jìn)位,則高字節(jié)加 1
  199.                         Temp_Value[1]++;
  200.                         ng = 1; //設(shè)置負(fù)數(shù)標(biāo)志為 1
  201.         }
  202.         Display_Digit[0] = df_Table[Temp_Value[0]&0x0f]; //查表得到溫度小數(shù)部分
  203.         //獲取溫度整數(shù)部分(低字節(jié)低 4 位清零,高 4 位右移 4 位) +(高字節(jié)高 5 位清零,
  204.         //低三位左移 4 位)
  205.         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
  206.         //將溫度整數(shù)部分分解為 3 位待顯示數(shù)字
  207.         Display_Digit[3] = CurrentT/100;
  208.         Display_Digit[2] = CurrentT%100/10;
  209.         Display_Digit[1] = CurrentT%10;
  210.         //刷新 LCD 緩沖 //加字符 0 是為了將待數(shù)字轉(zhuǎn)化為字符顯示
  211.         LcdGotoXY(2,3);
  212.         wdata(Display_Digit[2]+'0');
  213.         wdata(Display_Digit[1]+'0');
  214.         wdata('.');
  215.         wdata(Display_Digit[0]+'0');
  216. }
  217. void delay10ms(void)   //誤差 -0.000000000001us
  218. {
  219.     unsigned char a,b,c;
  220.     for(c=7;c>0;c--)
  221.         for(b=168;b>0;b--)
  222.             for(a=22;a>0;a--);
  223. }
  224. void WateringIntelligence()        //智能控制模式
  225. {
  226.         //--------------設(shè)置濕度上下限函數(shù)----
  227.     {
  228.                    JD=1;
  229.                 wcode(0x0f);                                   // 顯示光標(biāo),并閃爍
  230.                 //delay10ms();
  231.                 while(Key_Set==0);                                // 等待按鍵釋放
  232.                 //delay10ms();
  233.                 wcode(0x01);                            // 清屏
  234.                 xian1("Humidity   Set  ");                                 // 顯示 "Humidity Set" (第一行)
  235.                 xian2("      -   %RH   ");                                        // 顯示“  -   %RH  ” (第二行)
  236.                 LcdGotoXY(2,5);
  237.                 LcdPrintNum(HumiLowTemp);
  238.                 LcdGotoXY(2,8);
  239.                 LcdPrintNum(HumiHigTemp);
  240.                 LcdGotoXY(2,6);
  241.                 /*****濕度下限值設(shè)置******************************************
  242.                 ------------------------------------------------------------*/
  243.                 while(Key_Set!=0)
  244.                 {
  245.                         if(Key_Min==0)                                                // 濕度下限值 減
  246.                         {
  247.                                 HumiLowTemp--;
  248.                                 if(HumiLowTemp<0)
  249.                                         HumiLowTemp=0;
  250.                                 LcdGotoXY(2,5);                                        // 顯示濕度下限值
  251.                                 LcdPrintNum(HumiLowTemp);               
  252.                                 LcdGotoXY(2,6);
  253.                                 delay(500);                                       
  254.                         }
  255.                         if(Key_Add==0)                                                // 濕度下限值 加
  256.                         {
  257.                                   HumiLowTemp++;
  258.                                 if(HumiLowTemp==100)
  259.                                         HumiLowTemp=99;
  260.                                 LcdGotoXY(2,5);                                          // 顯示濕度下限值
  261.                                 LcdPrintNum(HumiLowTemp);               
  262.                                 LcdGotoXY(2,6);
  263.                                 delay(500);        
  264.                         }
  265.                 }
  266.                 //delay10ms();
  267.                 while(Key_Set==0);                                                // 等待按鍵釋放
  268.                 //delay10ms();
  269.                 LcdGotoXY(2,9);        
  270.                 while(Key_Set!=0)                                                // 如果按鍵1按下,那么跳到下一級(jí)設(shè)置,否則是濕度上限值的大小設(shè)置
  271.                 {
  272.                         if(Key_Min==0)                                                // 濕度上限值 減
  273.                         {
  274.                                 HumiHigTemp--;
  275.                                 if(HumiHigTemp<0)
  276.                                         HumiHigTemp=0;
  277.                                 LcdGotoXY(2,8);                                        // 顯示濕度上限值
  278.                                 LcdPrintNum(HumiHigTemp);
  279.                                 LcdGotoXY(2,9);
  280.                                 delay(500);               
  281.                         }
  282.                         if(Key_Add==0)                                                // 濕度上限值 加
  283.                         {
  284.                                 HumiHigTemp++;
  285.                                 if(HumiHigTemp==100)
  286.                                         HumiHigTemp=99;
  287.                                 LcdGotoXY(2,8);                                        // 顯示度上限值
  288.                                 LcdPrintNum(HumiHigTemp);
  289.                                 LcdGotoXY(2,9);
  290.                                 delay(500);                        
  291.                         }                                                        
  292.                 }
  293.                 //delay10ms();
  294.                 while(Key_Set==0);                                                // 等待按鍵釋放
  295.                 //delay10ms();
  296.                 wcode(0x0c);
  297.                
  298.                 ThresholdL=HumiLowTemp;                // 更新濕度下限報(bào)警值
  299.                 ThresholdH=HumiHigTemp;                // 更新濕度上限報(bào)警               
  300.                
  301.                 InitLCD();           //初始化1602  
  302.                    xian1("Watering System ");           //顯示第一行           
  303.                    xian2("T:   C H:  %RH  ");       //顯示第二行                  
  304.                 LcdGotoXY(2,5);
  305.                 wdata(0xdf);                        
  306.                
  307.         }        


  308.         if(sw==0)                   //當(dāng)前溫度低于閾值下限,澆水        
  309.         {        
  310.                 JD=0;        
  311.                 led1=0;        
  312.                 HumTab=0;
  313.                 LcdGotoXY(2,10);
  314.                 LcdPrintNum(19);
  315.                                 
  316.         }               
  317.         else        //當(dāng)前溫度高于閾值上限,停止?jié)菜?nbsp;       
  318.         {        
  319.                 JD=1;        
  320.                 led1=1;        
  321.                 HumTab=1;
  322.                 LcdGotoXY(2,10);
  323.                 LcdPrintNum(53);        
  324.         }                        


  325. }               


  326. //水位檢測(cè)函數(shù)
  327. void CheckWaterLevel()
  328. {
  329.         if(Key_Low==1&&Key_High==1)//高低水位都沒水
  330.         {
  331.                    led3=0;                         //下水位,快沒水了
  332.                 led2=1;
  333.                 BEEP=0;                        //蜂鳴器報(bào)警
  334.         }


  335.         else if(Key_Low==0&&Key_High==0)//低水位有水,高水位有水,水滿了
  336.         {
  337.                 led3=1;
  338.                 led2=0;
  339.                 BEEP=0;
  340.         }        
  341.           else
  342.           {
  343.         led3=1;
  344.                 led2=1;
  345.                 BEEP=1;


  346.           }
  347. }               
  348. void main()
  349. {


  350.         InitLCD();           //初始化1602  


  351.         xian1("Watering System ");
  352.         xian2("T:   C H:  %RH  ");       //顯示第二行
  353.         LcdGotoXY(2,5);
  354.         wdata(0xdf);               
  355.            while(1)           //進(jìn)入死循環(huán),防止看門狗復(fù)位
  356.         {
  357.                 //key1deal();
  358.                 Read_Temperature();
  359.                 Display_Temperature();
  360.                 CheckWaterLevel();
  361.                 WateringIntelligence();
  362.                 delay(1000);
  363.         }


  364. }
復(fù)制代碼


全部資料51hei下載地址:
花卉自動(dòng)澆水.rar (76.03 KB, 下載次數(shù): 159)





評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:345158 發(fā)表于 2018-6-13 00:33 | 只看該作者
hi,你這個(gè)畢業(yè)設(shè)計(jì)有電路原理圖嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:498721 發(fā)表于 2019-3-26 21:07 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

地板
ID:532592 發(fā)表于 2019-5-10 16:12 來(lái)自觸屏版 | 只看該作者
樓主,我想問一下那個(gè)藍(lán)色字體是什么,看不清楚
回復(fù)

使用道具 舉報(bào)

5#
ID:659078 發(fā)表于 2019-12-10 12:34 | 只看該作者
謝謝大佬
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产96色在线 | 久久精品在线 | 激情一区二区三区 | 国产精品毛片久久久久久久 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 黄色一级免费看 | 成人综合在线视频 | 久久伊人精品一区二区三区 | 欧美国产一区二区 | 亚洲国产成人精品女人久久久 | 在线播放一区二区三区 | 日韩视频在线免费观看 | 日韩在线视频观看 | 精品美女久久久久久免费 | 午夜影视| 99久久婷婷国产综合精品 | 老司机67194精品线观看 | 亚洲精品久久久久久一区二区 | 日本三级在线 | 国产午夜精品久久久久免费视高清 | 日韩欧美国产一区二区三区 | 欧美一区二区三区视频 | 欧美韩一区二区三区 | 在线视频一区二区三区 | 在线观看国产视频 | 97精品超碰一区二区三区 | 超碰在线影院 | 人人爽日日躁夜夜躁尤物 | 国产视频久久 | 日本成人毛片 | 老头搡老女人毛片视频在线看 | 久草在线在线精品观看 | 国产激情视频 | 久久久久久久成人 | 96国产精品久久久久aⅴ四区 | 欧美天堂 | 九九热久久免费视频 | 成人福利视频 | 久久综合久久综合久久 | 国产网站在线免费观看 | 97久久久久久久久 |