一、实现设置
定义一个边界例如为10,一个占空比在0-10之间。定义一个计数参数,在计时器中递增。
当计数参数小于占空比时亮灯;当计数参数大于于占空比时灭灯。
在设置占空比的函数中,每5次中断后更新占空比递增或递减(呼吸灯)/直接设置(电位器控制)。
二、呼吸灯/电位器控制代码示例
//呼吸灯实验现象:L1亮0.5秒灭0.5秒循环
//电位器控制实验现象:L1的亮度随RB2输出变化
//定时器定时1ms,边界为10,每5次更新一次占空比,递增占空比进行10次后,进入递减,故单次亮灭用时1*10*5*10=500ms
#include "stc15f2k60s2.h"
#include "iic.h"
#include "intrins.h"
code unsigned char SegNoDot_Table[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };
unsigned char Volt = 0;
unsigned char count = 0;
unsigned char pwm_duty = 0;
unsigned char flag = 0;
unsigned char stat_led = 0xff;
unsigned char times = 0;
unsigned char go = 0;
unsigned char PCF8591_Read();
void HC573_Choose(unsigned char channel, unsigned char value)
{
P2 = (P2 & 0x1f) | 0x00;
P0 = value;
switch(channel)
{
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;
}
P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_bit(unsigned char pos, unsigned char dat)
{
HC573_Choose(6,0x01 << pos);
HC573_Choose(7,dat);
DelaySMG(500);
HC573_Choose(6,0x01 << pos);
HC573_Choose(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
HC573_Choose(6,0xff);
HC573_Choose(7,value);
}
void DisplaySMG_Function()
{
DisplaySMG_bit(7,SegNoDot_Table[Volt % 10]);
DisplaySMG_bit(6,SegNoDot_Table[Volt / 10 % 10]);
DisplaySMG_bit(5,SegNoDot_Table[Volt / 100]);
}
void Init_Timer0()
{
TMOD = 0x00;
TH0 = (65535-1000)/256;
TL0 = (65535-1000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void Service_Timer0() interrupt 1 //在小于占空比时亮,大于时灭
{
count++;
if(count <= pwm_duty)
{
flag = 1;
}
else if(count <= 10)
{
flag = 0;
}
else
{
count = 0;
times++;
}
}
unsigned char PCF8591_Read()
{
unsigned char temp;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x03);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return temp;
}
void Function()
{
if(times == 5)
{
times = 0; //减轻了低亮度的闪烁情况
//电阻器控制亮度
Volt = PCF8591_Read();
pwm_duty = Volt * 10 / 255;
//呼吸灯
/*if(go == 0)
{
pwm_duty = pwm_duty + 1;
if(pwm_duty == 11)
{
pwm_duty = 10;
go = 1;
}
}
else if(go == 1)
{
pwm_duty = pwm_duty - 1;
if(pwm_duty == 255)
{
pwm_duty = 0;
go = 0;
}
}*/
}
if(flag == 1)
{
stat_led = 0xfe;
}
else
{
stat_led = 0xff;
}
}
void Init_sys()
{
HC573_Choose(4,0xff);
HC573_Choose(5,0x00);
DisplaySMG_All(0xff);
Init_Timer0();
}
void main()
{
Init_sys();
while(1)
{
Function();
HC573_Choose(4,stat_led);
DisplaySMG_Function();
}
}