找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3678|回复: 4
收起左侧

51单片机的养殖场自动投喂系统程序原理图 WT588D语音模块

  [复制链接]
ID:474195 发表于 2021-8-15 19:18 | 显示全部楼层 |阅读模式
电路原理图如下:
51hei.png
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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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为什么要上拉?
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表