找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 253|回复: 5
打印 上一主题 下一主题
收起左侧

求教89c52rc单片机六位一体数码管怎么可以第一次显示如123456

[复制链接]
跳转到指定楼层
楼主
求教89c52rc 六位一体数码管怎么可以第一次显示如(123456),第二次显示(338737),第三次显示(decfga),六个数同时显示(用delay(1)),三次显示间隔一秒
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:866313 发表于 2024-3-28 18:07 | 只看该作者
其实你只需要了解一个动态扫描的显示方式就可以实现了,我这里把我之前的学习笔记贴出来,我自己温故知新的同时希望对你也有所帮助。
数码管动态扫描显示原理
六位八段数码管的内部结构图如下(下图以共阳极为例)


由图可知,六位八段数码管当中,每个数码位的段选信号全部连接到了一起,然后进行输出(对于共阳极数码管来说,段选引脚为低电平时有电流从数码管的段选引脚流出);每个数码位单独引出一个位选信号用来控制数码位的选择,这种连接方式会使得被选中的数码位显示的内容都是相同的,因为这些被选中的数码位的段选信号已经全部连接到了一起。如何使用这个六位八段数码管来实现数码管的动态显示呢?我们需要使用一种方式:动态扫描
如何使用动态扫描的方式来实现数码管的动态显示呢?这里给大家举一个例子:比如说,我们想要使用六位八段数码管显示数字 123456



如何使用六位八段数码管来显示数字 123456 呢?
首先我们选中第一个数码位,让这个数码位显示数字 1;然后它显示的时间设为 T,这个 T 可以看作一个周期

当第一个数码位完成一个 T 周期数字 1 的显示之后,立刻选中第二个数码位;注意,此时只选中了第二个数码位让它显示数字 2,显示的时间同样是一个周期 T

当第二个数码位完成了一个周期 T 数字 2 的显示之后,立刻选中第三个数码位;这儿注意,也是只选中了第三个数码位让它显示数字 3,同样显示时间为 T

依次往下类推,那么此时就显示 4

然后是 5

然后是 6

当第六个数码位完成了一个周期 T 数字 6 的显示之后,再重新选中第一个数码位;这儿也是只选中了第一个数码位,让它继续显示数字 1,然后显示的时间仍然是 T 周期,这样依次往下循环。
通过上述动态显示过程的描述,我们知道这样一个循环是六个周期就是 6*T;如果说给这个 T 规定一个确切的时间会怎样呢?首先给 T 规定一个确切的时间 1s;如果说 T 等于 1s,六位八段数码管的六个数码位会依次显示 1、2、3、4、5、6 每个数字显示的时间为 1s,如下GIF动图所示

如果进一步把这个 T 进行缩短,比如说缩短到 20ms 这时候六位八段数码管的六个数码位会进行闪烁显示,显示的内容依次是 1、2、3、4、5、6,如下GIF动图所示

如果进一步缩短时间 T 为 1ms,这时候,六位八段数码管的六个数码位实际上也是依次进行闪烁的显示,显示的内容依次是 1、2、3、4、5、6 每个数字显示时间是 1ms,如下GIF动图所示

但是它们切换的频率太快了,我们的肉眼不能分辨这种闪烁,就误以为六位八段数码管的六个数码位在同时进行显示,而且显示的内容是 123456。
这样就使用动态扫描的方式实现了数码管的动态显示。
使用动态扫描的方式实现数码管的动态显示,实际上是利用了两个现象:人眼的视觉暂留特性和数码管的余晖效应。人眼在观察景物时,光信号传入到大脑神经需要经过一段时间,光的作用结束之后我们的视觉影像并不会立刻的消失,这种残留的视觉被称为后像,这种现象就被称为视觉暂留;数码管的余晖效应是什么意思呢?当我们停止向发光二极管供电时,发光二极管的亮度仍能够维持一段时间。我们的动态扫描利用这两个特性就实现了数码管的动态显示。

以上内容是我在观看视频教程34-第二十三讲-数码管动态显示(一)后的笔记的一部分


Proteus 仿真看看吧一开始先设置T为3s左右看一看,如下GIF动图所示


