【51单片机系列】C51中的中断系统扩展实验

本文是关于51单片机中断系统的扩展实验。

文章目录

  • 一、 扩展实验一:使用外部中断0控制蜂鸣器,外部中断1控制直流电机
  • 二、扩展实验二:修改定时器初值,设定3秒钟的定时时间让LED模块闪烁
  • 三、扩展实验三:使用定时器1和数码管设计一个数字时钟

一、 扩展实验一:使用外部中断0控制蜂鸣器,外部中断1控制直流电机

外部中断扩展实验一实现的功能:使用外部中断0控制蜂鸣器发声/不发声,外部中断1控制直流电机转动/停止。

由蜂鸣器的内容可以知道,蜂鸣器分为有源蜂鸣器和无源蜂鸣器;蜂鸣器有两个管脚,要使蜂鸣器发声,需要有电流通过蜂鸣器,即管脚一端接正极,管脚另一端接负极。有源蜂鸣器只需给一定的电压即可发声,无源蜂鸣器需要一定频率的脉冲才可发声。这里设计了两种蜂鸣器,都由外部中断0控制。

直流电机的驱动方式与蜂鸣器类似。

proteus中硬件设计如下,为显示蜂鸣器的发声,这里使用了一个LED显示发声与否。蜂鸣器的一端连接到电源,另一端经过ULN2003芯片连接P1.5口,当P1.5=0时蜂鸣器发声;直流电机的一端连接到电源,另一端经过ULN2003连接到P1.0口,当P1.0=0时电机转动。为体现中断,使用独立按键模块连接到P3.2和P3.3口,当按键按下,蜂鸣器发声或电机转动。

proteus设计外部中断控制蜂鸣器和直流电机

软件设计如下:

/*实现功能:外部中断0控制蜂鸣器发声,外部中断1控制直流电机转动- 与外部中断0和外部中断1有关的有两个寄存器IE和TCON,- IE是中断允许控制寄存器,TCON是中断请求标志寄存器。- IE中包括了- 总中断允许位(EA)- 外部中断0/1允许位(EX0/EX1)- 定时器0/1允许位(ET0/ET1)- 串口中断允许位(ES);- TCON中的低四位是外部中断允许和触发方式控制位,包括了- IT0/IT1是外部中断0/1触发方式控制位,0表示低电平触发,1表示下降沿触发;- IE0/IE1是外部中断0/1请求标志位[2023-12-19] zoya
*/#include "reg52.h"
#include "typedef.h"
#include "Delay.h"sbit BEEP = P1^5;
sbit MOTOR = P1^0;
sbit CTR_INT0 = P3^2;
sbit CTR_INT1 = P3^3;/*************************************************************************
* 函数名:		IntInit
* 函数功能:	外部中断0/1初始化,设置中断触发方式为边沿触发
* 输入:			void
* 输出:			void
**************************************************************************/
void IntInit()
{// 1. 设置中断触发方式IT0=1;IT1=1;// 2. 打开外部中断0/1EX0=1;EX1=1;// 3. 打开总中断EA=1;
}void main()
{MOTOR=0;BEEP=0;IntInit(); while(1);
}/*************************************************************************
* 函数名:		Int0
* 函数功能:	外部中断0中断服务函数,
* 						控制蜂鸣器发声
* 输入:			void
* 输出:			void
**************************************************************************/
void Int0() interrupt 0
{delayms(10);  // 按键延时消抖if(0 == CTR_INT0){BEEP = ~BEEP;}
}/*************************************************************************
* 函数名:		Int1
* 函数功能:	外部中断1中断服务函数,
* 						控制直流电机转动
* 输入:			void
* 输出:			void
**************************************************************************/
void Int1() interrupt 2
{delayms(10);  // 按键延时消抖if(0 == CTR_INT1){MOTOR=~MOTOR;}
}

仿真结果:

外部中断控制蜂鸣器和直流电机

二、扩展实验二:修改定时器初值,设定3秒钟的定时时间让LED模块闪烁

如何计算定时器初值?

以使用12MHz的晶振频率计算。如果使用的是12MHz晶振,单片机内部的时钟频率为12分频即12/12MHz=1MHz;那么对应的机器周期为1/1MHz=1us。即使用12MHz晶振的机器周期为1us。

如果要定时1ms,需要计数1ms/1us=1000个,定时器使用方式1工作,那么初值为 2 16 − 1000 = 64536 2^{16}-1000 = 64536 2161000=64536 = 0xFC18。即初值THx=0xfc,TLx=0x18。

如果要定时1s,可以通过初值设置定时1ms,当定时结束重新赋初值,并设定一个全局变量累计定时1ms的次数,当该全局变量累计1000次时表示定时1s。

