51单片机(80951系列)引脚功能说明

news2025/1/10 0:12:00

一 AT89C51引脚图

在这里插入图片描述

1.0 中断

1.0.1 中断源

AT89C51一共有5个中断源
(1)在这里插入图片描述:外部中断0,外部中断请求信号由在这里插入图片描述引脚输入,低电平或下降沿有效,中断请求标志位IE0。
(2)在这里插入图片描述:外部中断1,外部中断请求信号由引脚在这里插入图片描述输入,低电平或下降沿有效,中断请求标志位IE1。
(3)T0:定时/计数溢出时发出中断请求信号,中断请求标志位TF0(也就是之前说的溢出标志位)。
(4)T1:定时/计数溢出时发出中断请求信号,中断请求标志位TF1(也就是之前说的溢出标志位)。
(5)串行口中断:发出或接收1字节数据以后发出中断请求信号,中断请求标志位发送时为TI,接收时为RI。

1.0.2 控制中断特殊寄存器

控制中断的特殊功能寄存器包括:
(1)定时/计数控制寄存器TCON,
在这里插入图片描述

(2)串行口控制寄存器SCON
在这里插入图片描述

(3)中断允许寄存器IE
在这里插入图片描述

(4)中断优先级寄存器IP
在这里插入图片描述

1.0.3 中断函数

中断函数的格式:函数返回值类型 函数名(形式参数表) interrupt n using m

