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单片机学习入门(三):串口相关推荐

  1. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  2. 51单片机学习笔记-6串口通信

    6 串口通信 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓库 ...

  3. 51单片机学习笔记(串口通信 LED点阵屏 DS1302)

    四.串口通信 1.基本概念 通信中最重要的两个方面: 信息表示和解析方法: 信息的传输方法. 通信双方事先需要约定好信息的表示方法和解析方法,做到一致,否则信息不能有效传递. 信号的传输方法是指经过编 ...

  4. 【51单片机快速入门指南】4.4.1:python串口接收磁力计数据并进行最小二乘法椭球拟合

    目录 硬知识 Python代码 使用方法 串口收集数据 椭球拟合 验证 STC15F2K60S2 16.384MHz Keil uVision V5.29.0.0 PK51 Prof.Develope ...

  5. 【51单片机快速入门指南】3.3:USART 串口通信

    目录 快速使用 硬知识 串行口相关寄存器 串行口控制寄存器SCON和PCON 串行口数据缓冲寄存器SBUF 从机地址控制寄存器SADEN和SADDR 与串行口中断相关的寄存器IE和IPH.IP 串行口 ...

  6. 单片机学习笔记————51单片机实现主机的串口收发

    proteus虚拟串口的实现:https://mp.csdn.net/console/editor/html/107251649 一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 / ...

  7. 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据

    目录 硬知识 特性参数 MPU6050 简介 模块重要寄存器简介 电源管理寄存器 1 陀螺仪配置寄存器 加速度传感器配置寄存器 FIFO 使能寄存器 陀螺仪采样率分频寄存器 配置寄存器 电源管理寄存器 ...

  8. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

  9. 小白系列之51单片机的入门速成法

    51单片机的入门速成法 01-经典51内核资源全览浓缩图 02-重要外设特殊功能寄存器概览 03-程序开发流程与设计要点 04-三大外设的开发与可重用代码 05-应用程序设计入门一例通 01-经典51 ...

  10. 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

    目录 硬知识 DS18B20介绍 时序 初始化时序 写时序 读时序 命令 ROM 操作命令 ROM 搜索举例 存贮器操作命令 示例程序 DS18B20.c DS18B20.h 测试程序 定时器中断服务 ...

最新文章

  1. Object.keys()
  2. oracle 怎么创建约束,Oracle创建约束
  3. 恒安嘉新面试题java_面了三个大厂,终于拿到offer,数年Java最经典的面试题总结...
  4. 1121 if条件语句练习--输入年月日判断执行
  5. 玩转Keras之Seq2Seq自动生成标题 | 附开源代码
  6. Struts学习总结之配置文件
  7. 前端学习(1915)vue之电商管理系统电商系统之通过路由展现权限列表
  8. ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
  9. 这枚纸币为什么这么贵?
  10. (转)Unity 导出XML配置文件,动态加载场景
  11. html与js简单小游戏,使用js写了一个特别简单的小游戏
  12. 中国行政区划 地级 js
  13. 【第14章】恶意代码防范技术原理@信息安全工程师 软考笔记
  14. android电视不能root权限,智能电视如何刷机获取root权限,当贝市场推荐四种方法!...
  15. 2017腾讯校招面试回忆 成功拿到offer
  16. python爬取斗鱼弹幕,Python爬虫日记八:利用API实时爬取斗鱼弹幕
  17. java 两张图片合成
  18. a-upload 上传文件到阿里oss
  19. idear怎么设置自动导包
  20. java获得程序运行时间_java中获得程序运行时间的方法(转)

热门文章

  1. linux下STM32开发环境搭建
  2. MAC Photoshop标题栏不见了
  3. Color RGB颜色深浅的排序
  4. 【大数据】大数据-实时统计分析-方案选型
  5. 8.2 向量数量积与向量积(点乘与叉乘)
  6. 【漏洞分析】流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析
  7. 如何显示计算机窗口的状态栏,如何让电脑任务栏不显示打开的程序或窗口方法...
  8. 各层电子数排布规则_核外电子的排布及其规律,亨利·莫塞莱和查尔斯·巴克拉最先发现电子层...
  9. Vue最全知识点集合
  10. GAITC 2020 演讲实录丨戴琼海:人工智能的几点思考