标题:
给你的51单片机作品加个呼吸灯(程序)
[打印本页]
作者:
xiashan
时间:
2015-4-5 18:27
标题:
给你的51单片机作品加个呼吸灯(程序)
本帖最后由 xiashan 于 2015-4-5 18:30 编辑
看着笔记本待机的时候,电源灯变成忽明忽暗,手就不自在了。
研究了一番,写出了代码,加到自己做的“玩具”上。
可能会觉得这个东西没有什么实在意义,只不过看起来没闪烁那么单调而已。
如果觉得有用,也可以加到自己的作品上,据说某mp3用呼吸频率来表示系统电量得多少,咱觉得还是蛮创意的。
如果你的系统有空余的定时器,或者已经使用了定时器,那不妨试试,唯一就是要占用两个字节的ram,和几十微秒的时间。
unsigned char t1=0,t2=0,c1=1;
bit c=1;
void timer_1() interrupt 3 using 3 //呼吸灯程序
{
TL1 = 0x3C; //200us
TH1 = 0xFF;
t1++; t2++;
if(t1 <= cl) led = 0; //这三行通过t1与cl比较,控制led亮灭,也就是PWM调光。
if(t1 > cl) led = 1; //
if(t1 == 40) t1 = 0; //
if(t2 == 250) //250次中断以后,进入以下语句,更改cl值,改变亮度。改变比较的值(250)
{ //可以调整闪烁速度。
t2=0;
if(c)
{
cl++;
if(cl == 41) c=0; //由亮变暗标识
}
if(!c)
{
cl--;
if(cl == 3) c=1; //由暗变亮标识
}
}
}
下面以我的开发板为例作个具体的程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0; //位定义;定义led灯是接到P1^0;
unsigned char t1=0,t2=0,c1=1;
bit c=1;
sbit wela=P2^6;
uchar code table[]={0x06,0x5b,0x4f};
uchar temp,num;
delay(uchar);
display(uchar);
void main()
{
TMOD=0x01;
TH0=0x3C;
TL0=0xFF;
EA=1;
ET0=1;
TR0=1;
while(1)
{
P3=0x7f;
temp=P3;
temp=temp&0x7f;
if(temp!=0x7f)
{
delay(50);
if(temp!=0x7f)
{
switch(temp)
{
case 0x6f: num=0;
break;
case 0x5f: num=1;
break;
case 0x3f: num=2;
break;
}
}
}
display(num);
}
}
delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
display(uchar num1)
{
P0=table[num1];
wela=0;
}
void timer_0() interrupt 1 //呼吸灯程序
{
TL1 = 0x3C; //200us
TH1 = 0xFF;
t1++; t2++;
if(t1 <= c1) led = 0; //这三行通过t1与cl比较,控制led亮灭,也就是PWM调光。
if(t1 > c1) led = 1; //
if(t1 == 40) t1 = 0; //
if(t2 == 100) //250次中断以后,进入以下语句,更改cl值,改变亮度。改变比较的值(250)
{ //可以调整闪烁速度。
t2=0;
if(c)
{
c1++;
if(c1 == 41) c=0; //由亮变暗标识
}
if(!c)
{
c1++;
if(c1 == 41) c=1; //由暗变亮标识
}
}
}
作者:
penghualin
时间:
2015-4-5 19:58
大神啊,赞一个
作者:
爱德华
时间:
2015-4-5 22:47
挺复杂的!
作者:
bhjyqjs
时间:
2015-6-2 09:15
顶一个
作者:
小伙子。
时间:
2015-6-2 11:06
看起来好厉害的样子
作者:
牧田
时间:
2015-6-2 11:39
看起来好厉害的样子
作者:
sszv
时间:
2017-10-21 16:51
为什么我烧录了之后是蜂鸣器在响
作者:
sszv
时间:
2017-10-21 16:52
为什么我烧录了之后是蜂鸣器在响?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1