#include<reg52.h> #include<intrins.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
uchar code num[]="1xxxxxxxxx3";(电话号码)
uchar code table[]="Temperature:";
#define Buf_Max 200
uchar Rec_Buf[Buf_Max]; //定义缓存数组
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;
sbit dq=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
uchar q = 0; //定义缓存指针
uint number=12;
uint wd;
void Serial_Init(void);
void Send_ASCII(unsigned char *b);
void delayMs(uint a);
void CLR_Buf(void);
void Send_Hex(unsigned char c);
bit Hand(unsigned char *a);
void delayMs(uint a)
{
uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
void delay_15us(uchar temp)
{
for(temp;temp>0;temp--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
}
void delayUs()
{
_nop_();
}
bit init_ds18b20()//温度初始化
{
bit ret=1;
dq=0;
delay_15us(39);
dq=1;
delay_15us(4);
ret=dq;
delay_15us(27);
dq=1;
return ret;
}
void wbyte_ds18b20(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
if(b)
{
dq = 0; i++; i++;
dq = 1;
i = 8; while(i>0) i--;
}
else
{
dq = 0;
i = 8; while(i>0) i--;
dq = 1;
i++; i++;
}
}
}
bit rbit_ds18b20()//读位
{
uint i;
bit data_bit;
dq=0;
i++;
dq=1;
i++;
i++;
data_bit=dq;
i = 8;
while(i>0) i--;
return data_bit;
}
uchar rbyte_ds18b20()//读字节
{
uchar i,j;
uchar data_byte=0;
for(i=0;i<8;i++)
{
j=rbit_ds18b20();
data_byte=(j<<7)|(data_byte>>1);
}
return data_byte;
}
void start_ds18b20()//温度转换
{
init_ds18b20();
delayMs(1);
wbyte_ds18b20(0xcc);
wbyte_ds18b20(0x44);
}
uint read_tem()//得到温度值
{
init_ds18b20();
delayMs(1);
wbyte_ds18b20(0xcc);
wbyte_ds18b20(0xbe);
wd=rbyte_ds18b20();
wd=wd|(rbyte_ds18b20()<<8);
wd=wd*0.0625;
wd=wd*10;
return wd;
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
void delay1(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void write_com(uchar com)//写1602指令
{
P0=com;
rs=0;
lcden=1;
delayUs();
lcden=0;
delayMs(1);
}
void write_date(uchar date)//写1602数据
{
P0=date;
rs=1;
lcden=1;
delayUs();
lcden=0;
delayMs(1);
}
void init()//1602初始化
{
dula=0;
wela=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void diplay_temp(void)
{
char shi,ge;
shi=read_tem()/100;
ge=read_tem()%100/10;
write_com(0x80+0x40+3);
write_date(0x30+shi);
write_date(0x30+ge);
write_com(0x80+0x40+5);
write_date('C');
}
void display(void)
{
start_ds18b20();
delayMs(1000);
init();
write_com(0x80);
for(number=0;number<12;number++)
{
write_date(table[number]);
}
diplay_temp();
}
void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;
TR1 = 1; //开启定时器1
ES = 1; //开启串口中断
EA = 1; //开启全局中断
}
void Serial_Int() interrupt 4
{
ES = 0; //关串口中断,防止中断嵌套
if(TI) //如果是发送中断,则不做任何处理
{
TI = 0; //清除发送中断标志位
}
if(RI) //如果是接送中断,则进行处理
{
RI = 0; //清除接收中断标志位
Rec_Buf[q] = SBUF; //将接收到的字符串存到缓存中
q++; //缓存指针向后移动
if(q>200) //如果缓存满,将缓存指针指向缓存的首地址
{
q = 0;
}
}
ES = 1; //开启串口中断
}
/**********************************************************************/
void Send_ASCII(unsigned char *b)
{
ES = 0; //关串口中断
for (b; *b!='\0';b++)
{
SBUF = *b;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
}
ES = 1; //开串口中断
}
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //将缓存内容清零
{
Rec_Buf[k] = 0;
}
q = 0; //接收字符串的起始存储位置
}
/*函数功能:发送字符(十六进制)
/*输入参数:unsigned char c
/******************************************************************/
void Send_Hex(unsigned char c)
{
ES = 0; //关串口中断
SBUF = c;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
ES = 1; //开串口中断
}
/*函数功能:判断缓存中是否含有指定的字符串
/*输入参数:unsigned char *a 指定的字符串
/*输出参数:bit 1---含有 0---不含有
/*调用模块:无
/*******************************************************************/
uchar Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
void main()
{
LED0=0;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
LED5=0;
LED6=0;
LED7=0;
Serial_Init(); //调用串口初始化函数
CLR_Buf();
//while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
//{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// }
CLR_Buf();
delayMs(3000); //延时
//Send_ASCII("AT+CPMS=\"MT\",\"MT\",\"MT\"");//?所有操作都在MT(模块终端)中进行
//Send_Hex(0x0d); //发送回车符
//Send_Hex(0x0a); //发送换行符
//delayMs(Delay_Time); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
// delayMs(Delay_Time); //延时
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf();
delayMs(3000); //延时
Send_ASCII("AT+CMGF=1"); //文本(TEXT)模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
//LED4 = 0; //点亮设置成功指示灯
delayMs(3000); //延时
Send_ASCII("AT+CMGD=1"); //删除第一条信息
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
while(1)
{
display();
if(wd>28)
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
delayMs(3000); //延时
Send_ASCII("ATD15322374613;");
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
//等待设置成功
CLR_Buf();
}
if(strstr(Rec_Buf,"+CMTI")!=NULL) //?若缓存字符串中含有"+CMTI"就表示有新的短信
{
CLR_Buf(); //清除缓存内容
delayMs(3000); //延时
Send_ASCII("AT+CMGR=1"); //发送读取信息指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// while(!Hand("OK")); //等待设置成功
//LED2 = 0; //点亮设置成功指示灯
if(strstr(Rec_Buf,"close")!=NULL) //如果信息内容是"open1"
LED0= 1;
LED1=1;
LED2=1;
LED3=1;
LED4=1;
LED5=1;
LED6=1;
LED7=1;
CLR_Buf(); //清除缓存内容
delayMs(3000); //延时
Send_ASCII("AT+CMGD=1"); //删除读取后的信息
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
delayMs(3000); //延时
// while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
}
}
}
我的程序主要实现的功能是温度传感器实时测周围环境的温度,当温度(wd)大于28度时向一个手机打电话,然后手机发送close信息给GSM模块关闭LED灯,温度传感器的显示没问题,单片机的发送串口也没问题,就是就收不到TC35I反馈的信息,,,我觉得主要是黄色部分问题 请大侠们帮我查找问题,谢谢了
|