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

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

QQ登錄

只需一步,快速開始

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

51單片機(jī)+ADC0832智能澆花系統(tǒng)Proteus仿真程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
功能描述:
(1)本系統(tǒng)采用單片機(jī)STC89C52+ADC0832+LCD1602液晶+土壤濕度傳感器+抽水電機(jī)+ 按鍵+蜂鳴器設(shè)計(jì)而成。
(2)能夠檢測(cè)土壤的濕度,實(shí)時(shí)顯示到LCD1602液晶屏上。其中,液晶第一行顯示實(shí)際的濕度。液晶第二行顯示濕度上限值和濕度下限值。
(3)根據(jù)不同的土壤,能夠合理的調(diào)整澆水要求。通過(guò)按鍵設(shè)置上下限值。濕度低于下限報(bào)警,開始澆水直到上限停止報(bào)警及澆水。隨后濕度下降到下限開始報(bào)警并啟動(dòng)澆水。
(4)按鍵分為,減鍵、加鍵、設(shè)置鍵。潛水泵通過(guò)繼電器控制通斷。
(5)可通過(guò)藍(lán)牙模塊對(duì)應(yīng)的手機(jī)端讀取實(shí)時(shí)濕度數(shù)據(jù),并控制單片機(jī)端繼電器和蜂鳴器功能的有無(wú)。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include <reg52.H>
  2. #include "intrins.h"
  3. #include "uart.h"
  4. #include "stdio.h"
  5. #include <stdio.h>

  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define ulong unsigned long
  9. #define     LCDIO      P0         //液晶屏數(shù)據(jù)口
  10. //ADC0832的引腳
  11. sbit ADCLK =P3^6;  //ADC0832 clock signal
  12. sbit ADDIO =P3^7;  //ADC0832 k in
  13. sbit ADCS =P3^4;  //ADC0832 chip seclect

  14. sbit rs=P2^5;  //定義1602 RS
  15. sbit rw=P2^6;  //定義1602 Rw
  16. sbit lcden=P2^7; //定義1602 EN

  17. sbit key1=P1^7;    //設(shè)定
  18. sbit key2=P1^6;    //加
  19. sbit key3=P1^5;    //減
  20. sbit motor=P2^1;   //繼電器接口
  21. sbit speak=P2^0;        //蜂鳴器接口
  22. uchar key;         //設(shè)定指針
  23. uint RH=500,RL=10;//水位上下限
  24. float temp_f;
  25. ulong temp;
  26. uchar v;
  27. uchar count,s1num;
  28. uchar code table[]= "shi du:          ";
  29. uchar code table1[]="RH:  %              ";
  30. uchar getdata; //獲取ADC轉(zhuǎn)換回來(lái)的值

  31. unsigned char init_flag=1;

  32. /*********************************************/
  33. void delay(uint z)                  //延時(shí)
  34. {
  35.         uint x,y;
  36.         for(x=z;x>0;x--)
  37.                 for(y=110;y>0;y--);
  38. }

  39. void long_alarm(void)                  //延時(shí)
  40. {
  41.     speak=0;                       
  42.     delay(800);                
  43.     speak=1;
  44.     delay(800);
  45. }

  46. void alarm(void)                  //延時(shí)
  47. {
  48.     speak=0;                       
  49.     delay(50);                
  50.     speak=1;
  51.     delay(50);
  52. }

  53. /**********************************************/
  54. void write_com(uchar com)
  55. {
  56.         rs=0;
  57. //        rd=0;
  58.         lcden=0;
  59.         P0=com;
  60.         delay(5);
  61.         lcden=1;
  62.         delay(5);
  63.         lcden=0;       
  64. }
  65. /*********************************************/
  66. void write_date(uchar date)
  67. {
  68.         rs=1;
  69. //        rd=0;
  70.         lcden=0;
  71.         P0=date;
  72.         delay(5);
  73.         lcden=1;
  74.         delay(5);
  75.         lcden=0;       
  76. }
  77. /***********************************************/
  78. void init()
  79. {
  80.         uchar num;

  81.         Uart_Init();

  82.         lcden=0;
  83.         rw=0;
  84.         write_com(0x38);
  85.         write_com(0x0c);
  86.         write_com(0x06);
  87.         write_com(0x01);
  88.         write_com(0x80);
  89.         for(num=0;num<15;num++)
  90.                 {
  91.                         write_date(table[num]);
  92.                         delay(5);
  93.                 }
  94.         write_com(0x80+0x40);
  95.         for(num=0;num<15;num++)
  96.                 {
  97.                         write_date(table1[num]);
  98.                         delay(5);
  99.                 }
  100.         }
  101. //****************************************************************************/
  102. /************
  103. 讀ADC0832函數(shù)
  104. ************/
  105. //采集并返回
  106. /****************************************************************************
  107. 函數(shù)功能:AD轉(zhuǎn)換子程序
  108. 入口參數(shù):CH(如果讀取CH0,channel的值為0x01,如果讀取CH1則channel的值為0x03)
  109. 出口參數(shù):adval
  110. ****************************************************************************/
  111. uchar Adc0832()     //AD轉(zhuǎn)換,返回結(jié)果
  112. {
  113.     uchar i;
  114.     uchar dat=0;

  115.     ADCLK=0;
  116.     ADDIO=1;
  117.     ADCS=0;                  //拉低CS端
  118.     ADCLK=1;                 
  119.     ADCLK=0;                 //拉低CLK端,形成下降沿1

  120.     ADDIO=1;//指定轉(zhuǎn)換通道是CH1還是CH2,指定值位與0x1,取最后一位的值
  121.     ADCLK=1;   
  122.     ADCLK=0;                 //拉低CLK端,形成下降沿2

  123.     ADDIO=0;//指定值右移一位,再取最后一位的值
  124.     ADCLK=1;
  125.     ADCLK=0;                //拉低CLK端,形成下降沿3


  126.     ADDIO=1;               
  127.         for(i=0;i<8;i++)
  128.     {
  129.         ADCLK=1;
  130.         ADCLK=0;           //形成一次時(shí)鐘脈沖
  131.         if(ADDIO)
  132.                    dat|= 0x80>>i;  //收數(shù)據(jù)
  133.     }


  134.     ADCS=1;                //拉低CS端
  135.     ADCLK=1;
  136.     ADDIO=1;               //拉高數(shù)據(jù)端,回到初始狀態(tài)
  137.     return(dat);           //return dat
  138. }
  139. /***************************************************************************/


  140. /********************************************************/
  141. void displayRH()                        //下限顯示
  142. {write_com(0xc0+3);
  143. write_date(RH/100%10+0x30);//上限百位
  144. write_date(RH/10%10+0x30);//上限十位
  145. //write_date('.');
  146. //write_date(RH%10+0x30);
  147. }
  148. void displayRL()          //下限顯示
  149. {write_com(0xca);
  150.   write_date('R');
  151.   write_date('L');
  152.   write_date(':');
  153. write_date(RL/100%10+0x30);//下限百位
  154. write_date(RL/10%10+0x30);//下限十位
  155. write_date('%');
  156. }
  157. /**************************************************/
  158. /********************************************************/
  159. void keyscan()                 //按鍵處理
  160. {
  161.         bit kk1=0,kk2=0;

  162.         if(key1==0)
  163.         {
  164.          delay(10);
  165.          while(key1==0);
  166.          alarm();       
  167.          key=1;

  168.            switch(key)
  169.            {
  170. //            speak=1;kk2=motor;motor=1;
  171.             case 1:        //RL下線報(bào)警值設(shè)置
  172.                     {
  173.                             write_com(0x0f);write_com(0xce); //光標(biāo)閃爍
  174.                                 while(key1!=0)         //等待按鍵松開
  175.                                 {
  176.                                     if(key2==0)                //key2按鍵下
  177.                                    {   
  178.                                            delay(10);                //按鍵延時(shí)消抖
  179.                                            if(key2==0)                //確定key2按下
  180.                                            {
  181.                                                     while(key2==0); //等待松開
  182.                                             alarm();
  183.                                                         if(RL>=998)
  184.                                                         {RL=999;                //RL下限最大設(shè)置為99
  185.                                                         }
  186.                                                         else
  187.                                                         {RL+=10;                //RL加1
  188.                                                         }       
  189.                                            }
  190.                                            displayRL();                //調(diào)用RL下限顯示函數(shù)
  191.                                            write_com(0xce);
  192.                                    }  
  193.                                     

  194.                                    if(key3==0)                //key3按下
  195.                                    {                                  
  196.                                                    delay(10);                //按鍵延時(shí)消抖
  197.                                                   if(key3==0)                //確定key3按下
  198.                                            {
  199.                                                     while(key3==0);         //等待key3按鍵松開
  200.                                             alarm();
  201.                                                         if(RL<=1)                 //RL最小設(shè)置為1
  202.                                                         {RL=0;
  203.                                                         }
  204.                                                         else
  205.                                                         {RL-=10;                 //RL下限減1
  206.                                                         }
  207.                                            }
  208.                                            displayRL();                //調(diào)用RL下限顯示函數(shù)
  209.                                            write_com(0xce);
  210.                                   }                          
  211.                            }
  212.                                    while(key1==0);
  213.                     alarm();                       
  214.                         }


  215.                         case 2:        //RL上線報(bào)警值設(shè)置
  216.                         {
  217.                            write_com(0x0f);write_com(0xc4);  //RH設(shè)置數(shù)據(jù),光標(biāo)閃爍
  218.                            while(key1==1)
  219.                            {
  220.                                     if(key2==0)           //key2按下
  221.                                    {
  222.                                            delay(30);           //按鍵延時(shí)消抖
  223.                                            if(key2==0)           //確定key2按下
  224.                                            {
  225.                                                     while(key2==0);        //等待松開
  226.                                             alarm();
  227.                                                         if(RH>=998)                //RH最大設(shè)置為99
  228.                                                         {RH=999;
  229.                                                         }
  230.                                                         else
  231.                                                         {RH+=10;                //RH加1
  232.                                                         }                                       
  233.                                            }
  234.                                             displayRH();                //RH上限顯示函數(shù)
  235.                                             write_com(0xc4);
  236.                                     }
  237.                                  
  238.                                   
  239.                                   
  240.                                    if(key3==0)          //key3按下
  241.                                    {
  242.                                            delay(30);          //按鍵延時(shí)消抖
  243.                                            if(key3==0)          //確定按下
  244.                                            {
  245.                                                     while(key3==0);//等待松開
  246.                                             alarm();
  247.                                                         if(RH<=1)           //RH最小設(shè)置為1
  248.                                                         {RH=0;
  249.                                                         }
  250.                                                         else
  251.                                                         {RH-=10;                //RH減1
  252.                                                         }                                               
  253.                                                 }
  254.                                                    displayRH();                //調(diào)用RH顯示函數(shù)
  255.                                                    write_com(0xc4);
  256.                                   }                       
  257.                            }
  258.                            while(key1==0);
  259.                        alarm();
  260.                            }


  261.                         case 0:
  262.                         {
  263.                                         write_com(0x0c);
  264.                                     break;
  265.                         }


  266.          }
  267.    }
  268. }
  269. /**************************************************/
  270. void Conut(void)          //土壤檢測(cè)數(shù)據(jù)轉(zhuǎn)換
  271. {          
  272.       v=Adc0832();
  273.           temp=v;
  274. //      temp_f=temp*10/2.55;
  275.           temp_f=(temp-173.4)*12.25;
  276.       temp=temp_f;
  277.           temp=1000-temp;         
  278.           write_com(0x80+10);
  279.           write_date(temp/100%10+0x30);//千位
  280.           write_date(temp/10%10+0x30);//百位
  281.           write_date('.');
  282.           write_date(temp%10+0x30);
  283.           write_date('%');//顯示符號(hào)位
  284.        
  285.          }
  286. /********************************************************/
  287. void main(void)
  288. {
  289.     char alarm_flag=0;
  290.         char alarm_forbidden_flag=0;
  291.         unsigned char shidu_string[20];

  292.         init();
  293.         displayRH();   //顯示上限
  294.         displayRL();   //顯示下限
  295.         delay(50);         //啟動(dòng)等待,等LCD講入工作狀態(tài)
  296.         delay(50);         //延時(shí)片刻(可不要)
  297.         delay(50);                         //延時(shí)
  298.         delay(50);
  299.         Conut();           //顯示函數(shù)
  300.         delay(150);        
  301.        

  302.         while(1)
  303.         {        
  304. //                printf("%d",1);
  305.            Conut();        //顯示當(dāng)前濕度
  306.                  keyscan();
  307.                  

  308.                   sprintf(shidu_string, "shi du: %2d.%d \r\n",(int)(temp/10),(int)(temp%10));
  309.                   Send_Word(shidu_string); //通過(guò)藍(lán)牙將數(shù)據(jù)上報(bào)出去,給你的手機(jī)藍(lán)牙助手。


  310.                 if(init_flag!=0)
  311.                  {
  312. ……………………

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

所有資料51hei提供下載:
基于51單片機(jī)智能澆花系統(tǒng).7z (231.39 KB, 下載次數(shù): 164)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:143646 發(fā)表于 2021-6-24 17:36 | 只看該作者
請(qǐng)問(wèn)如果需要多個(gè)土壤檢測(cè)點(diǎn)和多個(gè)水泵.應(yīng)該怎么弄呢
回復(fù)

使用道具 舉報(bào)

板凳
ID:927615 發(fā)表于 2021-6-24 18:04 來(lái)自手機(jī) | 只看該作者
不錯(cuò),照著做一個(gè)試試
回復(fù)

使用道具 舉報(bào)

地板
ID:118488 發(fā)表于 2021-7-16 16:46 | 只看該作者

不錯(cuò),照著做一個(gè)試試
回復(fù)

使用道具 舉報(bào)

5#
ID:955045 發(fā)表于 2021-7-20 18:01 | 只看該作者
看了您的作品,感覺慢有意思的,我是做科研的 想做一個(gè)多通道的噴霧單片機(jī)。不知道有沒有興趣,項(xiàng)目開發(fā)
回復(fù)

使用道具 舉報(bào)

6#
ID:518779 發(fā)表于 2021-9-13 16:06 | 只看該作者
感謝分享,下載下來(lái)學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线不卡 | www.黄色在线观看 | 国产精品特级片 | 成年人黄色小视频 | 91在线精品一区二区 | www.日韩高清 | 国产精品日韩欧美一区二区三区 | 91av在线影院 | 日本在线网址 | 日本精品久久久久久久 | 日韩在线精品视频 | 91精品国产综合久久久久久 | 亚洲国产成人av好男人在线观看 | 亚洲国产精品人人爽夜夜爽 | 91大神在线资源观看无广告 | 欧美日韩久| 亚洲精品一二三区 | 久久国内精品 | 51ⅴ精品国产91久久久久久 | 成人欧美一区二区三区在线播放 | 91一区 | 一级黄色夫妻生活 | 成人免费视频一区 | 亚洲精品视频在线看 | 羞羞的视频免费在线观看 | 亚洲精品一区二三区不卡 | 亚洲综合小视频 | 欧美日韩视频 | 99久久婷婷国产综合精品电影 | www.亚洲精品 | 草久久 | 在线免费观看亚洲 | 国产精品1区 | 中文字幕在线不卡播放 | 337p日韩 | 一级毛片大全免费播放 | 久久综合久色欧美综合狠狠 | 国产1区2区在线观看 | 国产午夜视频 | 99热欧美 | 国产精品免费一区二区三区 |