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

QQ登錄

只需一步,快速開始

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

單片機(jī)自動(dòng)澆花系統(tǒng)(附原理圖、仿真文件、源程序)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:254980 發(fā)表于 2017-12-1 12:02 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
(共享資料)自己做的基于stc89c51單片機(jī)的自動(dòng)澆花系統(tǒng),有自動(dòng)和手動(dòng)兩種模式,可以設(shè)置濕度的上下限,利用lcd1602顯示,有一點(diǎn)遺憾的是設(shè)置濕度上下限時(shí),沒有光標(biāo)閃動(dòng)提示,希望大家給點(diǎn)建議,幫助改進(jìn),我把源程序附在這。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


原理圖:


單片機(jī)源代碼:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit ad_cs=P1^3;         //ADC0832的控制位
  5. sbit ad_clk=P1^0;
  6. sbit ad_dat=P1^1;

  7. sbit lcd_rs=P2^7;         //LCD1602的控制位
  8. sbit lcd_e=P2^6;

  9. sbit key1=P1^4;                 //獨(dú)立按鍵
  10. sbit key2=P3^2;
  11. sbit key3=P3^3;

  12. sbit relay=P1^6;     //繼電器

  13. bit flag=1;                     //工作模式標(biāo)志
  14. bit flag_motor=1;         //手動(dòng)模式下,抽水機(jī)開關(guān)標(biāo)志
  15. bit flag_jia=0;
  16. bit flag_jian=0;

  17. uchar Hum_H=60;                 //自動(dòng)模式下,濕度設(shè)定最大值
  18. uchar Hum_L=30;                 //自動(dòng)模式下,濕度設(shè)定最小值

  19. uchar num=0;

  20. /********************延時(shí)函數(shù)1ms*****************
  21. void delay_ms(uint a)                                       
  22. {
  23.         uint i;
  24.         while(a--)
  25.         for(i=0;i<125;i++);
  26. }
  27. *************************************/


  28. /*******************延時(shí)函數(shù)50us******************/
  29. void delay_50us(uint a)
  30. {
  31.         uint i;
  32.         while(a--)
  33.         for(i=0;i<19;i++);
  34. }
  35. /*************************************/

  36. /*******************ADC讀取******************/
  37. uchar read_ad(uchar channel)  
  38. {
  39.         uchar i;
  40.         uchar dat1,dat2;
  41.         ad_clk=0;
  42.         ad_cs=0;
  43.         ad_dat=1;
  44.         ad_clk=1;
  45.         ad_clk=0;  //起始信號(hào)

  46.         ad_dat=1;
  47.         ad_clk=1;
  48.         ad_clk=0;  //選擇單通道模式

  49.         ad_dat=channel;//0對(duì)應(yīng)通道0,1對(duì)應(yīng)通道1
  50.         ad_clk=1;
  51.         ad_clk=0;

  52.         ad_dat=1;

  53.         for(i=0;i<8;++i)
  54.         {
  55.                  ad_clk=1;
  56.                 ad_clk=0;
  57.                 dat1=dat1<<1;
  58.                 if(ad_dat)
  59.                 dat1|=0x01;        
  60.         
  61.         }
  62.         for(i=0;i<8;i++)
  63.         {
  64.                  dat2=dat2>>1;
  65.                 if(ad_dat)
  66.                 dat2|=0x80;        
  67.                
  68.                 ad_clk=1;
  69.                 ad_clk=0;
  70.         }
  71.         ad_cs=1;
  72.         return (dat1==dat2)?dat1:0;
  73.         
  74. }
  75. /*************************************/

  76. /*******************LCD1602初始化******************/
  77. void write_com(uchar com)        //寫指令
  78. {
  79.         lcd_e=0;
  80.         lcd_rs=0;
  81.         P0=com;
  82.         delay_50us(10);
  83.         lcd_e=1;
  84.         delay_50us(10);
  85.         lcd_e=0;
  86. }

  87. void write_data(uchar dat)  //寫數(shù)據(jù)
  88. {
  89.         lcd_e=0;
  90.         lcd_rs=1;
  91.         P0=dat;
  92.         delay_50us(10);
  93.         lcd_e=1;
  94.         delay_50us(10);
  95.         lcd_e=0;
  96. }                        

  97. void init_lcd1602()                 //lcd 初始化
  98. {
  99.         delay_50us(300);
  100.         write_com(0x38);
  101.         delay_50us(100);
  102.         write_com(0x38);
  103.         delay_50us(100);
  104.         write_com(0x38);
  105.         write_com(0x38);
  106.         write_com(0x08);
  107.         write_com(0x01);
  108.         write_com(0x06);
  109.         write_com(0x0c);
  110. }

  111. void display_shu(uchar add,uchar dat)          //顯示數(shù)字
  112. {
  113.         uchar l,m;
  114.         
  115. //        k=dat/100;
  116.         l=dat%100/10;
  117.         m=dat%10;

  118.         write_com(0x80+add);
  119. //        write_data(k+0x30);
  120.         write_data(l+0x30);
  121.         write_data(m+0x30);
  122. }

  123. void display_string(uchar add,uchar *dat)  //顯示字符串
  124. {
  125.         uchar i;
  126.          write_com(0x80+add);
  127.         while(dat!=0&&(*dat!='\0')&&i<16)
  128.         {
  129.                  write_data(*dat);
  130.                 dat++;
  131.                 i++;
  132.                 if(i==15) i=0;
  133.         }
  134. }
  135. /*****************************************/

  136. /****************主函數(shù)*******************/
  137. void main()
  138. {
  139.         EA=1;                                                          //開總中斷
  140.         EX0=1;                                                          //開外部中斷0
  141.         EX1=1;                                                          //開外部中斷1
  142.         IT0=0;                                                          //外部中斷0觸發(fā)方式為低電平
  143.         IT1=0;                                                          //外部中斷1觸發(fā)方式為低電平
  144.         
  145.         init_lcd1602();        
  146.         
  147.         display_string(0,"Hum:  %");      //實(shí)時(shí)顯示當(dāng)前的濕度
  148.         display_string(11,"H:  %");       //顯示設(shè)置的濕度最大值

  149.         display_string(0x40,"Mode:");          //顯示工作模式
  150.         display_string(0x40+11,"L:  %");  //顯示設(shè)置的濕度最小值


  151.     while(1)
  152.         {        
  153.                 uchar i;
  154.                
  155.                 i=100-read_ad(0)*0.39;
  156.                 display_shu(4,i);
  157.                 display_shu(13,Hum_H);
  158.                 display_shu(0x40+13,Hum_L);
  159.                 if(key1==0)        
  160.                         {
  161.                                 delay_50us(100);
  162.                                 if(key1==0)
  163.                                 {
  164.                                         while(!key1);
  165.                                         num++;
  166.                                         if(num>2) num=0;
  167.                                 }        
  168.                            
  169.                                 switch (num)                                         //選擇工作模式和調(diào)整濕度設(shè)置最大、最小值
  170.                             {
  171.                                 case 0:flag=~flag;
  172.                                            flag_jia=0;
  173.                                            flag_jian=0;
  174.                                            //write_com(0x80+0x40);
  175.                                        //write_com(0x0f);
  176.                                            break;
  177.                                 case 1://write_com(0x80+9);
  178.                                        //write_com(0x0f);
  179.                                            //delay_50us(1000);
  180.                                            //write_com(0x0c);
  181.                                            flag_jia=1;
  182.                                            flag_jian=0;
  183.                                            break;
  184.                                 case 2://write_com(0x80+0x40+9);
  185.                                        //write_com(0x0f);
  186.                                            //delay_50us(1000);
  187.                                            //write_com(0x0c);
  188.                                            flag_jian=1;
  189.                                            flag_jia=0;
  190.                                            break;        
  191.                            }
  192.                            if(flag==0&&num==1)        
  193.                            {
  194.                                    flag=~flag;
  195.                                    num=0;
  196.                                    flag_jia=0;
  197.                                    flag_jian=0;
  198.                            }               
  199.                     }                  
  200.                 if(flag==0)                              //手動(dòng)模式
  201.                 {
  202.                         
  203.                          display_string(0x40+5,"MT");
  204.                         if(flag_motor) relay=1;
  205.                         else if(i<Hum_H) relay=0;          //不能超過濕度最大值
  206.                         else relay=1;
  207.                 }                                
  208.                 else                                                          //自動(dòng)模式
  209.                 {
  210.                         display_string(0x40+5,"AT");
  211.                         if(i<(Hum_L+Hum_H)/2)                   //最大和最小值的平均值作為抽水的判斷條件
  212.                         {
  213.                                  relay=0;
  214.                         }
  215.                         else relay=1;
  216.                 }
  217.      }        
  218. }
  219. /********************************************/

  220. /***********************外部中斷*********************/
  221. void int0() interrupt 0
  222. {
  223.         delay_50us(20);
  224.         if(key2==0)
  225.         while(!key2);
  226.         flag_motor=~flag_motor;
  227.         if(flag&&flag_jia)
  228.           {
  229.                     //write_com(0x80+9);
  230.               //write_com(0x0f);
  231.                   //delay_50us(1000);
  232.               //write_com(0x0c);
  233.                   //delay_50us(1000);
  234.                   Hum_H++;
  235.                   if(Hum_H>=99) Hum_H=99;
  236.           }
  237.         if(flag&&flag_jian)
  238.           {
  239.                     //write_com(0x80+0x40+9);
  240.                   //write_com(0x0f);
  241.                   //delay_50us(1000);
  242.                   //write_com(0x0c);
  243.                   //delay_50us(1000);
  244.                   Hum_L++;
  245.                   if(Hum_L>=Hum_H) Hum_L=Hum_H-1;
  246.           }   
  247. }

  248. void int1() interrupt 2
  249. {
  250.         delay_50us(20);
  251.         if(key3==0)
  252.         while(!key3);        
  253.         if(flag&&flag_jian)
  254.           {
  255.                     //write_com(0x80+0x40+9);
  256.                   //write_com(0x0f);
  257.                   //delay_50us(1000);
  258.                   //write_com(0x0c);
  259.                   //delay_50us(1000);
  260.                   Hum_L--;
  261.                   if(Hum_L<=1) Hum_L=1;
  262.           }
  263.         if(flag&&flag_jia)
  264.           {
  265.               //write_com(0x80+9);
  266.               //write_com(0x0f);
  267.                   //delay_50us(1000);
  268.               //write_com(0x0c);
  269.                   //delay_50us(1000);
  270.                   Hum_H--;
  271.                   if(Hum_H<=Hum_L) Hum_H=Hum_L+1;
  272.           }
  273. }
  274. /********************************************/
