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)