/**********************51单片机学习例程************************
* 平台:Keil U4 + STC89C52
* 名称:定时器0,方式2,输出PWM,周期2000us占空比每120ms改变5%,控制呼吸灯
* 编写:Tony
* 日期:2022-1-27
* QQ : 674749794
* 晶体:12MHZ
* 变更记录:无
******************************************************************/
#include
unsigned char ZHOUQI_COUNT; //进入中断的次数,满一个周期清零,计20次,周期2ms
unsigned char PWM_VALUE; //当前高电平对应的定时次数
unsigned int UPDATA_COUNT; //占空比更新时间,计1200次,120ms更新一次占空比
bit direc_flag; //占空比更新方向,0增加,1减少
sbit led= P1^0;
void Timer0_Init();
/********************************************
定时器0初始化函数,8位定时器,0.1ms溢出一次,开启中断
********************************************/
void Timer0_Init()
{
TMOD=0x02; //模式设置,0b0000 0010,定时器0,工作模式2,8位定时器 (M1=1,M0=0)
ET0=1; //开启定时器0中断
TH0=0x9c; //0.1ms溢出
TL0=0x9c; //
EA=1; //开启总中断
TR0=1; //使能定时器0
}
void main()
{
UPDATA_COUNT=0;
ZHOUQI_COUNT=0;
PWM_VALUE=10;
direc_flag=0;
led=0;
Timer0_Init();
while(1);
}
void Timer0_In() interrupt 1
{
ZHOUQI_COUNT++; //计数加1
UPDATA_COUNT++;
if(ZHOUQI_COUNT==PWM_VALUE) //判断是否到点亮led的时候
led=1;//亮led
if(ZHOUQI_COUNT==20)//当前周期结束
{
ZHOUQI_COUNT=0; //重新计时
led=0; //熄灭led
}
if(UPDATA_COUNT==1200&&(direc_flag==0)) //120ms
{
UPDATA_COUNT=0;
PWM_VALUE++; //占空比增加5%
if(PWM_VALUE==19)
{
direc_flag=1; //占空比方向改变
}
}
if(UPDATA_COUNT==1200&&(direc_flag==1))
{
UPDATA_COUNT=0;
PWM_VALUE--; //占空比减少5%
if(PWM_VALUE==1)
{
direc_flag=0;
}
}
}