单片机原理及技术(三)—— AT89S51单片机(二)(C51编程)

一、AT89S51单片机的并行I/O端口

1.1 P0口

AT89S51的P0口是一个通用的I/O口,可以用于输入和输出。每个引脚都可以通过软件控制为输入或输出模式。

1.1.1 P0口的工作原理

P0口的工作原理是通过对P0寄存器的读写操作来控制P0口的引脚。

  1. 输出模式:当P0口配置为输出模式时,可以通过对P0寄存器进行写操作来控制引脚的电平状态。写入“0”将相应引脚置为低电平(0V),写入“1”将相应引脚置为高电平(Vcc,即供电电压),实现对外部设备的控制。

  2. 输入模式:当P0口配置为输入模式时,可以通过对P0寄存器进行读操作来获取外部设备输入的电平状态。读取P0寄存器的值,可以得知相应引脚的电平,如果读取值为“0”,表示引脚为低电平,如果读取值为“1”,表示引脚为高电平。

1.2 P1口

AT89S51的P1口是一个具有8个引脚的I/O口,可以用于输入和输出操作,可以配置为输入或输出模式,可以使用上拉电阻和推挽电路配置。

1.2.1 P1口的工作原理

P1口也是一种数字输入/输出(I/O)端口,其工作原理与P0口类似,但具有一些特定的功能和特性。

P1口通常可用于各种用途,如外部中断,定时器/计数器的输入/输出。以下是P1口的一般工作原理:

  1. 输入模式:在输入模式下,P1口可以接收外部电路传输的电平信号。当外部电路输出低电平(0V)时,P1口会读取到一个逻辑低电平(0);当外部电路输出高电平(3.3V或5V)时,P1口会读取到一个逻辑高电平(1)。这样,通过读取P1口的电平状态,可以判断外部设备的状态或传送外部设备的数据。

  2. 输出模式:在输出模式下,P1口可以向外部电路发送电平信号。通过将P1口设置为输出模式,并向其写入逻辑低电平(0)或逻辑高电平(1),可以控制外部电路的工作状态或发送数据。

1.3 P2口

AT89S51的P2口是一个8位的双向I/O口,可以用于输入和输出。P2口的特殊功能是通过该端口的位定义来选择。默认情况下,P2口的所有引脚都是作为GPIO引脚使用。

1.3.1 P2口的工作原理

P2口的默认状态是输入模式。要将P2某一位设置为输出模式,只需将相应的P2寄存器位设置为1即可。

  1. 当P2口设置为输出模式时,可以通过对P2寄存器位的设置来控制相应的引脚输出高电平(1)或低电平(0)。
  2. 当P2口设置为输入模式时,可以通过对P2寄存器位的读取来获取相应引脚的输入状态。例如,读取P2寄存器的P2.0位,可以获取P2.0引脚的输入状态(高电平或低电平)。

注意:

  • 在将P2口的某一位设置为输出模式时,要确保相应引脚上的外部设备可以接受输出信号,并且要注意电流和电压等规格的限制。

1.4 P3口

P3口的引脚分别为P3.0~P3.7,可以通过程序配置为输入或输出。对于输出模式,可以通过设置对应的P3寄存器来输出高电平或低电平电压。对于输入模式,可以通过读取P3寄存器的状态来获取引脚的电平状态。

注意:

  • P3口同时也作为一些特殊功能的引脚,如外部中断、定时器/计数器输入等。
1.4.1 P3口的工作原理

P3口是AT89S51单片机的一个8位双向口。它可以通过配置为输入或输出模式来进行相应的操作。

  1. 在输出模式下,可以通过设置P3口的相应位来输出高电平或低电平电压。对于P3.0至P3.7,可以使用软件指令来设置或清除相应的位。设置位将引脚拉高为高电平,而清除位将引脚拉低为低电平。
  2. 在输入模式下,P3口可以用来读取外部设备或传感器的状态。通过读取P3口的相应位,程序可以获取到对应引脚的电平状态(高电平或低电平)。
  3. 除了一般的输入/输出功能,P3口还有一些特殊功能。其中,P3.2和P3.3可以用作外部中断引脚,用于接收外部中断信号。P3.4和P3.5可以作为定时器/计数器的输入引脚。这些功能需要在使用之前进行相应的配置,以使P3口能够正确地工作。

