呼吸灯程序


#nclude //51头文件


//《B_无级亮度变化》
#define DY_PORT     P1 //设置LED连接的I/O组
#define DY_SPEED    1 //设置每一个明亮级的停留时间(值域:0~65535)
#define DY_PWM      500 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX      500 //设置最大明亮(值域:小于明亮总级数)

void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
    unsigned char i;
    while( --a != 0){
        for(i = 0; i < 12; i++);
                       
}

void display (unsigned int a){ //显示程序(50ms的PWM宽度)
    DY_PORT = 0x00; //LED小灯亮
    delay (a);      //延时a的长度
    DY_PORT = 0xff; //LED小灯灭
    delay (DY_PWM-a);//延时总PWM长度减a
}

void main (void){ //主程序
    unsigned int t=1;
    unsigned int i;
    bit LOOP=0; //LOOP是循环切换标志
 
    while (1){
        if(LOOP == 0){ //变亮循环
            for(i = 0; i < DY_SPEED; i++){
                display(t);
            }
            t++;
            if(t>(DY_MAX-2)){
                LOOP = 1;
            }
        }
        if(LOOP == 1){ //变暗循环
            for(i = 0; i < DY_SPEED; i++){
                display(t);
            }
            t--;
            if(t<2){
                LOOP = 0;
            }
        }
    }
}


 从这里看起来就很有意思了。想渐明渐暗,用到的是PWM(脉冲宽度调制)。简单的讲,对于这个灯,就是调节暗和明的比例。

比如10为一个时间段的话,那么1/10为明,9/10为暗,这样亮度就算是1了。因为机器的时间段非常的短到人们看到的一直是连续的。

另外想到一点,当时序短到一定的程度的时候,那么本来连续的程序,变成为了并行(这话说得不是很严密,要看什么样的程序)。所以,我们能一边上qq,一边看网页。

另外,面向过程符合机器的思维,面向对象符合人的思维。

学嵌入式很有意思的一点就是,你可以理解到程序运行的本质。有一种掌控感,而拥有掌控这项技能的,似乎只有神。。。

我一直想,学计算机应该从底层学起,虽然让让人很提不起兴趣。

言归正传,说道这个程序,有个缺点,就是无法独立控制很多的LED灯。我查了很多的资料。却没有得到很明确的结果。倒是发现了一点国内教材的通病---- 天下文章一大抄。我买的基本教材,竟然大部分一样。更可恨的是,连图也一样。这让我情何以堪。后来我发现图的出处----单片机的使用说明书。感情这说明书就是最好的教材。其实不光我们技术比国外落后,教材也落后。就像大学里那些只会照着ppt读的老师一样恶心。

看了看单片机的说明书,发现上面有现成的PCA模块。可惜我的这个型号只能同时控制两路。在网上找到有控制16路的,目前还看不懂。

看来流星灯的制作,还是有点小困难的。还得继续研究。

下面是两路的程序

#include
 
//设置sfr
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAP1L = 0xFB;
sfr CCAP1H = 0xFB;
 
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
 
sbit CR = 0xDE;
 
void PWM_init(void)
{
    CMOD = 0x02;//设置PCA定时器
    CL = 0x00;
    CH = 0x00;
    //PWM0的设置
    CCAPM0 = 0x42;
    CCAP0L = 0x00;
    CCAP0H = 0x00;
    //PWM1的设置
    CCAPM1 = 0x42;
    CCAP0L = 0x00;
    CCAP0H = 0x00;
    CR = 1;//启动PCA定时器
}
//设置PWM0的参数
void PWM0_set(unsigned char a)
{
    CCAP0L = a;
    CCAP0H = a;
}
//设置PWM1的参数
void PWM1_set(unsigned char a)
{
    CCAP1L = a;
    CCAP1H = a;
}
 
void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
    unsigned char i;
    while( --a != 0){
        for(i = 0; i < 12; i++);
                       
}
void main(void)
{
    unsigned int i;
    PWM_init();//PWM初始化
    PWM0_set(0x00);//设置PWM0占空比
    PWM1_set(0x00);//设置PWM1占空比
    while(1)
    {
        for(i = 0;i < 256;i++)
        {
            PWM0_set(i);
            PWM1_set(256 - i);
            delay(100);
        }
        for(i = 256;i > 0;i--)
        {
            PWM0_set(i);
            PWM1_set(256 - i);
            delay(100);
        }
    }
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于呼吸灯的C语言编程Options 1,0,0 // Target 'Target 1' Device (AT89C51) Vendor (Atmel) Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000)) FlashUt () StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code")) FlashDR () DevID (2976) Rgf (REGX51.H) Mem () C () A () RL () OH () DBC_IFX () DBC_CMS () DBC_AMS () DBC_LMS () UseEnv=0 EnvBin () EnvInc () EnvLib () EnvReg (Atmel\) OrgReg (Atmel\) TgStat=16 OutDir (.\) OutName (a9) GenApp=1 GenLib=0 GenHex=1 Debug=1 Browse=1 LstDir (.\) HexSel=0 MG32K=0 TGMORE=0 RunUsr 0 0 RunUsr 1 0 BrunUsr 0 0 BrunUsr 1 0 SVCSID MODEL5=0 RTOS5=0 ROMSZ5=2 DHOLD5=0 XHOLD5=0 T51FL=80 XT51FL=0 CBANKS5=0 XBANKS5=0 RCB51 { 0,0,0,0,0,0,0,1,0 } RXB51 { 0,0,0,0,0,0,0,0,0 } OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IRO51 { 1,0,0,0,0,0,16,0,0 } IRA51 { 0,0,0,0,0,128,0,0,0 } XRA51 { 0,0,0,0,0,0,0,0,0 } XRA512 { 0,0,0,0,0,0,0,0,0 } IROM512 { 0,0,0,0,0,0,0,0,0 } C51FL=21630224 C51VA=0 C51MSC () C51DEF () C51UDF () INCC5 () AX51FL=4 AX51MSC () AX51SET () AX51RST () INCA5 () PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IncBld=1 AlwaysBuild=0 GenAsm=0 AsmAsm=0 PublicsOnly=0 StopCode=3 CustArgs () LibMods () BankNo=65535 LX51FL=292 LX51OVL () LX51MSC () LX51DWN () LX51LFI () LX51ASN () LX51RES () LX51CCL () LX51UCL () LX51CSC () LX51UCS () LX51COB () LX51XDB () LX51PDB () LX51BIB () LX51DAB () LX51IDB () LX51PRC () LX51STK () LX51COS () LX51XDS () LX51BIS () LX51DAS () LX51IDS () OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51) OPTDBG 48125,-1,()()()()()()()()()() ()()()() FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 } FLASH2 () FLASH3 () FLASH4 () EndOpt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值