如果要设定3s时间,可以通过初值设定定时3ms,其它同定时1ms。定时3ms需要计数3ms/1us=3000,定时器使用方式1工作,初值为 2 16 − 3000 2^{16} - 3000 2163000 = 62536 = 0xF448,即初值THx=0xF4,TLx=0x48。

该实验在前面使用示例的基础上更改计数初值即可实现定时3s实现LED模块的闪烁。proteus中设计LED模块如下,定时器模块在单片机内部。

proteus设计定时器控制LED模块闪烁

软件设计如下:

/*实现功能:定时器0定时3s实现LED模块亮灭- 与定时/计数器工作有关的寄存器有IE、TCON、TMOD、THx、TLx- IE是中断允许控制寄存器,TCON是中断请求标志寄存器,TMOD是定时/计数器工作方式寄存器- THx和TLx是计数初值赋值寄存器。- IE中包括了- 总中断允许位(EA)- 外部中断0/1允许位(EX0/EX1)- 定时器0/1允许位(ET0/ET1)- 串口中断允许位(ES);- TCON中的高四位用于控制定时/计数器的启动和中断申请,包括TR0/1、TF0/1- TR0/TR1是T0/T1运行控制位,TR0=1时开始工作,TR0=0时停止工作,TR1与TR0类似;- TF0/TF1是T0/T1溢出中断请求标志位,溢出时由硬件自动置位,CPU响应中断后由硬件自动清0可随时查询该位状态,也可软件置1或清0.- TMOD高四位控制T1,低四位控制T0,高四位和低四位分别为有GATE、C/T、M1M0- GATE是门控位,- GATE=0表示不受外部中断信号影响,仅TR0/TR1控制定时/计数器工作,- GATE=1表示受外部中断信号影响,即TR0/TR1+INT0控制定时/计数器工作- C/T是定时/计数器模式选择位,C/T=0为定时模式,C/T=1为计数模式;- M1M0是工作方式设置位,有四种方式:00 01 10 11[2023-12-20] zoya
*/#include "reg52.h"
#include "typedef.h"
#include "Delay.h"#define GPIO_LED P2
/*************************************************************************
* 函数名:		Timer0Init
* 函数功能:	定时器0初始化,工作方式1定时3ms,仅TR0启动或停止计数
* 输入:			void
* 输出:			void
**************************************************************************/
void Timer0Init()
{// 1. 设置工作方式1,仅TR0控制TMOD |= 0x01;// 2. 设置定时3ms的初值,0xf448TH0 = 0xf4;TL0 = 0x48;// 3. 打开中断允许位EA = 1;ET0 = 1;// 4. 置位TR0,开始计数TR0 = 1;
}void main()
{Timer0Init(); while(1);
}/*************************************************************************
* 函数名:		Timer0
* 函数功能:	定时器0中断服务函数,定时3s控制LED模块亮灭
* 输入:			void
* 输出:			void
**************************************************************************/
void Timer0() interrupt 1
{static u16 i;// 重新赋初值TH0 = 0xf4;TL0 = 0x48;i++;if(1000 == i){i=0;GPIO_LED = ~GPIO_LED;}
}

仿真结果:

定时器0定时3s控制LED模块亮灭

三、扩展实验三:使用定时器1和数码管设计一个数字时钟

定时器的设置参考扩展实验二。

数字时钟采用24小时制,显示使用“00-00-00”格式。

这里数码管使用一个八位一体的共阴极数码管,使用芯片74HC138控制数码管的位选,使用芯片74HC245控制数码管的段选;P0口控制74HC245的输入,P2.2 ~ P2.4控制74HC138的输入。proteus设计如下:

proteus设计定时器1和数码管实现一个数字时钟

软件设计如下:

