单片机
返回首页

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;    //清除发送完成标志位   发送中断标志位

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章