51 单片机 串口通讯方式1
/*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 = '@'; //接收到之后返回一个@ 可自行修改
//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'; //将发送的数据清空
}
}
四年前,自己用51单片机+纸币验证器+继电器+改造饭卡出纳机+红外计数传感模块,开发了一个饭卡自助充值机,对于奇偶校验,由于默认不支持,自己自行多发数据实现了校验,觉得自己棒棒哒:lol stc89c51?上学时还用这个做过幻灯片 支持一下,刚入门学习 学习了 谢谢 好久没看过了 :Dweeqw 51入门 很久没玩过单板了 最近学习了 突然发现那些用单片机做流水灯的日子,已经离我过去很久了 学习了,多谢
页:
[1]
2