接着设置为300ms左右,如下GIF动图所示(闪烁起来了


然后设置为30ms左右,如下GIF动图所示(貌似眨眼补帧后就是同时显示的了


我还要快一点,那就再除个10,每个位只显示3ms左右的时间看看吧


看来它已经可以欺骗我们的眼睛和大脑了(至少仿真软件认为是这样的)
用手机拍视频时如果画面中有对准过多位数码管显示类产品的话,相信你一定注意到过手机画面中,数码管通常会闪烁吧,原因就是使用了动态扫描的方式显示

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:230500 发表于 2024-3-29 08:54 | 只看该作者
看来单片机开发板还没有学入门; 找个视频自己看了后再写出来,然后下载到板子上看看实际情况, 再改改延时时间  你就会看到另一种不一样的结果, 只有这样才真正学会, 在这问这些是没有用的, 跟你讲动态扫描 就好像讲无字天书一样, 很玄妙!
回复

使用道具 举报

地板
ID:1110945 发表于 2024-3-29 10:02 | 只看该作者
你知道六位的数码管里面有多少个发光二极管吗?
6x8=48个发光二极管,最笨的办法要用49根引脚才能控制它,
聪明的办法只要6+8=14根引脚就行了,但是要用动态扫描的方
法才能正常显示。实际同一时间只能有一个数码管在显示,其
它的都是关着的不显示的,“动态扫描”的意思是排着队一个一个
的来显示,只要切换的速度足够快,我们就感觉是“同时”都在显
示数字了。你感觉1秒钟的时间很短,对于单片机来说却是很漫长
的,比如24MHz的频率它要计数2400万才到1秒钟。
你这个题目很大,慢慢来吧,从点亮一个发光管开始吧,然后学会
在其中的一个数码管上显示“12345abcd”这些,还要能随意的显示,
随意的变换显示给出的内容,然后是把时间分成小段完成动态扫描。
你要的不同时间段显示不同的内容,还要再把时间分成大的时间段
显示你要的内容。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:977869 发表于 2024-3-29 11:09 | 只看该作者
#define  display_tm_base    15u

//
display_time++
if(display_time>=display_tm_base)
                                {
                                        display_show();
                                        display_time=0;
                                        index++;
                                        if(index>=12)


                                        {
                                                index=0;
                                        }
                                }

//上面那部分程序放在定时器中


void display_show()//数码管显示程序
{
        if(run_mode==6)
        {
                show_value[0]=mode_timer_value/100;     //百位
                show_value[1]=mode_timer_value%100/10;   //十位
                show_value[2]=mode_timer_value%100%10;//十位  
        }
        else
        {
                  if(pro_set==0)
                {
                                show_value[0]=trigger_cut/100;     //百位
                }
                else
                {
                                show_value[0]=16;     //P段显示
                }
        show_value[1]=trigger_cut%100/10;   //十位
        show_value[2]=trigger_cut%100%10;//十位  
        }

        show_value[3]=intergral/100;  //百位
        show_value[4]=intergral%100/10;// 十位
        show_value[5]=intergral%100%10;//个位
        if(index==0)
        {
                        select_pin1=0;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[2]];
        }
        else if(index==2)
        {
                        select_pin1=1;
                        select_pin2=0;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[1]];
        }
        else if(index==4)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=0;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[0]];
        }
        else if(index==6)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=0;
                        select_pin5=1;
                        select_pin6=1;
                        show_port=table[show_value[5]];
        }
        else if(index==8)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=0;
                        select_pin6=1;
                        show_port=table[show_value[4]];
        }
        else if(index==10)
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=0;
                        show_port=table[show_value[3]];
        }
        else
        {
                        select_pin1=1;
                        select_pin2=1;
                        select_pin3=1;
                        select_pin4=1;
                        select_pin5=1;
                        select_pin6=1;
                //        show_port=0X00;
        }
}


char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73};  //数码管共阴极编码表
回复

使用道具 举报

6#
ID:619259 发表于 2024-3-31 23:11 | 只看该作者

修改多次都失败,不知何因,补发附件。



#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc2};                //共阳代码
uchar code com[]={0x01,0x02,0x04,0x08,0x10,0x20};   //位码
uchar seg_buff[6];      //显示缓冲区
/****************************************************
    延时子函数(xms)
****************************************************/
void delay(uint xms)   
{
    uint i,j;
    for(i=xms;i>0;i--)
       for(j=120;j>0;j--);
}

/***************************************************************
    显示子函数
***************************************************************/
void seg_show(uchar a,uchar b,uchar c,uchar x,uchar y,uchar z)
{
    uchar i;
    seg_buff[0]=seg[a];
    seg_buff[1]=seg[b ];
    seg_buff[2]=seg[c];
    seg_buff[3]=seg[x];
    seg_buff[4]=seg[y];
    seg_buff[5]=seg[z];   
   
    for(i=0;i<6;i++)
    {
        P2=0x00;
        P0=seg_buff[ i];
        P2=com[ i];
        delay(1);
    }
}

/****************************************************
    主函数
****************************************************/
void main()
{
    while(1)
    {
        uint cnt;       //延时计数参数,不精确的计算,想精确的建议用定时器
                          //数码管刷新一次约为6ms,167次约为1秒
        if(cnt<167)    seg_show(1,2,3,4,5,6);
        else if(cnt>=167 && cnt<334)   seg_show(3,3,8,7,3,7);
        else   seg_show(13,14,12,15,16,10);
        cnt++;
        if(cnt>501) cnt=0;
    }
}

seg05.rar

729 Bytes, 下载次数: 1

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表