目录
一、初探单片机中断
二、定时器中断相关寄存器
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;
}
}