单片机基础之单片机中断、定时器中断、PWM及SG90舵机的初识认知

news2024/12/26 0:27:39

目录

一、初探单片机中断

二、定时器中断相关寄存器

1、中断寄存器

2、中断结构

3、用定时器中断方式控制LED,代码编程测试

三、初识PWM

1、什么是占空比

2、如何输出PWM信号

四、SG90舵机基本认知

1、什么是舵机

2、怎么控制舵机

3、舵机编程实战


一、初探单片机中断

1、什么是中断系统

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的

2、什么是中断

当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程为中断。

实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求

3、如果使用C语言编程,中断查询次序号就是中断号,例如:

voidInt0_Routine(void)                   interrupt0;

voidTimer0_Rountine(void)            interrupt1;

voidInt1_Routine(void)                   interrupt2;

voidTimer1_Rountine(void)            interrupt3;

voidUART_Routine(void)                interrupt4;

voidTimer2_Routine(void)              interrupt5;

voidInt2_Routine(void)                   interrupt6;

voidInt3_Routine(void)                   interrupt7;

中断号:interrupt1;是被硬件调用的

当函数后加入一个interrupt1中断号时;系统产生中断时,程序会去调用这个中断函数,然后在烧写单片机程序的时候,也会把这个中断函数烧录到单片机中的一个特殊位置。

二、定时器中断相关寄存器

1、中断寄存器

 

CPU能响应定时器0中断的条件,需要配置IE寄存器的bit1:ET0  bit7:EA

(1)ET0:中断允许要置一,   即ET0 = 1

(2)EA:总中断允许要置一 ,即EA   = 1

2、中断结构

3、用定时器中断方式控制LED,代码编程测试

#include "reg52.h"

sbit led  = P3^6;
sbit led1 = P3^7;
int cnt = 0;

void Time0Init(){

	//1、配置定时器0工作模式位16位计时
	TMOD = 0x01;
	//2、给定时器一个初值
	TL0 = 0x00;
	TH0 = 0xDC;
	//3、定时器开始计时
	TR0 = 1;
	TF0 = 0;	
	//4、打开中断定时器
	ET0 = 1;
	//5、设置总中断定时器
	EA = 1;	
}

void Delay300ms()		//@11.0592MHz
{
	unsigned char i, j, k;	
	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	led = 1;	
	Time0Init();
	while(1){
		led1 = 0;
		Delay300ms();
		led1 = 1;
		Delay300ms();					
	}
}

void Time0Handler() interrupt 1   //定时器0的中断号为 interrupt 1
{
	cnt ++;           //统计爆表的次数
	//给定时器重新定义初值
	TL0 = 0x00;      
	TH0 = 0xDC;       
	if(cnt == 100){   //要爆表101次
			led = !led;   //每经过1s,翻转led的状态
			cnt = 0;      //当100次表示1s,重新让cnt从0开始,计算下一次的1s
	}
}

三、初识PWM

PWM ,英文名 Pulse Width Modulation ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通 过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的 时间占据整个信号周期的百分比,例如方波的占空比就是50%.

PWM主要是通过占空比编码模拟信号

1、什么是占空比

占空比是指一个波形周期内,高电平占据时长的百分比(面试考点)

比如,一个4ms的周期里,低电平时长为3ms,高电平时长为1ms,那么这个周期的占空比为25%

2、如何输出PWM信号

(1)通过芯片内部模块输出,一般观察手册或者芯片IO口都会标明这个是否是PWM口

(2)如果没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差

怎么模拟:

        搞个50Hz频率的PWM

四、SG90舵机基本认知

1、什么是舵机

如下图所示,最便宜的舵机SG90,常用三根线或者四根线

用处(学习的项目):垃圾桶项目开盖用 、智能小车的全比例转向,摄像头云台,机械臂等

常见的有0-90°、0-180°、0-360°

黄线:PWM信号控制线

红线:VCC(电源线正极)

灰线:GND(电源线负极)

2、怎么控制舵机

向黄色信号线灌入PWM信号

PWM波的频率不能太高,大约50Hz,即周期 = 1/频率 = 1/50 = 0.02s,20ms左右

数据:

0.5ms------------------------0度;2.5%对应函数中占空比为250

1.0ms------------------------45度;5.0%对应函数中占空比为500

1.5ms------------------------90度;7.5%对应函数中占空比为750

2.0ms------------------------135度;10.0%对应函数中占空比为1000

2.5ms------------------------180度;12.5%对应函数中占空比为1250

编程思路:

定时器需要定时20ms,关心的单位0.5ms,40个的0.5ms,初值0.5ms,cnt++

3、舵机编程实战

#include "reg52.h"