二、时钟电路与时序

下面是AT89S51的时钟电路和时序相关的特点:

时钟电路: AT89S51的时钟电路由晶体振荡器和相关外部元件组成。它支持使用外部晶体振荡器或外部时钟源作为时钟信号。晶体振荡器接口可以接入一个8MHz的陶瓷晶体,或外部时钟信号。

时序特点: AT89S51的时序特点包括以下几个方面:

  1. 时钟频率:AT89S51的工作时钟频率为最高为33MHz。时钟频率由供电电压和晶体振荡器的频率决定。
  2. 存取时间:AT89S51的存取时间(即指令执行时间)为1个机器周期。机器周期是时钟周期与机器指令执行时间之和。以8MHz的晶振为例,机器周期时间为1/8MHz=125ns。
  3. 中断响应时间:AT89S51的中断响应时间为2机器周期。即在发生中断请求后,芯片最多需要2个机器周期才能进入中断服务程序。
  4. 复位时间:AT89S51的复位时间为2机器周期。即在复位引脚(RST)变为高电平后,芯片最多需要2个机器周期才能执行正常的程序。

2.1 时钟电路设计

2.1.1 内部时钟方式

AT89S51单片机的内部时钟方式包括两种:晶振模式和RC振荡模式。

  1. 晶振模式:在晶振模式下,单片机使用外部晶体振荡器作为主时钟源。晶体振荡器通过外部晶体与XTAL1和XTAL2引脚连接,提供稳定的时钟信号。晶振模式具有更高的精度和稳定性,适用于对时钟要求较高的应用。

  2. RC振荡模式:在RC振荡模式下,单片机使用内部RC振荡电路作为主时钟源。RC振荡电路包括一个电容和一个电阻,通过内部电阻和电容的组合来产生时钟信号。RC振荡模式成本低廉,但时钟信号精度和稳定性较差,适用于对时钟要求不那么严格的应用。

2.1.2 外部时钟方式

AT89S51单片机支持两种外部时钟方式:晶体振荡器模式和外部时钟源模式。

  1. 晶体振荡器模式: 在晶体振荡器模式下,需要使用一个晶体振荡器将外部时钟信号输入到单片机的XTAL1和XTAL2引脚。晶体的频率可以根据实际需求选择,常见的频率为11.0592MHz或12MHz。单片机通过内部的时钟电路将晶体振荡器输出的时钟信号分频,生成系统时钟,供CPU和其他模块使用。

  2. 外部时钟源模式: 在外部时钟源模式下,可以直接将外部时钟源信号输入到单片机的XTAL1引脚,而XTAL2引脚保持悬空或接地。外部时钟源的频率可以根据实际需求选择,一般情况下,输入频率应小于单片机支持的最大外部时钟频率。

在程序中,需要通过设置单片机的相关寄存器来选择使用哪种外部时钟方式。对于晶体振荡器模式,可以通过设置相应的位来选择晶体振荡器的频率;对于外部时钟源模式,需要设置相应的位来使能外部时钟源,并设置外部时钟的频率。

以下是一个使用晶体振荡器模式的示例程序:

#include <REG51.h>void main()
{// 设置晶体振荡器的频率为11.0592MHzOSCXCN = 0x67;    // 配置晶体振荡器模式和频率while (!(OSCXCN & 0x80));    // 等待晶体振荡器稳定// 设置系统时钟为晶体振荡器模式AUXR &= 0xF7;    // 清除定时器2的时钟源选项位// 其他代码...while (1){// 主循环}
}

2.1.3 时钟信号的输出

AT89S51单片机的时钟信号输出主要有两个方式:XTAL2引脚输出和P3.4引脚输出。

  1. XTAL2引脚输出: 在晶体振荡器模式下,XTAL2引脚可以用作时钟信号的输出。单片机内部的时钟电路通过分频晶体振荡器的时钟信号生成系统时钟,系统时钟经过处理后就会驱动XTAL2引脚输出相应的时钟信号。XTAL2引脚的输出频率通常是输入时钟频率的一半。

  2. P3.4引脚输出: P3.4是AT89S51单片机的一个通用I/O口,可以通过编程将其配置为时钟信号的输出。需要设置P3.4为输出模式,并将相应的寄存器设置为输出高电平或低电平,来控制P3.4引脚输出时钟信号。需要注意的是,P3.4引脚是具有上拉电阻的,因此在将其配置为输出低电平时,需要将其外接到地,以确保输出为低电平。

