51单片机智能花盆程序代码,内有详细介绍,此系统由51 单片机,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缓存长度
- #define STABLE_TIMES 15 //等待A6上电后稳定,再进行自适应波特率
- #define SEND_AT_TIMES 30 //发送多少个AT指令进行自适应
- #define SEND_AT_INTERVAL 2 //2代表的是2*20ms 自适应的时候,每个AT指令的间隔时间
- //串口1发送回车换行
- #define UART1_SendLR() UART1_SendData(0X0D);\
- UART1_SendData(0X0A)
- sbit ds = P2^2; //ds18b20位声明
- sbit dula = P2^6; //数码管位声明
- 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数据端口
- sbit scl=P2^1;//I2C时钟
- 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[]={"光强: " };
- uchar xdata dis4[]={"自动模式: 关 " }; //液晶显示部分
- uchar xdata dis5[]={"温度: 10-30C " };
- uchar xdata dis6[]={"湿度:30-60% " };
- uchar xdata dis7[]={"补光: 关 "};
- uchar dis8[]={"自动模式: 开 "};
- uchar dis9[]={"补光: 开 "};
- xdata u8 Uart1_Buf[Buf_Max];
- //u8 Register_Flag=0; //A6 注册标志位 1 :注册成功 3:注册失败 5:注册成功,但处于漫游状态下,无法拨打电话发短信
- 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;
- /************* 本地函数声明 **************/
- void delay_ms(u16 ms); //延时ms个20ms ms*20ms
- void CLR_Buf(void); //清串口接收缓存
- u8 Find(u8 *a); //查找字符串
- void UART1_SendData(u8 dat); //串口1发送 1字节
- void UART1_SendString(char *s);//串口1发送 字符串
- void UART1_Send_Command(char *s);
- u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//a6 at命令发送
- 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;
- }
- }
- /***************************************************************
- 注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。
- ****************************************************************/
- u8 send_pdu_message0(char *content)
- {
- u8 ret;
- char content_len[3];//计算字符串的长度,暂时支持的短信内容的字符数为2位,也就是99个字节,可以根据自己爱好进行修改
- 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);//发送字符个数指令
- if(ret == 0)
- {
- return 0;
- }
-
- UART1_SendString(content); //发送具体的内容
- ret = UART1_Send_AT_Command(end_char,"OK",3,250);//发送结束符,等待返回ok,等待5S发一次,因为短信成功发送的状态时间比较长
-
- return ret;
- }
- u8 send_pdu_message1(char *content)
- {
- u8 ret;
- char content_len[3];//计算字符串的长度,暂时支持的短信内容的字符数为2位,也就是99个字节,可以根据自己爱好进行修改
- 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);//发送字符个数指令
- if(ret == 0)
- {
- return 0;
- }
-
- UART1_SendString(content); //发送具体的内容
- ret = UART1_Send_AT_Command(end_char,"OK",3,250);//发送结束符,等待返回ok,等待5S发一次,因为短信成功发送的状态时间比较长
-
- 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) //写指令数据到液晶
- { lcdrs=0;
- lcdrw=0;
- lcden=0;
- P0=com;
- delay1(5);
- lcden=1;
- delay1(5);
- lcden=0;
- }
- void write_data(uchar date) //写显示数据到液晶
- {
- 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 起始信号
- {
- scl=1;
- _nop_();
- sda=1;
- delay();
- sda=0;
- delay();
- scl=0;
- _nop_();
- }
- void stop() //PCF8591终止信号
- {
- scl=1;
- _nop_();
- sda=0;
- delay();
- sda=1;
- delay();
- }
- void respons() //应答信号
- {
- 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) //主机向从机发送数据
- {
- 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() /*读一个字节(从机向主机)由高到低位*/
- {
- 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) /*单片机读PCF8591的AD数据*/
- {
- 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() //读一位数据
- {
- bit dat;
- ds=0;
- _nop_();
- _nop_();
- ds=1;
- _nop_();
- dat=ds;
- TempDelay(12);
- return dat;
- }
- uchar ds_read_byte() //读1个字节数据
- {
- 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写数据
- {
- 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() //温度获取和转换
- {
- ds_reset();
- ds_write_byte(0xcc);
- ds_write_byte(0x44);
- }
- uint get_temperature() //读取温度数据
- {
- 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++; //用于计数2个下降沿之间的时间
- }
- void EX0_ISR (void) interrupt 0 //外部中断0服务函数
- {
- static unsigned char i; //接收红外信号处理
- static bit startflag; //是否开始处理标志位
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是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)//定时器0初始化
- {
- TMOD=0x22;//定时器0工作方式2,TH0是重装值,TL0是初值
- TH0=0x00; //重载值
- TL0=0x00; //初始化值
- ET0=1; //开中断
- TR0=1;
- }
- void EX0init(void)
- {
- IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
- EX0 = 1; //使能外部中断
- EA = 1; //开总中断
- }
- void Ir_work(void)//红外键值散转程序
- {
- switch(IRcord[2])//判断第三个数码值
- {
- case 0x45:DP=dofly_DuanMa[1];break;//1 显示相应的按键值
- 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;//处理完成标志
- }
- void Ircordpro(void)//红外码值处理函数
- {
- unsigned char i, j, k,cord,value;
- k=1;
- for(i=0;i<4;i++) //处理4个字节
- {
- for(j=1;j<=8;j++) //处理1个字节8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
- value=value|0x80;
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//处理完毕标志位置1
- }
- void fk()
- {if(irok)
- {
- Ircordpro();
- irok=0;
- }
- if(irpro_ok)
-
- Ir_work();}
- /**********************************************/
- /*设计思路:
- (0)进行串口、定时器初始化工作。
- (1)开机等待15秒,等待模块准备好。
- (2)发送AT指令,让模块进行自适应波特率为9600
- (3)发送相应的指令。
- ************************************************/
- void main(void)
- {
- uchar dat,dat1,dat2;
- aa=p5=p6=p7=0;
- delay1(5);
- init();
- init1();
-
- ds_change();
- Uart1Init();
- TIM0init();//初始化定时器
- EX0init(); //初始化外部中断
- delay1(1000);
- for(i = 0;i < STABLE_TIMES;i++)//等待网络稳定
- {
- delay_ms(50);
- }
-
- //自适应波特率
- adjust_A6_buadrate();
- //等待GSM注册成功
- Wait_CREG();
- //设置存储位置,不做返回值判断了
- 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); //光强显示模块
- 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);//发送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- c=1;
- }
-
-
-
- }
-
-
- }
-
- if(dat1<w)
- { if(a==0)
- { delay1(1000);
- ret = send_pdu_message1(pdu_content2);//发送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- a=1;
- }
-
- delay1(1000);
- LED3=1; } }
- if(dat1>w0)
- {if(b==0){
- ret = send_pdu_message1(pdu_content1);//发送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- b=1;
- }
-
- delay1(1000);
- LED3=1; } }
-
- }
- //自动模式
- if(k1==1)
- {
- if(dat1<w)
- {
- if(a==0)
- { delay1(3000);
- ret = send_pdu_message1(pdu_content2);//发送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);//发送pdu短信
-
- if(ret == 1)
- {
- LED3 = 0;
- b=1;
- }
-
- delay1(1000);
- LED3=1; } }
-
- if(dat2<s)
- {if(c==0)
- {
- ret = send_pdu_message0(pdu_content0);//发送pdu短信
-
- if(ret == 1)
- {
-
- c=1;
- }
-
- } p5=1; }
- if(k2==1)
- {
- if(dat<70)
- p6=1;
- }
- if(k2==2)
- {
- p6=0;
- }
-
- }
-
- }
- }}
-
-
- /*******************************************************************************
- * 函数名 : Timer0_ISR
- * 描述 : 定时器0中断服务入口函数,1ms中断一次
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- /********************* UART1中断函数************************/
- void UART1_ISR (void) interrupt 4
- {
- if (RI)
- {
- RI = 0; //清除RI位
- Uart1_Buf[First_Int] = SBUF; //将接收到的字符串存到缓存中
- First_Int++; //缓存指针向后移动
- 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)//说明进入接收短信的模式,
- {
- if(First_Int >=22)//这里的22是根据情况进行判断设定的
- {
- ledon_flag = 1;
- }
- }
-
- }
- if (TI)
- {
- TI = 0; //清除TI位
- }
- }
- /*******************************************************************************
- * 函数名 : CLR_Buf
- * 描述 : 清除串口2缓存数据
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf(void)
- {
- u8 k;
- for(k=0;k<Buf_Max;k++) //将缓存内容清零
- {
- Uart1_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存储位置
- }
- /*******************************************************************************
- * 函数名 : Find
- * 描述 : 判断缓存中是否含有指定的字符串
- * 输入 :
- * 输出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(u8 *a)
- {
- ES = 0; //改进程序
- if(strstr(Uart1_Buf,a)!=NULL)
- {
- ES = 1;
- return 1;
- }
- else
- {
- ES = 1;
- return 0;
- }
-
- }
- /*******************************************************************************
- * 函数名 : Wait_CREG
- * 描述 : 等待模块注册成功
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- 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 发送串口数据
- -----------------------------*/
- void UART1_SendData(u8 dat)
- {
- ES=0; //关串口中断
- SBUF=dat;
- while(TI!=1); //等待发送成功
- TI=0; //清除发送中断标志
- ES=1; //开串口中断
- }
- /*----------------------------
- UART1 发送字符串
- -----------------------------*/
- void UART1_SendString(char *s)
- {
- while(*s)//检测字符串结束符
- {
- UART1_SendData(*s++);//发送当前字符
- }
- }
- /**********************************
- 发送命令
- **********************************/
- void UART1_Send_Command(char *s)
- {
- CLR_Buf();
- while(*s)//检测字符串结束符
- {
- UART1_SendData(*s++);//发送当前字符
- }
- UART1_SendLR();
- }
- /*******************************************************************************
- * 函数名 : Second_AT_Command
- * 描述 : 发送AT指令函数
- * 输入 : 发送数据的指针、希望收到的应答、发送等待时间(单位: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)) //查找需要应答的字符
- {
- 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--) ;
-
- }
复制代码
全部资料下载地址:
智能花盆程序.docx
(24.63 KB, 下载次数: 47)
|