[C] 纯文本查看 复制代码 /*
2020年11月19日10:37:04
功能:
串口方式1 波特率 9600 @11.0592
采用中断方式
接收一个字符或者发送一个字符
可以在此基础上 传输字符串
接收字符 或者 发送 字符两不误
*/
#include <reg52.h>
void init();
char rec_buff = '\0'; //接收缓存
char sen_buff = '\0'; //发送缓存
void main()
{
init();
sen_buff = 'k'; //上电 发送一个 k
SBUF = sen_buff;
//sen_buff = '\0'; //发送内容 清空 写在中断里面了 也可以不再中断清空 操作完后再清空
while(1)
{
sen_buff = rec_buff; //不断检测 当接收中断之后 rec_buff 将不再是'\0' 进入下面的控制中
if(sen_buff)
{
switch(sen_buff)
{
case '1':
P1 = 0xFE;
break;
case '2':
P1 = 0xFC;
break;
case '3':
P1 = 0xF8;
break;
}
SBUF = '@'; //接收到之后返回一个[url=home.php?mod=space&uid=402414]@[/url] 可自行修改
//sen_buff = '\0';
rec_buff = '\0'; //防止不断发送 , 发送之后清空接收到的内容 如果想保留可以 在整个变量
}
/*
if(sen_buff != '\0')
{
SBUF = sen_buff;
sen_buff = '\0';
rec_buff = '\0';
}
*/
}
}
void init()
{
//设置 定时器 TMOD
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
//设置SCON
SM0 = 0;
SM1 = 1;
SM2 = 1; //串口方式1 当确实收到 停止位 REN才置1
//设置中断 IE
EA = 1;
ES = 1;
//开启定时器 允许接收数据 TMOD SCON
TR1 = 1;
REN = 1;
}
void ser() interrupt 4 //串行口中断
{
// 判断是 接收还是发送引起的中断
if(RI == 1)
{
RI = 0;
rec_buff = SBUF; //将接收到的数据保存在 rec_buff中
}
if(TI == 1)
{
TI = 0;
sen_buff = '\0'; //将发送的数据清空
}
}
|