简介:运用
一、定时器和中断的概念
三、案例
#include "reg52.h"
sbit LED1 = P3^7;
sbit LED2 = P3^6;
int cnt = 0;
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//定时器
void Timer0Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//中断
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
}
void main()
{
LED2 = 1;
Timer0Init();
while(1)
{
LED2 = 0;
Delay100ms();
LED2 = 1;
Delay100ms();
}
}
//定时器中断控制LED1
void Time0Handler() interrupt 1
{
cnt++; //统计爆表次数
//重新给初值
TL0 = 0x00;
TH0 = 0xDC;
if(cnt == 100){ //当爆表次数达到100 经过了1s
cnt = 0; //当100次表示1s,初始化cnt 计算下一次1s
LED1 = !LED1; //每经过1s,LED2状态改变
}
}
四、定时器中断控制方式
五、PWM介绍
重点(面试会问):占空比一个周期内,高电平占据时长百分比
六、如何实现PWM信号输出
七、案例(编程控制sg90舵机)
#include "reg52.h"
sbit sg90 = P1^1;
int jd;
int cnt = 0;
void Delay200ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 9;
j = 104;
k = 139;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay800ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 34;
j = 159;
k = 59;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//定时器
void Timer0Init(void) //20毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
//中断
void break_off()
{
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
}
void main()
{
//运行前让硬件缓冲稳定一下
Delay200ms();
//调用定时器和中断函数
Timer0Init();
break_off();
jd = 1; //初始角度是0度,0.5ms,溢出1就是0.5,高电平
cnt = 0;
sg90 = 1; //一开始从高电平开始
//每隔两秒切换一次角度
while(1)
{
jd = 3;
cnt = 0;
Delay800ms();
jd = 1;
cnt = 0;
Delay800ms();
}
}
void open() interrupt 1
{
cnt++;
//重新给初值
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
//控制PWM波
if(cnt < jd){
sg90 = 1;
}else{
sg90 = 0;
}
if(cnt == 80){
cnt = 0;
sg90 = 1;
}
}