/*实现功能:定时器1和数码管设计一个数字时钟- 与定时/计数器工作有关的寄存器有IE、TCON、TMOD、THx、TLx- IE是中断允许控制寄存器,TCON是中断请求标志寄存器,TMOD是定时/计数器工作方式寄存器- THx和TLx是计数初值赋值寄存器。- IE中包括了- 总中断允许位(EA)- 外部中断0/1允许位(EX0/EX1)- 定时器0/1允许位(ET0/ET1)- 串口中断允许位(ES);- TCON中的高四位用于控制定时/计数器的启动和中断申请,包括TR0/1、TF0/1- TR0/TR1是T0/T1运行控制位,TR0=1时开始工作,TR0=0时停止工作,TR1与TR0类似;- TF0/TF1是T0/T1溢出中断请求标志位,溢出时由硬件自动置位,CPU响应中断后由硬件自动清0可随时查询该位状态,也可软件置1或清0.- TMOD高四位控制T1,低四位控制T0,高四位和低四位分别为有GATE、C/T、M1M0- GATE是门控位,- GATE=0表示不受外部中断信号影响,仅TR0/TR1控制定时/计数器工作,- GATE=1表示受外部中断信号影响,即TR0/TR1+INT0控制定时/计数器工作- C/T是定时/计数器模式选择位,C/T=0为定时模式,C/T=1为计数模式;- M1M0是工作方式设置位,有四种方式:00 01 10 11使用一个八位一体的共阴极数码管显示时间,74HC138芯片控制数码管的位选,74HC245控制数码管的段选。[2023-12-20] zoya
*/#include "reg52.h"
#include "typedef.h"
#include "Delay.h"#define GPIO_DISPLAY P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;// 共阴极数码管的码表,0-9以及:
u8 code smg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67, 0x40};static u16 h, m, s;/*************************************************************************
* 函数名:		Timer0Init
* 函数功能:	定时器0初始化,工作方式1定时3ms,仅TR0启动或停止计数
* 输入:			void
* 输出:			void
**************************************************************************/
void Timer1Init()
{// 1. 设置工作方式1,仅TR0控制TMOD |= 0x10;// 2. 设置定时1ms的初值,0xFC18TH1 = 0xFC;TL1 = 0x18;// 3. 打开中断允许位EA = 1;ET1 = 1;// 4. 置位TR1,开始计数TR1 = 1;
}void DigDisplay()
{LSA=0; LSB=0; LSC=0; GPIO_DISPLAY = smg[h/10];delayms(1);LSA=1; LSB=0; LSC=0; GPIO_DISPLAY = smg[h%10];delayms(1);LSA=0; LSB=1; LSC=0; GPIO_DISPLAY = smg[10];delayms(1);LSA=1; LSB=1; LSC=0; GPIO_DISPLAY = smg[m/10];delayms(1);LSA=0; LSB=0; LSC=1; GPIO_DISPLAY = smg[m%10];delayms(1);LSA=1; LSB=0; LSC=1; GPIO_DISPLAY = smg[10];delayms(1);LSA=0; LSB=1; LSC=1; GPIO_DISPLAY = smg[s/10];delayms(1);LSA=1; LSB=1; LSC=1; GPIO_DISPLAY = smg[s%10];delayms(1);
}void main()
{GPIO_DISPLAY = 0x00;Timer1Init(); while(1){DigDisplay();}
}/*************************************************************************
* 函数名:		Timer1
* 函数功能:	定时器1中断服务函数,控制数码管显示
* 输入:			void
* 输出:			void
**************************************************************************/
void Timer1() interrupt 3
{static u16 j;// 重新赋初值TH1 = 0xFC;TL1 = 0x18;j++;if(1000 == j){j=0;s++;if(60 == s){s=0; m++;if(60 == m){m=0; h++;if(24 == h){h=0;}}}}
}

仿真结果:

定时器1和数码管实现一个数字时钟

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

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

相关文章

法线贴图实现地形模型皱褶、凹凸不平的纹理效果

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色,它通过模拟表面的微…

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱&#xf…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件,Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用,以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改,而C…

springboot集成websocket全全全!!!

一、界面展示 二、前置了解 1.什么是websocket WebSocket是一种在单个TCP连接上进行全双工通信的持久化协议。 全双工协议就是客户端可以给我们服务器发数据 服务器也可以主动给客户端发数据。 2.为什么有了http协议 还要websocket 协议 http协议是一种无状态,非…

可视化开发

可视化开发 数据可视化 交互式可视化 文章目录 可视化开发前言一、可视化开发二、Python数据可视化大屏GIS图像智能识别处理软件开发三、可视化开发必备总结前言 可视化开发可以帮助开发者通过图形化界面和拖放操作来创建、编辑和测试应用程序。使用这些工具,开发者可以提高开…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课: 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建&基本状态&内部任务)、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

代码随想录算法训练营Day7 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串