以下是使用P3.4引脚作为时钟信号输出的示例程序:

#include <REG51.h>void main()
{// 将P3.4引脚配置为输出模式P3 &= 0xEF;    // 将P3.4引脚置为0,即输出低电平P3 |= 0x10;    // 将P3.4引脚置为1,即输出高电平// 其他代码...while (1){// 主循环}
}

2.2 机器周期、指令周期与指令时序

AT89S51单片机的机器周期、指令周期和指令时序如下:

  1. 机器周期: AT89S51单片机使用外部时钟源进行时钟信号的驱动。机器周期取决于所选择的外部时钟源频率(晶振频率)。一般情况下,AT89S51的机器周期为12个时钟周期。例如,如果使用12MHz的晶振,那么每个机器周期的时钟周期就是1微秒(1/12MHz)。

  2. 指令周期: AT89S51的指令周期通常为12个机器周期。因此,在使用12MHz晶振的情况下,每个指令周期的时钟周期为12微秒。每条指令按照这个指令周期来执行。

  3. 指令时序: AT89S51的指令时序是由内部控制单元生成的。它定义了每个指令在执行时的各个阶段,并且需要按照时钟信号进行同步。在每个指令周期内,有不同的阶段,如取指令、译码、执行、存储结果等。每个阶段需要满足一定的时间要求,以确保指令的正确执行。

三、复位操作和复位电路

3.1 复位操作

在AT89S51单片机中,复位操作可以通过以下方法进行:

  1. 外部电源复位:将单片机的Vcc电压降至低电平(通常为0V)并持续一段时间,然后恢复到正常电压(通常为5V),即可触发复位操作。

  2. 内部复位:通过设置单片机内部的复位标志位来触发复位操作。可以通过编写程序来实现内部复位,具体代码如下:

#include <8051.h>void main()
{EA = 0;      // 关闭总中断RSTFR = RSTFR | 0x01;   // 设置复位标志位EA = 1;      // 打开总中断while(1){// 程序运行主体}
}

在以上代码中,通过设置RSTFR(复位标志寄存器)的最低位为1,即可触发复位操作。设置复位标志位之前需要先关闭总中断(EA=0),设置完成后再打开总中断(EA=1)。

下面是在AT89S51单片机复位时,部分片内寄存器的状态表格:

寄存器名称复位后状态
P00xFF
P10xFF
P20xFF
P30xFF
PSW0x00
ACC0x00
B0x00
SP0x07
DPL0x00
DPH0x00
IP0x00
IE0x00
TMOD0x00
TCON0x00
TH00x00
TL00x00
TH10x00
TL10x00
SCON0x00
SBUF0x00
IE0x00
IP0x00
EA0x00
RSTFR0x00
T2CON0x00
RCAP2L0x00
RCAP2H0x00
TL20x00
TH20x00

上表列出了复位后的部分寄存器状态,其中:

  • 端口寄存器(P0, P1, P2, P3)的状态为0xFF,表示所有引脚为高电平输入状态;
  • 程序状态字寄存器(PSW)的状态为0x00,表示所有标志位都被清零;
  • 累加器(ACC)和B寄存器的状态为0x00,表示内容被清零;
  • 堆栈指针(SP)的状态为0x07,指向上一次使用的栈顶位置;
  • 定时器、串口等相关寄存器的状态为0x00,表示所有配置被清零。

3.2 复位电路设计