復(fù)制代碼
全部資料51hei下載地址:
基于51單片機(jī)的自動(dòng)澆花系統(tǒng).zip (33.96 KB, 下載次數(shù): 1461)



評(píng)分

參與人數(shù) 4黑幣 +112 收起 理由
17802971359 + 2 贊一個(gè)!
HanCock + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
粟米sss + 5 很給力!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

來自 2#
ID:247623 發(fā)表于 2018-4-3 10:59 | 只看該作者
可以用keil 4編譯成功,仿真可以

搜狗截圖20180403105826.jpg (260.46 KB, 下載次數(shù): 247)

搜狗截圖20180403105826.jpg
回復(fù)

使用道具 舉報(bào)

板凳
ID:257503 發(fā)表于 2017-12-5 10:11 | 只看該作者
在嗎,怎么在keil3_full編譯不行的,我一摸一樣復(fù)制的
回復(fù)

使用道具 舉報(bào)

地板
ID:257631 發(fā)表于 2017-12-5 12:33 | 只看該作者
很厲害的
回復(fù)

使用道具 舉報(bào)

5#
ID:254980 發(fā)表于 2017-12-8 13:33 | 只看該作者
yxlclp17 發(fā)表于 2017-12-5 10:11
在嗎,怎么在keil3_full編譯不行的,我一摸一樣復(fù)制的

