您的位置 首页 发布

51单片机串口通讯的注记

最近折腾51单片机,当然学到的都是比较基础的东西,可能我认为比较复杂的概念有中断和串口通信,这篇主要是讲串口通信使用的自然是山大王…

最近折腾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;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/263631.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部