AT89S51单片机的复位电路一般由三部分组成:复位电路、晶振电路和电源电路。

  1. 复位电路:复位电路主要是用来实现单片机的复位功能,确保在单片机上电或外部复位信号发生时,单片机能正常地进行初始化操作。它通常由一个复位电路芯片(如MAX809)和相关的电阻和电容组成。复位电路芯片有两个功能引脚,一个是复位输入引脚(RST),用于接收复位信号;另一个是复位输出引脚(RESET),用于输出复位信号给单片机。

  2. 晶振电路:晶振电路主要是用于提供稳定的时钟信号给单片机。AT89S51单片机通常需要外接一个晶振(如12MHz),晶振电路由晶振、两个电容和两个相关电阻组成。其中,晶振接在单片机的两个时钟输入引脚(XTAL1和XTAL2),两个电容和两个电阻分别连接在晶振和地之间,用于稳定晶振的工作。

  3. 电源电路:电源电路主要是用于为单片机提供稳定的电源。一般来说,AT89S51单片机可以工作在5V的电源电压下。电源电路通常由一个稳压芯片(如7805)和相关的电容和二极管组成。稳压芯片负责将输入的电源电压(如9V)稳压为5V输出给单片机,相关的电容和二极管则用于滤波和保护。

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

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

相关文章

UI学习笔记(一)

UI学习 一&#xff1a;UIView基础frame属性隐藏视图对象&#xff1a;UIView的层级关系 二&#xff1a;UIWindow对象三&#xff1a;UIViewController基础UIViewController使用 四&#xff1a;定时器与视图移动五&#xff1a;UISwitch控件六&#xff1a;滑动条和进度条七&#xf…

2021年vue面试题整理(万字解析)

一、对MVVM的理解 MVVM分为Model、View、ViewModel。 Model 代表数据模型&#xff0c;数据和业务逻辑都在Model层中定义&#xff1b;泛指后端进行的各种业务逻辑处理和数据操控&#xff0c;对于前端来说就是后端提供的 api 接口。 View 代表UI视图&#xff0c;负责数据的展示…

【Python数据分析--Numpy库】Python数据分析Numpy库学习笔记,Python数据分析教程,Python数据分析学习笔记(小白入门)

一&#xff0c;Numpy教程 给大家推荐一个很不错的笔记&#xff0c;个人长期学习过程中整理的 Python超详细的学习笔记共21W字点我获取 1-1 安装 1-1-1 使用已有的发行版本 对于许多用户&#xff0c;尤其是在 Windows 上&#xff0c;最简单的方法是下载以下的 Python 发行版…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)

概览 在任何语言中对序列(或集合)元素的排序无疑是一种司空见惯的常规操作,在 Swift 语言里自然也不例外。序列排序看似简单,实则“暗藏玄机”。 要想真正掌握 Swift 语言中对排序的“各种姿势”,我们还得从长计议。不如就先从最简单的排序基本功开始聊起吧。 在本篇博…

【十大排序算法】插入排序

插入排序&#xff0c;如一位细心的整理者&#xff0c; 她从序列的左端开始&#xff0c; 挨个将元素归位。 每当她遇到一个无序的元素&#xff0c; 便将它插入已经有序的部分&#xff0c; 直至所有元素有序排列。 她不张扬&#xff0c;却有效率&#xff0c; 用自己的方式&…

pdf文件在线压缩网站,pdf文件在线压缩工具软件

在数字化时代的今天&#xff0c;PDF文件已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着PDF文件的广泛使用&#xff0c;其文件大小问题也日益凸显。过大的PDF文件不仅占用了大量的存储空间&#xff0c;而且在传输和共享过程中也往往面临诸多不便。因此&am…

SylixOS网卡多 IP 配置

概述 网卡多 IP 是指在同一个网络接口上配置和绑定多个 IP 地址。 引进网卡多 IP 的目的主要有以下几个&#xff1a; 提供服务高可用性。通过在同一接口绑定多个 IP 地址&#xff0c;然后在服务端使用这些 IP 地址启动多个服务实例。这样在任意一 IP 出现问题时&#xff0c;可…

Redis学习(十二)Redis的三种删除策略

目录 一、背景二、Redis 的三种删除策略2.1 定时删除&#xff08;用CPU换内存空间&#xff09;2.2 定期删除2.3 惰性删除&#xff08;用内存换CPU性能&#xff09; 三、总结 一、背景 我们都知道 Redis 是一种内存数据&#xff0c;所有的数据均存储在内存中&#xff0c;可以通…

Android 代码打印meminfo

旨在替代adb shell dumpsys meminfo packageName&#xff0c;在log打印meminfo&#xff0c;以便分析内存情况 ActivityManager.MemoryInfo memoryInfo new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); long totalMemory Runtime.getRuntime(…

