電路原理圖如下:
51hei.png (116.34 KB, 下載次數: 87)
下載附件
2021-8-15 21:29 上傳
WT588D -16語音模塊+2個8P圓排座 2
DS1302時鐘芯片+SIP8管座 2
32.768Khz晶振 2
11.0592M晶振 1
9*15萬用板 5
USB電源線或供電電池盒 2
MQ-2煙霧檢測 1
單片機源程序如下:
- #include <reg52.h>
- #include"LCD1602.h"//液晶
- #include" 1302.h" //DS1302時鐘芯片
- #include "EepRom.h"
- #include"wt588.c" //語音播報
- #include "ADC0832.h"
- #define uchar unsigned char
- #define uint unsigned int
- //-------------------------------------------硬件定義
- sbit key1=P3^3;//按鍵
- sbit key2=P3^4;
- sbit key3=P3^5;
- sbit key4=P3^6;
- sbit key5=P3^7;
- //---------------------------------------> Dis variable
- bit s0=0; //閃爍
- //------------------------------》時間
- uchar state=0 ;
- ///----步進電機--------------------------------------------
- unsigned char code gaofz[]= //正轉數據 高四位
- {0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};
- unsigned char code gaozz[]= //反轉數據 高四位
- {0x90,0x80,0xC0,0x40,0x60,0x20,0x30,0x10};
- #define QuanShu 2050
- #define DelayS 1
- uchar FangXiang = 0; //電機轉動方向 = 0表示關但是已經關上了所以不動
- unsigned char loop = 0;
- //---定時------------------------------------------
- uchar ding_shi[4] = {0};//定時小時存儲
- uchar ding_fen[4] = {0};//定時分鐘存儲
- bit kai_guan1= 0; //開關定時標志位
- bit kai_guan2= 0;
- bit kai_guan3= 0;
- bit kai_guan4= 0;
- bit shou_dongF = 0;
- uchar i = 0;
- bit only_flag=0; //只允許播報一次
- //------------------------------------------------------------------------- MQ-2煙霧部分定義
- bit Read_Smok=0; //-- 讀取濃度標志
- unsigned char AD_Dat=0;
- unsigned char Smok=0;
- unsigned char Smok_H=0; //-- 煙霧濃度及其閾值
- unsigned char Voice_Time=0; //-- 語音報警時間間隔
- //-------------------------------------------------------串口部分定義
- unsigned char Open=0; //-- 開啟關閉狀態
- bit Send_flag=0; //-- 串口發送標志
- unsigned char data Uart_Buff[50]=0;// 串口接收數據數組
- unsigned char data Uart_Count=0;
- unsigned char Call_Back=0;
- //---函數初始化------------------------------------------------
- void Timer0Init(void); //50毫秒@11.0592MHz
- void Read_Memory();//讀存儲
- void Key_Dispose(); //按鍵處理函數
- void Display(); //顯示函數
- void BuJinDianJi() ; //步進電機驅動函數
- void Uart_dat();
- void Uart_datbyte();
- void Uart_Send_dat(); //-- 串口發送數據
- //********************************************************************************************
- void main() //主函數
- {
- Timer0Init();
- EA=1;
- LCD1602_cls(); //定時器初始化以及液晶初始化
- Read_Memory();//讀存儲
- while(1)
- {
- if(Send_flag)
- {
- Send_flag=0;
- Uart_Send_dat(); //-- 發送數據
- }
- if(Read_Smok)
- {
- Read_Smok = 0;
- AD_Dat= A_D(0);
- // if(AD_Dat<5) AD_Dat=5;
- // if(AD_Dat>250) AD_Dat=250;
- Smok = (AD_Dat-0)/2.55;
- }
- Display(); //顯示函數
- if(!state)read_time1(); //讀取時間函數
- if(FangXiang==0) only_flag=1;
- else if(FangXiang==1)
- {
- if(only_flag==1)
- {
- only_flag=0; //清零 只允許播報一次
- Send_threelines(0); //語音播報 吃飯了
- }
- }
- BuJinDianJi();
- if(Voice_Time==0 && Smok>Smok_H)
- {
- Voice_Time = 10;
- Send_threelines(1);
- }
- }
- }
- //==========================================延時函數
- void Delay(uint delayi) //短延時函數
- {
- while (delayi)
- {
- delayi--;
- time_data[0]=ds1302read(0x81);
- time_data_1[0]=time_data[0]/16*10+time_data[0]%16;
- time_data[1]=ds1302read(0x83);
- time_data_1[1]=time_data[1]/16*10+time_data[1]%16;
- LCD1602_write(0,0xC0+3);
- LCD1602_write(1,0x30+time_data_1[1]/10);
- LCD1602_write(1,0x30+time_data_1[1]%10);
- LCD1602_write(1,':');
- LCD1602_write(1,0x30+time_data_1[0]/10);
- LCD1602_write(1,0x30+time_data_1[0]%10);
- }
- }
- //=========================================================================================================== 串口發送數據函數
- void Uart_dat(unsigned char dat)//--------------------------發送單個字節
- {
- SBUF = dat;
- while(!TI);
- TI=0;
- }
- void Uart_datbyte(char *byte)//--------------------------發送字符
- {
- while(*byte!='\0')
- {
- Uart_dat(*byte++);
- }
- }
- void Uart_Send_dat()//--------------------------發送數據
- {
- Uart_datbyte("Data,");
- Uart_dat(0x30+Open%10); //-- 投食狀態 0關閉 1開啟 1
- Uart_datbyte(",");
-
- Uart_dat(0x30+Call_Back%10); //-- app 設置
- Uart_datbyte(",");
- Uart_dat(0x30+ding_shi[0]/10%10); //-- 定時時間 3
- Uart_dat(0x30+ding_shi[0]%10);
- Uart_datbyte(",");
- Uart_dat(0x30+ding_fen[0]/10%10); //4
- Uart_dat(0x30+ding_fen[0]%10);
- if(kai_guan1==0) Uart_datbyte(",0,");
- else Uart_datbyte(",1,"); //5
- Uart_dat(0x30+ding_shi[1]/10%10);
- Uart_dat(0x30+ding_shi[1]%10);
- Uart_datbyte(",");
- Uart_dat(0x30+ding_fen[1]/10%10);
- Uart_dat(0x30+ding_fen[1]%10);
- if(kai_guan2==0) Uart_datbyte(",0,");
- else Uart_datbyte(",1,");
- Uart_dat(0x30+ding_shi[2]/10%10);
- Uart_dat(0x30+ding_shi[2]%10);
- Uart_datbyte(",");
- Uart_dat(0x30+ding_fen[2]/10%10);
- Uart_dat(0x30+ding_fen[2]%10);
- if(kai_guan3==0) Uart_datbyte(",0,");
- else Uart_datbyte(",1,");
-
- Uart_dat(0x30+ding_shi[3]/10%10);
- Uart_dat(0x30+ding_shi[3]%10);
- Uart_datbyte(",");
- Uart_dat(0x30+ding_fen[3]/10%10);
- Uart_dat(0x30+ding_fen[3]%10);
- if(kai_guan4==0) Uart_datbyte(",0,");
- else Uart_datbyte(",1,");
- if(Smok>99) Uart_dat(0x30+Smok/100%10);
- else Uart_datbyte(" ");
- if(Smok>9) Uart_dat(0x30+Smok/10%10);
- else Uart_datbyte(" ");
- Uart_dat(0x30+Smok/1%10);
- Uart_datbyte(",");
- if(Smok_H>99) Uart_dat(0x30+Smok_H/100%10);
- else Uart_datbyte(" ");
- if(Smok_H>9) Uart_dat(0x30+Smok_H/10%10);
- else Uart_datbyte(" ");
- Uart_dat(0x30+Smok_H/1%10);
- Uart_datbyte(",");
- if(Smok>Smok_H) Uart_datbyte("0,");
- else Uart_datbyte("1,");
- Uart_datbyte("\r\n");
-
- }
- //===============================================步進電機
- bit jishi_J = 0;
- void BuJinDianJi() //步進電機驅動函數
- {
- static uint bujin1i = 0 ;
- if(FangXiang==0)
- {
- P1&=0x0F;
- Open = 0;
- }
- else if(FangXiang==1)
- {
- for(; bujin1i<QuanShu; bujin1i++)
- {
- P1&=0x0F; //步進電機用到的四個口清零
- P1|=gaozz[loop]; //給電機的四個口中有1為1,其他口數值不變
- loop=(loop+1)%8; //循環加,Loop變化范圍是 0 - 7,這樣結合上一句話就可循環將轉動數據送給P2
- Delay(DelayS);//; //短延時一下,調節這個短延時,可以控制步進電機的轉動速度,越小就越快
- }
- jishi_J = 1;
- Open=1;
- }
- else if(FangXiang==2)
- {
- for( ; bujin1i>0; bujin1i--) //
- {
- P1&=0x0F; //步進電機用到的四個口清零
- P1|=gaofz[loop]; //給電機的四個口中有1為1,其他口數值不變
- loop=(loop+1)%8; //循環加,Loop變化范圍是 0 - 7,這樣結合上一句話就可循環將轉動數據送給P2
- Delay(DelayS);//; //短延時一下,調節這個短延時,可以控制步進電機的轉動速度,越小就越快
- }
- FangXiang=0;
- Open = 0;
- }
- }
- //====================================================
- void Timer0Init(void) //50毫秒@11.0592MHz
- {
- TMOD &= 0xF0; //設置定時器模式
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初值
- TH0 = 0x4C; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0=1;
- SCON = 0X50;
- T2CON = 0X34;
- RCAP2H=TH2=0XFF;
- RCAP2L=TL2=0XDC;
- TR2 = 1;
- ES = 1;
- }
- //======存儲==================================================
- void memory_Money() //存儲
- {
- SectorErase(0x2000); //第一扇區擦除
- SectorErase(0x2200);
- for(i = 0; i<4;i++)
- {
- byte_write(0x2000+i,ding_shi[i]);
- byte_write(0x2010+i,ding_fen[i]);
-
- }
- byte_write(0x2200,Smok_H);
- }
- void Read_Memory()//讀存儲
- {
- Smok_H = byte_read(0x2200);
- if(Smok_H>100) Smok_H = 60;
- for(i = 0; i<4;i++)
- {
- ding_shi[i] = byte_read(0x2000+i);
- ding_fen[i] = byte_read(0x2010+i);
- if(ding_shi[i]>23||ding_fen[i]>59)
- {
- for(i = 0; i<4; i ++)
- {
- ding_shi[i] = 10;
- ding_fen[i] = 30;
- }
-
- }
-
- }
- }
- //=============================================================================================================== 按鍵處理函數
- bit keyF = 0;
- void Key_Dispose()
- {
- if(!key1) //判斷按鍵按下
- {
- if(keyF)
- {
- keyF = 0;
- state=(state+1)%16; //變量累加,加到 7 的時候會變成 0 ,
- if(!state)
- {
- memory_Money(); //存儲
- Write();
- }
- }
- } else
- if(!key2) //按鍵 2
- {
- if(keyF)
- {
- keyF = 0;
- switch(state)
- {
- case 0:
- break; //在狀態 0 ,也就是顯示非設置,按鍵按下沒有反應
- case 1:
- if(time_data_1[5]<99) time_data_1[5]++;else time_data_1[5] = 0;
- break; //等于 1 ,也就是此時設置年,數據只要小于99就加一
- case 2:
- if(time_data_1[4]<12) time_data_1[4]++; else time_data_1[4] = 1;
- break; //然后是月
- case 3:
- 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)
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei附件下載:
資料.7z
(1.25 MB, 下載次數: 136)
2021-8-15 21:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|