编写AT89C51单片机中断程序时,应遵循以下规则:
(1)中断函数没有返回值,因此将中断函数类型定义为void类型。
(2)中断函数不包含任何形式参数,形式参数表为空。
(3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。
(4)如果在中断函数中再调用其他函数,则被调用的函数所使用的寄存器区必须与中断函数使用的寄存器区不同。

n是中断号,对应51单片机从外部中断0到串行口的5个中断向量,n的取值为0~4,编译器从8 × n + 3地址处产生中断向量
中断源对应的中断号,中断向量,和中中断优先级默认顺序如下
在这里插入图片描述
AT89C51单片机在内部RAM中可以使用4个工作寄存器区,每个工作区包括8个工作寄存器(R0~R7)
C51拓展了一个关键字using,using后面的m用来选择AT89C51的4个不同的工作寄存器区。
using是一个选项,如果不选用该选项,中断函数中所用工作寄存器的内容将会保持到堆栈中。
关键字using对函数目标代码的影响如下:在中断函数的入口处将当前工作寄存器区的内容保护到堆栈中,函数返回之前将被保护的寄存器区的内容从堆栈中恢复。使用关键字using在函数中确定一个工作寄存器区时必须十分小心,要保证任何工作寄存器区的切换都只在指定的控制区域中发生,否则将产生不正确的函数结果;

不正确的结果举例:如果一个低优先级中断正在被执行,这个中断使用的工作寄存器区是0,另外一个高优先级中断产生并且工作寄存区也0,这个时候就会产生数据紊乱。

1.0.4 中断优先级

低优先级中断可以被高优先级中断打断:一个低优先级中断正在执行,此时一个高优先级中断产生,那么会先执行高优先级中断,执行完高优先级中断再执行低优先级中断。

同级中断不能相互打断

低优先级中断不能打断高优先级中断

1.0.5 外部中断实验

1.0.5.1 电路图

在这里插入图片描述

1.0.5.2 代码

#include<reg51.h>

sbit P1_0 = P1^0;

int main()
{
	IT1=1;//设置中断触发方式,下降沿触发
	EX1=1; //开启开外部中断1
	EA=1;//开启总中断
	while(1);
}
void int_1() interrupt 2 		   //外部中断函数1,中断号为2,使用工作寄存器区为0
{
	P1_0=!P1_0;	
}
  
 

2.0 定时器/计数器

定时器/计数器位数高8位低8位工作模式定时模式的计数方式计数模式的计数方式
T016位TH0TL0定时和计数对片内机器周期进行计数对片外加在T0(P3.4)引脚上的外部脉冲计数
T116位TH1TL1定时和计数对片内机器周期进行计数对片外加在T1(P3.5)引脚上的外部脉冲计数
注意:T0 和 T1 都属于加 1 计数,每计一个脉冲,计数器加 1。由于单片机时钟频率固定,因此可由计数值得到精确的时间。

2.0.1 控制定时/计数器的特殊功能寄存器(TMOD)

定时/计数方式寄存器TMOD,字节地址89H,不可位寻址(不能单独一位赋值)。详细操作见下表
在这里插入图片描述
在这里插入图片描述

2.0.2 定时/计数控制器(TCON)

定时/计数控制寄存器 TCON,字节地址 88H,可位寻址(可以单独一位赋值)。见下表

						**定时计数控制寄存器**

在这里插入图片描述

2.0.3 定时器和计数器的区别

定时器和计数器实际都是通过计数器来计数,定时器是对周期不变的脉冲计数(一般来自于系统时钟),由计数的个数和脉冲的周期可计算出时间,同时,通过一个给定的预期值(即比较值,对应预期的计数值,也就是预期时间),当计数值达到预期值时产生中断,这样就实现了定时,应用程序通过设置不同的预期值实现不同时长的定时。

计数器是对某一事件进行计数,这个事件每发生一次,计数值加/减1,而这个事件的产.生可能是没有规律的。也就是计数器的用途是对事件的发生次数进行计数,由计数值来反映事件产生的次数。

2.0.4 定时功能使用实例

目的:使用定时器中断功能控制LED亮灭

2.0.4.1 电路图

在这里插入图片描述

2.0.4.2代码编写流程(T0,方式2(自动装载))

提示:
12MHz 时钟频率下,256us 以下的定时,多采用方式 2;
256us~65536us 及以上的定时,多采用方式 1。

目的:产生周期为200us,占空比1:2的方波实现脉宽调制PWM

(1)设置TMOD寄存器规定工作模式:方式2,T0
(2)计算定时器的初值:
方式 2 下初值的计算公式为:

初值 X = 256 - 定时时长/机器周期。

因为51单片机每12个时钟周期为一个机器周期
机器周期的计算公式:机器周期=12*(1/时钟频率)

12MHz 时钟频率下,机器周期为 1us。
初值 X = 256-100/1=156。也可以转换成 16 进制,此时初值 X = 0x9C。
给 T0 赋初值,TH0=156,TL0=156。或者 TH0=0x9C,TL0=0x9C。计数由 TL0 完成,
TL0 计数过程中,TH0 保持 156 不变。当 TL0 从 156 计数到 256 时达到最大值溢出,此时TH0 将初值 156 重新赋给 TL0 开始下轮计数

(3)设置 IE 寄存器允许中断

(4)设置 TCON 寄存器启动或停止定时器 T0

2.0.4.3 代码

#include<reg51.h>

sbit P1_0 = P1^0;


int main()
{
	
TMOD=0x02; //定时器 T0 方式 2 
 TH0=156; //12MHz 时钟频率下,定时器初值
 TL0=156; 
 EA=1; //允许总中断
 ET0=1; //允许 T0 中断
 TR0=1; //启动定时器 T0 
 while(1); //无限循环,等待定时溢出中断信号到来后跳转到中断函数执行
} 
 void T0_INT() interrupt 1 
{ 
 P1_0=!P1_0;//P1.0 取反,然后返回 while(1)等待下一轮定时溢出中断信号
}

2.0.4.5 代码(方式1 手动装载)

只有方式2是自动装载初始值

方式1初始值的计算:初始值=65536-定时时长/机器周期

51单片机每12个时钟表示一个机器周期

#include<reg51.h>

sbit P1_0 = P1^0;


int main()
{
	
TMOD=0x01; //定时器 T0 方式 1 

  
 TH0=0xFF;	 //填充12MHz 时钟频率下,定时器初值
 TL0=0X9C;

 EA=1; //允许总中断
 ET0=1; //允许 T0 中断
 TR0=1; //启动定时器 T0 
 while(1)
 {
 	if(TF0==1)//  判断溢出标志位
	{
	TF0 = 0;//清除溢出标志位,实际上在中断响应后,溢出标志位会自动清0

	TH0=0XFF; //再次填充12MHz 时钟频率下,定时器初值
	TL0=0X9C;
	
	}
 
 }; //无限循环,等待定时溢出中断信号到来后跳转到中断函数执行
} 
 void T0_INT() interrupt 1 
{ 
 P1_0=!P1_0;//P1.0 取反,然后返回 while(1)等待下一轮定时溢出中断信号
}

2.0.4.6 PWM解释

占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比,如一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。

分辨率:也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率),16位的的PWM理论就是1:65535(单斜率)。

频率就是这样的:如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到,如果计数从0计到80之后又从0开始计到80…,那么它的分辨率最小就是1:80了,但是,它也快了,也就是说PWM的输出频率高了。

双斜率 / 单斜率:

假设一个PWM从0计数到80,之后又从0计数到80…这个就是单斜率

假设一个PWM从0计数到80,之后是从80计数到0…这个就是双斜率

可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80) =1:160,就是提高了一倍。

pwm 也就是模拟方式稳定输出,通过调节pwm的占空比(分辨率),和周期调节电压电流大小。

3.0 串行口

3.0.1 串行口简介

全双工异步通信通信数据线。

全双工:就是两个单片机之间串行数据可以同时双向传输

异步通信:就是收发双方使用各自的时钟控制数据收发过程,不需要同步时钟信号

串行口通信:将一个字节的8位数据低位在前,高位在后一位一位地串行接收或发送

RXD(P3.0):数据接收引脚

TXD(P3.1):数据发送引脚来实现

SCON:串行口控制寄存器,字节地址(98H),可位寻址

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

SUBF:串行发送和接送共用的数据缓冲寄存器,字节地址为(99H),物理上独立,收发使用不同的读写指令来区分

波特率:传输速率

串行口可以产生接收和发送中断

串行口具有不同的工作方式

3.0.2 串行口特殊功能寄存器

3.0.2.1 串行口控制寄存器(SCON)

在这里插入图片描述

在这里插入图片描述

3.0.2.2 串行口电源控制寄存器(PCON)

在这里插入图片描述

掉电保持模式(休眠模式):当单片机进入掉电模式时,外部晶振,CPU,定时器,串口全部停止工作,使单片机进入休眠的指令将会称为休眠前单片机执行的最后一条指令,进入休眠后,芯片中程序还位涉及到的数据存储及和特殊功能寄存器中的数据都会保持原值。直到外部中断或者硬件复位模式唤醒单片机。使用中断唤醒,程序会从来原来停止处继续往下执行,使用复位唤醒单片机程序将从头开始执行。
空闲模式:单片机进入空闲模式时,除CPU处于休眠状态外,其余硬件全部处于活动状态,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将报纸原值。但假若定时器正在运行,那么计数器寄存器中的值还会增加,单片机在空闲模式下可由任一个中断或硬件复位唤醒,需要注意的是,使中断唤醒单片机时,程序从原来停止处继续向下执行,使用复位唤醒单片机程序将从头开始执行。进入空闲模式是为了降低功耗。

简单来说:
空闲模式,功耗降低一大半,掉电功耗几乎为0,都可通过中断唤醒。
空闲模式,代码不再执行,只有定时器工作,能通过定时器中断唤醒。
掉电模式,只能通过外部中断唤醒。

3.0.2.3 工作方式与波特率

波特率:串行口每秒发送或接收数据的位数,收发双方必须保持一致否者会产生错误
工作方式由SCON(串口控制寄存器)的SM0和SM1定义;其中工作方式0和工作方式2,波特率是固定的,方式1和方式3,波特率是可变得,由定时器T1得溢出率,即T1每秒溢出的次数来确定。

工作方式0

串行口的工作方式0位同步移位寄存器输入输入方式。此方式并不用于串行数据通信,而是用于外界移位寄存器,用来拓展并行I/O口
方式0以8位数据为1帧,没有起始位和停止位,先接收或发送最低为,其帧格式如下
在这里插入图片描述

工作方式1

串行口的工作方式1为双机串行通信,如下图
在这里插入图片描述

方式1以0为数据为1帧,包含一个起始位(0),8个数据位,1个停止位,先接收或发送最低位,方式1的帧格式如下图
在这里插入图片描述
方式1的波特率可变,一般由定时器T1方式2(8位自动重装初始值)来确定,波特率公式为:

波特率=2SMODX(T1的溢出率)/32

设定时器T1方式2的初始值为X,则有

T1的溢出率=时钟频率/(12X(256-X))

所以初始值=T1 的初值 X = 256-fosc×2SMOD / (12×波特率×32)

fosc:芯片时钟频率

如果时钟频率 fosc=12MHz,T1 的初值计算出来不会是整数,将导致波
特率有一定误差,要得到精确的波特率,时钟频率 fosc 一般选择 11.0592MHz

方式2

串口通信方式2为9位串行通信方式,可用于双机通信也可用于多机通信。
方式2以11位数据为1帧,包含1个起始位(0),8个数据位,1个奇偶校验位(1/0),1个停止位(1),先接收或发送最低位。方式2的帧格式如下图
在这里插入图片描述
方式2的波特率公式为:波特率=2SMODX芯片时钟频率/64
所以工作方式2的波特率只有2种,fosc/32或focs/64

方式3

串口的工作方式3为9位串行通信方式,可用于双机通信也可用于多机通信。
方式3的帧结构与方式2相同。
方式3的波特率可变,设置方法和方式1相同

3.0.3串口通信实验

3.0.3.1 实验设计思路

(1)设置 SCON 寄存器规定工作方式

(2)设置 PCON 寄存器波特率倍增位

(3)设置 TMOD 寄存器规定工作方式

(4)计算定时器 T1 方式 2 下的初值。

(5)设置 TCON 寄存器启动或停止定时器 T1

3.0.3.2 电路图

在这里插入图片描述

3.0.3.3

代码U1_1 接收端

#include <reg51.h> 
void main(void) 
{ 
 SCON=0x50;//串行口通信方式 1,接收允许
 PCON=0x00;//SMOD=0 
 TMOD=0x20;//定时器 T1 方式 2 
 TH1=0xF4; //波特率为 2400bit/s,时钟频率 11.0592MHz 的初值
 TL1=0xF4; 
 TR1=1; //启动 T1 定时
 EA=1; //允许总中断
 ES=1; //允许串行口中断
 while(1); //接收中 RI 为 0,直到接收完毕 RI 硬件置 1 
} 
void UART_INT() interrupt 4 using 1
{ 
 RI=0; //软件清 0,开始下一轮接收
P0=SBUF; //接收到的数据由缓冲器送给 P0
}

U1发送端

#include<reg51.h>

sbit P3_3=P3^3;

void INIT_UART(void)	//串口初始化函数
{
SCON=0X50;//串口通信方式1,接收允许

PCON=0X00;//波特率增倍系数SMOD=0,

TMOD=0x20;//定时器 T1 方式 2
TH1=0XF4;//波特率=2400bit/s,初值=256-(时钟频率/(波特率/1*32)/12)=11.0592*1 000 000 /2400/32/12
TL1=0xF4;
TR1=1; //启动 T1 定时
}

int OFF_ON=0XFF;
int main()
{
	 INIT_UART();//串口初始化
	 EX1=1; //允许串行口中断
	 IT1=1;      //下降沿触发
	 EA=1; //允许总中断
	while(1);
}

void INT_2() interrupt 2 using 0
{
	OFF_ON=~OFF_ON;
	 SBUF=OFF_ON; //将 0x55 送入缓冲器,低位到高位开始发送
	 while(TI==0);//发送中 TI 为 0,直到发送完毕 TI 硬件置 1 
 	 TI=0; ///软件清 0,开始下一轮发送
	 
}


实验现象: 按一下亮,再按一下小灯关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive-hive核心面试范围题目整理(数据倾斜、外部表内部表、分区分桶、行转列等)

1 hive的优缺点 优点 SQL减少MR的开发难度使用于实时性不高的数据分析场合优势处理大数据自定义函数 缺点 Hql表达能力优先&#xff1a;迭代式算法&#xff1f; 处理延迟效率较低&#xff0c;小数据的时候&#xff0c;不如传统数据库 2 对hive的了解 优点本质&#xff1…

pymysql详解——通过Python连接Mysql数据库

pymysql详解——通过Python连接Mysql数据库 pymysql是可用于连接mysql数据库&#xff0c;且能够提供mysql与python窗口交互创立通道的工具库。可以通过创建引擎&#xff0c;建立游标直接通过python编程实现mysql数据库操作。在开发和分析可形成线性脚本。是广泛使用的库。 连…

计算机组成原理——第七章输入输出系统(上)

如若来世再相见&#xff0c;半点朱唇尽我尝 文章目录 7.1.1 输入输出系统和IO控制方式7.1.2 外部设备7.2 IO接口7.3.1 程序查询方式流程图 7.1.1 输入输出系统和IO控制方式 i/O接口是一个电子部件&#xff0c;会被集成与主板中&#xff0c;而I/O设备则是你看得见摸得着的那些设…

O(1) 时间复杂度的抽奖算法 - The Alias Method

0 背景 在营销等场景下&#xff0c;有种常见的玩法&#xff0c;即抽奖&#xff0c;不论前端抽奖界面如何炫酷&#xff0c;底层抽奖组件具有一致性。本文不讨论奖池的抽取规则、奖池奖品配置、奖池切换、抽奖机会、奖品扣减和发放、告警和降级等&#xff0c;主要聚焦于抽奖算法…

Nginx之TCP/UDP反向代理

Nginx从1.9.13起开始发布ngx_stream_core_module模块不仅能支持TCP代理及负载均衡,其实也是支持UDP协议的。 1.Nginx下载 wget http://nginx.org/download/nginx-1.24.0.tar.gz 2.Nginx安装 #yum -y install proc* openssl* pcre* # tar -zxvf nginx-1.24.0.tar.gz #cd n…

【Docker学习三部曲】—— 核心篇

容器数据卷 基本概念 容器数据卷是 Docker 中用于持久化存储容器数据的一种解决方案它允许容器中的数据在容器重新创建或迁移时得以保留&#xff0c;而不会丢失数据卷可以看作是 Docker 主机和容器之间的一个共享目录容器可以将数据写入数据卷&#xff0c;而这些数据将储存在…

【Jpom】docker-compose 部署 RabbitMQ 3.11.X (包含延迟队列插件)

文章目录 前言参考目录前置准备系统版本软件版本 部署步骤1、Jpom 配置节点信息2、Dockerfile 文件3、插件上传4、修改 docker-compose.yml5、构建 Dockerfile&#xff08;可选&#xff09;6、执行 docker-compose 编排7、Jpom 查看 Docker8、登录 RabbitMQ9、直接执行 docker-…

OrCAD原理图检查

OrCAD原理图检查 FPGA或处理器芯片原理图封装检查OrCad元件Part Reference与Reference位号不同检查所有器件是否与CIS库元件匹配用CIS库中的元器件替换已存在器件方法1方法2 DRC检查修改页码Annotate重排位号利用Intersheet References功能进行off-page索引检查封装、厂家、型号…

[数据结构 - C语言] 顺序表

