最近折腾51单片机,当然学到的都是比较根底的东西,或许我以为比较复杂的概念有“中止” 和“串口通讯”,这篇主要是讲串口通讯
运用的自然是山大王STC89C52RC的芯片来学习
串口通讯主要是C51单片机的RXD 和TXD 与上位机进行通讯,我们上位机一般是电脑,所以要TTL转成电脑能读出的RS232的电路来支撑 一般运用MAX232 芯片 串口通讯电路如下
之后就可以电脑的串口与这儿的串口头子接了,留意 串口先要穿插一下 即电脑的TXD 对应下位机的RXD
C51单片机串口通信形式有4种,最常用的是第一种
方法0 同步移位寄存器方法 ,一般用来扩展I/O口,
方法1 10位异步收发(8位数据),波特率可变(由定时器1的溢出率操控)
方法2 11位异步收发(9位数据),波特率固定
方法4 11位异步收发,波特率可变(定时器1溢出率决议)
各种需求装备的参数如下所示
TI
发送中止标志位
当发送一帧结束后,由硬件使TI=1,向外部发送中止请求,在中止服务程序中,有必要用软件手动TI = 0,不然一向卡在中止里(测验一下)
RI
承受中止标志位
当接纳一帧结束后,由硬件使RI = 1, 向外部发送中止请求,也有必要要在中止服务程序中,用软件将其清0,撤销此次中止请求
ES
串行中止答应位
1 为开打 0为封闭
REN
答应串行承受位
1 为翻开 0 为封闭
SBUF
串口缓存
在读写结束后,存储的是相应的读/写值(留意,SUBF实践有两个寄存器,一个放写一个放读)
SM0/1
串口设置工作方法
设置4种工作方法,留意,最好是设置好工作方法再开串口教授
EA
终端总开关
TR1
定时器1开关
TH1/TL1
定时器初值
为了分量9600 的波特率 所以需求将TH1 TL1 设置为0xfd
TMOD
定时器运转形式
在串口通讯的1号方法的时分 需求翻开T1的串口通讯 TMOD= 0x20 ,即第二种方法,8位主动重装
ET0/1
中止答应开关
time0 time1
之后是我的选用笔记的两篇关于串口通讯笔记的共享
http://app.yinxiang.com/shard/s20/sh/6abe8da0-d4b8-4407-9848-3142dde1bed5/ba2a0a6debaab317aaca09185ce65c71
http://app.yinxiang.com/shard/s20/sh/0faa2671-1e95-4d08-9d12-b1bdedc0eadd/13e7a915ea347b0daf3aca30fd9a6a74
我自己写的个简略的串口通讯
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = “Hi “;
uchar receiveFlag=0;
void init(){
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
TR1 = 1;
}
void main(){
uchar serVal,i;
init();
receiveFlag = 1;
while(1){
if(receiveFlag == 1){
ES = 1;
while(RI==0);
serVal = SBUF;
RI = 0;
receiveFlag = 0;
}
if(receiveFlag==0){ //need to send msg;
for(i =0;i<3;i++){
SBUF = table[i];
while(TI==0);
TI = 0;
}
SBUF = serVal;
while(TI ==0);
TI = 0;
receiveFlag = 1;
}
}
}
void receive_data() interrupt 4{
RI = 0;//手动清0
ES = 0;
receiveFlag = 0;
}