STC15单片机呼吸灯程序
主控 | STC15W4K61S4 |
---|---|
频率 | 24Mhz |
该程序用了PCA/PWM作为LED的驱动,因为目标板(15F2K60S2)上没有增强型PWM,其实STC的15系列和8系列基本的硬件外设兼容性还是不错的,稍加修改或者不修改就可以运行的。
例程注释很详细,有问题可以留言,看到必回。
#include <stc15.h>
void PWM_Init(void);
void Timer0_Init(void);
void PWM_IO_Init(void);
void Timer2_Init(void);
bit Timer2_1sf; //时间刻度标志,=Timer2中断的设定
bit zengjian; //决定渐灭还是渐亮
int main(void)
{
Timer0_Init();
PWM_IO_Init();
PWM_Init();
Timer2_Init();
while(1)
{
if(P35) //PWM0输出引脚
P55 = 1; //由于板子上的灯在P55上,所以在此处判断控制
else
P55 = 0;
if(CCAP0H==255)
zengjian=1;
if(CCAP0H==0)
zengjian=0;
if(Timer2_1sf && !zengjian)
{
Timer2_1sf = 0;
CCAP0H += 1; //渐亮
}
if(Timer2_1sf && zengjian)
{
Timer2_1sf = 0;
CCAP0H -= 1; //渐灭
}
}
}
void PWM_Init(void) //PWM0使能并输出在P3.5
{
CMOD = 0x84; //定时器0的溢出作为CAP时钟
CCAPM0 |= 1<<1; //PWM0使能
CCAPM0 |= 1<<6; //ECOM0比较器使能
PCA_PWM0 = 0x00; //8位PWM
AUXR1 |= 1<<4; //0,1 选择第二组管脚序列
CCAP0H = 0x00; //此处为PWM占空比调节,作为下个周期的装载值
CCAP0L = 0x00; //PWM实际控制值
CL = 0xFF; //设置0xFF使得定时器0下次溢出后清零CL并重装PWM实际控制值
CCON |= 1<<6; //启动
}
void Timer0_Init(void) //1微秒@24.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xE8; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void PWM_IO_Init(void)
{
P3M0 |= 0xE0; //PWM P3.5~P3.7推挽输出
P3 &= 0x1F; //P3.5~P3.7默认输出低
P1 = 0xFF; //P1用于按键检测
}
void Timer2_Init(void) //1ms @24.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x40; //设置定时初始值
T2H = 0xA2; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
EA = 1; //开总中断
IE2 |= 1<<2; //ET2中断
}
void Timer2_E(void) interrupt 12
{
static unsigned int T;
if(T<10) //时间刻度大小(10ms)
T++;
else
{
T = 0;
Timer2_1sf = 1;
}
}