51单片机-数码管

发布者:大头玩家最新更新时间:2015-04-09 来源: cechina关键字: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();
                } 
        }                         
}

    想让哪个数码管亮多少就亮多少:
[page]
    
      #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++;
关键字:51单片机  数码管  二极管 引用地址:51单片机-数码管

上一篇:基于51单片机的太阳能草坪灯设计
下一篇:51单片机-定时器

推荐阅读最新更新时间:2024-03-16 13:57

51单片机:定时器与中断系统的运用
#include regx52.h void Delay(int time) { while(time--) //while循环一次需要10us { } } void Timer0Init(void) //1毫秒@11.0592MHz { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x66; //设置定时初值 TH0 = 0xFC; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; EA = 1;
[单片机]
<font color='red'>51单片机</font>:定时器与中断系统的运用
51单片机总线与非总线的程序对比
简介:三总线简称ADC,这总是让我想起ADC的芯片,A是地址总线,D是数据总线,C是控制总线,是控制片外ROM、RAM和I/O的。 #include #include #define uchar unsigned char #define uint unsigned int uchar code table = The distance is ; uchar code table1 = 00.0cm ; sbit shuru=P1^0; sbit yidianling=P1^0; sbit yidianyi=P1^3;//延时 void delay(uint z) { uint x,y;
[单片机]
<font color='red'>51单片机</font>总线与非总线的程序对比
51单片机C语言编程中对单片机绝对地址访问的两种方法
在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间。 C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定。 为了能够在C51程序中直接对任意指定的存储器地址进行操作,可以采用扩展关键字“at”、指针、预定义以及连接定位控制命令。 在这些方法中,本人认为最简单而有效的方法是用“ _at_ ”关键字来对指定变量存储器空间绝对地址来指定。一般格式如下: 数据类型 标识符 _at_ 地址常数 其中: (1).存储器类型: idata、data、xdata等C51能够识别的所有类型,最好不要省略。 (2).数据类型: 可以用in
[单片机]
基于51单片机的两相步进电机控制系统
硬件设计 代码设计 #include MAIN.H #include LCD1602.h #include PCF8591.h unsigned char code FFW_X ={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //X反转顺序 unsigned char code FFZ_X ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //X正转顺序 unsigned char code FFW_Y ={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //Y反转顺序 unsigned cha
[单片机]
基于<font color='red'>51单片机</font>的两相步进电机控制系统
51单片机驱动16×16LED点阵显示动画汉字汇编程序
电路图就不贴出来了16×16LED点阵的典型接法。这里提供一个完整的AT89S51单片机驱动驱动led点阵显示具有动画效果的汉字的汇编程序列子. ORG 0000H ST: MOV A,#0FFH ;初始化 MOV P1,A MOV P2,A MOV P3,A MOV P0,A CLR A MOV R0,#50H ;显示缓存清0 MOV R1,#20H ;控制清0的次数 ST0: MOV @R0,A INC R0 DJNZ R1,ST0 ;正文显示 CHINESE: MOV DPTR,#TAB1 ;查表指针指向TAB1 LCALL
[单片机]
STM32三线控制八个发光二极管(74HC595)
STM32三线控制八个发光二极管是典型的IO扩展应用,思路和学习51单片机时一致,下面直接上图和代码! 简述: 1.74HC595D这里使用的5V供电,和STM32间通过MOS管做电平转换处理; 2.74HC595D使用11、12、14脚 PIN11- SHCP shift register clock input 移位时钟 PIN12- STCP storage register clock input 锁存时钟 PIN14- SI serial data input 串行数据 代码: #include 74HC595D.h #include delay.h u8 CHx_LED;//指示灯控制字 111
[单片机]
STM32三线控制八个发光<font color='red'>二极管</font>(74HC595)
stc51单片机硬件SPI驱动nrf24l01程序
stc51系类单片机大多数带SPI模块,例如STC12C5608AD,就带有SPI口,可以直接用此SPI口驱动nrf24l01,省去模拟SPI的麻烦。 spi初始化代码如下: void SPI_Init(void) { SPSTAT |= 0XC0; // 清高两位, SPCTL = 0XD0; // 设置为主模式,开SPI } spi收发数据代码如下: uchar SPI_RW(uchar tr_data) { uchar i=0; SPSTAT |= 0Xc0; // 清高两位, SPDAT=tr_data; while(((SPSTAT&0X80)!=0X80)&&(i 20)) { i++; delay_ms(1)
[单片机]
8051单片机由什么组成 8051单片机有多少管脚
8051单片机介绍 8051单片机是一款广泛应用于嵌入式系统中的8位单片机,由Intel公司在1980年推出,是当时业界最先进的8位单片机之一,也是单片机领域的经典之作。 8051单片机具有较低的功耗、高度集成、强大的功能和易于编程等优点,广泛应用于各种嵌入式系统中,如家电控制、自动化设备、工业控制、仪器仪表、汽车电子、通讯设备、电子游戏等领域。 8051单片机内部包含了CPU、存储器、定时器、串行通信接口、并行输入输出端口等基本模块,同时还具有多种外设和扩展接口,可以根据不同应用需要进行灵活配置和扩展。 在编程方面,8051单片机支持多种编程语言和开发工具,如C语言、汇编语言、BASIC语言等,并且有许多成熟的开源或商业的集
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved