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