方法1:通過for循環簡單粗暴的實現呼吸燈
#include <ioCC2530.h>
#define D1 P1_0
void Init_Port()
{
P1SEL &=~0x01;
P1DIR |= 0x01;
D1 = 0;
}
void delay(unsigned int j)
{
while(j--);
}
void main()
{
Init_Port();
while(1)
{
unsigned char i;
for(i=0; i<100; i++)
{
D1 = 1;
delay(100*i);
D1 = 0;
delay(100*(100-i));
}
for(i=0; i<100; i++)
{
D1 = 1;
delay(100*(100-i));
D1 = 0;
delay(100*i);
}
}
}
方法2:簡單的PWM
#include <ioCC2530.h>
#define D1 P1_0
#define SW1 P1_2
void Init_Port()
{
P1SEL &= ~0X03;
P1DIR |= 0X03;
P1 &= ~0X03;
}
void delay(int time)
{
while(time--);
}
void main()
{
Init_Port();
int i,j=1000;
int flag = 1;
while(1)
{
if(flag)
{
D1 = 1;``
delay(i++);
D1 = 0;
delay(j--);
if(j == 0)
flag = 0;
}
else
{
D1 = 1;
delay(i--);
D1 = 0;
delay(j++);
if(i == 0)
flag = 1;
}
}
}
方法三:定時器
#include <ioCC2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
void InitLed(void)
{
P1DIR |= 0x01;
LED1 = 1; //默認滅
}
void InitT1()
{
CLKCONCMD &= ~0x40; //設置系統時鍾源為32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振為32M
CLKCONCMD &= ~0x07; //設置系統主時鍾頻率為32MHZ
CLKCONCMD |= 0x38; //設置定時器所分頻率為250KHZ
PERCFG |= 0x40; //選擇定時器1映射的IO口位置,選擇備用位置2,映射的IO口就是P1_0
P2SEL &= ~0x10; //設置優先級,定時器1優先
P2DIR |= 0xC0; //設定第1優先級:定時器1通道2-3
P1DIR |= 0x01; //設置P1_0為輸出
P1SEL |= 0x01; //P1_0配置為外設功能對應定時器1
T1CC2H = 0x00; //T1CC2H為T1CC0的高位,T1CC2L為T1CC0的低位
T1CC2L = 0x00; //修改T1CC2L可調整占空比,此處的設置決定比較時的值
T1CC0H = 0x00; //
T1CC0L = 0xff; //
T1CCTL2 = 0x1c; //設置模式
T1CTL = 0x02; //頻率250KHz 1分頻,運行模式為模模式
}
void Delay_us(uint t)
{
while(t--)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
void main(void)
{
InitLed();
InitT1();
uint a = 0x00;
uint b = 0x00;
while(1)
{
a++; //改變通道2的定時值
Delay_us(10000);
T1CC2H = b;
T1CC2L = a;
if(a == 0xff)
{
while(1)
{
a--;//改變通道2設置的定時值
Delay_us(10000);
T1CC2H = b;
T1CC2L = a;
if(a == 0)
break;
}
}
}
}
方法思路都是通過改變PWM,調節在一個周期內燈的亮滅狀態所占的百分比來實現PWM的改變
剛開始改變PWM的頻率小於人眼識別圖像的頻率,變成了LED閃爍。后面使占空比改變的頻率大於人眼識別頻率,出現了呼吸燈效果