|
51單片機(jī)智能花盆程序代碼,內(nèi)有詳細(xì)介紹,此系統(tǒng)由51 單片機(jī),lcd2864 gsm-a6 ,各種傳感器組成
- #include <reg52.h>
- #include "string.h"
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- #define Buf_Max 50 //串口1緩存長(zhǎng)度
- #define STABLE_TIMES 15 //等待A6上電后穩(wěn)定,再進(jìn)行自適應(yīng)波特率
- #define SEND_AT_TIMES 30 //發(fā)送多少個(gè)AT指令進(jìn)行自適應(yīng)
- #define SEND_AT_INTERVAL 2 //2代表的是2*20ms 自適應(yīng)的時(shí)候,每個(gè)AT指令的間隔時(shí)間
- //串口1發(fā)送回車換行
- #define UART1_SendLR() UART1_SendData(0X0D);\
- UART1_SendData(0X0A)
- sbit ds = P2^2; //ds18b20位聲明
- sbit dula = P2^6; //數(shù)碼管位聲明
- sbit wei = P2^7;
- sbit beep=P2^3;
- sbit lcden=P3^4; //液晶使能端聲明
- sbit lcdrs=P3^5; //寄存器使能端聲明
- sbit lcdrw=P3^6; //讀寫端
- sbit lcdPSB=P3^7; //串并口位聲明
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit sda=P2^0; //I2C數(shù)據(jù)端口
- sbit scl=P2^1;//I2C時(shí)鐘
- sbit LED0 = P1^0;
- sbit LED1 = P1^1;
- sbit LED3 = P1^3;
- sbit p5 = P1^5;
- sbit p6 = P1^6;
- sbit p7= P1^7 ;
- sbit p4=P1^4;
- bit flag;
-
- uint xdata aa,bb,q,w=10,w0=30,w1,w2,w3,w4,s=30,s0=60,s1,s2,s3,s4,g,g1,g2,temp,DP,k1=2,k2=2,a=0,b=0,c=0;
- unsigned int code dofly_DuanMa[16]={0,1,2,3,4,5,6,7,8,9,45,46,66,47,88,99};// 顯示段碼值0~9
- unsigned char irtime; //紅外用全局變量
- bit irpro_ok,irok;
- unsigned char xdata IRcord[4];
- unsigned char xdata irdata[33];
- uchar temp1;
- uchar xdata dis1[]={"溫度: C " };
- uchar xdata dis2[]={"濕度: % " };
- uchar xdata dis3[]={"光強(qiáng): " };
- uchar xdata dis4[]={"自動(dòng)模式: 關(guān) " }; //液晶顯示部分
- uchar xdata dis5[]={"溫度: 10-30C " };
- uchar xdata dis6[]={"濕度:30-60% " };
- uchar xdata dis7[]={"補(bǔ)光: 關(guān) "};
- uchar dis8[]={"自動(dòng)模式: 開 "};
- uchar dis9[]={"補(bǔ)光: 開 "};
- xdata u8 Uart1_Buf[Buf_Max];
- //u8 Register_Flag=0; //A6 注冊(cè)標(biāo)志位 1 :注冊(cè)成功 3:注冊(cè)失敗 5:注冊(cè)成功,但處于漫游狀態(tài)下,無法撥打電話發(fā)短信
- u8 First_Int = 0;
- u8 xdata i,ret;
- static u8 *phone_num = "AT+CMGS=\"***********\""; //撥打電話,修改這里可以修改撥打的電話。
- const char *AT_CMGS="AT+CMGS=27";
- const char *pdu_content0="0011000D91687158538312F70008AA0C4E3B4EBAFF0C62116E344E86" ;
- const char *AT_CMG="AT+CMGS=31";
- const char *pdu_content1="0011000D91687158538312F70008AA104E3B4EBAFF0C62115FEB70ED6B7B4E86";
- const char *pdu_content2="0011000D91687158538312F70008AA104E3B4EBAFF0C62115FEB51BB6B7B4E86";
- u8 receive_message_mode = 0;
- u8 ledon_flag = 0;
- /************* 本地函數(shù)聲明 **************/
- void delay_ms(u16 ms); //延時(shí)ms個(gè)20ms ms*20ms
- void CLR_Buf(void); //清串口接收緩存
- u8 Find(u8 *a); //查找字符串
- void UART1_SendData(u8 dat); //串口1發(fā)送 1字節(jié)
- void UART1_SendString(char *s);//串口1發(fā)送 字符串
- void UART1_Send_Command(char *s);
- u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//a6 at命令發(fā)送
- void Wait_CREG(void);
- void adjust_A6_buadrate(void)
- {
- u8 ret;
- ret = UART1_Send_AT_Command("AT","OK",SEND_AT_TIMES,SEND_AT_INTERVAL);
- if(ret == 1)
- {
- LED0 = 0;
- }
- else
- {
- LED0 = 1;
- }
- }
- /***************************************************************
- 注:當(dāng)然你可以返回其他值,來確定到底是哪一步發(fā)送指令出現(xiàn)失敗了。
- ****************************************************************/
- u8 send_pdu_message0(char *content)
- {
- u8 ret;
- char content_len[3];//計(jì)算字符串的長(zhǎng)度,暫時(shí)支持的短信內(nèi)容的字符數(shù)為2位,也就是99個(gè)字節(jié),可以根據(jù)自己愛好進(jìn)行修改
- u8 end_char[2];
- idata char *con;
- idata u8 i;
-
- end_char[0] = 0x1A;
- end_char[1] = '\0';
-
- ret = 0;
-
- con = content;
- i = 0;
- ret = UART1_Send_AT_Command("AT+CMGF=0","OK",3,50);//配置為PDU模式
- if(ret == 0)
- {
- return 0;
- }
-
- ret = UART1_Send_AT_Command(AT_CMGS,">",3,50);//發(fā)送字符個(gè)數(shù)指令
- if(ret == 0)
- {
- return 0;
- }
-
- UART1_SendString(content); //發(fā)送具體的內(nèi)容
- ret = UART1_Send_AT_Command(end_char,"OK",3,250);//發(fā)送結(jié)束符,等待返回ok,等待5S發(fā)一次,因?yàn)槎绦懦晒Πl(fā)送的狀態(tài)時(shí)間比較長(zhǎng)
-
- return ret;
- }
- u8 send_pdu_message1(char *content)
- {
- u8 ret;
- char content_len[3];//計(jì)算字符串的長(zhǎng)度,暫時(shí)支持的短信內(nèi)容的字符數(shù)為2位,也就是99個(gè)字節(jié),可以根據(jù)自己愛好進(jìn)行修改
- u8 end_char[2];
- idata char *con;
- idata u8 i;
-
- end_char[0] = 0x1A;
- end_char[1] = '\0';
-
- ret = 0;
-
- con = content;
- i = 0;
- ret = UART1_Send_AT_Command("AT+CMGF=0","OK",3,50);//配置為PDU模式
- if(ret == 0)
- {
- return 0;
- }
-
- ret = UART1_Send_AT_Command(AT_CMG,">",3,50);//發(fā)送字符個(gè)數(shù)指令
- if(ret == 0)
- {
- return 0;
- }
-
- UART1_SendString(content); //發(fā)送具體的內(nèi)容
- ret = UART1_Send_AT_Command(end_char,"OK",3,250);//發(fā)送結(jié)束符,等待返回ok,等待5S發(fā)一次,因?yàn)槎绦懦晒Πl(fā)送的狀態(tài)時(shí)間比較長(zhǎng)
-
- return ret;
- }
- void Ir_work(void);
-
- void delay() //5us
- {;;}
- void delay1(uint z)//1ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void write_com(uchar com) //寫指令數(shù)據(jù)到液晶
- { lcdrs=0;
- lcdrw=0;
- lcden=0;
- P0=com;
- delay1(5);
- lcden=1;
- delay1(5);
- lcden=0;
- }
- void write_data(uchar date) //寫顯示數(shù)據(jù)到液晶
- {
- lcdrs=1;
- lcdrw=0;
- lcden=0;
- P0=date;
- delay1(5);
- lcden=1;
- delay1(5);
- lcden=0;
- }
- void lcd_pos(uchar X,uchar Y) //液晶位置選擇
- {
- uchar pos;
- if(X==0)
- {X=0x80;}
- else if(X==1)
- {X=0x90; }
- else if(X==2)
- {X=0x88;}
- else if(X==3)
- {X=0x98;}
- pos=X+Y;
- write_com(pos);
- }
- void init1() //液晶初始化
- {dula=0;
- wei=0;
- lcdPSB=1;
- write_com(0x30) ;
- delay1(5);
- write_com(0x0C);
- delay1(5);
- write_com(0x01);
- delay1(5);
- }
- void start() // PCF8591 起始信號(hào)
- {
- scl=1;
- _nop_();
- sda=1;
- delay();
- sda=0;
- delay();
- scl=0;
- _nop_();
- }
- void stop() //PCF8591終止信號(hào)
- {
- scl=1;
- _nop_();
- sda=0;
- delay();
- sda=1;
- delay();
- }
- void respons() //應(yīng)答信號(hào)
- {
- scl=1;
- _nop_();
- sda=0;
- delay();
- scl=0;
- _nop_();
- }
- void norespons()
- {
- scl=1;
- _nop_();
- sda=1;
- delay();
- }
- void init() //PCF8591初始化
- {
- scl=1;
- _nop_();
- sda=1;
- _nop_();
- }
- void write_byte(uchar dat) //主機(jī)向從機(jī)發(fā)送數(shù)據(jù)
- {
- uchar i,tem;
- tem=dat;
- for(i=0;i<8;i++)
- {
- scl=0;
- _nop_();
- if((tem&0x80)==0x80)
- sda=1; //寫1
- else
- sda=0; //寫0
- scl=1;
- _nop_();
- tem<<=1;
- }
- scl=0;
- _nop_();
- }
- uchar read_byte() /*讀一個(gè)字節(jié)(從機(jī)向主機(jī))由高到低位*/
- {
- uchar dat,i;
- sda=1;
- _nop_();
- scl=0;
- _nop_();
- for(i=0;i<8;i++)
- {
- scl=1;
- _nop_();
- if(sda)
- dat|=0x01;
- if(i<7)
- dat<<=1;
- scl=0;
- _nop_();
- }
- return dat;
- }
- uchar ADC_read(uchar com) /*單片機(jī)讀PCF8591的AD數(shù)據(jù)*/
- {
- uchar dat;
- dat=com;
- start();
- write_byte(0x90);
- respons();
- write_byte(com);
- respons();
- start();
- write_byte(0x91);
- respons();
- dat=read_byte();
- norespons();
- stop();
- return dat;
- }
-
-
- void TempDelay(uchar us)
- {
- while(us--); //6.51us
- }
- void ds_reset() //DS18B20初始化
- {
- ds=1;
- _nop_();
- ds=0;
- TempDelay(80);//520us
- ds=1;
- TempDelay(5);
- if(ds==0)
- flag=1;
- else
- flag=0;
- TempDelay(20);
- ds=1;
- }
- bit ds_read_bit() //讀一位數(shù)據(jù)
- {
- bit dat;
- ds=0;
- _nop_();
- _nop_();
- ds=1;
- _nop_();
- dat=ds;
- TempDelay(12);
- return dat;
- }
- uchar ds_read_byte() //讀1個(gè)字節(jié)數(shù)據(jù)
- {
- uchar i,j,value;
- for(i=0;i<8;i++)
- {
- j=ds_read_bit();
- value=(j<<7)|(value>>1);
- }
- return value;
- }
- void ds_write_byte(uchar dat) //向DS18B20寫數(shù)據(jù)
- {
- uchar i,onebit;
- for(i=0;i<8;i++)
- {
- onebit=dat&0x01;
- if(onebit) //寫1
- {
- ds=0;
- TempDelay(1);
- ds=1;
- _nop_();
- }
- else //寫0
- {
- ds=0;
- TempDelay(11);
- ds=1;
- _nop_();
- }
- dat>>=1;
- }
- }
- void ds_change() //溫度獲取和轉(zhuǎn)換
- {
- ds_reset();
- ds_write_byte(0xcc);
- ds_write_byte(0x44);
- }
- uint get_temperature() //讀取溫度數(shù)據(jù)
- {
- uchar a,b;
- float temperature;
- ds_reset();
- ds_write_byte(0xcc);
- ds_write_byte(0xbe);
- a=ds_read_byte();
- b=ds_read_byte();
- temp=b;
- temp<<=8;
- temp|=a;
- temperature=temp*0.0625;
- temp=temperature*10+0.5;
- temp=temperature+0.05;
-
- return temp;
- }
- void Ir_work(void);
- void Ircordpro(void);
- void tim0_isr (void) interrupt 1 using 1
- {
- irtime++; //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
- }
- void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
- {
- static unsigned char i; //接收紅外信號(hào)處理
- static bit startflag; //是否開始處理標(biāo)志位
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
- void Uart1Init(void) //9600bps@11.05926MHz
- {
- PCON =0x80; //
- SCON = 0x50; //
- TMOD=0x22;
- TL1 = 0xFA; //
- TH1 = 0xFA; //
- TH0=0x00; //重載值
- TL0=0x00; //初始化值
-
- IE = 0x90;
- ET1 = 0; //
- TI=1;
- TR1 = 1; //
- ES = 1; //
- }
- void TIM0init(void)//定時(shí)器0初始化
- {
- TMOD=0x22;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
- TH0=0x00; //重載值
- TL0=0x00; //初始化值
- ET0=1; //開中斷
- TR0=1;
- }
- void EX0init(void)
- {
- IT0 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
- EX0 = 1; //使能外部中斷
- EA = 1; //開總中斷
- }
- void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
- {
- switch(IRcord[2])//判斷第三個(gè)數(shù)碼值
- {
- case 0x45:DP=dofly_DuanMa[1];break;//1 顯示相應(yīng)的按鍵值
- case 0x46:DP=dofly_DuanMa[2];break;//2
- case 0x47:DP=dofly_DuanMa[3];break;//3
- case 0x44:DP=dofly_DuanMa[4];break;//4
- case 0x40:DP=dofly_DuanMa[5];break;//5
- case 0x43:DP=dofly_DuanMa[6];break;//6
- case 0x07:DP=dofly_DuanMa[7];break;//7
- case 0x15:DP=dofly_DuanMa[8];break;//8
- case 0x09:DP=dofly_DuanMa[9];break;//9
- case 0x19:DP=dofly_DuanMa[0];break;//0
- case 0x18:DP=dofly_DuanMa[15];break;//上
- case 0x08:DP=dofly_DuanMa[10];break;//左
- case 0x5a:DP=dofly_DuanMa[11];break;//右
- case 0x16:DP=dofly_DuanMa[12];break;//*
- case 0x52:DP=dofly_DuanMa[13];break;//下
- case 0x0d:DP=dofly_DuanMa[14];break;//#
-
- default:break;
- }
- irpro_ok=0;//處理完成標(biāo)志
- }
- void Ircordpro(void)//紅外碼值處理函數(shù)
- {
- unsigned char i, j, k,cord,value;
- k=1;
- for(i=0;i<4;i++) //處理4個(gè)字節(jié)
- {
- for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
- value=value|0x80;
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//處理完畢標(biāo)志位置1
- }
- void fk()
- {if(irok)
- {
- Ircordpro();
- irok=0;
- }
- if(irpro_ok)
-
- Ir_work();}
- /**********************************************/
- /*設(shè)計(jì)思路:
- (0)進(jìn)行串口、定時(shí)器初始化工作。
- (1)開機(jī)等待15秒,等待模塊準(zhǔn)備好。
- (2)發(fā)送AT指令,讓模塊進(jìn)行自適應(yīng)波特率為9600
- (3)發(fā)送相應(yīng)的指令。
- ************************************************/
- void main(void)
- {
- uchar dat,dat1,dat2;
- aa=p5=p6=p7=0;
- delay1(5);
- init();
- init1();
-
- ds_change();
- Uart1Init();
- TIM0init();//初始化定時(shí)器
- EX0init(); //初始化外部中斷
- delay1(1000);
- for(i = 0;i < STABLE_TIMES;i++)//等待網(wǎng)絡(luò)穩(wěn)定
- {
- delay_ms(50);
- }
-
- //自適應(yīng)波特率
- adjust_A6_buadrate();
- //等待GSM注冊(cè)成功
- Wait_CREG();
- //設(shè)置存儲(chǔ)位置,不做返回值判斷了
- ret = UART1_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);//AT+CPMS="SM","ME","SM"
- while(1)
- { delay1(5);
-
- if(k1==2)
- for(i=0;i<15;i++)
- write_data(dis4[i]);
-
- if(k1==1)
- for(i=0;i<15;i++)
- write_data(dis8[i]);
- delay1(5) ;
- temp1=temp;
- if((temp1!=255)&&(temp1!=85))
- dat1=temp1;
- //溫度顯示模塊
- dis1[6]=(uint) (0x30+dat1/100) ;
- dis1[7]=(uint)(0x30+dat1%100/10);
- dis1[8]=(uint)(0x30+dat1%100%10);
-
-
- lcd_pos(1,0);
- for(i=0;i<15;i++)
- {write_data(dis1[i]); }
- delay1(100);
- ds_change();
- get_temperature();
-
- dat2=-ADC_read(0x02); //濕度顯示模塊
-
- dis2[7]=(uint)(0x30+dat2/2%100/10);
- dis2[8]=(uint)(0x30+dat2/2%100%10);
- lcd_pos(2,0);
- for(i=0;i<15;i++)
- {write_data(dis2[i]); }
-
- delay1(5);
- dat=0;
- dat=-ADC_read(0x03); //光強(qiáng)顯示模塊
- dis3[6]=(uint) (0x30+dat/100) ;
- dis3[7]=(uint)(0x30+dat%100/10);
- dis3[8]=(uint)(0x30+dat%100%10);
- lcd_pos(3,0);
- for(i=0;i<15;i++)
- {write_data(dis3[i]); }
-
-
-
-
- //控制界面
- fk();
- if (DP==66)
-
- {
-
- lcd_pos(0,0);
- if(k1==2)
- for(i=0;i<15;i++)
- write_data(dis4[i]);
-
- if(k1==1)
- for(i=0;i<15;i++)
- write_data(dis8[i]);
- delay1(5) ;
-
- lcd_pos(1,0);
- for(i=0;i<15;i++)
- {write_data(dis5[i]); }
- delay1(5);
- lcd_pos(2,0);
- for(i=0;i<15;i++)
- {write_data(dis6[i]); }
- delay1(5) ;
- lcd_pos(3,0);
- if(k2==2) {
- for(i=0;i<14;i++)
- write_data(dis7[i]); }
- if(k2==1) {
- for(i=0;i<14;i++)
- write_data(dis9[i]);
- }
- delay1(5) ;
- do{
- do{
- fk();
- }while(DP==66);
-
- if(DP==45)
- {
- while(DP==45)
- fk();
- w1=DP;
- lcd_pos(1,0);
- dis5[6]=(0x30+DP);
- for(i=0;i<15;i++)
- write_data(dis5[i]);
- delay1(5) ;
- while(DP==w1)
- fk();
- w2=DP ;
- lcd_pos(1,0);
- dis5[7]=(0x30+DP);
- for(i=0;i<15;i++)
- write_data(dis5[i]);
- w=w1*10+w2;
- delay1(5) ;
- while(DP==w2)
- fk();
- w3=DP ;
- lcd_pos(1,0);
- dis5[9]=(0x30+DP);
- for(i=0;i<15;i++)
- write_data(dis5[i]);
- delay1(5) ;
- while(DP==w3)
- fk();
- w4=DP ;
- lcd_pos(1,0);
- dis5[10]=(0x30+DP);
- for(i=0;i<15;i++)
- write_data(dis5[i]);
- w0=w3*10+w4;
- delay1(5) ;
- }
-
- if(DP==46)
- {
- while(DP==46)
- fk();
- s1=DP;
- lcd_pos(2,0);
- dis6[6]=(0x30+DP);
- for(i=0;i<10;i++)
- write_data(dis6[i]);
- delay1(5) ;
- while(DP==s1)
- fk();
- s2=DP ;
- lcd_pos(2,0);
- dis6[7]=(0x30+DP);
- for(i=0;i<10;i++)
- write_data(dis6[i]);
- s=s1*10+s2;
- delay1(5) ;
- while(DP==s2)
- fk();
- s3=DP ;
- lcd_pos(2,0);
- dis6[9]=(0x30+DP);
- for(i=0;i<15;i++)
- write_data(dis6[i]);
- delay1(5) ;
- while(DP==s3)
- fk();
- s4=DP ;
- lcd_pos(2,0);
- dis6[10]=(0x30+DP);
- for(i=0;i<15;i++)
- write_data(dis6[i]);
- s0=s3*10+s4;
- delay1(5) ;
- }
- if(DP==47)
- {
- while(DP==47)
- fk();
- k2=DP;
- lcd_pos(3,0);
- if(k2==1)
- for(i=0;i<14;i++)
- write_data(dis9[i]);
- if(k2==2)
- for(i=0;i<14;i++)
- write_data(dis7[i]);
- delay1(5) ;}
- if(DP==99)
- {
- while(DP==99)
- fk();
- k1=DP;
- lcd_pos(0,0);
- if(k1==1)
- for(i=0;i<15;i++)
- write_data(dis8[i]);
- if(k1==2)
- for(i=0;i<15;i++)
- write_data(dis4[i]);
- delay1(5) ;
- }
- fk();
- }while(DP!=88);
-
-
-
- }
-
- if(dat1>w)
- a=0;
- if(dat1<w0)
- b=0;
- if(dat>70)
- p6=0;
- if(dat2/2>s)
- {c=0;
- p5=0;}
- aa++;
- if(aa>15)
- {
- if(k1==2)
- {
- if(dat2/2<s)
- {if(c==0){
- ret = send_pdu_message0(pdu_content0);//發(fā)送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- c=1;
- }
-
-
-
- }
-
-
- }
-
- if(dat1<w)
- { if(a==0)
- { delay1(1000);
- ret = send_pdu_message1(pdu_content2);//發(fā)送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- a=1;
- }
-
- delay1(1000);
- LED3=1; } }
- if(dat1>w0)
- {if(b==0){
- ret = send_pdu_message1(pdu_content1);//發(fā)送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- b=1;
- }
-
- delay1(1000);
- LED3=1; } }
-
- }
- //自動(dòng)模式
- if(k1==1)
- {
- if(dat1<w)
- {
- if(a==0)
- { delay1(3000);
- ret = send_pdu_message1(pdu_content2);//發(fā)送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- a=1;
- }
-
- delay1(1000);
- LED3=1; }
- }
- if(dat1>w0)
- {if(b==0)
- { delay1(3000);
- ret = send_pdu_message1(pdu_content1);//發(fā)送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- b=1;
- }
-
- delay1(1000);
- LED3=1; } }
-
- if(dat2<s)
- {if(c==0)
- {
- ret = send_pdu_message0(pdu_content0);//發(fā)送pdu短信
-
- if(ret == 1)
- {
-
- c=1;
- }
-
- } p5=1; }
- if(k2==1)
- {
- if(dat<70)
- p6=1;
- }
- if(k2==2)
- {
- p6=0;
- }
-
- }
-
- }
- }}
-
-
- /*******************************************************************************
- * 函數(shù)名 : Timer0_ISR
- * 描述 : 定時(shí)器0中斷服務(wù)入口函數(shù),1ms中斷一次
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /********************* UART1中斷函數(shù)************************/
- void UART1_ISR (void) interrupt 4
- {
- if (RI)
- {
- RI = 0; //清除RI位
- Uart1_Buf[First_Int] = SBUF; //將接收到的字符串存到緩存中
- First_Int++; //緩存指針向后移動(dòng)
- if(First_Int > Buf_Max) //如果緩存滿,將緩存指針指向緩存的首地址
- {
- First_Int = 0;
- }
- /*
- if(First_Int >=6)
- {
- if(Find("RING"))
- {
- LED7 = 0;
- }
- else
- {
- LED7 = 1;
- }
- }
- */
- if(receive_message_mode == 1)//說明進(jìn)入接收短信的模式,
- {
- if(First_Int >=22)//這里的22是根據(jù)情況進(jìn)行判斷設(shè)定的
- {
- ledon_flag = 1;
- }
- }
-
- }
- if (TI)
- {
- TI = 0; //清除TI位
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : CLR_Buf
- * 描述 : 清除串口2緩存數(shù)據(jù)
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf(void)
- {
- u8 k;
- for(k=0;k<Buf_Max;k++) //將緩存內(nèi)容清零
- {
- Uart1_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存儲(chǔ)位置
- }
- /*******************************************************************************
- * 函數(shù)名 : Find
- * 描述 : 判斷緩存中是否含有指定的字符串
- * 輸入 :
- * 輸出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(u8 *a)
- {
- ES = 0; //改進(jìn)程序
- if(strstr(Uart1_Buf,a)!=NULL)
- {
- ES = 1;
- return 1;
- }
- else
- {
- ES = 1;
- return 0;
- }
-
- }
- /*******************************************************************************
- * 函數(shù)名 : Wait_CREG
- * 描述 : 等待模塊注冊(cè)成功
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Wait_CREG(void)
- {
- u8 i;
- u8 k;
- i = 0;
- CLR_Buf();
- while(i == 0)
- {
- UART1_Send_Command("AT+CREG?");
- delay_ms(100);
-
- for(k=0;k<Buf_Max;k++)
- {
- if((Uart1_Buf[k] == '+')&&(Uart1_Buf[k+1] == 'C')&&(Uart1_Buf[k+2] == 'R')&&(Uart1_Buf[k+3] == 'E')&&(Uart1_Buf[k+4] == 'G')&&(Uart1_Buf[k+5] == ':'))
- {
-
- if((Uart1_Buf[k+7] == '1')&&((Uart1_Buf[k+9] == '1')||(Uart1_Buf[k+9] == '5')))
- {
- i = 1;
- LED1 =0;
- break;
- }
-
- }
- }
-
- }
- }
- /*----------------------------
- UART1 發(fā)送串口數(shù)據(jù)
- -----------------------------*/
- void UART1_SendData(u8 dat)
- {
- ES=0; //關(guān)串口中斷
- SBUF=dat;
- while(TI!=1); //等待發(fā)送成功
- TI=0; //清除發(fā)送中斷標(biāo)志
- ES=1; //開串口中斷
- }
- /*----------------------------
- UART1 發(fā)送字符串
- -----------------------------*/
- void UART1_SendString(char *s)
- {
- while(*s)//檢測(cè)字符串結(jié)束符
- {
- UART1_SendData(*s++);//發(fā)送當(dāng)前字符
- }
- }
- /**********************************
- 發(fā)送命令
- **********************************/
- void UART1_Send_Command(char *s)
- {
- CLR_Buf();
- while(*s)//檢測(cè)字符串結(jié)束符
- {
- UART1_SendData(*s++);//發(fā)送當(dāng)前字符
- }
- UART1_SendLR();
- }
- /*******************************************************************************
- * 函數(shù)名 : Second_AT_Command
- * 描述 : 發(fā)送AT指令函數(shù)
- * 輸入 : 發(fā)送數(shù)據(jù)的指針、希望收到的應(yīng)答、發(fā)送等待時(shí)間(單位:interval_time*20 ms)
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time)
- {
- u8 i;
- CLR_Buf();
- i = 0;
- while(i < wait_time)
- {
- UART1_Send_Command(b);
- delay_ms(interval_time);
- if(Find(a)) //查找需要應(yīng)答的字符
- {
- return 1;
- }
- i++;
- }
-
- return 0;
- }
- void delay_ms(u16 ms)
- {
- u16 i,j;
-
- for (i=ms*20;i>0;i--)
- for (j=110;j>0;j--) ;
-
- }
復(fù)制代碼
全部資料下載地址:
智能花盆程序.docx
(24.63 KB, 下載次數(shù): 47)
2017-9-1 12:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|