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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4177|回復: 4
打印 上一主題 下一主題
收起左側

51單片機的養殖場自動投喂系統程序原理圖 WT588D語音模塊

  [復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:

WT588D -16語音模塊+2個8P圓排座    2
DS1302時鐘芯片+SIP8管座    2
32.768Khz晶振    2
11.0592M晶振    1
9*15萬用板    5
USB電源線或供電電池盒    2
MQ-2煙霧檢測    1

單片機源程序如下:
  1. #include <reg52.h>
  2. #include"LCD1602.h"//液晶
  3. #include" 1302.h"                //DS1302時鐘芯片
  4. #include "EepRom.h"
  5. #include"wt588.c" //語音播報
  6. #include "ADC0832.h"

  7. #define uchar unsigned char
  8. #define uint unsigned int


  9. //-------------------------------------------硬件定義
  10. sbit key1=P3^3;//按鍵
  11. sbit key2=P3^4;
  12. sbit key3=P3^5;
  13. sbit key4=P3^6;
  14. sbit key5=P3^7;



  15. //---------------------------------------> Dis variable
  16. bit s0=0;   //閃爍

  17. //------------------------------》時間
  18. uchar state=0 ;

  19. ///----步進電機--------------------------------------------
  20. unsigned char code gaofz[]=         //正轉數據        高四位
  21. {0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};
  22. unsigned char code gaozz[]=         //反轉數據         高四位
  23. {0x90,0x80,0xC0,0x40,0x60,0x20,0x30,0x10};

  24. #define QuanShu 2050
  25. #define DelayS 1
  26. uchar FangXiang = 0;  //電機轉動方向           = 0表示關但是已經關上了所以不動
  27. unsigned char loop = 0;

  28. //---定時------------------------------------------
  29. uchar ding_shi[4] = {0};//定時小時存儲
  30. uchar ding_fen[4] =        {0};//定時分鐘存儲
  31. bit kai_guan1= 0;  //開關定時標志位
  32. bit kai_guan2= 0;
  33. bit kai_guan3= 0;
  34. bit kai_guan4= 0;
  35. bit shou_dongF = 0;
  36. uchar i = 0;
  37. bit only_flag=0; //只允許播報一次  

  38. //-------------------------------------------------------------------------  MQ-2煙霧部分定義
  39. bit Read_Smok=0;                //-- 讀取濃度標志
  40. unsigned char AD_Dat=0;
  41. unsigned char Smok=0;   
  42. unsigned char Smok_H=0; //-- 煙霧濃度及其閾值
  43. unsigned char Voice_Time=0; //-- 語音報警時間間隔


  44. //-------------------------------------------------------串口部分定義
  45. unsigned char Open=0;        //-- 開啟關閉狀態
  46. bit Send_flag=0; //-- 串口發送標志
  47. unsigned char data Uart_Buff[50]=0;//  串口接收數據數組
  48. unsigned char data Uart_Count=0;
  49. unsigned char Call_Back=0;





  50. //---函數初始化------------------------------------------------
  51. void Timer0Init(void);                //50毫秒@11.0592MHz
  52. void Read_Memory();//讀存儲
  53. void Key_Dispose();          //按鍵處理函數
  54. void Display();                //顯示函數
  55. void BuJinDianJi() ;   //步進電機驅動函數

  56. void Uart_dat();
  57. void Uart_datbyte();
  58. void Uart_Send_dat();  //-- 串口發送數據

  59. //********************************************************************************************
  60. void main()           //主函數
  61. {
  62.         Timer0Init();
  63.         EA=1;
  64.         LCD1602_cls(); //定時器初始化以及液晶初始化
  65.         Read_Memory();//讀存儲
  66.         while(1)
  67.         {
  68.                 if(Send_flag)
  69.                 {
  70.                         Send_flag=0;
  71.                         Uart_Send_dat(); //-- 發送數據
  72.                 }

  73.                 if(Read_Smok)
  74.                 {
  75.                                 Read_Smok = 0;
  76.                                 AD_Dat= A_D(0);
  77. //                                if(AD_Dat<5)                AD_Dat=5;
  78. //                                if(AD_Dat>250)                AD_Dat=250;
  79.                                 Smok = (AD_Dat-0)/2.55;
  80.                 }
  81.                 Display();          //顯示函數
  82.                 if(!state)read_time1(); //讀取時間函數

  83.                 if(FangXiang==0)            only_flag=1;
  84.                 else if(FangXiang==1)
  85.                 {
  86.                          if(only_flag==1)
  87.                         {
  88.                                  only_flag=0;        //清零  只允許播報一次
  89.                                 Send_threelines(0);   //語音播報  吃飯了
  90.                         }
  91.                 }
  92.                 BuJinDianJi();                          


  93.                 if(Voice_Time==0 && Smok>Smok_H)
  94.                 {
  95.                                 Voice_Time = 10;
  96.                                 Send_threelines(1);
  97.                 }
  98.         }
  99. }

  100. //==========================================延時函數
  101. void Delay(uint delayi)                //短延時函數
  102. {
  103.         while (delayi)
  104.         {
  105.                     delayi--;
  106.                         time_data[0]=ds1302read(0x81);
  107.                     time_data_1[0]=time_data[0]/16*10+time_data[0]%16;
  108.                         time_data[1]=ds1302read(0x83);
  109.                         time_data_1[1]=time_data[1]/16*10+time_data[1]%16;
  110.                         LCD1602_write(0,0xC0+3);

  111.                         LCD1602_write(1,0x30+time_data_1[1]/10);
  112.                         LCD1602_write(1,0x30+time_data_1[1]%10);

  113.                         LCD1602_write(1,':');

  114.                         LCD1602_write(1,0x30+time_data_1[0]/10);
  115.                         LCD1602_write(1,0x30+time_data_1[0]%10);
  116.         }
  117. }
  118. //===========================================================================================================   串口發送數據函數
  119. void Uart_dat(unsigned char dat)//--------------------------發送單個字節
  120. {
  121.         SBUF = dat;
  122.         while(!TI);
  123.         TI=0;
  124. }
  125. void Uart_datbyte(char *byte)//--------------------------發送字符
  126. {
  127.         while(*byte!='\0')
  128.         {
  129.                 Uart_dat(*byte++);
  130.         }
  131. }
  132. void Uart_Send_dat()//--------------------------發送數據
  133. {
  134.         Uart_datbyte("Data,");
  135.         Uart_dat(0x30+Open%10);                                  //-- 投食狀態 0關閉  1開啟                         1
  136.         Uart_datbyte(",");
  137.                                                                                                                                                                                  
  138.         Uart_dat(0x30+Call_Back%10);                   //-- app  設置
  139.         Uart_datbyte(",");

  140.         Uart_dat(0x30+ding_shi[0]/10%10);          //-- 定時時間                                                  3
  141.         Uart_dat(0x30+ding_shi[0]%10);       
  142.         Uart_datbyte(",");
  143.         Uart_dat(0x30+ding_fen[0]/10%10);                                                                                           //4
  144.         Uart_dat(0x30+ding_fen[0]%10);       
  145.         if(kai_guan1==0)                         Uart_datbyte(",0,");       
  146.         else                                                 Uart_datbyte(",1,");                                                        //5

  147.         Uart_dat(0x30+ding_shi[1]/10%10);          
  148.         Uart_dat(0x30+ding_shi[1]%10);       
  149.         Uart_datbyte(",");
  150.         Uart_dat(0x30+ding_fen[1]/10%10);          
  151.         Uart_dat(0x30+ding_fen[1]%10);       
  152.         if(kai_guan2==0)                         Uart_datbyte(",0,");       
  153.         else                                                 Uart_datbyte(",1,");

  154.         Uart_dat(0x30+ding_shi[2]/10%10);          
  155.         Uart_dat(0x30+ding_shi[2]%10);       
  156.         Uart_datbyte(",");
  157.         Uart_dat(0x30+ding_fen[2]/10%10);          
  158.         Uart_dat(0x30+ding_fen[2]%10);       
  159.         if(kai_guan3==0)                         Uart_datbyte(",0,");       
  160.         else                                                 Uart_datbyte(",1,");
  161.        
  162.         Uart_dat(0x30+ding_shi[3]/10%10);          
  163.         Uart_dat(0x30+ding_shi[3]%10);       
  164.         Uart_datbyte(",");
  165.         Uart_dat(0x30+ding_fen[3]/10%10);          
  166.         Uart_dat(0x30+ding_fen[3]%10);       
  167.         if(kai_guan4==0)                         Uart_datbyte(",0,");       
  168.         else                                                 Uart_datbyte(",1,");


  169.         if(Smok>99)                                         Uart_dat(0x30+Smok/100%10);
  170.         else                                                 Uart_datbyte(" ");
  171.         if(Smok>9)                                         Uart_dat(0x30+Smok/10%10);
  172.         else                                                 Uart_datbyte(" ");
  173.         Uart_dat(0x30+Smok/1%10);
  174.         Uart_datbyte(",");

  175.         if(Smok_H>99)                                 Uart_dat(0x30+Smok_H/100%10);
  176.         else                                                 Uart_datbyte(" ");
  177.         if(Smok_H>9)                                 Uart_dat(0x30+Smok_H/10%10);
  178.         else                                                 Uart_datbyte(" ");
  179.         Uart_dat(0x30+Smok_H/1%10);
  180.         Uart_datbyte(",");

  181.         if(Smok>Smok_H)                                 Uart_datbyte("0,");
  182.         else                                                 Uart_datbyte("1,");
  183.         Uart_datbyte("\r\n");

  184.                                                             
  185. }
  186. //===============================================步進電機       
  187. bit jishi_J = 0;
  188. void BuJinDianJi()    //步進電機驅動函數
  189. {
  190.         static uint  bujin1i = 0 ;
  191.         if(FangXiang==0)
  192.         {
  193.                  P1&=0x0F;
  194.                 Open = 0;
  195.         }
  196.         else if(FangXiang==1)
  197.         {
  198.                 for(; bujin1i<QuanShu; bujin1i++)
  199.                 {
  200.                         P1&=0x0F;      //步進電機用到的四個口清零

  201.                         P1|=gaozz[loop];     //給電機的四個口中有1為1,其他口數值不變
  202.                         loop=(loop+1)%8;    //循環加,Loop變化范圍是 0 -  7,這樣結合上一句話就可循環將轉動數據送給P2
  203.                         Delay(DelayS);//;      //短延時一下,調節這個短延時,可以控制步進電機的轉動速度,越小就越快
  204.                 }
  205.                 jishi_J = 1;
  206.                 Open=1;
  207.         }
  208.         else if(FangXiang==2)
  209.         {
  210.                 for( ; bujin1i>0; bujin1i--) //
  211.                 {
  212.                         P1&=0x0F;                       //步進電機用到的四個口清零

  213.                         P1|=gaofz[loop];     //給電機的四個口中有1為1,其他口數值不變
  214.                         loop=(loop+1)%8;     //循環加,Loop變化范圍是 0 -  7,這樣結合上一句話就可循環將轉動數據送給P2
  215.                         Delay(DelayS);//;      //短延時一下,調節這個短延時,可以控制步進電機的轉動速度,越小就越快

  216.                 }
  217.                 FangXiang=0;
  218.                 Open = 0;

  219.         }

  220. }
  221. //====================================================
  222. void Timer0Init(void)                //50毫秒@11.0592MHz
  223. {
  224.         TMOD &= 0xF0;                //設置定時器模式
  225.         TMOD |= 0x01;                //設置定時器模式
  226.         TL0 = 0x00;                //設置定時初值
  227.         TH0 = 0x4C;                //設置定時初值
  228.         TF0 = 0;                //清除TF0標志
  229.         TR0 = 1;                //定時器0開始計時
  230.         ET0=1;

  231.         SCON = 0X50;
  232.         T2CON = 0X34;
  233.         RCAP2H=TH2=0XFF;
  234.         RCAP2L=TL2=0XDC;
  235.         TR2 = 1;
  236.         ES = 1;
  237. }

  238. //======存儲==================================================
  239. void memory_Money()        //存儲                                                                                          
  240. {                                                                                                                  
  241.                   SectorErase(0x2000);                   //第一扇區擦除
  242.                 SectorErase(0x2200);
  243.                 for(i = 0; i<4;i++)
  244.                 {
  245.                    byte_write(0x2000+i,ding_shi[i]);
  246.                    byte_write(0x2010+i,ding_fen[i]);
  247.                
  248.                 }
  249.                 byte_write(0x2200,Smok_H);

  250. }
  251. void Read_Memory()//讀存儲
  252. {
  253.                 Smok_H = byte_read(0x2200);
  254.                 if(Smok_H>100)                Smok_H = 60;
  255.                 for(i = 0; i<4;i++)
  256.                 {
  257.                         ding_shi[i] = byte_read(0x2000+i);       
  258.                         ding_fen[i] = byte_read(0x2010+i);
  259.                         if(ding_shi[i]>23||ding_fen[i]>59)
  260.                         {
  261.                                   for(i = 0; i<4; i ++)
  262.                                   {
  263.                                                   ding_shi[i] = 10;
  264.                                                   ding_fen[i] = 30;
  265.                                   }
  266.                        
  267.                         }
  268.                
  269.                 }
  270. }



  271. //===============================================================================================================  按鍵處理函數
  272. bit keyF = 0;
  273. void Key_Dispose()          
  274. {
  275.         if(!key1)           //判斷按鍵按下
  276.         {
  277.                 if(keyF)
  278.                 {
  279.                         keyF = 0;

  280.                          state=(state+1)%16;  //變量累加,加到 7 的時候會變成 0 ,
  281.                         if(!state)
  282.                         {
  283.                                 memory_Money();        //存儲
  284.                                 Write();
  285.                         }
  286.                 }
  287.         } else
  288.         if(!key2)           //按鍵 2
  289.         {


  290.                 if(keyF)
  291.                 {
  292.                         keyF = 0;
  293.                          switch(state)
  294.                         {
  295.                                         case 0:
  296.                                                 break;         //在狀態 0 ,也就是顯示非設置,按鍵按下沒有反應
  297.                                         case 1:
  298.                                                 if(time_data_1[5]<99)  time_data_1[5]++;else    time_data_1[5] = 0;
  299.                                                 break;        //等于 1 ,也就是此時設置年,數據只要小于99就加一
  300.                                         case 2:
  301.                                                 if(time_data_1[4]<12)  time_data_1[4]++;   else time_data_1[4] = 1;
  302.                                                 break;                //然后是月
  303.                                         case 3:
  304.                                                 if(time_data_1[4]==1||time_data_1[4]==3||time_data_1[4]==5||time_data_1[4]==7||time_data_1[4]==8||time_data_1[4]==10||time_data_1[4]==12)
  305.                                                
  306. ……………………

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

所有資料51hei附件下載:
資料.7z (1.25 MB, 下載次數: 136)



評分

參與人數 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:973492 發表于 2021-11-3 10:04 來自手機 | 只看該作者
你好 朋友,你的哪個元器件庫能發我一下嗎,STC89C52我找不到元件,封裝也沒有。
回復

使用道具 舉報

板凳
ID:474195 發表于 2021-12-20 21:16 | 只看該作者
xlxz 發表于 2021-11-3 10:04
你好 朋友,你的哪個元器件庫能發我一下嗎,STC89C52我找不到元件,封裝也沒有。

原理圖庫可以自己畫 封裝是dip40的  加q1772413610
回復

使用道具 舉報

地板
ID:995066 發表于 2021-12-21 10:52 | 只看該作者
ds1302 5、6、7為什么要上拉?
回復

使用道具 舉報

5#
ID:711539 發表于 2021-12-21 14:05 | 只看該作者
jrsaql78041 發表于 2021-12-21 10:52
ds1302 5、6、7為什么要上拉?

單線通訊,加上拉電阻,增強電氣可靠性,穩定性
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产99久久精品一区二区永久免费 | 国产一区二区三区久久久久久久久 | 精品免费国产视频 | 亚洲精品一区二区冲田杏梨 | 在线播放国产一区二区三区 | 日日久 | 91免费入口 | 日本小电影网站 | 玖玖在线免费视频 | 欧美激情一区二区三区 | 免费在线h视频 | a精品视频 | 伊人一区 | 成人精品毛片国产亚洲av十九禁 | 亚洲综合区 | 国产在线视频网 | 日韩久久综合网 | h片在线看 | 国产精品国色综合久久 | 秋霞在线一区二区 | 欧美成人自拍 | 性做久久久久久免费观看欧美 | 在线观看亚洲精品 | 国产精品一区一区 | 日本精品久久 | 亚洲成人精品久久久 | 国产精品国产精品 | 欧美日韩国产一区二区三区 | 久久婷婷av | 国产精品视频综合 | 日韩成人国产 | 国产精品a久久久久 | 97日日碰人人模人人澡分享吧 | 国产1区 | 99爱视频 | 久久精品免费观看 | 一区 | 国产精品久久久久久吹潮 | 在线资源视频 | 国产一级淫片a直接免费看 免费a网站 | 99re在线视频 |