提示什么錯(cuò)誤 我用的keil4編譯環(huán)境
回復(fù)

使用道具 舉報(bào)

6#
ID:259068 發(fā)表于 2017-12-8 14:30 | 只看該作者
贊一個(gè)!

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:259548 發(fā)表于 2017-12-9 19:49 | 只看該作者
adc0832不能仿真怎么辦
回復(fù)

使用道具 舉報(bào)

8#
ID:270103 發(fā)表于 2018-1-2 12:00 | 只看該作者
我是小白,請(qǐng)問左下角的那個(gè)圓形在ISIS中怎么找啊
回復(fù)

使用道具 舉報(bào)

9#
ID:242941 發(fā)表于 2018-2-8 11:49 | 只看該作者
yxlclp17 發(fā)表于 2017-12-5 10:11
在嗎,怎么在keil3_full編譯不行的,我一摸一樣復(fù)制的

格式不對(duì)或者缺少什么語句,仔細(xì)檢查,如果代碼沒問題建議換keil 4
回復(fù)

使用道具 舉報(bào)

10#
ID:273292 發(fā)表于 2018-2-8 13:25 | 只看該作者
給你點(diǎn)贊,暫時(shí)不下載 ,需要的時(shí)候自然下載
回復(fù)

使用道具 舉報(bào)