sbit sg90_con = P1^1;
int cnt = 0;
int jd;
void Time0Init(){

	//1、配置定时器0工作模式位16位计时
	TMOD = 0x01;
	//2、给定时器一个初值,每个周期都等于0.5ms
	TL0 = 0x33;
	TH0 = 0xFE;
	//3、定时器开始计时
	TR0 = 1;
	TF0 = 0;
	
	//4、打开中断定时器
	ET0 = 1;
	//5、设置总中断定时器
	EA = 1;
	
}

void Delay300ms()		//@11.0592MHz
{
	unsigned char i, j, k;	
	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	Delay300ms();  //系统上电后先延时300ms,确保系统的稳定
	Time0Init();   //初始化定时器及开启中断
	jd = 1;        //初始角度是0度,什么时候0度,刚好是0.5ms的高电平,也是定时器溢出1次
	cnt = 0;
	sg90_con = 1;  //刚开始给PWM信号一个高电平
	//每隔两秒切换一次角度
	while(1){
		jd = 3;      //90度,1.5ms的高电平
		cnt = 0;     //每切换一次角度,都要重置cnt的值
		Delay2000ms();
		jd = 1;      //0度,1.5ms的高电平
		cnt = 0;     //每切换一次角度,都要重置cnt的值
		Delay2000ms();
	}
}

void Time0Handler() interrupt 1   //定时器0的中断号为 interrupt 1
{
	
	cnt ++;           //统计爆表的次数
	//给定时器重新定义初值,每个周期都等于0.5ms
	TL0 = 0x33;      
	TH0 = 0xFE;
	//控制PWM波形
	if(cnt < jd){
		sg90_con = 1;
	}else{
		sg90_con = 0;
	}
	
	if(cnt == 40){   //要爆表40次,经过了20ms
			cnt = 0;      //当100次表示1s,重新让cnt从0开始,计算下一次的1s
			sg90_con = 1;
	}
}

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

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

相关文章

Jetson nano 入手系列之2—板载摄像头IMX219启动

Jetson nano 入手系列之2—板载摄像头IMX219启动1.亚克力板安装2.摄像头启动3.nvgstcapture常用命令3.1 Set sensor orientation3.2 Get Image Capture Resolution3.3 Capture3.4 quit参考文献Jetson nano 入手系列&#xff1a; Jetson nano 入手系列之1—如何SSH远程登录 Jets…

Redis学习(一)

Redis入门 Redis是一个基于内存的key-value结构数据库&#xff0c;读写性能较高 Redis数据类型 Redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种数据类型&#xff1a; 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集…

Altium Designer 20 凡亿教育视频学习-01

课程视频&#xff1a;第1课 课程介绍.mp4_哔哩哔哩_bilibili 第一部分学习 学习方法 工程具备文件 一定需要先建立工程&#xff0c;再来创建原理图库、原理图等文件 栅格大小改变 栅格的大小我们常在绘制原理图的时候改变&#xff0c;因为有时候我们需要画一个细线&#…

【PCB专题】什么是通孔、盲孔、埋孔?

PCB板是由基板和PP叠加而成的。不同层上走了各种信号线和电源,这些信号和电源在不同的电路层之间切换时需要依靠过孔(通孔、盲孔和埋孔)连接。如下图所示的6层板,使用了2阶HDI方案:有机械孔和激光孔。 过孔的作用就像是水管一样,连接了不同的平面。PCB板上的过孔作用就是…

函数的定义和调用 与 this指向

1、函数的定义和调用 1.1、函数的定义方式 函数声明方式 function 关键字 (命名函数)函数表达式 (匿名函数)new Function() var fn new Function(参数1,参数2..., 函数体)&#xff08;1&#xff09;Function 里面参数都必须是字符串格式 &#xff08;2&#xff09;第三种方式…

已解决+ CategoryInfo: SecurityError: (:) [ ].ParentContainsErrorRecordException

已解决无法加载文件 E:\day_01\Scripts\activate.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的about_Execution_Policies。 CategoryInfo: SecurityError: &#xff08;:&#xff09; [ ]…

[LeetCode周赛复盘] 第 326 场周赛20230101

[LeetCode周赛复盘] 第 326 场周赛20230101 一、本周周赛总结二、 [Easy] 6278. 统计能整除数字的位数1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6279. 数组乘积中的不同质因数数目1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6196. 将字符串分割成值不超过 K 的子字…

路由 NAT(简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表)

4.1.0 路由 NAT&#xff08;简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表&#xff09; 目录简介NAT地址映射表静态NAT简介操作案例动态NAT简介操作案例NAT Server简介操作案例NAPT简介操作案例Easy-ip简介操作案例简介 为了有效节约公网IPv4地址&#xf…

QT 学习笔记(十二)