大数据环境搭建@Hive编译

Hive3.1.3编译 1.编译原因1.1Guava依赖冲突1.2开启MetaStore后运行有StatsTask报错1.3Spark版本过低 2.环境部署2.1jdk安装2.2maven部署2.3安装图形化桌面2.4安装Git2.5安装IDEA 3.拉取Hive源码4.Hive源码编译4.1环境测试1.测试方法——编译2.问题及解决方案&#x1f4a5;问题1…

【设计模式】结构型-装饰器模式

在代码的海洋深处迷离&#xff0c;藏匿着一片神奇之地。那里有细腻的线条交错&#xff0c;是装饰器的奇妙艺术。 文章目录 一、登录的困境二、装饰器模式三、装饰器模式的核心组成部分四、运用装饰器模式五、装饰器模式的应用场景六、小结推荐阅读 一、登录的困境 假设我们有…

YOLOv5改进总目录 | backbone、Neck、head、损失函数,注意力机制上百种改进技巧

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏地址&#xff1a; YOLOv5改进入门——持续更新各种有效涨点方法 点击即可跳转 报错 解决Yolov5的RuntimeError: result type Float can…

qq号码采集软件

寅甲QQ号码采集软件, 一款采集QQ号、QQ邮件地址&#xff0c;采集QQ群成员、QQ好友的软件。可以按关键词采集&#xff0c;如可以按地区、年龄、血型、生日、职业等采集。采集速度非常快且操作很简单。

C# WPF入门学习主线篇(九)—— ComboBox常见属性和事件

欢迎来到C# WPF入门学习系列的第九篇。在前面的文章中&#xff0c;我们已经学习了 Button、TextBox、Label 和 ListBox 控件。今天&#xff0c;我们将探讨 WPF 中的另一个重要控件——ComboBox。本文将详细介绍 ComboBox 的常见属性和事件&#xff0c;并通过示例代码展示其在实…

逻辑这回事(三)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时&#xff0c;Tsu表示数据前边沿距离时钟上升沿的时间&#xff0c;MicTsu表示时钟clk能够稳定采样数据D的所要求时间&#xff0c;Th表示数据后边沿距离时钟上升沿的时间&#xff0c;MicTh表示时钟clk采样…

Spring Boot集成pmd插件快速入门Demo

1.什么是pmd插件&#xff1f; PMD 插件允许您在项目的源代码上自动运行PMD代码分析工具&#xff0c;并生成带有其结果的站点报告。它还支持与 PMD 一起分发的单独的复制/粘贴检测器工具&#xff08;或 CPD&#xff09;。 此版本的 Maven PMD 插件使用 PMD 6.42.0 并且需要 Jav…

从大到小吗?-分支c++

题目描述 给出 4 个整数&#xff0c;a , b , c , d 。 判断这四个数字是否满足从大到小。 输入 输入 4 个整数&#xff0c;a , b , c , d 。 输出 输出 Yes 或者 No 。 样例输入 4 3 2 1 样例输出 Yes 提示 分析&#xff1a; 这道题十分的简单&#xff0c;只需判断…

23 二叉搜索树

本节目标 1.内容安排说明 2.二叉搜索树实现 3.应用分析 4.进阶题 1. 内容安排说明 二叉树在c数据结构已经说过了&#xff0c;本节内容是因为&#xff1a; map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构二叉搜索树的特性了解&#xff0c;有助于…

Linux:动态库和静态库的编译与使用

目录 1.前言 2.静态链接库 3.静态链接库生成步骤 4.静态链接库的使用 5.动态链接库 6.动态链接库生成步骤 7.动态链接库的使用 8.动态链接库无法加载 9.解决动态链接库无法加载问题 前言 在《MinGW&#xff1a;从入门到链接库》博客中简单介绍了如何编译动态链接库和静态链接库…

YOLOv5车流量监测系统研究

一. YOLOv5算法详解 YOLOv5网络架构 上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言&#xff0c;我们通常可以将其划分为4个通用的模块&#xff0c;具体包括&#xff1a;输入端、基准网络、Neck网络与Head输出端&#xff0c;对应于上图中的4个红色模块。Y…