51单片机学习入门(三):串口
1.串口是什么?
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。
51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
STC89C52的UART有四种工作模式:
- 模式0:同步移位寄存器;
- 模式1:8位UART,波特率可变(常用);
- 模式2:9位UART,波特率固定;
- 模式3:9位UART,波特率可变;
51单片机有两个通信接口TXD——P3^0;RXD——P3^1;
2.串口模式1的配置
(1)串口模式1是用寄存器SCON配置串口模式1:
SM0 SM1 为1 0 //选择方式2;REN为1;//即REN=1为允许串行接收状态
综上所述:
SCON = 0x50; //8位数据,可变波特率
(2)波特率可变设置寄存器PCON的SMOD=1,
PCON=0X80;//波特率加倍
(3)由图可见,串口的波特率是由定时器T1来产生的,所以我们要先打开定时器T1
打开定时器T1用到TCON寄存器的TR1位:
TCON的低四位用于控制外部的中断。TCON的高4位用于控制定时/计数计时器的启动和申请中断。
TR1=1;//定时器1开始计时
(4)查stc52手册可知定时器要采用方式2(8位自动重装模式)
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
(5)同时我们还要禁止定时器1中断
ET1 = 0;//禁止定时器中断
(6)然后定时器要设置高低八位寄存器TH1/TL1的初值,来控制波特率的速率:可查表
或者直接用STC-ISP软件生成初值 :如下面软件的配置,初值为
TH1=0XFD;TL1=0XFD;//设置定时初始值
综上所述,串口的初始化配置总结如下:
void UartInit(void) //9600bps@11.0592MHz
{PCON |= 0x80; //使能波特率倍速位SMODSCON = 0x50; //8位数据,可变波特率TMOD &= 0x0F; //设置定时器模式TMOD |= 0x20; //设置定时器模式TL1 = 0xFA; //设置定时初始值TH1 = 0xFA; //设置定时重载值ET1 = 0; //禁止定时器%d中断TR1 = 1; //定时器1开始计时
}
也可以直接用stc-dsp软件进行配置,把AUXR的两行代码去掉即可;
3.串口的使用
SBUF寄存器
单片机的内部硬件自带发送和接收数据的功能,它是通过SBUF寄存器实现的。
SBUF地址都为99H,物理结构上,这是俩个完全独立的寄存器,
一个是发送寄存器,另一个是接收寄存器。
a=SBUF,代表单片机从计算机接收到了数据
//串口发送一个字节数据
void UART_SendByte(unsigned char Byte){SBUF=Byte;//检测是否完成while(TI==0);TI=0;//TI复位
}
SBUF=a,代表单片机要给计算机发送a数据
//串口发送一个字节数据
void UART_SendByte(unsigned char Byte){SBUF=Byte;//检测是否完成while(TI==0);TI=0;//TI复位
}
(1)单片机向PC发送数据
IT是发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,
即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则
在停止位开始发送时由内部硬件置位,必须用软件复位。
#include <REGX52.H>
#include "UART.H"
#include "DELAY.H"
void USART_Sendbit(unsigned char Byte)
{SBUF=Byte;//发送的字节先存在SBUF寄存器后发出while(TI==0);TI=0;
}
void main()
{UartInit();//串口初始化函数while(1){USART_Sendbit(0x66);//向电脑发送0x66Delay(1000);//延时1s,使串口发送不会太快}
}
结果如图:
(2)单片机接收PC的数据
RI: 接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1, 向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到 停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复 位,即RI=0.
单片机接收电脑的数据存到SBUF寄存器
接收要重新增加中断的配置:
#include <REGX52.H>
void UART_Init(void) //9600bps@11.0592MHz
{PCON |= 0x80; SCON = 0x50; TMOD &= 0x0F; TMOD |= 0x20; TL1 = 0xFA; TH1 = 0xFA; ET1 = 0; TR1 = 1;EA=1;//开启总中断ES=1;//开启串口中断
}
#include <REGX52.H>
#include "UART.H"
void main()
{UART_Init();while(1){}
}
void UART_Routine(void) interrupt 4
{if(RI==0){USART_Sendbit(SBUF);P2=SBUF;RI=0;}
}
这里的"UART.H"是封装了串口的初始化UART_Init()与串口发送USART_Sendbit(SBUF)函数,模块化编程,可以使代码更加简洁。
51单片机学习入门(三):串口相关推荐
- 51单片机学习--定时器--中断--串口通信
51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...
- 51单片机学习笔记-6串口通信
6 串口通信 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓库 ...
- 51单片机学习笔记(串口通信 LED点阵屏 DS1302)
四.串口通信 1.基本概念 通信中最重要的两个方面: 信息表示和解析方法: 信息的传输方法. 通信双方事先需要约定好信息的表示方法和解析方法,做到一致,否则信息不能有效传递. 信号的传输方法是指经过编 ...
- 【51单片机快速入门指南】4.4.1:python串口接收磁力计数据并进行最小二乘法椭球拟合
目录 硬知识 Python代码 使用方法 串口收集数据 椭球拟合 验证 STC15F2K60S2 16.384MHz Keil uVision V5.29.0.0 PK51 Prof.Develope ...
- 【51单片机快速入门指南】3.3:USART 串口通信
目录 快速使用 硬知识 串行口相关寄存器 串行口控制寄存器SCON和PCON 串行口数据缓冲寄存器SBUF 从机地址控制寄存器SADEN和SADDR 与串行口中断相关的寄存器IE和IPH.IP 串行口 ...
- 单片机学习笔记————51单片机实现主机的串口收发
proteus虚拟串口的实现:https://mp.csdn.net/console/editor/html/107251649 一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 / ...
- 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据
目录 硬知识 特性参数 MPU6050 简介 模块重要寄存器简介 电源管理寄存器 1 陀螺仪配置寄存器 加速度传感器配置寄存器 FIFO 使能寄存器 陀螺仪采样率分频寄存器 配置寄存器 电源管理寄存器 ...
- 51单片机学习笔记-1简介及点灯
51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...
- 小白系列之51单片机的入门速成法
51单片机的入门速成法 01-经典51内核资源全览浓缩图 02-重要外设特殊功能寄存器概览 03-程序开发流程与设计要点 04-三大外设的开发与可重用代码 05-应用程序设计入门一例通 01-经典51 ...
- 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取
目录 硬知识 DS18B20介绍 时序 初始化时序 写时序 读时序 命令 ROM 操作命令 ROM 搜索举例 存贮器操作命令 示例程序 DS18B20.c DS18B20.h 测试程序 定时器中断服务 ...
最新文章
- Object.keys()
- oracle 怎么创建约束,Oracle创建约束
- 恒安嘉新面试题java_面了三个大厂,终于拿到offer,数年Java最经典的面试题总结...
- 1121 if条件语句练习--输入年月日判断执行
- 玩转Keras之Seq2Seq自动生成标题 | 附开源代码
- Struts学习总结之配置文件
- 前端学习(1915)vue之电商管理系统电商系统之通过路由展现权限列表
- ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
- 这枚纸币为什么这么贵?
- (转)Unity 导出XML配置文件,动态加载场景
- html与js简单小游戏,使用js写了一个特别简单的小游戏
- 中国行政区划 地级 js
- 【第14章】恶意代码防范技术原理@信息安全工程师 软考笔记
- android电视不能root权限,智能电视如何刷机获取root权限,当贝市场推荐四种方法!...
- 2017腾讯校招面试回忆 成功拿到offer
- python爬取斗鱼弹幕,Python爬虫日记八:利用API实时爬取斗鱼弹幕
- java 两张图片合成
- a-upload 上传文件到阿里oss
- idear怎么设置自动导包
- java获得程序运行时间_java中获得程序运行时间的方法(转)
热门文章
- linux下STM32开发环境搭建
- MAC Photoshop标题栏不见了
- Color RGB颜色深浅的排序
- 【大数据】大数据-实时统计分析-方案选型
- 8.2 向量数量积与向量积(点乘与叉乘)
- 【漏洞分析】流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析
- 如何显示计算机窗口的状态栏,如何让电脑任务栏不显示打开的程序或窗口方法...
- 各层电子数排布规则_核外电子的排布及其规律,亨利·莫塞莱和查尔斯·巴克拉最先发现电子层...
- Vue最全知识点集合
- GAITC 2020 演讲实录丨戴琼海:人工智能的几点思考