#include "STC15F2K60S2.h"
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
uchar LED1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //模式1
uchar LED2[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //模式2
uchar LED3[4]={0x7e,0xbd,0xdb,0xe7}; //模式3
uchar LED4[4]={0xe7,0xdb,0xbd,0x7e}; //模式4
uchar LED;
bit pwmFlag = 0;
uint pwm_t = 0;
uint gap;
uchar num;
uchar led_mode;
uchar cylc;
uint pwm_duty = 0; //cycle(周期)-pwm_duty==高电平时间,
//Pwm_duty越大,高电平时间越少,低电平时间越长led越亮
void Timer0Init(void) //1毫秒@12.000MHz T0 12T
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
EA = 1; ET0=1;
}
void setled()
{
switch(led_mode)
{
case 1:if(num>=8)num=0;LED=LED1[num];break;//led1
case 2:if(num>=8)num=0;LED=LED2[num];break;//led2
case 3:if(num>=4)num=0;LED=LED3[num];break;//led3
case 4:if(num>=4)num=0;LED=LED4[num];break;//led4
}
}
void ServiceTimer0() interrupt 1
{
pwm_t++;
if(pwm_t<=cylc)
{
if(pwm_t<=pwm_duty)//低电平---pwm_duty(高电平),led亮,led熄灭
// 通过pwm_duty调节来改变亮度
setled(); //点亮led
else //pwm_duty(高电平)---100,led熄灭
LED=0xff;
}
else
{
pwm_t=0; //(0-100)周期结束重新定时
if(pwm_duty==cylc) //100-pwm_duty==高电平时间,低电平为100,完全点亮
pwmFlag=1; //开始渐灭标志位
if(pwm_duty==0) //100-pwm_duty==高电平时间,低电平为0,完全熄灭
{ pwmFlag=0; num++; } //开始渐亮标志位,下一个led灯
if(pwmFlag==0)
pwm_duty++; //cylc-pwm_duty==高电平时间,高电平减少,低电平增加,渐亮
else if(pwmFlag==1)
pwm_duty--; //cylc-pwm_duty==高电平时间,高电平增加,低电平减少,渐灭
}
}
void main()
{
Timer0Init();
led_mode=2; //流转模式
gap=1000; //流转间隔ms
cylc=sqrt(gap/2); // 流转间隔ms(gap)=2(改变标志位时间)*周期(亮)*周期(灭)
// cylc= sqrt(gap/2)
//数学太菜。公式可能不太准欢迎大神指导
while(1)
{
P2=0x80;
P0 = LED;
}
}
蓝桥杯流转呼吸灯
于 2023-03-25 22:16:31 首次发布