关于STC12C5A08S2串口初始化问题
#include<STC12C5A08S2.h>
#include<string.h>
#include<stdio.h>
#define Buf_Max 60
#define Delay_Time 300
sbit LED1 = P0^0; //继电器状态指示灯1
sbit LED2 = P0^1; //状态指示灯2
sbit LED3 = P0^2; //状态指示灯3
sbit LED4 = P0^3; //状态指示灯4
sbit LED5 = P0^4; //继电器5
sbit IGT=P1^0;
int Phone_num;
unsigned char i = 0; //定义缓存指针
unsigned char Rec_Buf[Buf_Max]; //定义缓存数组
void Serial_Init(void); //声明串口初始化函数
void Send_ASCII(unsigned char *b); //声明发送字符(ASCII码)函数
void Delay_ms(unsigned int time); //声明延时函数
void CLR_Buf(void); //声明清除缓存内容
void Send_Hex(unsigned char b); //声明发送字符(十六进制)函数
bit Hand(unsigned char *a); //声明判断缓存中是否含有指定的字符串函数
int Phone_Number(void);//确定那个手机,并进行判断是否是指定手机
void Send_Class(int class);//向模块终端发送短信内容
void AT_CMGS(int Phone_num); //向模块终端发送发短信指令
/**********************************主函数******************************/
void main(void)
{
LED1 =0; //开始均置低电平
LED2 =0;
LED3 =0;
LED4 =0;
LED5 =0;
IGT=0;
Delay_ms(1000); //延时
IGT=1;
Serial_Init(); //初始化串口
CLR_Buf(); //清除缓存内容
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(6000); //延时
}
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGF=1"); //文本(TEXT)模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGD=1"); //删除第一条信息
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
Delay_ms(2000);
LED2=0;
while(1)
{
if(strstr(Rec_Buf,"+CMTI")!=NULL) //若缓存字符串中含有"+CMTI"就表示有新的短信
{ LED1=0;
CLR_Buf(); //清除缓存内容
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGR=1"); //发送读取信息指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
LED3=0;
Phone_Number();
CLR_Buf();
Delay_ms(2000);
if(Phone_num)
{
if(strstr(Rec_Buf,"openled1")!=NULL) //如果信息内容是"open1"
{ LED1 = 1; AT_CMGS(Phone_num); //点亮LED1指示灯
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
while(!Hand(">"));
Send_ASCII("success");
Send_Hex(0x1a);
}
else if(strstr(Rec_Buf,"closeled1")!=NULL) //如果信息内容是"close1"
{ LED1 = 0; AT_CMGS(Phone_num); //关闭LED1指示灯
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
while(!Hand(">"));
Send_ASCII("failed");
Send_Hex(0x1a);
} //熄灭LED1指示灯
else if(strstr(Rec_Buf,"openled2")!=NULL) //如果信息内容是"open2"
{ LED2 = 1; AT_CMGS(Phone_num); //点亮LED1指示灯
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
while(!Hand(">"));
Send_ASCII("success");
Send_Hex(0x1a);
} //点亮LED2指示灯
else if(strstr(Rec_Buf,"closeled2")!=NULL) //如果信息内容是"close2"
{ LED2 = 0; AT_CMGS(Phone_num); //关闭LED1指示灯
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
while(!Hand(">"));
Send_ASCII("failed");
Send_Hex(0x1a);
}
}
else
{
AT_CMGS(Phone_num);
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
while(!Hand(">"));
Send_ASCII("You haven't authority");
Send_Hex(0x1a);
}
Delay_ms(3000);
CLR_Buf();
Phone_num=0;
Delay_ms(1000);
Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CMGD=1"); //删除读取后的信息
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf();
}
}
}
/***************************串口初始化函数*****************************/
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[i] = SBUF; //将接收到的字符串存到缓存中
i++; //缓存指针向后移动
if(i>200) //如果缓存满,将缓存指针指向缓存的首地址
{
i = 0;
}
}
ES = 1; //开启串口中断
}
/****************************发送字符(ASCII)函数***********************/
void Send_ASCII(unsigned char *b)
{
ES = 0; //关串口中断
for (b; *b!='\0';b++)
{
SBUF = *b;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
}
ES = 1; //开串口中断
}
/****************************time ms延时函数***************************/
void Delay_ms(unsigned int time)
{
unsigned char j;
for(;time>0;time--)
{
j = 1500;
while(j--);
}
}
/**************************清除缓存数据函数****************************/
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //将缓存内容清零
{
Rec_Buf[k] = 0;
}
i = 0; //接收字符串的起始存储位置
}
/*************************发送字符(十六进制)函数********************/
void Send_Hex(unsigned char c)
{
ES = 0; //关串口中断
SBUF = c;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
ES = 1; //开串口中断
}
/*****************判断缓存中是否含有指定的字符串函数******************/
bit Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
/**************确定那个手机***************************************/
int Phone_Number(void)//确定那个手机,并进行判断是否是指定手机
{
if(Hand("15307736480"))
Phone_num=1;
else if(Hand("13807839598"))
Phone_num=2;
else Phone_num=0;
return Phone_num;
}
/***********************向模块终端发送短信内容***************************/
/*{
if(class==1)
Send_ASCII("Math");
else if(class==2)
Send_ASCII("Chinese");
else if(class==3)
Send_ASCII("English");
else if(class==4)
Send_ASCII("History");
else if(class==5)
Send_ASCII("PE");
else if(class==6)
Send_ASCII("Science");
else if(class==7)
Send_ASCII("Self-study");
else if(class==8)
Send_ASCII("Self-study");
else if(class==9)
Send_ASCII("Self-study");
}
*/
void AT_CMGS(int Phone_num) //向模块终端发送发短信指令
{
if(Phone_num==1)
{Send_ASCII("AT+CMGF=1"); //文本(TEXT)模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf(); //清除缓存内容
Send_ASCII("AT+CMGS=15307736480");
}
else if(Phone_num==2)
{
Send_ASCII("AT+CMGF=1"); //文本(TEXT)模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf();
Send_ASCII("AT+CMGS=13807839598");
}
}/***
串口初始化的时候最好加一条
PCON = 0x00; //不倍频
void Send_ASCII(unsigned char *b)
{
ES = 0; //关串口中断
while(*b++ != '\0')
{
SBUF = *b;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
}
ES = 1; //开串口中断
}
谢谢 我试试啊 昨天没登的 !
void Send_ASCII(unsigned char *b)
{
ES = 0; //关串口中断
while(*b++ != '\0')
{
SBUF = *b;
while(TI!=1); //等待发送完成
TI = 0; //清除发送中断标志位
}
ES = 1; //开串口中断
}那您加这段代码是?
它是靠串口2进行接收和发送的 怎么设置呢 ?
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; //开启全局中断
}
//以上经过证实可用
学习了,好东西。