原理:调节高低电平的占空比
#include "STC15F2K60S2.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar LED;
void SelectHC573(uchar val)
{
switch(val)
{
case 4 : P2 = (P2 & 0x1f) | 0x80; break;
case 5 : P2 = (P2 & 0x1f) | 0xa0; break;
case 6 : P2 = (P2 & 0x1f) | 0xc0; break;
case 7 : P2 = (P2 & 0x1f) | 0xe0; break;
default: P2 = (P2 & 0x1f); break;
}
}
void InitSystem()//系统初始化关闭蜂鸣器、继电器、LED
{
SelectHC573(5);
P0 = 0xbf; //由于不同板子的引脚接法不同,此时的初始值也不同
SelectHC573(4);
P0 = 0xff; //LED全灭
}
void Timer0Init(void) //100微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
uint pwmval = 0; //pwm高低电平时间设置,pwmval越大,led越亮
bit pwmFlag = 0; //PWM标志位,为0表示led越来越亮,为1表示led越来越暗
uint pwmCount = 0;
void ServiceTimer0() interrupt 1
{
uchar pushp0,pushp2;
pushp0 = P0;
pushp2 = P2;//入栈
pwmCount++;
if(pwmCount<=100) //100*100us=10ms,高低电平时间通过pwmva调节
{
if(pwmCount <= pwmval)//低电平时间
LED = 0x00; //将led状态暂时存储到变量LED中,避免直接对P0操作
else
LED = 0xff; //高电平时间
}
else
{
pwmCount=0;
if(pwmval==100)
pwmFlag=1;
if(pwmval==0)
pwmFlag=0;
if(pwmFlag==0)
pwmval=pwmval+1;
else
pwmval=pwmval-1;
}
P2 = pushp2;//出栈
P0 = pushp0;
}
void main()
{
InitSystem();
Timer0Init();
while(1)
{
SelectHC573(4);
P0 = LED; //此时,打开led的573,再将变量LED状态赋给P0
}
}
注意点:在蓝桥杯中,若想控制led,最好设置一个8位的变量,将led状态储存到该变量中,否则很可能会因为中断或者其他对P0口的设置状态而影响led状态。