文章目录一、文件系统1. 文件系统简介2. 文件系统分类二、基本文件操作1. QFile 读文件2. QFile 写文件3. QFileInfo 获取文件信息三、基本文件操作代码1. 主窗口头文件 widget.h2. 主窗口源文件 widget.cpp由于每次代码都是在原有程序上修改&#xff0c;因此除了新建项目&…

物联网与射频识别技术,课程实验(三)

实验3—— 时隙ALOHA(S-ALOHA)算法的实现及其性能分析 实验说明&#xff1a; 1. 利用Python或Matlab模拟时隙ALOHA算法&#xff1b; 分析标签数量k、时隙大小t对信道利用率的影响&#xff0c;其中&#xff0c; 信道利用率发送数据的时间/(发送数据的时间信道空闲的时间) 3. …

10、中断系统概述

目录 0x01、异常类型 0x0001、系统异常清单 0x0002、外部中断清单 0x02、NVIC 简介 0x0001、NVIC 寄存器 0x0002、NVIC 中断配置固件库 0x03、优先级 0x0001、优先级定义 0x0002、优先级分组 0x0003、中断编程 0x01、异常类型 STM32F103 在内核水平上搭载了一个异常响…

重金打造SEA浩瀚架构,吉利的野心绝不仅仅是一个平台

&#xff08;作者&#xff1a;贝贝。常年供职于某外资整车企业产品规划部门&#xff0c;负责全球车型在国内的引入和投放&#xff09;最近几个月&#xff0c;吉利旗下的中高端电动车品牌极氪汽车销量一路走高。单凭借极氪001一款车型&#xff0c;10月、11月交付量连续破万&…

查找:折半查找、平衡二叉树、散列表(习题-1、5、6)二叉排序树(习题-2、3、4)

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.1 Last edited: 2023.1.1 目录 查找&#xff1a;折半查找、平衡二叉树、散列表&#xff08;习题-1、5、6&#xff09; 第1关&#xff1…

04.spring源码循环依赖终极讲解

1.Spring怎么解决循环依赖 我们都知道&#xff0c;单例Bean初始化完成&#xff0c;要经历三步&#xff1a; 注入就发生在第二步&#xff0c;属性赋值&#xff0c;结合这个过程&#xff0c;Spring 通过三级缓存解决了循环依赖&#xff1a; 一级缓存 : Map<String,Object>…

PUCCH传输UCI信息

上报HARQ-ACK 时序 传输HARQ-ACK信息的时序不再像4G那样固定&#xff0c;而是由基站侧配置给UE。有下面几种情况&#xff1a; 如果UE收到的是DCI format 1_0&#xff0c;其中的字段’PDSCH-to-HARQ_feedback timing indicatior’指示HARQ-ACK与PDSCH的时序关系&#xff0c;该…

Linux之孤儿进程、进程优先级、环境变量

本章目录1.孤儿进程2.状态优先级3.环境变量1.孤儿进程 父进程如果提前退出&#xff0c;那么子进程后退出&#xff0c;进入Z之后&#xff0c;那该如何处理&#xff1f; 父进程先退出&#xff0c;子进程还在&#xff0c;子进程就称之为“孤儿进程”。 孤儿进程被1号init进程&am…

移动安全APT事件总结及防御解决方案探讨

声明 本文是学习移动安全总结 2019. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 2019年各地移动APT事件总结 2019年世界依旧不太平&#xff0c;在表面平静的背后是暗流涌动。大规模军事冲突不会发生的当下&#xff0c;因利益&#xff0c;…

Python全栈开发(一)——环境搭建和入门

今天是2023年的第一天&#xff0c;接下来的一个月里&#xff0c;我将持续更新关于python全栈开发的相关知识&#xff0c;前面一段时间都是基础语法。主要分成四大块&#xff1a;基础、面向对象、MYSQL数据库、Django框架。话不多说&#xff0c;进入到今天的主题。 1.文档和工具…

聊聊最适合程序员的画图工具

画图工具 没问题&#xff0c;直接坦白讲&#xff0c;我用了 2 年的画图工具是&#xff1a;draw.io。 我的图解文章里的图片全是在 draw.io 这个工具画的&#xff0c;写了那么久的图解文章&#xff0c;再加上我工作中也有画图的习惯&#xff0c;累计也有在上面画了接近 1000 张…

树形压缩DP——没有上司的舞会

树形压缩DP——没有上司的舞会一、问题描述二、DFS暴搜1、算法思路2、代码实现三、DP做法一、问题描述 二、DFS暴搜 1、算法思路 这道题其实最容易想到的是暴力DFS&#xff0c;然后选出一个最大值。我们平时会在DFS的形参中设置一个变量表示子树的根。但是今天这道题还涉及到…