欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)gsm-A6+lcd2864智能花盆程序代碼
[打印本頁]
作者:
songwentai
時間:
2017-9-1 12:32
標(biāo)題:
51單片機(jī)gsm-A6+lcd2864智能花盆程序代碼
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緩存長度
#define STABLE_TIMES 15 //等待A6上電后穩(wěn)定,再進(jìn)行自適應(yīng)波特率
#define SEND_AT_TIMES 30 //發(fā)送多少個AT指令進(jìn)行自適應(yīng)
#define SEND_AT_INTERVAL 2 //2代表的是2*20ms 自適應(yīng)的時候,每個AT指令的間隔時間
//串口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時鐘
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[]={"自動模式: 關(guān) " }; //液晶顯示部分
uchar xdata dis5[]={"溫度: 10-30C " };
uchar xdata dis6[]={"濕度:30-60% " };
uchar xdata dis7[]={"補(bǔ)光: 關(guān) "};
uchar dis8[]={"自動模式: 開 "};
uchar dis9[]={"補(bǔ)光: 開 "};
xdata u8 Uart1_Buf[Buf_Max];
//u8 Register_Flag=0; //A6 注冊標(biāo)志位 1 :注冊成功 3:注冊失敗 5:注冊成功,但處于漫游狀態(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); //延時ms個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];//計算字符串的長度,暫時支持的短信內(nèi)容的字符數(shù)為2位,也就是99個字節(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ā)送字符個數(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ā)一次,因為短信成功發(fā)送的狀態(tài)時間比較長
return ret;
}
u8 send_pdu_message1(char *content)
{
u8 ret;
char content_len[3];//計算字符串的長度,暫時支持的短信內(nèi)容的字符數(shù)為2位,也就是99個字節(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ā)送字符個數(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ā)一次,因為短信成功發(fā)送的狀態(tài)時間比較長
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 起始信號
{
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() //應(yīng)答信號
{
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() /*讀一個字節(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個字節(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++; //用于計數(shù)2個下降沿之間的時間
}
void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標(biāo)志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
i=0;
irdata[i]=irtime;//存儲每個電平的持續(xù)時間,用于以后判斷是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下降沿觸發(fā),INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
{
switch(IRcord[2])//判斷第三個數(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個字節(jié)
{
for(j=1;j<=8;j++) //處理1個字節(jié)8位
{
cord=irdata[k];
if(cord>7)//大于某值為1,這個和晶振有絕對關(guān)系,這里使用12M計算,此值可以有一定誤差
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è)計思路:
(0)進(jìn)行串口、定時器初始化工作。
(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();//初始化定時器
EX0init(); //初始化外部中斷
delay1(1000);
for(i = 0;i < STABLE_TIMES;i++)//等待網(wǎng)絡(luò)穩(wěn)定
{
delay_ms(50);
}
//自適應(yīng)波特率
adjust_A6_buadrate();
//等待GSM注冊成功
Wait_CREG();
//設(shè)置存儲位置,不做返回值判斷了
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; } }
}
//自動模式
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
* 描述 : 定時器0中斷服務(wù)入口函數(shù),1ms中斷一次
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
/********************* UART1中斷函數(shù)************************/
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)//說明進(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; //接收字符串的起始存儲位置
}
/*******************************************************************************
* 函數(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
* 描述 : 等待模塊注冊成功
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
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)//檢測字符串結(jié)束符
{
UART1_SendData(*s++);//發(fā)送當(dāng)前字符
}
}
/**********************************
發(fā)送命令
**********************************/
void UART1_Send_Command(char *s)
{
CLR_Buf();
while(*s)//檢測字符串結(jié)束符
{
UART1_SendData(*s++);//發(fā)送當(dāng)前字符
}
UART1_SendLR();
}
/*******************************************************************************
* 函數(shù)名 : Second_AT_Command
* 描述 : 發(fā)送AT指令函數(shù)
* 輸入 : 發(fā)送數(shù)據(jù)的指針、希望收到的應(yīng)答、發(fā)送等待時間(單位: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
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1