lesson4~数码管的动态扫描

1.动态显示:

动态显示的原理:

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

2.利用定时器的延时子程序:

利用定时器代替延时函数,切时间更加精确.

#include<reg52.h>//利用定时器让第一个LED灯闪烁
unsigned char a;
sbit d1 = P1^0;
void main()
{
    TMOD = 0x01;//设置定时器0为工作状态
    TH0 = (65536 - 50000)/256;//定时器将从15536加到65536共50毫秒(经计算准确的50毫秒应将50000改为46080)
    TL0 = (65536 - 50000)%256;
    EA = 1;//开总中断
    ET0 = 1;//开启定时器0中断
    TR0 = 1;//开启定时器0
    while(1)
    {
        if(a==20)//经过20个50毫秒即1秒后第一个LED灯亮.
        {
            a=0;//将a复位
            d1 = 0;
        }
        if(a==20)//同理
        {
            a=0;
            d1 = 1;
        }
    }
}
void delay() interrupt 1//中断1为定时器0的标志
{
    TH0 = (65536 - 50000)/256;
    TL0 = (65536 - 50000)%256;
    a++;//经过50毫秒后a自增1.
}

3.数码管的动态扫描:

上一章数码管的静态扫描中只能控制任意几个数码管显示相同的字符,而数码管的动态扫描中可以让数码管显示不同的字符.

例程序如下:

该程序利用每次只亮一个数码管,然后每次输入不同的字符以达到动态扫描的目的,程序的运行结果为数码管每个一秒左右依次显示1,2,3,4,5,6
#include<reg52.h>
sbit dula = P2^6;
sbit wela  = P2^7;
unsigned char  temp,aa,num;
unsigned int numdu,numwe;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};//控制显示屏显示的字符
unsigned char code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};//控制哪些显示屏亮
void main()
{
    numdu = 0;
    numwe = 0;
    aa=0;
    TMOD = 0x01;//使定时器0为工作状态
    TH0 = (65536 - 50000)/256;
    TL0 = (65536 - 50000)%256;
    EA = 1; //开外部总中断
    ET0 = 1;//开启定时器0中断
    TR0 = 1;//开启定时器0
    temp = 0xfe;
    P1 = temp;
    while(1)
    {
        if(aa==20)
        {
            numdu++;
            dula = 1;//打开断选     
            if(numdu == 7)
                numdu = 1;
            P0 = table[numdu];//选择哪些数码管亮
            dula = 0;//关闭断选
            wela = 1;//打开位选
            if(numwe == 6)
                numwe = 0;
            P0 = tablewe[numwe];//输入需要显示的字符
            wela = 0;//关闭位选
            numwe++;//将数码管向后移一位,同时输入下一个字符
            aa = 0;//将aa重置
        }
    }
}
void enter() interrupt 1
{
    TH0 = (65536 - 50000)/256;
    TL0 = (65536 - 50000)%256;
    aa++;
}

4.数码管同时显示不同的字符:

例程序如下:

该程序可以让数码管显示123456;

其实基本和上面一样,只需要把延时部分时间调短,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示.
#include<reg52.h>
sbit dula = P2^6;
sbit wela  = P2^7;
unsigned char  temp,aa,num;
unsigned int numdu,numwe;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};//控制显示屏显示的字符
unsigned char code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};//控制哪些显示屏亮
void main()
{
    numdu = 0;
    numwe = 0;
    aa=0;
    TMOD = 0x01;
    TH0 = (65536 - 50)/256;//改变部分
    TL0 = (65536 - 50)%256;//改变部分
    EA = 1; 
    ET0 = 1;
    TR0 = 1;
    temp = 0xfe;
    P1 = temp;
    while(1)
    {
        if(aa==20)
        {
            numdu++;
            dula = 1;   
            if(numdu == 7)
                numdu = 1;
            P0 = table[numdu]
            dula = 0;
            wela = 1;
            if(numwe == 6)
                numwe = 0;
            P0 = tablewe[numwe];
            wela = 0;
            numwe++;
            aa = 0;
        }
    }
}
void enter() interrupt 1
{
    TH0 = (65536 - 50)/256;//改变部分
    TL0 = (65536 - 50)%256;//改变部分
    aa++;
}

6.小作品:

利用数码管&定时器制作一个简单但精确的电子时钟:

代码如下:

使用时只需将初始时间在程序中设置好然后再在设置的时间开启单片机即可当时钟一样.
#include<reg52.h>
sbit wela = P2^7;
sbit dula = P2^6;
unsigned int hourshi,hourge,fenshi,fenge,miaoshi,miaoge,a;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};//???????????
void delay(int c);//ÑÓʱ×Ó³ÌÐò
void display(int hourshi,int hourge);
void display1(int fenshi,int fenge);
void display2(int miaoshi,int miaoge);
void init();//³õʼ»¯×Ó³ÌÐò
void main()
{
    init();
    hourshi = 2;//设
    hourge = 1; //置
    fenshi = 4; //初
    fenge = 4; // 始
    miaoshi =2; //时
    miaoge = 0; //间
    /*21:44:20*/
    while(1)
    {
        display(hourshi,hourge);
        display1(fenshi,fenge);
        display2(miaoshi,miaoge);
        if(a==20)
        {
            a=0;
            miaoge++;
        }
        if(miaoge>9)
        {
            miaoge = 0;
            miaoshi++;
        }
        if(miaoshi>5)
        {
            miaoshi = 0;
            fenge++;
        }
        if(fenge>9)
        {
                fenge = 0;
                fenshi++;
        }
        if(fenshi>5)
        {
                fenshi = 0;
                hourge++;
        }
        if(hourge>9)
        {
                hourge = 0;
                hourshi++;
        }

    }
}
void enter() interrupt 1
{
    TH0 = (65536 - 46080)/256;
    TL0 = (65536 - 46080)%256;
    a++;
}//?????
void init()
{
    TMOD = 0x01;
    TH0 = (65536 - 46080)/256;
    TL0 = (65536 - 46080)%256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void display(int hourshi,int hourge)
{
    wela = 1;
    P0 = 0xfe;
    wela = 0;
    dula = 1;
    P0 = table[hourshi];
    dula = 0;
    delay(1);

    wela = 1;
    P0 = 0xfd;
    wela = 0;
    dula = 1;
    P0 = table[hourge];
    dula = 0;
    delay(1);
}
void display1(int fenshi,int fenge)
{
    wela = 1;
    P0 = 0xfb;
    wela = 0;
    dula = 1;
    P0 = table[fenshi];
    dula = 0;
    delay(1);

    wela = 1;
    P0 = 0xf7;
    wela = 0;
    dula = 1;
    P0 = table[fenge];
    dula = 0;
    delay(1);
}
    void display2(int miaoshi,int miaoge)
    {
    wela = 1;
    P0 = 0xef;
    wela = 0;
    dula = 1;
    P0 = table[miaoshi];
    dula = 0;
    delay(1);

    wela = 1;
    P0 = 0xdf;
    wela = 0;
    dula = 1;
    P0 = table[miaoge];
    dula = 0;
    delay(1);
    }

void delay(int c)
{
    int a,b;
    for(a=100;a>0;a--)
        for(b=c;b>0;b--);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值