7065|17

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

新手关于消影的问题 [复制链接]

我是新手,正在学习51单片机,也正在做实验。关于消影还是不怎么理解。我用定时器中断做了个0至59秒的计时器,但是影子相对明显,我将硬件情况及程序附上,请各位指点。怎样才能较好地控制消影呢?还有最好能说明白消影的原理,看得比较多,但是还是没有透彻的理解。
1、硬件情况:STC89C52,P0口接三极管控制共阳数码管;
2、程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uint num1,num2,shi,ge;
void display(uint,uint);
uchar code table[]=
{
0xC0,0xF9,0xA4,//定义数码管的显示
0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,
};
uchar code shit[]=
{
0x0E,0x0D,//定义位选WE1,WE2
};
void delay(uint);
void main()
{
TMOD=0x10;
EA=1;
ET1=1;
TR1=1;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
P2=0xFF;
while(1)
{
  display(shi,ge);
}
}
void display(uint shi,uint ge)
{
shi=num2/10; //十位数取整
P2=0x0E; //位选第一个数码管
P0=table[shi]; //输出十位数
delay(1);

P2=0xFF;
ge=num2%10; //个位数取余
P2=0x0D; //位选第二个数码管
P0=table[ge]; //输出个位数
delay(1);
}
void delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
  for(j=110;j>0;j--);
}
void T1_time() interrupt 3 //定时器1中断
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num1++;
if(num1==20) //20次50ms循环
{
  num1=0;
  num2++;
  if(num2==60) //数字到60后清零
   num2=0;
}
}
此帖出自单片机论坛

最新回复

恩恩,自己动手又学到了吧。O(∩_∩)O哈哈~  详情 回复 发表于 2015-7-17 11:26
点赞 关注
 

回复
举报

4177

帖子

9

TA的资源

五彩晶圆(高级)

推荐
 
1. “阴影”(我暂时称它为阴影,去阴影,我们叫做消影);
2. 重叠“阴影”是因为数码管在动态显示下产生的,数据更新非常短暂,所以看起来会有重叠的“阴影”;
3. “消影"如P2=0xFF(在display函数中);刚刚送完段选、位选数据(P2=0x0E。。。。)P2口会仍然保持上次(假如是第二次)段选的数据,接下来P2口再次通过位选送入数据。由于这个过程非常短暂。在高速显示的状态之下,我们肉眼会看到显示混乱或者重叠的现象。加上”P2=0xff“就可以消影了。既可以理解为非常短暂(时间很短)的关闭,然后再打开。(我这里拿P2口来举例)
4.也可以考虑适当增加延时时间。
此帖出自单片机论坛
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
huaiqiao 发表于 2015-7-15 10:11
1. “阴影”(我暂时称它为阴影,去阴影,我们叫做消影);
2. 重叠“阴影”是因为数码管在动态显示下产生 ...

慢慢增加了延时之后,会发现阴影好些了,但是仍然存在,如果继续增大延时,那数码管就会开始闪烁,闪烁的时候,仍然依稀可见“影”。请问下,我这程序设计的有问题吗?还有其他的解决方式吗?
此帖出自单片机论坛

点评

大致看了下,应该是没有太大的问题。这样吧,我上传一个附件(数码管显示时钟的,但是程序中没有消影),你参考下,因为我这里没有硬件无法调试。你不要着急,慢慢调。 还有,如果你用的是开发板,请考虑下,与其他  详情 回复 发表于 2015-7-15 10:40
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

4
 
楼上说的对。在切换数码管的数据之前先把数码管的当前输出都关闭,楼上说的P2=0xFF只适用于共阴极的数码管,你应该能明白。
一般来说,在切换数码港的时候肯定执行几个语句,一般写成一个小函数。在进这个函数以后先处理关闭当前数码港的语句。再进行函数里面必要的数据处理,最后再打开下一个数码管就可以了。
此帖出自单片机论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

5
 
zanexue 发表于 2015-7-15 10:20
慢慢增加了延时之后,会发现阴影好些了,但是仍然存在,如果继续增大延时,那数码管就会开始闪烁,闪烁的 ...

大致看了下,应该是没有太大的问题。这样吧,我上传一个附件(数码管显示时钟的,但是程序中没有消影),你参考下,因为我这里没有硬件无法调试。你不要着急,慢慢调。
还有,如果你用的是开发板,请考虑下,与其他模块断开哦。

数码管.rar (735 Bytes, 下载次数: 3)


此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

6
 
本帖最后由 zanexue 于 2015-7-15 11:03 编辑
jishuaihu 发表于 2015-7-15 10:22
楼上说的对。在切换数码管的数据之前先把数码管的当前输出都关闭,楼上说的P2=0xFF只适用于共阴极的数码管 ...

意思是,我在输出十位的时候,应该先打开位选,再进行段选,最后关闭此位选。之后再按照相同的方式输出个位的数值?控制共阳数码管的时候,0xFF应该是阻止输出的呀,即关闭位选。

不知道这样理解是否正确,请指点。
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

7
 
huaiqiao 发表于 2015-7-15 10:40
大致看了下,应该是没有太大的问题。这样吧,我上传一个附件(数码管显示时钟的,但是程序中没有消影), ...