LeetCode 344 反转字符串 本题思路:反转字符串比较简单,定义两个指针,一个 i 0, 一个 j s.length-1。然后定义一个临时变量 tmp,进行交换 s[i] 和 s[j]。 class Solution {public void reverseString(char[] s) {int i 0;int …

在Excel中,如何简单快速地删除重复项,这里提供详细步骤

当你在Microsoft Excel中使用电子表格时,意外地复制了行,或者如果你正在制作其他几个电子表格的合成电子表格,你将遇到需要删除的重复行。这可能是一项非常无脑、重复、耗时的任务,但有几个技巧可以让它变得更简单。 删除重复项 …

【Linux】权限篇(二)

权限目录 1. 前言2. 权限2.1 修改权限2.2 有无权限的对比2.3 另外一个修改权限的方法2.3.1 更改用户角色2.3.2 修改文件权限属性 3. 第一个属性列4. 目录权限5. 默认权限 1. 前言 在之前的一篇博客中分享了关于权限的一些知识,这次紧接上次的进行,有需要…

《A++ 敏捷开发》-1 如何改善

1 如何改善 敏捷开发过程改进案例 5月 A公司一直专门为某电信公司提供针对客服、线上播放等业务。 张工是公司的中层管理者,管理好几个开发团队,有5位项目经理向他汇报。 他听说老同学的团队都开始用敏捷开发,很感兴趣,便参加了…

mysql SQL执行超时问题

show variables like max_execution_time 使用这个命令查看了,没有设置sql执行超时时间,那么大概率问题就出在阿里的Druid数据库连接池出了问题 尝试着socketTimeout由60000毫秒改成10000毫秒,果然执行了十几秒就超时报错了 socketTime…

【雷达原理】雷达测速原理及实现方法

一、雷达测速原理 1.1 多普勒频率 当目标和雷达之间存在相对运动时,若雷达发射信号的工作频率为,则接收信号的频率为,其中为多普勒频率。将这种由于目标相对于辐射源运动而导致回波信号的频率发生变化的现象称为多普勒效应。 如图1-1所示&a…

IDEA的facets和artifacts

在软件开发领域,IDEA 是指 JetBrains 公司的 IntelliJ IDEA,是一款流行的集成开发环境(Integrated Development Environment)。在 IntelliJ IDEA 中,"facets" 和 "artifacts" 是两个概念&#xff…

Qt通用属性工具:随心定义,随时可见(一)

一、开胃菜&#xff0c;没图我说个DIAO 先不BB&#xff0c;给大家上个效果图展示下&#xff1a; 上图我们也没干啥&#xff0c;几行代码&#xff1a; #include "widget.h" #include <QApplication> #include <QObject> #include "QtPropertyEdit…

攻防世界——game 游戏

下载下来是一个exe文件&#xff0c;可以用IDA打开 我们先运行一下 这是属于第二种类型&#xff0c;完成一个操作后给你flag 这种题我更倾向于动调直接得到flag 我们查壳 没有保护壳&#xff0c;直接32打开 进入字符串界面&#xff0c;找到显示的那部分 int __cdecl main_0(…

汽车级EEPROM 存储器 M24C64-DRMN3TP/K是电可擦除可编程只读存储器?它的功能特性有哪些?

M24C64-DRMN3TP/K是一款64 Kbit串行EEPROM汽车级设备&#xff0c;工作温度高达125C。符合汽车标准AEC-Q100 1级规定的极高可靠性。 该设备可通过一个高达1MHz的简单串行I2C兼容接口访问。 存储器阵列基于先进的真EEPROM技术&#xff08;电可擦除可编程存储器&#xff09;。M2…

【三维生成与重建】ZeroRF:Zero Pretraining的快速稀疏视图360°重建

系列文章目录 题目&#xff1a;ZeroRF: Fast Sparse View 360◦ Reconstruction with Zero Pretraining 任务&#xff1a;稀疏重建&#xff1b;拓展&#xff1a;Image to 3D、文本到3D 作者&#xff1a;Ruoxi Shi* Xinyue Wei* Cheng Wang Hao Su &#xff0c;来自UC San Dieg…

【接口测试】如何定位BUG的产生原因

我们从在日常功能测试过程中对UI的每一次操作说白了就是对一个或者多个接口的一次调用&#xff0c;接口的返回的内容(移动端一般为json)经过前端代码的处理最终展示在页面上。http接口是离我们最近的一层接口&#xff0c;web端和移动端所展示的数据就来自于这层&#xff0c;那么…

深入理解 Rust 中的容器类型及其应用

Rust 作为一种系统编程语言&#xff0c;提供了丰富的容器类型来处理各种数据结构和算法。这些容器类型不仅支持基本的数据存储和访问&#xff0c;还提供了高效的内存管理和安全性保障。本文将详细介绍 Rust 中的几种主要容器类型&#xff0c;包括它们的用法、特点和适用场景&am…

【数据结构一】初始Java集合框架(前置知识)

Java中的数据结构 Java语言在设计之初有一个非常重要的理念便是&#xff1a;write once&#xff0c;run anywhere&#xff01;所以Java中的数据结构是已经被设计者封装好的了&#xff0c;我们只需要实例化出想使用的对象&#xff0c;便可以操作相应的数据结构了&#xff0c;本篇…