目录 1、线性表 2、顺序表 2.1 顺序表的概念 2.2 接口 3、接口实现 3.1 初始化 3.2 销毁 3.3 容量检测 3.4 打印数据 3.5 顺序表的头插 3.6 顺序表的尾插 3.7 顺序表的头删、尾删 3.8 顺序表查找 3.9 指定位置插入数据 1、线性表 线性表&#xff08;linear list&…

认识HTTPS以及了解HTTPS的加密过程

目录 简单认识HTTPS&#xff1a; 运营商劫持&#xff1a; 加密的理解&#xff1a; HTTPS的工作过程&#xff1a; 对称加密&#xff1a; 非对称加密&#xff1a; 中间人攻击 证书 简单认识HTTPS&#xff1a; HTTPS 也是一个应用层协议。是在 HTTP 协议的基础上引…

逆向-还原代码之(*point)[4]和char *point[4] (Interl 32)

// source code #include <stdio.h> #include <string.h> #include <stdlib.h> /* * char (*point)[4] // 数组指针。 a[3][4] // 先申明二维数组,用它来指向这个二维数组 * char *point[4] // 指针数组。 a[4][5] // 一连串的指针…

客快物流大数据项目(一百一十六):远程调用 Spring Cloud Feign

文章目录 远程调用 Spring Cloud Feign 一、​​​​​​​简介

OpenGL入门之 深入三角形

一、引言 本教程使用GLEW和GLFW库。  通过本教程&#xff0c;你能轻松的、深入的理解OpenGL如何绘制一个三角形。  如果你不了解OpenGL是什么&#xff0c;可以阅读OpenGL深入理解。 二、基本函数和语句介绍 通过阅读以下的函数&#xff0c;你的大脑里能留下关于OpenGL基本函…

【每日一题Day184】LC1187使数组严格递增 | dp

使数组严格递增【LC1187】 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 <…

前端学习:HTML块、类、Id

目录 快 一、块元素、内联元素 二、HTML 元素 三、HTML元素 类 一、分类块级元素 二、分类行内元素 Id 一、使用 id 属性 二、 class与ID的差异 三、总结 快 一、块元素、内联元素 大多数HTML元素被定义为块级元素或内联元素。 块级元素在浏览器显示时&#xff0c;通常会…

Docker常用命令详解,有这些足够了

首先启动类 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机自启动&#xff1a;systemctl enable docker 查看docker概要…

【CocosCreator入门】CocosCreator组件 | Widget(对齐)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的Widget组件用于UI布局和调整&#xff0c;可以通过调整Widget组件来实现UI元素的自适应和排版。 目录 一、组件介绍 二、组件属性 三、组件使用 四、脚本示例 一、组件介绍 在Coc…

Python中的统计学(二)

大数定律和中心极限定律都是概率论中重要的定理。它们之间的不同在于它们所涉及的随机变量和极限的不同。 大数定律是指随着样本容量的增大&#xff0c;样本均值越来越接近于总体均值的定律。即样本均值的极限等于总体均值&#xff0c;也就是说&#xff0c;当样本量足够大时&a…

绝了!!PDF转换没想到这么简单

PDF处理是很多小伙伴的“痛”&#xff0c;在工作学习中&#xff0c;PDF转换、PDF编辑、PDF和图片的各种问题都是需要快速解决的&#xff0c;但市面上不少付费的软件让我们很是肉痛&#xff01; 今天给大家推荐5个免费的神仙PDF转换网站&#xff0c;解决你的所以PDF问题~ 记得…

Simulink 自动代码生成电机控制:硬件开发板系统介绍

目录 前言 电源电路 MCU电路 开发板接口 关于电流采样和过流保护 驱动部分 总结 前言 在介绍开发板之前突然有感而发想多说两句&#xff0c;本人从事电控行业也是有一些年头了&#xff0c;除了刚刚毕业就接触的电机控制外&#xff0c;就是电源控制相关的&#xff0c;像三相P…