全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

RS232串口通信的代码分析

时间:2019-07-08 15:25

人气:

作者:admin

标签: 串口通信 

导读:RS232串口通信的代码分析-void usart_init(){SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1TMOD = 0x20; //定时器工作方式2PCON = 0x00;TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (...

想来想去不知道要怎么样把232串口通信说清楚,想想还是直接把代码分析一遍吧。

重点是“常用波特率与定时器1的参数关系”这张表格!波特率的设置很重要!

一、串口初始化

void usart_init()

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1

TMOD = 0x20; //定时器工作方式2

PCON = 0x00;

TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (11.0592M)

TL1 = 0xFD;

ES = 1; //开串口中断

EA = 1; //开总中断

TR1 = 1; //启动定时器

}

SCON寄存器

RS232串口通信的代码分析

1.SM0、SM1:串行口工作方式控制位

RS232串口通信的代码分析

2.SM2:多机通信控制位

3.REN:允许接收位

4.TB8:发送接收数据位8

5.RB8:接收数据位8

6.TI:发送中断标志位 TI=1表示帧发送结束

7.RI:接收中断标志位 RI=1表示帧接收完成

RS232串口通信的代码分析

1.GATE:门控制位 GATE=0,仅受TRX控制 GATE=1,受TRX和外部中断引脚共同控制

2.C/T:定时器模式和计数器模式选择器 C/T=1,计数器 C/T=0,定时器

3.M1、M0:工作方式选择位

RS232串口通信的代码分析

PCON寄存器

RS232串口通信的代码分析

SMOD:是波特率是否加倍的选择位。

SMOD=0时:波特率不加倍。

SMOD=1时:波特率加倍。

RS232串口通信的代码分析

二、串口数据发送

void send_data(unsigned char a)

{

SBUF = a; //SUBF接受/发送缓冲器

while(0 == TI); //每次等待发送完毕,再执行下一条

TI=0; //手动清0

}

SBUF:有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

TI:发送中断标志位 TI=1表示帧发送结束

三、串口中断程序

void ser_int (void) interrupt 4 using 1

{

if(1 == RI) //RI接受中断标志

{

RI = 0; //清除RI接受中断标志

ReData = SBUF; //SUBF接受/发送缓冲器

Flag=1; //标志位置1表示有新数据进来

}

}

RI:接收中断标志位 RI=1表示帧接收完成

四、总代码

#include

//变量声明

unsigned char SenData, //发送数据

Flag, //标志位

ReData; //接收数据

//函数声明

void usart_init(); //串口中断初始化

void send_data(unsigned char a); //串口数据发送

//---------------------------

//串口中断初始化

//---------------------------

void usart_init()

{

SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1

TMOD = 0x20; //定时器工作方式2

PCON = 0x00;

TH1 = 0xFD; //波特率9600、数据位8、停止位1。效验位无 (11.0592M)

TL1 = 0xFD;

ES = 1; //开串口中断

EA = 1; //开总中断

TR1 = 1; //启动定时器

}

//---------------------------

//串口数据发送

//---------------------------

void send_data(unsigned char a)

{

SBUF = a; //SUBF接受/发送缓冲器

while(0 == TI); //每次等待发送完毕,再执行下一条

TI=0; //手动清0

}

//---------------------------

//串口中断程序

//---------------------------

void ser_int (void) interrupt 4 using 1

{

if(1 == RI) //RI接受中断标志

{

RI = 0; //清除RI接受中断标志

ReData = SBUF; //SUBF接受/发送缓冲器

Flag=1; //标志位置1表示有新数据进来

}

}

//---------------------------

//主函数

//---------------------------

void main()

{

usart_init(); //串口中断初始化

while(1)

{

if (Flag==1) //判断是否有数据过来,有则进入循环

{

EA=0; //进入循环之后就把总中断关闭,防止处理过程中又有中断进来

//----------------------该段即对接收的数据进行处理

if(ReData==‘a’)

SenData = ‘b’;

else

SenData = ‘c’;

send_data(SenData); //串口数据发送

//----------------------

Flag=0; //数据处理完毕后将标志位置0,表示没有新数据要处理

EA=1; //打开总中断,允许接收新数据

}

}

}

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信