51单片机-数码管

发布时间:2011-3-22 11:41    发布者:techshare
关键词: 51单片机 , 数码管



  共阴极是指所有发光二极管阴极连接在一起,这个共阴极可以用来做片选。

  



  如图,这里有8个发光二极管,到底哪个亮需要进行片选。

  段选:8段数码管每一段的控制段叫段选

  位选:就是进行哪个8段数码管亮的选择

  TX-1C使用两片锁存器74HC573实现位选和段选

  



  这里的D0"7是连在单片机的I/O口上,当为高电平时,Q与D中的数据一致,遇到负跳变沿时Q中的

  数据保持住,D中的数据即使变化也不会影响Q。

  MCU Version2使用的是74HC245和38译码器74HC138

  





  74HC245有一个缓冲和驱动的作用,这样可以使led显示的更加稳定,

  数码管显示分动态显示和静态显示,每个数码管的状态都是被不断更新的,利用的人的视觉暂留,

  使看上去数值保持在一个固定的位置上,人的视觉是有延续性的,当一个东西不断变化时,变化

  的时间小于人眼的视觉暂留时间的话,人的眼睛会以为这个东西是连续的。静态显示是一幅画面

  放在那看上去是不动的而它确实是不动的。动态扫描显示即轮流向各位数码管送出字型码和相应

  位选,利用发光管的余晖和视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

  静态显示:

  数码管从左向右依次点亮:

  
    #include <reg52.h>

void delay(){
        int i,j;
        for(i = 0; i < 0xff; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}
unsigned int code duan[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};

unsigned int code wei[]={
        0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};

void main(){
        while(1){
                int i;
                P2 = 0x39;
                for(i = 0; i < 8; i++){
                        P2 = duan[ i];
                        P1 = wei[ i];
                        delay();
                }
        }                        
}

    想让哪个数码管亮多少就亮多少:

   
      #include <reg52.h>

void delay(){
        int i,j;
        for(i = 0; i < 0xff; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}
unsigned char code duan[]={
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
      0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char code wei[]={
        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};

void show(unsigned char we,unsigned char du){
        P1 = wei[we];
        P2 = duan[du];
        delay();
}
void main(){
        while(1){
                show(1,5);
        }                        
}
   

   
动态显示: 3个数码管从0"999计数。
      




  #include <reg52.h>

unsigned int code duan[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6f};

unsigned int code wei[]={
        0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};

unsigned int num,sum;

void delay(int k){
        int i,j;
        for(i = 0; i < k; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}

void display(unsigned int bai, unsigned int shi, unsigned int ge){
        P1 = 0x0;
        P2 = duan[bai];
        delay(1);                       //少延时一些数码管更亮,如果延时很大就
        P1 = 0x1;                       //变成静态的了
        P2 = duan[shi];
        delay(1);
        P1 = 0x2;
        P2 = duan[ge];
        delay(1);
}
void main(){
        EA = 1;                                   
        ET1 = 1;
        TMOD = 0x10;
        TR1 = 1;
        num = 0;
        sum = 0;
        TH1 = (65535 - 50000) / 256;
        TL1 = (65535 - 50000) % 256;
        while(1){
                if(num == 20){          //每一秒计数增加1
                        num = 0;
                        if(sum == 1000)
                                sum = 0;     //用3位数码管显示,当达到1000时从头显示
                        sum++;
                }
                display(sum/100,sum%100/10,sum%10);        
        }        
}

void time1() interrupt 3{
        TH1 = (65535 - 50000) / 256;
        TL1 = (65535 - 50000) % 256;
        num++;
}








  #include <reg52.h>

unsigned char code duan[]={
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D};

void delay(int k){
        int i,j;
        for(i = 0; i < k; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}

void display(){
        int i;
        for(i = 1; i < 7; i++){
                P1 = i-1;
                P2 = duan[7-i];
                delay(1);
        }
}

void main(){
        while(1){
                        display();                                       
        }        
}

  

     


  
    #include <reg52.h>

unsigned int num,sum;

unsigned int code duan[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6f};

void delay(int m){
        int i,j;
        for(i = 0; i < m; i++)
                for(j = 0; j < 0xff; j++)
                        ;
}

void display(int n1,int n2,int n3){
        P1 = 0;
        P2 = duan[n1];
        delay(1);
        P1 = 1;
        P2 = duan[n2];
        delay(1);
        P1 = 2;
        P2 = duan[n3];
        delay(1);
}

void main(){
        EA = 1;
        ET1 = 1;
        TMOD = 0x10;
        TR1 = 1;
        sum = 0;
        num = 0;
        TH1 = (65535 - 50000) / 256;
        TL1 = (65535 - 50000) % 256;
        while(1){
                if(num == 1){
                        num = 0;
                        sum++;
                }
                if(sum == 1000)
                        sum = 0;
                display(sum/100,sum%100/10,sum%10);                                
        }
}

void time1() interrupt 3{
        TH1 = (65535 - 10000) / 256;
        TL1 = (65535 - 10000) % 256;
        num++;
}


李万鹏
本文地址:https://www.eechina.com/thread-59324-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
williamkmcn 发表于 2011-7-7 16:53:51
好东西值得收藏
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表