标题: 0-59秒循环显示程序,十位显示很暗,请大神帮忙 [打印本页]

作者: 晨星    时间: 2016-10-6 22:19
标题: 0-59秒循环显示程序,十位显示很暗,请大神帮忙
本人是单片机新手,最近正在学习51单片机,但在学习过程中遇到了困难,在编写0-59循环显示程序时,发现十位数一直无法正常显示,不知道怎么回事,还请大神帮帮忙。以下是源程序和原理图,请大神帮帮忙。该如何修改

#include <reg52.h>
#define uchar unsigned
#define uint unsigned
sbit duan=P1^0;//段锁存器
void delay(uint z);
void display(uint a,uint b);
uint a,shi,ge,num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();
void main()
{
    init();//程序初始化
   
    while(1)
    {
       if(a==20)
       {
          a=0;
          num++;//秒计时
          if(num>59)
             num=0;
          shi=num/10;
          ge=num%10;
          display(shi,ge);
       }
    }
}
void display(uint a,uint b)
{
     //十位数的显示
     duan=1;
     P3=table[a];
     duan=0;
     P2=0xfd;
     delay(1);
     //个位数的显示
     duan=1;
     P3=table[ b];
     duan=0;
     P2=0xfe;
     delay(1);
}
void timer0() interrupt 1
{
    a++;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;


}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void init()
{
    a=0;
    num=0;
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;
}


作者: 小蜗牛单片机    时间: 2016-10-7 08:57
P3=table; 这个有问题?
作者: 雪玉寐影    时间: 2016-10-7 10:03
这个延时好像太短了吧~~
作者: 晨星    时间: 2016-10-7 10:18
小蜗牛单片机 发表于 2016-10-7 08:57
P3=table; 这个有问题?

这个是我在上传程序的时候漏写了 本来是P3=table[ge];

作者: 晨星    时间: 2016-10-7 10:20
雪玉寐影 发表于 2016-10-7 10:03
这个延时好像太短了吧~~

是十位显示的延时太短了吗?我再改长一点试试
作者: 晨星    时间: 2016-10-7 21:31
雪玉寐影 发表于 2016-10-7 10:03
这个延时好像太短了吧~~

增加延时时间,还是没有解决问题。
作者: yzwzfyz    时间: 2016-10-8 01:17
均分各位显示的时间即可。
作者: npn    时间: 2016-10-8 07:06
配置一下P2M0、P2M1、P3M0、P3M1寄存器试试。
作者: rain_2015_long    时间: 2016-10-8 10:47
显示时间过短

作者: 晨星    时间: 2016-10-8 13:07
npn 发表于 2016-10-8 07:06
配置一下P2M0、P2M1、P3M0、P3M1寄存器试试。

好的 谢谢啊
作者: 晨星    时间: 2016-10-8 13:08
rain_2015_long 发表于 2016-10-8 10:47
显示时间过短

加长了延时时间,亮度增加了。但是十位显示一直在闪烁,
作者: wuyibin2003    时间: 2016-10-8 13:40
P3=table 好像没有子程序啊
作者: ahshmj    时间: 2016-10-8 15:15
本帖最后由 ahshmj 于 2016-10-8 15:19 编辑

     duan=1;
     P3=table[a];
     duan=0;
     P2=0xfd;
     delay(1);
     //个位数的显示
     duan=1;
     P3=table;
     duan=0;
     P2=0xfe;
     delay(1);
在这段程序中,
   “delay(1);
     //个位数的显示
     duan=1; ”
    当延时过后,接着就是duan=1 ,关闭了十位的显示。
个位显示过以后呢?要等到下次运行到一个“duan=1”时,才关闭个位显示,所以个位显示的时间长、就会很亮。

解决的办法是:个位的显示延时后面也加上“duan=1”,这样就会像十位一样了,如果感觉亮度都达不到要求,加大延时即可。

duan=1;
P3=table[a];
duan=0;
P2=0xfd;
delay(1);
//个位数的显示
duan=1;
P3=table;
duan=0;
P2=0xfe;
delay(1);
duan=1;




作者: ahshmj    时间: 2016-10-8 15:21
其他的错误,如P3=table;
大概是笔误?你自己看着改。
作者: 晨星    时间: 2016-10-8 21:14
wuyibin2003 发表于 2016-10-8 13:40
P3=table 好像没有子程序啊

上传程序的时候漏掉了,本来是P3=table[ge];
作者: 晨星    时间: 2016-10-8 21:29
wuyibin2003 发表于 2016-10-8 13:40
P3=table 好像没有子程序啊

这个复制的时候漏掉了,本来是P3=table[ge];
作者: 晨星    时间: 2016-10-8 21:29
ahshmj 发表于 2016-10-8 15:15
duan=1;
     P3=table[a];
     duan=0;

好的,谢谢啊,我试一试
作者: zl2168    时间: 2016-10-9 21:17
本帖最后由 zl2168 于 2016-10-9 21:29 编辑

“本人是单片机新手,最近正在学习51单片机,但在学习过程中遇到了困难”
为什么不找一本好的教材?
介绍你2本书,

张志良编著
80C51单片机实用教程——基于Keil CProteus》,高等教育出版社,ISBN 978-7-04-044532-9,用于学理论。
《80C51单片机仿真设计实例教程——基于Keil C和Proteus》,清华大学出版社,ISBN 978-7-302-41682-1,用于实验操作。
电路与程序真实可靠可信可行,且便于阅读理解,便于自学。
这样就不会出现那么多问题!!!
12-04962-003-01单片机实用教程 (1).pdf (479.45 KB, 下载次数: 7)








作者: rain_2015_long    时间: 2016-10-10 15:18
display(shi,ge);放在while主循环里面,不要放在a==20里面
作者: 晨星    时间: 2016-11-8 18:28
zl2168 发表于 2016-10-9 21:17
“本人是单片机新手,最近正在学习51单片机,但在学习过程中遇到了困难”
为什么不找一本好的教材?
介绍 ...

好的  谢谢
作者: 1240968729    时间: 2016-12-19 14:50
求电路图!有点单片机不认识
作者: 参议会    时间: 2016-12-19 14:55
驱动力不够




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1