一. 呼吸灯
呼吸灯:是指灯由亮逐渐变暗,再从亮逐渐变暗的一个过程。就好像人在呼吸一样。
单片机可以通过输出可调占空比的pwm波来实现
占空比:高电平时间与整个周期的比值
(通过调节频率调节灯的呼吸时间,通过调节占空比来调节亮度)
简易的呼吸灯代码;
#include "led.h"
#include "delay.h"
#include "sys.h"
void ledbreath(u16 t,u16 i)
{
PAout(8)=0;
PAout(8)=1;//电平先拉低,在拉高
delay_us(i);//高电平的时间
PAout(8)=1;
PAout(8)=0;//电平先拉高,再拉低
delay_us(t-i);//低电平的时间
} //形成一个基本的pwm波,但占空比在变,
int main(void)
{
int i=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
for(i=1;i<25000;i+=250)//25000,250,这两个参数随便调,只要效果明显就行了,先开始i增加占空比在增大
{
ledbreath(25000,i);
}
for(i=25000;i>1;i-=250)//后占空比开始减小
{
ledbreath(25001,i);
}
}
}
正点原子源码中的pwm波实验源码使用定时器pwm波做的其实是个呼吸灯实验,效果挺好的
流水灯
流水灯:顾名思义就是像灯像水一样流过
32上只有两个led灯,这里就用51单片机举个例子吧
知识点:移位操作
‘<<’:每执行一次指令,被操作的二进制数向左移动,低位补0。
'>>’: 用法类似。
代码
#include<reg52.h>
#define uchar unsigned char
void delay_ms(int);
uchar k;
void main()
{
k=0xfe;
while(1)
{
P1=k; //赋初值11111110
delay_ms(500);
k=k<<1;//左移1位后再付给k
//若要循环左移可改位k=_crol_(k,1)
//若要循环右移可改位k=_cror_(k,1)
}
}
void delay_ms(int x)
{
int i,j
for(i=x;i>0,i--)
for(j=110;j>0;j--);
}
这只是单纯左移,但要做大循环左移,这需要通过逻辑计算配合左移,但在51单片机中C51库中的函数:_crol_实现