历史上的今天
今天是:2024年10月12日(星期六)
2019年10月12日 | 51单片机RS232串口通信代码分析
2019-10-12 来源:eefocus
一、串口初始化
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寄存器

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

2.SM2:多机通信控制位
3.REN:允许接收位
4.TB8:发送接收数据位8
5.RB8:接收数据位8
6.TI:发送中断标志位 TI=1表示帧发送结束
7.RI:接收中断标志位 RI=1表示帧接收完成

1.GATE:门控制位 GATE=0,仅受TRX控制 GATE=1,受TRX和外部中断引脚共同控制
2.C/T:定时器模式和计数器模式选择器 C/T=1,计数器 C/T=0,定时器
3.M1、M0:工作方式选择位

PCON寄存器

SMOD:是波特率是否加倍的选择位。
SMOD=0时:波特率不加倍。
SMOD=1时:波特率加倍。

二、串口数据发送
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; //打开总中断,允许接收新数据
}
}
}
下一篇:51单片机入门之按键检测
史海拾趣
|
Windows Mobile 5.0 SDK的程序能在 WinCE5.0系统运行吗? Windows Mobile 5.0 SDK的程序能在 WinCE5.0系统中运行吗? WinCE5.0 SDK的程序能在 Windows Mobile 5.0系统中运行吗? 不知道这里面是怎样的个关系?… 查看全部问答> |
|
大家好,我需要在wince5里面调用DS,但是这个实体机器在定制的时候好像没有把ds打包进去,请问我如何才可以加上ds的组件? PS:我手上就一台实体机,没有rom擦写设备的. 或者如何给定制时候不带windows media play的ce装上windows media player 并且 ...… 查看全部问答> |
|
我用EVC4写的程序 可以修改WM5的注册表 就是Today下面的 用我写的程序修改后 用EVC自带的注册表编辑器查看显示修改是正确地 但是 只要一重启 就还原了 不知道这个问题怎么解决 谢谢了 ps 最好不要用破解注册表这种办法… 查看全部问答> |
|
9月10日.NET外企软件工程师班新班开课, 欢迎大家免费试听! 中美*爱*梯*科技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加! 公司网址: http://www.happyit.com.cn 报名电话: 82240069 中 ...… 查看全部问答> |
|
【班竹:为什么我的两个招聘的帖子都被删除了???】 招聘2-3名软件测试人员 我部门是隶属于一工厂的研发部,工厂在深圳福永(机场附近)。主要从事GPS的研发工作。 工作地点:深圳市南山区科技园 要求: 1) 计算机软件及相关专业毕业,大专及 ...… 查看全部问答> |
|
,超前电子的LPC2368开发板,原价460元,现在卖240吧,不到6折了,不包邮, 板子的资料齐全,有一个配套LCD,板载网络接口 SD卡 USB 等常用功能 联系qq:289916015[localimg=300,240]2[/localimg] http://item.taobao.com/item.htm?id=988308063 ...… 查看全部问答> |
|
德州仪器:使用TI Sitara ARM微处理器简化零售自动化设计 $(\'swf_r01\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzEyMDc4Nzgw/v.sw ...… 查看全部问答> |




