新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2018-3-15
- 在线时间
- 4 小时
|
楼主 |
发表于 2018-3-15 19:33:12
|
显示全部楼层
#include "REG52.H"
#include "string.h"
#include "stdio.h"
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Buf_Max 200//缓存长度200
#define PAUSE_INT EA=0;
#define START_INT EA=1;
int i = 0;
unsigned char Rec_Buf[Buf_Max]; //定义缓存数组
/******串口1初始化函数******/
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式2
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80; //波特率提高一倍
// TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
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; //开串口中断
}
/******清除缓存数据函数******/
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;
}
/******判断缓存中是否含有指定的字符串函数******/
/*输入参数:unsigned char *a 指定的字符串
/*输出参数:bit 1 ---含有 0 ---不含
/**********************************************/
bit Hand(unsigned char *a){
if(strstr(Rec_Buf,a) != NULL)
return 1;
else
return 0;
}
/******发送一个字符的函数******/
void send_char_com(uchar ch){
PAUSE_INT
SBUF=ch;
while(TI==0);
TI=0;
START_INT;
}
/******发送一个字符串的函数******/
/*向串口发送一个字符串,strlen 为该字符串长度
/********************************/
void send_string_com(uchar strlen, uchar *str)
{
uchar k=0;
do
{
send_char_com(*(str+k));
k=k+1;
} while(k<strlen);
}
/************************/
/*main函数*/
/************************/
void main(void){
Delay100ms();
UartInit(); //串口初始化函数
Delay100ms();
CLR_Buf(); //清除缓存内容
Delay100ms();
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay100ms(); //延时
}
}
|
|