今天有些路一个定时器控制LED的程序,原理比较简单。
使用的是定时器0,通过配置定时器0为定时模式就可以了,然后在程序中打开定时器,定时时间间隔设置的小一点,设置的太大会造成不流畅的情况。
我在程序中设置的是0.01ms,周期为100,通过跟戴duty就可以改变占空比。如果要控制舵机运动的话,可以将定时时间设置成0.2ms,这样100次就是20ms,就是多级的控制周期了,然后通过设置占空比就可以控制舵机运动了。
废话不多说了,上程序:
#include
#define uchar unsigned char
#define uint unsigned int
sbit pwm = P3^7; //定义PWM引脚为P3.7
uchar duty = 100;
void timer0_Init(void);
void Set_Duty(void);
void delay_ms(uint ms);
int main()
{
int i;
timer0_Init();
while(1)
{
for(i=100;i>0;i-=1)
{
duty = i;
delay_ms(1);
}
for(i=0;i<10;i+=1)
{
duty = i;
delay_ms(1);
}
}
}
//延时函数
void delay_ms(int ms)
{
uint i;
for(;ms>0;ms--)
for(i=0;i<110;i++);
}
//定时器0初始化
void timer0_Init(void)
{
TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=(65536-20)/256; //给定时器赋初值,50us
TL0=(65536-20)%256;
ET0=1; //允许定时器中断0
EA=1; //打开总中断
TR0=1; //打开定时器
}
//使用定时0模拟PWM
void timer0() interrupt 1
{
static uint pwm_count = 0;
TH0=(65536-10)/256; //给定时器赋初值,50us
TL0=(65536-10)%256;
pwm_count ++;
if(pwm_count >= 100)
{
pwm_count = 0;
}else if(pwm_count <= duty)
{
pwm = 0;
}else
{
pwm = 1;
}
}
其中duty变量就是占空比的控制变量。
展示效果,如下图动图所示:
可以看到LED呈现明暗的变化
期望大家支持:)
今天有些路一个定时器控制LED的程序,原理比较简单。
使用的是定时器0,通过配置定时器0为定时模式就可以了,然后在程序中打开定时器,定时时间间隔设置的小一点,设置的太大会造成不流畅的情况。
我在程序中设置的是0.01ms,周期为100,通过跟戴duty就可以改变占空比。如果要控制舵机运动的话,可以将定时时间设置成0.2ms,这样100次就是20ms,就是多级的控制周期了,然后通过设置占空比就可以控制舵机运动了。
废话不多说了,上程序:
#include
#define uchar unsigned char
#define uint unsigned int
sbit pwm = P3^7; //定义PWM引脚为P3.7
uchar duty = 100;
void timer0_Init(void);
void Set_Duty(void);
void delay_ms(uint ms);
int main()
{
int i;
timer0_Init();
while(1)
{
for(i=100;i>0;i-=1)
{
duty = i;
delay_ms(1);
}
for(i=0;i<10;i+=1)
{
duty = i;
delay_ms(1);
}
}
}
//延时函数
void delay_ms(int ms)
{
uint i;
for(;ms>0;ms--)
for(i=0;i<110;i++);
}
//定时器0初始化
void timer0_Init(void)
{
TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=(65536-20)/256; //给定时器赋初值,50us
TL0=(65536-20)%256;
ET0=1; //允许定时器中断0
EA=1; //打开总中断
TR0=1; //打开定时器
}
//使用定时0模拟PWM
void timer0() interrupt 1
{
static uint pwm_count = 0;
TH0=(65536-10)/256; //给定时器赋初值,50us
TL0=(65536-10)%256;
pwm_count ++;
if(pwm_count >= 100)
{
pwm_count = 0;
}else if(pwm_count <= duty)
{
pwm = 0;
}else
{
pwm = 1;
}
}
其中duty变量就是占空比的控制变量。
展示效果,如下图动图所示:
可以看到LED呈现明暗的变化
期望大家支持:)