11#
ID:272080 發(fā)表于 2018-2-8 18:45 | 只看該作者
沒有下載電路吧
回復(fù)

使用道具 舉報(bào)

12#
ID:300285 發(fā)表于 2018-4-1 11:42 | 只看該作者
非常給力。。
回復(fù)

使用道具 舉報(bào)

13#
ID:300185 發(fā)表于 2018-4-2 19:09 | 只看該作者
很不錯(cuò),能仿真出來
回復(fù)

使用道具 舉報(bào)

14#
ID:192893 發(fā)表于 2018-4-3 08:05 來自手機(jī) | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

15#
ID:168085 發(fā)表于 2018-4-15 10:36 | 只看該作者
又沒有做出來東西
回復(fù)

使用道具 舉報(bào)

16#
ID:308570 發(fā)表于 2018-4-15 14:46 來自手機(jī) | 只看該作者
身為一個(gè)小白感覺很厲害厲害
回復(fù)

使用道具 舉報(bào)

17#
ID:301533 發(fā)表于 2018-4-25 17:00 | 只看該作者
請(qǐng)問能解釋一下AD原理圖繼電器模塊與電源接口模塊的工作原理嗎,看不太懂。
回復(fù)

使用道具 舉報(bào)

18#
ID:323130 發(fā)表于 2018-5-5 22:54 | 只看該作者
為啥我下載了,卻沒有清單
回復(fù)

使用道具 舉報(bào)

19#
ID:321920 發(fā)表于 2018-5-6 05:45 來自手機(jī) | 只看該作者
BOOKS 發(fā)表于 2018-4-2 19:09
很不錯(cuò),能仿真出來

你好,我是新手,請(qǐng)問用的是什么仿真軟件?能不能發(fā)給我一份?545535222@qq.com 謝謝
回復(fù)

使用道具 舉報(bào)

20#
ID:321920 發(fā)表于 2018-5-6 05:46 來自手機(jī) | 只看該作者
你好,我是新手,請(qǐng)問用的是什么仿真軟件?能不能發(fā)給我一份?545535222@qq.com 謝謝
回復(fù)

使用道具 舉報(bào)

21#
ID:323448 發(fā)表于 2018-5-6 14:35 | 只看該作者
厲害了
回復(fù)

