C51/C52的串口原理及参考代码

发布者:sheng44最新更新时间:2019-01-15 来源: eefocus关键字:C51  C52  串口原理 手机看文章 扫描二维码
随时随地手机看文章

一、什么是串口(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  串口原理 引用地址:C51/C52的串口原理及参考代码

上一篇:C51/C52的定时器计数器与中断
下一篇:C51/C52的中断(EXTI)

推荐阅读最新更新时间:2024-03-16 16:22

C51IO口模拟I2C总线驱动AT24C16 (EEPROM部分)
/* 名称:C51IO口模拟I2C总线驱动AT24C16 说明:关于EEPROM,即这里的AT24C16是一个特殊形式的FLASH存储器,不过其容量一般较少。比较适合于存储少量的数据。 AT24C16的通信接口是标准的I2C通信,即我们需要根据I2C通信协议来操纵EEPROM设备。 关于AT24C16的的各种操作,这里就不细讲了,简单介绍一下。 (1)、主机向AT24C16写一个字节:首先需要发送设备地址,然后发送需要访问的存储器地址。然后在发送要写入的数据。这里省略了开始、结束和确认等信号的产生。 (2)、指定页写入n个字节:和(1)的基本操作很类似。不同的是可以连续写入n个数据。这里要小注意一点的就是,写入的数
[单片机]
STM32串口通信基本原理
介绍串口通信 按照数据传送方向分类 单工 :数据传输只支持数据在一个方向上传输 半双工 :允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口 全双工 :允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端 分别如下图中的a、b、c所示。 按照通信方式分类 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线 在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进
[单片机]
C51单片机的压缩BCD码相加程序
设被加数 NA 及加数 NB 均为三字节压缩BCD码,分别存放于内部 RAM 的 20H~22H 及 30H~32H 单元中,低位在前,高位在后。 要求计算两数之和,并将和存放到内部 RAM 中 3FH~42H 单元,仍然是低位在前,高位在后。 编写完整的汇编语言源程序。 ;---------------------------------------------------------------------- 最佳答案: ;这个程序当然是楼主要求的C51单片机程序。 ;下面增加一些调试时使用的数据。 ORG 0000H MOV 20H, #12H ;假设被加数NA是563412 MOV 21H, #34H
[单片机]
C51的基础 11《 枚 举(enum) 》
枚 举(enum) 枚举是一个被命名的整型常数的集合, 枚举在日常生活中很常见。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 就是一个枚举。 枚举的说明与结构和联合相似, 其形式为: enum 枚举名{ 标识符 , 标识符 , ... 标识符 , } 枚举变量; 如果枚举没有初始化, 即省掉 =整型常数 时, 则从第一个标识符开始, 顺次赋给标识符0, 1, 2,...。但当枚举中的某个成员
[单片机]
51单片机c语言定义寄存器r,c51特殊功能寄存器定义及作用
单片机C51语言是由C语言继承而来的。和C语言不同的是,C51语言运行于单片机平台,而C语言则运行于普通的桌面平台。C51语言具有C语言结构清晰的优点,便于学习,同时具有汇编语言的硬件操作能力。对于具有C语言编程基础的读者,能够轻松地掌握单片机C51语言的程序设计。 c51主要特点 单片机C51语言兼备高级语言与低级语言的优点。 语法结构和标准C语言基本一致,语言简洁,便于学习。 单片机C51实验板 运行于单片机平台,支持的微处理器种类繁多,可移植性好。对于兼容的8051系列单片机,只要将一个硬件型号下的程序稍加修改,甚至不加改变,就可移植到另一个不同型号的单片机中运行。 具有高级语言的特点,尽量减少底层硬件寄存器的操
[单片机]
51单片机c语言定义寄存器r,<font color='red'>c51</font>特殊功能寄存器定义及作用
STC单片机做的电子表C51程序
电路很简单我就不画了,是stc系列的单片机做的,显示部分就是2个74hc573芯片连到P1口,然后用p3.0控制段选,按键的定义程序里有说明。很容易就能搭出来,下图是效果图,自己用万用板焊的,技术不行。到处都是飞线呵呵,请大家多多指教 程序的c51语言完整版本的下载地址: http://www.51hei.com/f/biaoc4.rar #include stc90.h #define uchar unsigned char #define uint unsigned int uchar d0,ss,gs,sf,gf,sm,gm; uchar e1,e2,e3,e4,e5,e6; uchar s1,q1; uchar
[单片机]
STC单片机做的电子表<font color='red'>C51</font>程序
keil C51中的本征函数库及使用说明
本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而不用ACALL和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率. 函数原型 extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long,
[单片机]
C51单片机指针变量的定义及应用
一。 指针变量的定义 指针变量定义与一般变量的定义类似,其形式如下: 数据类型 [存储器类型1] * [存储器类型2] 标识符; [存储器类型1] 表示被定义为基于存储器的指针。无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下: 存储类型IIdata/data/bdataxdatapdataCode编码值0x000x010xFE0xFF [存储类型2]用于指定指针本身的存储器空间。 1、 char * c_ptr; int *
[单片机]
<font color='red'>C51</font>单片机指针变量的定义及应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved