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

news2024/11/24 18:30:50

本文是关于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/1
	EX0=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的初值,0xf448
	TH0 = 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的初值,0xFC18
	TH1 = 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.coloradmin.cn/o/1325850.html

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

相关文章

KBP310-ASEMI适配高端电源KBP310

编辑:ll KBP310-ASEMI适配高端电源KBP310 型号:KBP310 品牌:ASEMI 封装:KBP-4 最大平均正向电流:3A 最大重复峰值反向电压:1000V 产品引线数量:4 产品内部芯片个数:4 产品内…

哈希算法专栏二《力扣题目练习》

引言 在了解了哈希表的基础理论之后,我们就可以开始进行刷题实战了。下面是我在力扣上找的一些题目,认真刷完并理解下面的题目,相信读者至少可以初步掌握哈希算法的思想了。 LeetCode242有效的字母异位词 242. 有效的字母异位词 已解答 简…

智能化安防与监控:全球发展、挑战与未来趋势

导言 智能化安防与监控系统在全球范围内得到广泛应用,成为社会安全和公共管理的重要工具。本文将深入研究其发展历程、遇到的问题及解决过程、未来的可用范围,以及在各国的应用和未来的研究趋势,以探讨在哪些方面能取胜,并在哪些方…

简易实现 STL--list

实现 list 的主要思想及过程 首先,实现过程中的所有代码必须放在自己定义的命名空间中。 定义一个结点的结构体类模板,结点的数据类型就应该是模板类型 T,定义的 next指针和 prev指针都应该是模板指针类型,并且结构体类中药有构…

git的使用思维导图

源文件在github主页:study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)

力扣:77. 组合(回溯, path[:]的作用)

题目: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 输入&…

MS5541/MS5542,高精度DAC,2.7V 到 5.5V、串行输入、电压输出、16 位数模转换器,可替代AD5541

MS5541/MS5542 是一款单通道、 16 位、串行输入、电压 输出的数模转换器,采用 2.7V 至 5.5V 单电源供电,输出范围 为 0V 至 V REF 。在输出范围内保证单调性,在温度范围为 -40 C 至 85 C 能够提供 1LSB INL 的 14 位精度。…

pycharm git 版本回退

参考 https://blog.csdn.net/qq_38175912/article/details/102860195 yoyoketang 悠悠课堂

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来,物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环,PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网,实现工厂设备数据采集”这一主题,探讨PLC物联网…

合并一个excel文件中的多个sheet

import pandas as pd #要合并的文件路径 filepath/Users/kangyongqing/Documents/kangyq/202311/班均及合班储备/最后校验/二批次组班/ file1z小班合班方案_2012(1).xlsx #获取文件d的所有sheet名 df1pd.read_excel(filepathfile1,sheet_nameNone,engine…

Graylog配置日志保留策略

找了半天没找到说的清楚的,只能抠官方文档 graylog的归档(日志持久化)只有付费版才能用,所以日志只能存在es中 1.理解官方给出的几个概念 轮转策略 (Index Rotation Strategy): 轮转策略定义了何时创建新的索引以及何时关闭旧的索…

C语言-> 文件操作(函数满屏)

系列文章目录 前言 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,数据结构,函数-CSDN博客 目的:学习文件操作,即…

gitee的学习

1.git下载 下载地址:https://git-scm.com/ 2.建立远程仓库 访问:gitee.com 在此网站上创建 3.本地操作 在本地找一个任意文件,克隆git 执行命令:git clone https://gitee.com/beijing-jiaxin-times_0/test_zsx_cang_ku.git …

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现,并在第 2 部分中探索训练过程之后,我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码,请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

[c]用指针进行四个数排序

#include<stdio.h> void swap(int*p1,int*p2)//定义函数&#xff0c;实现两个数值交换 {int temp;temp*p1;*p1*p2;*p2temp; } void psort( int *pa, int *pb,int *pc,int *pd) {int i1;for(i1;i<3;i)//对四个数排序&#xff0c;至少3次循环&#xff0c;交换过后是升序…

海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

漏洞介绍 海康威视IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞&#xff0c;该漏洞源于文件/ph…

跨境电商独立站有哪些优势,要如何做?

跨境电商独立站是指面向海外市场的电商网站&#xff0c;具有以下优势&#xff1a; 自主品牌 搭建跨境电商独立站可以通过自主品牌的打造&#xff0c;提升品牌的知名度和影响力&#xff0c;同时也可以在海外市场建立起更加稳定的品牌形象。 自主掌控 跨境电商独立站可以自主掌…

Python算法例19 创建最大数

1. 问题描述 给定两个长度分别是m和n的数组&#xff0c;数组的每个元素都是数字0~9&#xff0c;从这两个数组当中选出k个数字来创建一个最大数&#xff0c;其中k满足k&#xff1c;mn&#xff0c;选出来的数字在创建最大数里的位置必须与在原数组内的相对位置一致。返回k个元素…

Java第一个程序——Hello,World!

“Hello, world”的由来可以追溯到 The C Programming Language 。在这门编程语言中&#xff0c;它被用作第一个演示程序&#xff0c;向人们展示了在计算机屏幕上输出“Hello world”这行字符串的计算机程序。由于这个演示程序的简洁性和直观性&#xff0c;它成为了许多初学者学…

韩语中的一次多用-柯桥基础韩语学习

1.动词&#xff0c;写 일기를 쓰다 写日记 2.动词&#xff0c;戴&#xff08;帽子&#xff0c;眼镜&#xff0c;口罩&#xff09; 안경을 쓰다 戴眼镜 3.动词&#xff0c;使用&#xff08;材料&#xff0c;道具&#xff0c;手段&#xff09; 세제를 쓰다 使用洗剂 4.动词&am…