单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2906|回复: 7
打印 上一主题 下一主题
收起左侧

给你的51单片机作品加个呼吸灯(程序)

[复制链接]
跳转到指定楼层
楼主
xiashan 发表于 2015-4-5 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;    //由暗变亮标识
                }
        }
}  




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
penghualin 发表于 2015-4-5 19:58 | 只看该作者
大神啊,赞一个
回复

使用道具 举报

板凳
爱德华 发表于 2015-4-5 22:47 来自手机 | 只看该作者
挺复杂的!
回复

使用道具 举报

地板
bhjyqjs 发表于 2015-6-2 09:15 | 只看该作者
顶一个
回复

使用道具 举报

5#
小伙子。 发表于 2015-6-2 11:06 | 只看该作者
看起来好厉害的样子
回复

使用道具 举报

6#
牧田 发表于 2015-6-2 11:39 | 只看该作者
看起来好厉害的样子
回复

使用道具 举报

7#
sszv 发表于 2017-10-21 16:51 | 只看该作者
为什么我烧录了之后是蜂鸣器在响
回复

使用道具 举报

8#
sszv 发表于 2017-10-21 16:52 | 只看该作者
为什么我烧录了之后是蜂鸣器在响?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

快速回复 返回顶部 返回列表