数码管的动态显示问题,是共阳极的,在仿真的时候只有一个正常显示

作者&投稿:智鸿 (若有异议请与网页底部的电邮联系)
数码管动态显示~

我先来帮你分析一下这个程序:
(1)到(4)的功能是由P0口给出数码管的段码。我猜想在P0口和数码管的段码线之间是一个锁存器,这样能够保证当P0口的数据变化之后,数码管的数字不变化。这时,数码管不能显示相应数字,因为位码线还没有被选中。

(5)到(8)的功能是由P0口给出数码管的位码。这时位码线被选中,在段码和位码的同时作用下,数码管被激活,显示shi对应的数字。

然后延时delay(5);

执行到时(10),由于P0给出了ge的段码,而位码还没改变,这时候当然要在第一个数码管上显示第二个数码管的内容。

执行到(14),位码改变,第二个数码管被选中,这时段码和位码共同作用,第二个数码管显示ge所对应的数字。

然后延时。

由于第一个数码管显示ge的时间很短,只有不到十个机器周期,而正常显示的时间很长,这个时间是delay(5),所以看不出ge曾经在第一个数码管上经过,所以看上去显示效果是对的。

这也就是为什么要加延时程序(8)和(16)。如果不加的话,第一个数码管会快速的在ge和shi之间进行“切换”,最后的结果是数码管一显示8,而数码管二正常显示,你可以试一下。

因此回答如下:
问题一:延时程序的目的是为了掩盖数码管一上的“切换”,给你的眼睛“错觉”。
问题二:没有讲究,是锁存器的锁存特性造成的,延时程序很好解决了这一问题。

楼上的回答很不准确,我不赞同。即使把13.14.15和9.10.11换一下,如果不加延时程序,问题同样存在,只不过成了数字shi经过数码管二而已。

郭天祥讲的时候,程序不是现成的,是当时现场写的,出现错误也是正常的。

推荐你去论坛上面找protus软件的仿真,一般这种有很多

中断里动态点亮数码管的程序有错误,如下:
P1_0=0;P1_1=1;
P0=dispcode[second/10];
P1_0=1;P1_1=0;
P0=dispcode[second%10];
点亮第一位后接着灭掉第一位、点亮第二位,由于时间太快,而且中断时间太长,所以第一位点亮就看不到了,而只能看到第二位的数字了,也就是dispcode[second%10]对应的数码管。修改一下程序应该是这样的:
#include <reg51.h>
sbit P1_0=P1^0;
sbit P1_1=P1^1;
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
volatile unsigned char second; //告诉编译器不要优化变量,具体用法百度一下
unsigned char tcount;

//短暂延时
void delay(char x)
{
char i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++);
}
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
tcount=0;
second=0;

while(1)
{
P1_0=0;P1_1=1;
P0=dispcode[second/10];
delay(2); //x的值自己试试,只要能正常显示就行
P1_0=1;P1_1=0;
P0=dispcode[second%10];
delay(2);
}
}
void t0(void) interrupt 1 using 0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}

}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}

支持二楼的回答,我也认为是这个原因。但是你改变了人家的主要意思,而且你这样的话主程序要做其他的事怎么办?你就只能是显示了,这样做是不是不太好呢,朋友?
告诉你一个简单的改法,只改一点点就行了。呵呵~~~有问题Q我!

找出你原程序中如下这段:
P1_0=0;P1_1=1;
P0=dispcode[second/10];
P1_0=1;P1_1=0;
P0=dispcode[second%10];

其他部分不动,将这部分改成如下就好,加个判断,简单哦!
if(tcount%2)
{
P1_0=0;P1_1=1;
P0=dispcode[second/10];
}
else
{
P1_0=1;P1_1=0;
P0=dispcode[second%10];
}
这样改,其他的都不用动


数码管动态显示
这也就是为什么要加延时程序(8)和(16)。如果不加的话,第一个数码管会快速的在ge和shi之间进行“切换”,最后的结果是数码管一显示8,而数码管二正常显示,你可以试一下。因此回答如下:问题一:延时程序的目的是为了掩盖数码管一上的“切换”,给你的眼睛“错觉”。问题二:没有讲究,是锁存器...

七段数码管动态显示控制
实验二七段数码管动态显示控制1、实验目的利用AT89S52和使用两位数码管显示器,循环显示两位数00-99。其中P2.0和P2.1端口分别控制数码管的个位和十位的供电,当相应的端口变成低电平时,驱动相应的三极管会导通,+5V通过驱动三极管给数码管相应的位供电,这时只要P3口送出数字的显示代码,数码管就能正常...

关于proteus仿真数码管,动态扫描时有的数字不能显示问题!
首先你要确定,你的程序是否对,这个可以在相应的地方设置断点来帮助你。如果程序没太大的问题,可能是你的每个数码管显示的延时时间不够,至少要延时1-2ms,也不能太长,延时时间太长的话显示会出现闪烁。这个问题其实也是软件问题。还有一点,PROTEUS的仿真实际上是动画,每秒20-50帧(可设定),因此...

数码管动态显示一边暗一边亮还有重叠怎么回事?代码哪里不对?_百度知 ...
一个是位选锁存器,一个是段选锁存器。打开位选锁存器,选中你要点亮的数码管。然后再关闭位选锁存器。接着打开段选锁存器,然后输出你要亮的数字,再关闭段选锁存器。再加一个while(1);以上我说的是静态显示。你先把这个亮起来吧。你的动态显示有头文件#include"intrins.h",可是你的移位...

