IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机学习一:51单片机串口接发数据 -> 正文阅读

[嵌入式]单片机学习一:51单片机串口接发数据

接下来我以一段代码来详细分解串口的配置:?

***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;



/*******************************************************************************
* 函 数 名         : UsartInit
* 函数功能		   :串口初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void UsartInit()
{
	TMOD|=0X20;//选择为定时器1模式,工作方式2
	TH1=0X3F;//设定定时器1的初值	
	TL1=0X3F;
	PCON=0X80;//设置波特率倍增位
	TR1=1;//打开定时器
	SCON=0x50;//设置scon特殊功能寄存器
	ES=1;//打开串口中断
	EA=1;//打开串口总中断
			
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	void UsartInit();  //定时器1初始化
	while(1);		
}

/*******************************************************************************
* 函 数 名         : void Usart() interrupt 4
* 函数功能		   : 中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Usart() interrupt 4
{
	u8  receiveData;//定义一个变量,用来保存接收的数据(从pc发给单片机的)

	receiveData=SBUF;//接收的数据默认是保存在SBUF里的,这里把sbuf里的数据转移过来
	
	RI=0;//单片机接收完pc发的数据后(或者说接收到停止位的时候),内部硬件会将ri会置1,
	           发生串行口中断,这里要用软件来进行清零(这里本来就是中断程序内部,
	           这里的ri已经本来变成1了,清0是为了下次再使用ri)。
	
	SBUF=receiveData;//这里是把刚刚接收到的数据进行发送,
			把数据重新放进sbuf(发送缓存寄存器)里去。
			(ps:不是所有的程序都是这样的,这段程序的目的就是发一个数据马上接收一个数据,
			用来验证串口通信的效果,实际工作中可能会对数据进行各种计算,
			或者根本就不产生应答)
	
	while(!TI);//判断发送是否完成,如果发送完成,ti被硬件置1,这个while循环结束
		     如果发送仍在继续,ti是0,这个while循环后面为1(真),循环继续,等待发送完成。
	
	TI=0;//程序到达这里,必定是发送完成后,ti已经被变成1,此时就需要软件来清零,
		这样下次才能继续使用。

	
	
}

这个可以简单得看作是一部分初始化串口的代码,

实际上是对各个参数进行配置选择,来设定串口如何使用,

代码上看这些寄存器的一些特定位如果是不同的状态(0或者1),那么该串口就有不同的功能,那么寄存器就会呈现不同的值,通过对几个关键的寄存器赋各种值,那么就可实现配置串口。

?1;确定T1的工作方式(编程TMOD寄存器);

代码:

TMOD|=0X20;//选择为定时器1模式,工作方式2

这里的0x20可以看成是一串二进制代码0010 0000,它的具体配置内容如下:

?1、工作方式寄存器TMOD ? ? ? ?

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

GATE是门控位, GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。 ? ? ?C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。 ? ? M1M0:工作方式设置位。定时/计数器有四种工作方式。

?就这里来说:

tmod寄存器的的第7位gate设置为0,代表只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;

?tmod寄存器的的第6位C/T 设置为0,代表选择为定时模式;

?tmod寄存器的的第5、4位设置为10,代表选择为方式2;即8位自动重装载寄存器。

低四位用于T0,高四位用于T1,这里就是用高4位来设置了t1计时器,t0计时器没有使用,这里全部赋0;

于是把tmod寄存器赋值为0010 0000

?2、计算t1的初值

这里可以用小工具计算出来,然后直接把值赋给它,也可以直接把计算公式代码写出来计算一次值

?这里的代码是:

	TH1=0X3F;	
	TL1=0X3F;

?t1初值就是用来定义波特率的

初值的计算可以看下面的资料:

?

3、设置pcon的值

??tmod寄存器的的第7位smod设置为1,所以这个值为0x80

4、启动t1(计数器1)

tr1=1

?5、设置scon

这里的内容就比较多了,见下

?

?0x50=0101?0000

即:

sm0=0

sm1=1

sm2=0

ren=1

tb8=0

tb8=0

ti=0

ri=0

?6、打开串口中断和总中断

?es=1

ea=1

?

补充:

SBUF是指串行口中的两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,但地址是重叠的。它们都是字节寻址的寄存器,字节地址均为99H。

SBUF,全称:serial data buffer,中文名为串行数据缓冲器。这个重叠的地址靠读/写指令区分:串行发送数据时,CPU向SBUF写入数据,此时99H表示串行口的发送缓冲寄存器;串行接收数据时,CPU从SBUF读出数据,此时99H表示串行口的接收缓冲寄存器。

这个讲得比较好:

STC89C52_51单片机_串口配置_UART串口通信_hello_StarLee的博客-CSDN博客_stc89c51串口通信

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:30:12  更:2021-11-22 12:32:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:53:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码