历史上的今天
返回首页

历史上的今天

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

}


推荐阅读

史海拾趣

千志电子(CCO)公司的发展小趣事

千志电子于1986年由董事长陈初志先生在台湾创立,起初专注于生产各类型插件式电阻。随着业务的不断发展,公司意识到拓展更广阔市场的重要性。1996年,千志电子进军中国市场,在深圳设立了千志电子(深圳)有限公司,这一举措标志着公司开始走向国际化。深圳作为中国改革开放的前沿阵地,为千志电子提供了丰富的资源和广阔的市场空间,为其后续的发展奠定了坚实基础。

GTE Microcircuits公司的发展小趣事
学习高性能复合放大器电路的设计需要掌握模拟电路的基础知识,包括放大器的工作原理、电路分析方法、以及元器件的选择和使用等。此外,还需要通过阅读专业书籍、参加培训课程、以及实践项目等方式来不断积累经验和提高技能。
GainSpan ( Telit)公司的发展小趣事

进入21世纪后,风华高科加快了国际化进程。公司积极与国际知名企业开展合作,引进先进技术和设备,提升产品竞争力。同时,公司还不断拓展海外市场,产品远销北美、东南亚等地区。这些举措不仅提升了公司的国际知名度,也为公司带来了更多的业务机会和增长空间。

Blue Sky Research公司的发展小趣事

Blue Sky Research自成立之初,便以技术创新为核心竞争力。公司不断投入研发,成功开发出一系列高性能的激光二极管模块和光纤耦合激光组件。这些产品凭借其卓越的性能和稳定性,迅速在电子行业中占据了一席之地。随着技术的不断迭代和升级,Blue Sky Research逐渐在激光技术领域树立了行业标杆,成为众多企业争相合作的对象。

CBM_America_Corporation公司的发展小趣事

在面临激烈的市场竞争时,CBM_America_Corporation选择与一家国际知名的电子制造商建立战略合作关系。通过共享技术资源和市场渠道,两家公司共同开发了一款具有竞争力的智能设备。这一合作不仅提升了CBM的品牌影响力,还为其带来了稳定的订单和利润增长。随着合作的深入,CBM逐渐在电子行业中占据了重要的地位。

Coors Components Inc公司的发展小趣事

除了关注经济效益外,Coors Components Inc公司还积极履行社会责任。公司积极参与公益事业,为社会做出贡献;同时,公司也注重环保和可持续发展,努力降低生产过程中的环境污染。这些举措不仅提升了公司的品牌形象,还赢得了社会各界的广泛赞誉。

以上是关于电子行业公司发展的通用框架,你可以根据这些框架来进一步了解“Coors Components Inc”公司的具体发展故事。请注意,在编写故事时,应确保所描述的事实准确无误,避免夸大或缩小事实。

问答坊 | AI 解惑

用SPMC75F2313A实现LIN结点

1 引言    LIN 是低成本网络中的汽车通讯协议标准,LIN(Local Interconnect Network)是低成本的汽车网络,它是现有多种汽车网络在功能上的补充由于能够提高质量、降低成本,LIN 将是在汽车中使用汽 ...…

查看全部问答>

在Keil里出现Syntax error

在Keil里出现Syntax  error怎样解决…

查看全部问答>

新手学习 嵌入式开发 疑惑很多!

我在校大二学生,C语言基础很好。 今天拿了本“嵌入式开发与应用”的书看,怎么就感觉这么多东西都是陌生的勒? 而且根本提不起兴趣!请高手指点学习方法…

查看全部问答>

开发板如何加手机功能

开发板想加手机功能,1、硬件要加什么,如射频模块  2、软件要加什么,如所加硬件的驱动,另外在操作系统中是否还需加一个电话模块的软件,实现电话功能. 3、请大侠解答一下,有做过的朋友给说一下,系统运行wince或Linux。  …

查看全部问答>

应届生请教,WINCE嵌入式应用编程发展前景,请大家谈谈个人对现在工作的满意度?

想请教下wince、windows mobile编程方面的工作前景怎样呢》?高薪的可能性? 上次跟一个同学谈过,说这方面可能比较难拿到高薪 不知道大家的情况怎样呢?或者谈谈个人对现在工作的满意度? 下面介绍下我自己的基本情况 我是应届研究生,熟 ...…

查看全部问答>

初学者求问文件过滤驱动问题?

各位驱动学者前辈,小弟初学驱动开发,请指教一下ifs ddk和vc的配置步骤。我下的是win server 2003 ifs kit,但是装上后不知道从哪些代码,ifs 在这的作用,对了我是在xp上装得server 2003 ifs .是不是因为这不能用。请高手指教!…

查看全部问答>

mc1496

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 这三个电解电容怎么连接,求高手指导  …

查看全部问答>

2602新型测试仪器的多个测试系统类型?

Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1]   并行I-V测试[2]系统――适用于复杂器件的多个DUT测试或多通道测试的系统。对此类DUT的测试,速度取决于仪器、应用程序以及在施加激励源后DUT达到稳定响应时所 ...…

查看全部问答>

用运放接双色LED显示电压波动

用运放接双色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引脚保持高电 ...…

查看全部问答>