单片机C语言编程关于数码管动态显示的问题
在这一定要延时,因为你用的是动态扫描。如果不延时程序会走的很快前面的还没走完后面的跟上来了就会导致乱码。这只是我个人的理解。

LED数码管动态扫描显示如何解决重影
明显是缺少“消隐”环节。在更换“段”的输出内容之前,先令“所有的位”,都停止显示,即可。--- 太具体了,未必适合楼主的硬件。楼主如果提供出来显示程序,可以帮你改改。

最近刚刚接触单片机,led显示时的片选、段选完全搞不懂啊,求大侠解救...
你说的问题是LED数码管的动态显示问题,就是在一个时间段内,只有一个字码被显示,其它都是不亮的,因为转换速率高,人眼具有视觉暂留特性,大约是1\/10秒。所谓片选就是你让哪个管可以亮,所谓段选就是你让字码中的那个笔划亮。比如你显示4位数字,共阴极,每个字加上小数点共有8段,你可以在...

Proteus为什么p0口接数码管显示的数字不变,电平要变
你用板子试一下 应该不是你程序或者电路的问题 很多用proteus模拟数码管动态显示的时候都会有这种问题 你把送段码跟位码每一句后面加个延迟再模拟就能看出来 数码管用的是视觉残留的道理,每次显示一位,显示完了换到下一位显示,每秒刷新上千次,所以你看到的才会是很多位的数字。但是电脑显示器每秒...

单片机数码管动态显示的过程中,怎么实现让其中一个闪烁,其他的不受影...
嘿嘿 俺来帮你喽 1 单片机数码管动态显示的过程中,设置一个闪烁寄存器,专门保存要闪烁显示的位子,再增加一个闪烁显示码的暂存器。2 每次调用显示程序时,先要判断需要显示闪烁的位子的显示码,是不是等于“灭”的显示码,不是的话,将该位的显示码送闪烁显示码的暂存器进行保存,将“灭”的...

多位数码管的动态显示利用了人眼视觉暂留效应。
【答案】:B 动态显示就是按位轮流点亮各位数码管(扫描),即在某一时段,只让其中一位数码管的“位选端”有效,并送出相应的显示字型码。

遂溪县13343469644: 为什么我单片机数码管段码是共阴极的而位码是共阳极 -
梅往了哥: 一般来说 数码管是共阴极的,那么位码是阳极(如果你想让数码管全亮,就把所有阳极并接在一起,但是最好也要每个阳极串个限流电阻,再并接,不过这也不是叫共阳极).如果不是这样那你的数码管有没有型号或数据手册,帮你看一下.还有多个数码管的话是可以把不同的数码管位码接在一起,这也不叫共阳极,只是因为它们一般不会同时导通而已.

遂溪县13343469644: 数码管单个动态显示0到6(共阳极)用keil5编写c++语句,用的是51单片机开发板,这程序怎么写 -
梅往了哥: 既然是开发板,还不给数码管显示电路,一个共阳数码管是静态接法,还是多位动态显示电路,选其中的一位显示,这程序区别很大.另外,是开发板,就要用keil编译出HEX代码才能烧录,可keil并不能编译C++程序,只能编译C程序或汇编程序.下面仿真图以一位静态共阳数码管为例,接在P0口的仿真效果.

遂溪县13343469644: 急!!!求单只数码管循环显示0~9的代码解释,数码管是共阳极的.万分感谢!!! -
梅往了哥: #include//单片机寄存器相关的文件 #include//具有空指令的文件 #define uchar unsigned char//宏定义 以后用uchar替代unsigned char #define uint unsigned int //宏定义作用同上 uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,...

遂溪县13343469644: 怎么判断数码管是共阴极还是共阳极 -
梅往了哥: 用万用表二极管档,红表棒量公共端,黑表棒量其余管教,如果万用表有数值显示,或数码管有笔画发微弱亮光,说明是共阳的,反之共阴

遂溪县13343469644: 如何用万用表测试七段数码管是共阳极还是共阴极的? -
梅往了哥: 使用1Ω档正反测量gnd和其他管脚,亮灯的情况下,黑笔代表正极.用3-5伏电源测量.也可以用万用表拨到电阻档测量. LED有共阴极和共阳极的区别,共阴极的,用负极(黑表笔)接公共极;共阳极的,用正极(红表笔)接公共端.用另一...

遂溪县13343469644: 数码管显示器BS202是共阴的还是共阳的 -
梅往了哥: 这是个六位动态显示电路,用的是共阳八段显示器.所谓共阴、共阳是在于显示器共用的是阴极还是阳极,共阴和共阳显示器在使用时的不同之处在于前者用高电平,

遂溪县13343469644: 数码管在电路图中如何区分它是共阳极还是共阴极的? -
梅往了哥: 答:你这个图我看到了,74HC573是八D锁存器,它的输出是吸收电流的,所以,数码管是共阳极的.

遂溪县13343469644: 什么是共阳数码管?静态显示是什么回事? -
梅往了哥: 就是一个数码管由8 个发光二极管组成的7 段以及小数点,全亮时显示8和右下角一个点.这样,如果8 个LED的8 个阳极内部接在一起接到高电平(+5V),阴极分别接上低电平(0V).这样,8 个阴极由8 个控制,阳极接+5V.多位的话,比如3 位,就是24个阴极控制 ,这就是静态显示 . 相对静态显示的是动态显示,那样可以节省控制口.方法是各位的8 个对应的阴极全部并联,而共阳极分别轮流接高电平.轮流时间大约1~10ms,虽然各个管不是同时通电的,但利用人眼的暂留效应,看起来就是全显示了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网