历史上的今天
今天是:2025年01月15日(星期三)
2019年01月15日 | C51/C52的串口原理及参考代码
2019-01-15 来源:eefocus
一、什么是串口(RS232 9针串口)
串口是我们的大多数微控制单元(MCU)都具有的基本的外部接口,一般串口最基本的功能就是调试,又能做数据通信的接口(数据量要小一些)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、串口通信原理
一条信息的各位数据按位依次顺序的通信方式称为串行通信,传信通信可以是串口也可以是其他(74LS164移位寄存器)。
根据传输方式又分为单工、半双工和全双工三种,如图所示:

串口传输如下图所示:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、串口相关寄存器介绍
1、串口控制寄存器SCON



2、电源控制寄存器PCON

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、串口示例代码
1、串口发送单个数据
/**************************************************************************************
*
*实现现象:串口发送单个数据
*
*注意事项:波特率为4800
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void Delay(void)//延时500ms
{
unsigned char i,j;
for(i=0;i<255;i++) //进行循环操作,以达到延时效果
for(j=0;j<255;j++);
for(i=0;i<255;i++)
for(j=0;j<255;j++);
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为工作方式1:8位数据位
TMOD=0X20; //设置计数器工作方式2 高四位和低四位
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的,如果波特率要9600,修改TH1和TL1即可
TL1=0XF3;
}
/*******************************************************************************
* 函数名 :UsartSendByte()
* 函数功能 :串口发送单个字节
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartSendByte(unsigned char byte)
{
SBUF=byte; //缓冲区装载要发送的字节
while(TI==0)//等待发送数据完成,TI标志位会置1
TI=0; //清空发送中断标志位
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
unsigned char i = 0;
UsartInit(); //串口初始化
while(1)
{
UsartSendByte(i);//串口发送单字节数据
Delay();
i++;
if(i>255)
i=0;
}
}
2、串口接收并返回数据
/**************************************************************************************
*
*实现现象:串口接收并返回数据
*
*注意事项:波特率为4800
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void Delay(void)//延时500ms
{
unsigned char i,j;
for(i=0;i<255;i++) //进行循环操作,以达到延时效果
for(j=0;j<255;j++);
for(i=0;i<255;i++)
for(j=0;j<255;j++);
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void UsartInit()
{
SCON=0X50; //设置为工作方式1:8位数据位
TMOD=0X20; //设置计数器工作方式2 高四位和低四位
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的,如果波特率要9600,修改TH1和TL1即可
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
/*******************************************************************************
* 函数名 :UsartSendByte()
* 函数功能 :串口发送单个字节
*******************************************************************************/
void UsartSendByte(unsigned char byte)
{
SBUF=byte; //缓冲区装载要发送的字节
while(TI==0)//等待发送数据完成,TI标志位会置1
TI=0; //清空发送中断标志位
}
/************************************************************
*
*输入:pstr 字符串
*
*功能:串口打印字符串
*
************************************************************/
void PrintfStr(char *pstr)
{
while(pstr && *pstr)
{
UsartSendByte(*pstr++);
}
}
void main()
{
unsigned char i = 0;
UsartInit(); // 串口初始化
while(1);
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
*******************************************************************************/
void Usart() interrupt 4 //串口中断号
{
u8 receiveData;
receiveData=SBUF; //出去接收到的数据 接收中断标志位
RI = 0; //清除接收中断标志位
UsartSendByte(receiveData);//返回接收到的数据
//SBUF=receiveData; //将接收到的数据放入到发送寄存器
//while(!TI); //等待发送数据完成
//TI=0; //清除发送完成标志位 发送中断标志位
}
下一篇:C51/C52的中断(EXTI)
史海拾趣
|
1 引言 LIN 是低成本网络中的汽车通讯协议标准,LIN(Local Interconnect Network)是低成本的汽车网络,它是现有多种汽车网络在功能上的补充由于能够提高质量、降低成本,LIN 将是在汽车中使用汽 ...… 查看全部问答> |
|
开发板想加手机功能,1、硬件要加什么,如射频模块 2、软件要加什么,如所加硬件的驱动,另外在操作系统中是否还需加一个电话模块的软件,实现电话功能. 3、请大侠解答一下,有做过的朋友给说一下,系统运行wince或Linux。 … 查看全部问答> |
|
应届生请教,WINCE嵌入式应用编程发展前景,请大家谈谈个人对现在工作的满意度? 想请教下wince、windows mobile编程方面的工作前景怎样呢》?高薪的可能性? 上次跟一个同学谈过,说这方面可能比较难拿到高薪 不知道大家的情况怎样呢?或者谈谈个人对现在工作的满意度? 下面介绍下我自己的基本情况 我是应届研究生,熟 ...… 查看全部问答> |
|
各位驱动学者前辈,小弟初学驱动开发,请指教一下ifs ddk和vc的配置步骤。我下的是win server 2003 ifs kit,但是装上后不知道从哪些代码,ifs 在这的作用,对了我是在xp上装得server 2003 ifs .是不是因为这不能用。请高手指教!… 查看全部问答> |
|
Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1] 并行I-V测试[2]系统――适用于复杂器件的多个DUT测试或多通道测试的系统。对此类DUT的测试,速度取决于仪器、应用程序以及在施加激励源后DUT达到稳定响应时所 ...… 查看全部问答> |
|
用运放接双色LED, 搭文氏电桥,直观显示电压波动。 具体说明和源代码: 运放接LED的源代码 我每周发两个最好的应用电路和设计技巧,关注我的微信公共账号 \"电路图\" 就可以订阅。或者扫描这个二维码 … 查看全部问答> |
|
【Energia开发环境】MSP430 LAUNCHPAD学习笔记2--Lab2 KEY control LED1 【Energia开发环境】MSP430 LAUNCHPAD学习笔记2--Lab2 KEY control LED1材料:MSP430 LAUNCHPAD x 1LED1(P1.0)KEY(P1.3) 实验目的:让MSP430 LAUNCHPAD的P1.0 Y有按键S2控制亮灭原理图如下: 原理分析:为保持按键在没有按下时,P1.3引脚保持高电 ...… 查看全部问答> |




