蓝桥杯流转呼吸灯

#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;
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值