目录

1. 串口相关寄存器

1.1 串行控制寄存器SCON

1.2 电源控制寄存器PCON

1.3 与串行口中断相关的寄存器E和IPH、IP

2.源码

2.1 main.c

2.2 UART.c

2.3  UART.h


1. 串口相关寄存器

详细用法:https://blog.csdn.net/YLG_lin/article/details/126625147

STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。

1.1 串行控制寄存器SCON

串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能.其格式如下:SCON:串行控制寄存器(可位寻址)


其中SM0、SM1按下列组合确定串行口的工作方式:(本文主要用到方式1)

REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动
串行接收器RxD,开始接收信息。软件复位REN,即REN=O,则禁止接收。
TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,
即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。

RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,
向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=O。
SCON的所有位可通过整机复位信号复位为全“O”。SCON的字节地址尾98H,可位寻址,各位地址为98H~~9FH,可用软件实现位设置。当用指令改变SCON的有关内容时,其改变的状态将在下一条指令的第一个机器周期的S1P1状态发生作用。如果一次串行发送已经开始,则输出TB8将是原先的值,不是新改变的值。
串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。
电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。

 1.2 电源控制寄存器PCON

PCON:电源控制寄存器(不可位寻址)

SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波
特率加倍;SMOD=0,则各工作方式的波特率加倍。复位时SMOD=0。
SMOD0:帧错误检测有效控制位。当SMODO=1,SCON寄存器中的SMO/FE位用于FE(帧错误
检测)功能;当SMODO=0,SCON寄存器中的SMO/FE位用于SMO功能,和SM1一起指定串行口的工作方式;复位时SMODO=0

1.3 与串行口中断相关的寄存器E和IPH、IP

EA:CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断甲请。
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。
ES:串行口中断允许位,ES=1,允许串行口中断,ES=0,禁止串行口中断。

2.源码

2.1 main.c

#include <REGX52.H>
#include "UART.h"void main()
{UART_Init();       //串口初始化while(1){}
}void UART_Routine() interrupt 4
{if(RI==1)                    //如果接收标志位为1,接收到了数据{P2=~SBUF;                //读取数据,取反后输出到LEDUART_SendByte(SBUF); //将受到的数据发回串口RI=0;                  //接收标志位清0}
}

2.2 UART.c

#include <REGX52.H>//串口初始化,4800bps;12.000MHz
void UART_Init()
{SCON=0x50;   //方式1;PCON |= 0x80;  //波特率加倍TMOD &= 0x0F;       //设置定时器模式TMOD |= 0x20;     //设置定时器模式TL1 = 0xF3;       //设定定时初值TH1 = 0xF3;        //设定定时器重装值ET1 = 0;     //禁止定时器1中断TR1 = 1;     //启动定时器1EA=1;ES=1;
}void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}

2.3  UART.h

#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);
#endif

51单片机——电脑通过串口控制LED相关推荐

  1. 51单片机电脑通过串口控制LED灯

    Hex模式:底层传输的实际数据 文本模式:把数据进行编码,显示ASCII码char字符,带括号的是控制字符,无法显示出来 代码 UART.c #include <REGX52.H>/** ...

  2. 单片机:电脑通过串口控制LED灯

    题目概述: 电脑通过串口控制LED灯. 编程: #include<REG52.h> void delay(unsigned int xms) { unsigned int i,j; for ...

  3. 51单片机红外通信及控制LED灯(LCD1602显示)

    51单片机红外通信及控制LED灯(LCD1602显示) 大家好,又和大家见面了,离上一次DS18B20传感器的文章已经过去了一个星期了,这期我将给大家带来,基于STC89C52芯片和HS0038红外接 ...

  4. 51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)

    文章目录 前言 一.串行通信口的功能以及串行通信口的结构及原理 1.1 串行通信口的功能 1.2 51单片机串口的结构 二.串行通信口的控制寄存器 2.1 串行控制寄存器SCON 2.2 电源控制寄存 ...

  5. 51单片机实现独立按键控制LED灯

    本节博客主要实现以下效果: 3-1独立按键控制LED亮灭 本段代码主要使用了if...else...语句实现按下按下灯亮,松开按键时灯灭 #include <REGX51.H>void m ...

  6. 51单片机流水灯:控制LED亮暗顺序

    我这个是笨方法,就是根据需要LED位置,将二进制转化为16进制去控制其亮. 比如让LED灯按照从右往左数1,3,5,7,8,6,4,2的顺序依次亮,就根据二进制转16进制的表 表示出来即可,代码如下: ...

  7. 用C51汇编语言控制1234灯亮,51单片机:用汇编语言控制LED灯发光

    硬件电路: P1.0 ~ P1.5 外接 6 个 LED,分别称为 D1 ~ D6,低电平发光. P0.0 ~ P0.3 外接 4 个 按键,分别称为 K1 ~ K4. P3.2 ~ P3.3 外接  ...

  8. 【51单片机】独立按键控制LED灯(四种形式)

  9. STM32F103C8T6串口控制LED闪烁

    任务:开启时单片机回复已打开:关闭时在电脑显示已关闭:发 送 1 打开:发送 2 关闭. 本次学习是基于STM32的通用定时器结合串口,进行对LED灯闪烁的控制,使得延时函数时带来的误差性,以及消耗大 ...

最新文章

  1. 机器学习(MACHINE LEARNING)从零搭建一个汽车状态分类器(Tensorflow)
  2. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题
  3. python idle编辑的代码文件拓展名是_Python IDLE编辑器打开后缀名为.py的文件
  4. 【收藏】Geomesa(三)图层的裁剪分析
  5. OnClientClick和OnClick同时使用!
  6. JDBC+Servlet+JSP整合开发之25.JSP动作元素
  7. 机器学习数据挖掘笔记_15(关于凸优化的一些简单概念)
  8. c语言迪思卡尔算法,【论文】数字化的意匠_数字化设计与造型的认知学反思_谭峥.pdf...
  9. Nim游戏的一个扩展——51nod 1661 黑板上的游戏+LA 5059 Playing With Stones
  10. kerberos 下运行spark 报错 Requested user hdfs is banned
  11. 键盘与鼠标器是微型计算机上最常用的,2016年职称计算机考试WindowsXP考前预测试题5...
  12. 卷积核权值初始化_Pytorch卷积层手动初始化权值的实例
  13. Sql为什么连接不上服务器上的数据库
  14. Qemu 简述 | 转
  15. javascript HTMLAudioElement
  16. mysql math.max_Math.max.apply()用法
  17. 127.自己开发一个 PHP 框架
  18. Fenzo:来自Netflix基于Java语言的Mesos调度器
  19. spring 依赖注入_这几个关于Spring 依赖注入的问题你清楚吗?
  20. windows和linux环境下java调用C++代码-JNI技术

热门文章

  1. Xcode的几个编译设置
  2. FORESEE G500发布,江波龙国产固态硬盘再发声
  3. 如何成为技术领袖(转载)
  4. IntelliJ IDEA官网打不开的问题
  5. Oracle 19c OCP的1Z0-082-CHN、1Z0-083-CHN和1Z0-082、1Z0-083有什么不同
  6. 外贸特殊付款方式的风险分析及控制
  7. 综述:重复经颅磁刺激rTMS对静息态功能连接的影响
  8. Mac OS 如何让窗口显示在最前边,(用于录制屏幕提醒,以及屏幕分享,应用分享的UI窗口解决)
  9. DeAuth 无线信道MDK3攻击辅助工具
  10. Ureport2分栏功能