标题:
51单片机gsm-A6+lcd2864智能花盆程序代码
[打印本页]
作者:
songwentai
时间:
2017-9-1 12:32
标题:
51单片机gsm-A6+lcd2864智能花盆程序代码
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)
2017-9-1 12:31 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1