51单片机的LED与数码管的驱动

1、编写C51代码,实现流水灯字变花型:

/***********************************************************
* 实验功能       : LED实现流水灯花型控制
*************************************************************/
# include<reg51.h>

void delay(unsigned int z)
{
    unsigned int x,y;
    for(x=z;x>0;x--)
        for(y=100;y>0;y--);
}

timer0() interrupt 1    
{   
    static unsigned int tt; //tt用来保存当前时间在一秒钟的比例位置
    tt++;    //每250us增加1
    if(tt==10)   //2.5ms的时钟周期
        tt=0;       //使tt=0,开始新的PWM周期

}

void run(int *a,int len)
{
        unsigned int k;
        for(k=0;k<len;k++){
            P0 = a[k];
            delay(100*len);  
        }
}
void main(void)
{
    int a[]={0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00};
    int b[]={0X01,0X03,0X7,0X0F,0X1F,0X3F,0X7F,0XFF};
    int c[]={0X00,0X18,0X3C,0X7E,0XFF};
    int d[]={0XE7,0XC3,0X81,0X00};

    TMOD=0x02;   //T0:工作模式2,8位定时模式
    TH0=0x06;   //装T0初值,使250us溢出一次(12MHz)                  
    TL0=0x06;
    TR0=1;     //启动T0
    ET0=1;     //允许T0中断
    EA=1;      //允许总中断

    while(1){
        run(a,9);
        run(b,8);
        run(c,5);
        run(d,4);
    }
}

2、实现八个LED的三级亮度变化:

#include"reg51.h"  //模拟PWM输出控制灯的10个亮度级
unsigned int scale;  //占空比控制变量
void main(void)
{
    unsigned int n;   //延时循环变量
    TMOD=0x02;   //T0:工作模式2,8位定时模式
    TH0=0x06;   //装T0初值,使250us溢出一次(12MHz)                  
    TL0=0x06;
    TR0=1;     //启动T0
    ET0=1;     //允许T0中断
    EA=1;      //允许总中断
    while(1)
    {
        for(n=0;n<50000;n++);/*延时*/
        scale+=4;   //占空比控制变量加4(0,4,8三种),使得实验现象更清晰
        if(scale>=10)
            scale=0;
    }
}
/*********************************************************
程序名称:T0中断服务程序
程序功能:程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平;由于scale是变量,所以改变scale就可以改变占空比。
**********************************************************/
timer0() interrupt 1    
{   
    static unsigned int tt; //tt用来保存当前时间在一秒钟的比例位置
    tt++;    //每250us增加1

    if(tt>=10)   //2.5ms的时钟周期
    {
        tt=0;       //使tt=0,开始新的PWM周期
        P0=0xFF;   //LED灯亮(LED灯为阴极接地)
    }

    if(scale==tt)  //按照当前占空比切换输出为高电平
        P0=0x00;  //使LED灯灭
}

3、动态驱动八位数码管,显示两人学号:

/***********************************************************
* 实验功能       : 8位数码管动态驱动,显示二人学号
*************************************************************/
#include<reg51.h>   
#define GPIO_DIG P0   //定义要使用的IO口    
void Delay10ms(unsigned int c);   //声明延时函数                                    
//unsigned char code DIG_CODE[10]={0x3F,0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};  //共阴数码管0~9的段码

unsigned char code DIG_CODE_KANG[] = {0X3F,0X6D,0X06,0X66,0X7F,0X06,0X4F,0X6F};//学号共阴码
unsigned char code DIG_CODE_ZHANG[] = {0X3F,0X6D,0X06,0X66,0X7F,0X06,0X66,0X3F};//学号共阴码
unsigned char code choose[] = {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//位选共阳码

void main(void)
{
    unsigned char i = 0;
    unsigned int n = 0; 
    while(1){
        P0 = 0X00;
        Delay10ms(500);
        n = i = 0;
        while(1)
        {                                               
            P2 =  ~choose[i];/*位选*/
            GPIO_DIG = DIG_CODE_KANG[i];/*段选*/
            i++;
            n++;
            Delay10ms(1);
            if(i == 8)/*动态控制,循环显示*/
                i = 0;
            if(n == 300)/*保证学号不是一闪而过,而是动态循环300个周期,两秒左右时间*/
                break;
        }
        /*第一个人的学号显示完之后,变量全部清零并且延时片刻*/
        n = i = 0; 
        P0 = 0X00;
        Delay10ms(500);
        while(1)
        {                                               
            P2 =  ~choose[i];
            GPIO_DIG = DIG_CODE_ZHANG[i];
            i++;
            n++;
            Delay10ms(1);
            if(i == 8)
                i = 0;
            if(n == 300)
                break;
        }
    }

}

void Delay10ms(unsigned int c)   //延时函数
{
    unsigned char a, b;     
    for (;c>0;c--)   //--函数调用时,c已经被赋值,此处不用再赋初值
        for (b=5;b>0;b--)
            for (a=130;a>0;a--);

}

4、用四位数码管实现0~9999计数器:

/***********************************************************
* 实验功能       : 4位数码管实现0~9999的计数器
*************************************************************/
#include<reg51.h>        
void Delay10ms(unsigned int c);   //声明延时函数                                    
void show(int choose_bit,int number);        //声明段选显示与位选函数

unsigned char code TIMER[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};      /*段选共阴码*/
unsigned char code choose[] = {0X01,0X02,0X04,0X08};         /*位选共阳码*/

void main(void)
{
    unsigned char i = 0, j = 0, k = 0, m = 0;

    while(1)
    {   
        for(i=0;i<10;i++)
            for(j=0;j<10;j++)
                 for(k=0;k<10;k++)
                        for(m=0;m<10;m++){
                            show(0,i);
                            show(1,j);
                            show(2,k);
                            show(3,m);
                        }
    }               
}
 /*延时函数*/
void Delay10ms(unsigned int c)  
{
    unsigned char a, b;     
    for (;c>0;c--)  
        for (b=5;b>0;b--)
            for (a=130;a>0;a--);

}
/*段选与位选,动态驱动*/
void show(int choose_bit,int number)
{
    P2 = ~choose[choose_bit];
    P0 = TIMER[number];
    delay(1);
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值