好的,谢谢
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

8
 
huaiqiao 发表于 2015-7-15 10:40
大致看了下,应该是没有太大的问题。这样吧,我上传一个附件(数码管显示时钟的,但是程序中没有消影), ...

我昨天把代码修改了下(仅以十位举例),消影就没了:
shi=num2/10; //十位数取整
P0=table[shi]; //输出十位数
P2=0x0E; //位选第一个数码管
delay(1);
P2=0xFF;//消影
此帖出自单片机论坛

点评

对,那就是语句之间的顺序问题了,先求值,再位选。你有没有试过,先位选后求值。  详情 回复 发表于 2015-7-16 08:50
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

9
 
zanexue 发表于 2015-7-16 08:24
我昨天把代码修改了下(仅以十位举例),消影就没了:
shi=num2/10; //十位数取整
P0=table[shi]; //输 ...

对,那就是语句之间的顺序问题了,先求值,再位选。你有没有试过,先位选后求值。
此帖出自单片机论坛

点评

我之前的语句就是先位选,再求值的,会有影的,不严重,但是能看出来  详情 回复 发表于 2015-7-16 08:57
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

10
 
huaiqiao 发表于 2015-7-16 08:50
对,那就是语句之间的顺序问题了,先求值,再位选。你有没有试过,先位选后求值。

我之前的语句就是先位选,再求值的,会有影的,不严重,但是能看出来
此帖出自单片机论坛

点评

其实我的意思是说如下这样:和你一楼贴出来的不太一样 P2=0x0E; //位选第一个数码管 shi=num2/10; //十位数取整 P0=table[shi]; //输出十位数  详情 回复 发表于 2015-7-16 10:44
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

11
 
zanexue 发表于 2015-7-16 08:57
我之前的语句就是先位选,再求值的,会有影的,不严重,但是能看出来

其实我的意思是说如下这样:和你一楼贴出来的不太一样
P2=0x0E; //位选第一个数码管
shi=num2/10; //十位数取整
P0=table[shi]; //输出十位数
此帖出自单片机论坛

点评

shi=num2/10,这句话应该只是用作计算的吧,而后面一句P0=table[shi]才是在table中取数、P0口输出,仅仅是计算的话,应该不会影响输出的。所以,您的这个和我1楼写的那段应该差别不大,应该还是会有影的,晚上回去试  详情 回复 发表于 2015-7-16 12:00
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

12
 
huaiqiao 发表于 2015-7-16 10:44
其实我的意思是说如下这样:和你一楼贴出来的不太一样
P2=0x0E; //位选第一个数码管
shi=num2/10; //十 ...

shi=num2/10,这句话应该只是用作计算的吧,而后面一句P0=table[shi]才是在table中取数、P0口输出,仅仅是计算的话,应该不会影响输出的。所以,您的这个和我1楼写的那段应该差别不大,应该还是会有影的,晚上回去试下。个人愚见。
此帖出自单片机论坛

点评

好的,你可以试试。  详情 回复 发表于 2015-7-16 12:56
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

13
 
zanexue 发表于 2015-7-16 12:00
shi=num2/10,这句话应该只是用作计算的吧,而后面一句P0=table[shi]才是在table中取数、P0口输出,仅仅 ...

好的,你可以试试。
此帖出自单片机论坛

点评

按照你说的方式,我改了下程序,会有影的  详情 回复 发表于 2015-7-16 22:38
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

14
 
huaiqiao 发表于 2015-7-16 12:56
好的,你可以试试。

按照你说的方式,我改了下程序,会有影的
此帖出自单片机论坛

点评

哦,好的。那就是说你后来的那种方法是合理的。  详情 回复 发表于 2015-7-17 08:53
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

15
 
zanexue 发表于 2015-7-16 22:38
按照你说的方式,我改了下程序,会有影的

哦,好的。那就是说你后来的那种方法是合理的。
此帖出自单片机论坛

点评

嗯嗯,是这样的。还是应该先送数据,再位选,延时,关位选,只要是这个流程应该就不会有影了。  详情 回复 发表于 2015-7-17 10:57
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

16
 
huaiqiao 发表于 2015-7-17 08:53
哦,好的。那就是说你后来的那种方法是合理的。

嗯嗯,是这样的。还是应该先送数据,再位选,延时,关位选,只要是这个流程应该就不会有影了。
此帖出自单片机论坛

点评

恩恩,自己动手又学到了吧。O(∩_∩)O哈哈~  详情 回复 发表于 2015-7-17 11:26
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

17
 
zanexue 发表于 2015-7-17 10:57
嗯嗯,是这样的。还是应该先送数据,再位选,延时,关位选,只要是这个流程应该就不会有影了。

恩恩,自己动手又学到了吧。O(∩_∩)O哈哈~
此帖出自单片机论坛

点评

单片机果然很好玩~  详情 回复 发表于 2015-7-17 11:55
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

18
 
huaiqiao 发表于 2015-7-17 11:26
恩恩,自己动手又学到了吧。O(∩_∩)O哈哈~

单片机果然很好玩~
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表