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

来源:互联网 发布:云计算的特点分类应用 编辑:程序博客网 时间:2024/05/22 09:51

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 0
原创粉丝点击