使用道具 舉報(bào)

22#
ID:175067 發(fā)表于 2018-5-10 15:46 | 只看該作者
很厲害,正好用到
回復(fù)

使用道具 舉報(bào)

23#
ID:328949 發(fā)表于 2018-5-13 16:30 | 只看該作者
絕對(duì)干貨,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

24#
ID:330461 發(fā)表于 2018-5-15 16:01 | 只看該作者
仿真軟件叫什么名字   在哪里可以下載,謝謝
回復(fù)

使用道具 舉報(bào)

25#
ID:326586 發(fā)表于 2018-5-16 16:08 | 只看該作者
這個(gè)。。。樓主用的是什么濕度傳感器呢沒找到
回復(fù)

使用道具 舉報(bào)

26#
ID:326586 發(fā)表于 2018-5-16 16:09 | 只看該作者
劉樂濤 發(fā)表于 2018-5-15 16:01
仿真軟件叫什么名字   在哪里可以下載,謝謝

Proteus
回復(fù)

使用道具 舉報(bào)

27#
ID:334166 發(fā)表于 2018-5-20 15:19 | 只看該作者
怎么顯示屏沒有顯示啊
回復(fù)

使用道具 舉報(bào)

28#
ID:332444 發(fā)表于 2018-5-23 18:05 | 只看該作者
下載一個(gè)試看,謝謝分享。
回復(fù)

使用道具 舉報(bào)

29#
ID:277616 發(fā)表于 2018-5-23 20:10 | 只看該作者
請(qǐng)問現(xiàn)在很多土壤濕度傳感器不需要AD,那程序應(yīng)該變成什么樣子呢?
回復(fù)

使用道具 舉報(bào)

30#
ID:330461 發(fā)表于 2018-5-30 20:24 | 只看該作者
各位大哥們,程序有點(diǎn)看不懂,大神能加我好友指點(diǎn)一下嗎,1224799169重謝
回復(fù)

使用道具 舉報(bào)

31#
ID:345619 發(fā)表于 2018-6-5 19:36 | 只看該作者
感覺好厲害呀  新人勿怪
回復(fù)

使用道具 舉報(bào)

32#
ID:265171 發(fā)表于 2018-6-25 10:15 | 只看該作者
yilinghai 發(fā)表于 2018-4-3 10:59
可以用keil 4編譯成功,仿真可以

朋友如何仿真啊
回復(fù)

使用道具 舉報(bào)

33#
ID:335581 發(fā)表于 2018-6-26 18:42 | 只看該作者
您好,如果有STC89C51單片機(jī)開發(fā)板,這個(gè)仿真圖該怎樣設(shè)計(jì)
回復(fù)

使用道具 舉報(bào)

34#
ID:320226 發(fā)表于 2018-9-26 22:00 | 只看該作者
樓主你好.怎解濕度低于下限值時(shí)電機(jī)不工作啊
回復(fù)

使用道具 舉報(bào)

35#
ID:405844 發(fā)表于 2018-10-6 15:14 | 只看該作者
多謝分享哈
回復(fù)

使用道具 舉報(bào)

36#
ID:422623 發(fā)表于 2018-11-7 21:24 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

37#
ID:156302 發(fā)表于 2018-11-8 09:05 | 只看該作者
很給力,謝謝分享
回復(fù)

使用道具 舉報(bào)

38#
ID:422791 發(fā)表于 2018-11-8 10:29 | 只看該作者
謝謝樓主 感謝這次帶來的幫助
回復(fù)

使用道具 舉報(bào)

39#
ID:402717 發(fā)表于 2018-11-9 07:58 | 只看該作者
下載學(xué)習(xí)一下,謝謝分享
回復(fù)

使用道具 舉報(bào)

40#
ID:433915 發(fā)表于 2018-11-27 08:59 | 只看該作者
剛好時(shí)實(shí)訓(xùn)作業(yè)要做贊一個(gè)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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