51单片机语言程序数码管定时器显示时钟实验,程序无法显示

我写了一个用定时器显示数码管的时钟实验,但是运行后单片机上没有任何反应,这是我的代码,求大神帮忙看下哪里出了问题,要求:数码管上初始值为23-59-50,10秒后变为00-00-00。利用定时器0显示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff,0x20};
uchar dispuf[8]={10,10,10,10,10,10,10,10};
uchar discom=0;
uchar num,hour,min,sec;
void display();
void dispalychuzhi();
void delay1ms(uint xms) //延时
{
uchar i,j;
for(i=xms; i>0; i--)
for(j=110; j>0; j--);
}
void display() //显示
{
P2=(P2&0x1f|0xc0); //位选
P0=(1<<discom);
P2=(P2&0x1f);

P2=(P2&0x1f|0xff); //段选
P0=~table[dispuf[discom]];
P2=(P2&0x1f);
delay1ms(2);

P0 = 0xff;
P2 &= 0x1f;
if(++discom==8)
discom=0;

}

void T0_TIME(void)interrupt 1

{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256; //定时器重载

if(++num==20)
{ num=0;
sec++;
if(sec==60)
sec=0;
min++;
if(min==60);
min=0;
hour++ ;
if(hour==24)
hour=0;
dispuf[8]=sec%10;
dispuf[7]=sec/10;
dispuf[5]=min%10;
dispuf[4]=min/10;
dispuf[2]=hour%10;
dispuf[1]=hour/10;
dispuf[6]=12;
dispuf[3]=12;

}
}
void displaychuzhi() //数码管计入初值
{
P2=(P2&0x1f|0xc0); //位选 0
P0=0xfe;
P2=(P2&0x1f); // 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
P2=(P2&0x1f|0xff); //段选
P0=0x3f ;
P2=(P2&0x1f);
delay1ms(2);

P2=(P2&0x1f|0xc0); //位选 5
P0=0xfd;
P2=(P2&0x1f); // 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
P2=(P2&0x1f|0xff); //段选
P0=0x6d;
P2=(P2&0x1f);
delay1ms(2);
P2=(P2&0x1f|0xc0); //位选 9
P0=0xfb;
P2=(P2&0x1f); // 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
P2=(P2&0x1f|0xff); //段选
P0=0x6f ;
P2=(P2&0x1f);
delay1ms(2);
P2=(P2&0x1f|0xc0); //位选 5
P0=0xf7;
P2=(P2&0x1f); // 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
P2=(P2&0x1f|0xff); //段选
P0=0x6d;
P2=(P2&0x1f);
delay1ms(2);
P2=(P2&0x1f|0xc0); //位选 3
P0=0xef;
P2=(P2&0x1f); // 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
P2=(P2&0x1f|0xff); //段选
P0=0x4f;
P2=(P2&0x1f);
delay1ms(2);
P2=(P2&0x1f|0xc0); //位选 2
P0=0xdf;
P2=(P2&0x1f); // 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
P2=(P2&0x1f|0xff); //段选
P0=0x5b;
P2=(P2&0x1f);
delay1ms(2);

P0 = 0xff;
P2 &= 0x1f;

}

void mian()
{
TMOD=0x01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
dispalychuzhi();
while(1)
{
display();
}

}

你这是在 开发板上执行这个程序吗?还是仿真的?
你这程序写得太复杂了,没有必要这么写,也太乱了。肯定不行的。

是 共阴数码管,P2口为段选,P0口为位选,是这样的吗?如果是,帮你改下程序。追问

是在开发板上执行程序
display里边第一段代码为位选,第二段是段选
是共阴极
然后我觉得我初始值那里写的太复杂了,但是不晓得怎么能简单表达初始值为23-59-50
如果能帮我改下就太感谢您了

追答

如果是开发板,但不知道具体的原理图,不好改了。现在问题是,先不管显示初始值,数码管亮不亮吧?
不明白:display里边第一段代码为位选,第二段是段选,为什么这么写?是开发板给的例子吗?
但改显示初始值很简单。改这个,
uchar dispuf[8]={2,3,11,5,9,11,5,0};
下面这段:应该是这样,数组下标从0开始
dispuf[7]=sec%10;
dispuf[6]=sec/10;
dispuf[4]=min%10;
dispuf[3]=min/10;
dispuf[1]=hour%10;
dispuf[0]=hour/10;
//dispuf[5]=11; //是11,但可以不用再写了
//dispuf[2]=11;//不要了
再把这个void displaychuzhi(),全删掉,主程序中不要再调用了。先这样改,试试再说吧。
还有,从程序看,不是共阴数码管,倒底是什么,你不清楚吗?

追问

现在显示板是不亮的,我把原理图给您,是共阳极的数码管

追答

你的原理图不全,单片机那部分呢?这是开发板给的原理图吗,那把原图发上来。另外这个图还是小,符号看不清楚。你可以把原图发到百度网盘上,给我一个链接。

追问

我私信您吧

温馨提示:内容为网友见解,仅供参考
无其他回答

用51单片机实现每隔一秒数码管显示刷新一次,用定时器0实现定时功能。但...
TR0=1;\/\/开定时器0 P0=LED7Code[num]; \/\/不能是num++ } void main(){ system_init();\/\/参数初始化 while(1){ if(temp==20) \/\/定时1s,刷新数码管数字显示 { temp=0; \/\/标志位置零,计数程序修改后是这样的 num++; \/\/原来的写法有问题 if(num>15)num=0;P0=LED7Code[num]; \/...

51单片机锁存器控制数码管显示时钟
一种是静态扫描,二是动态扫描。静态的太耗资源,一般很少用,除非资源足够用。多数都是用动态扫描的。动态扫描的原理是:首先有八个数据线,分别连接到七段数码管的七个位,和小数点位。然后就是有一批使能信号线。假如你有八个数码管,那就需要八个使能信号线。同一个时刻,其实只有一个数码管在亮...

单片机控制程序 问 设置时钟程序 因代码太多 以至于数码管用延时函数无...
1、如果时间显示到秒,应在100ms左右读一次RTC。2、为了保证显示不删,应在20ms以内完成一次显示刷新,假设你用了20个数码管显示日期和时间。3、按键是随机的,需要检测,一般按键按下的时间不小于50ms,可以考虑在10ms检测一次按键。程序可以定义一个1ms的定时器,设置几个变量对定时器进行计数。每个1...

51单片机电子钟程序数码管显示
include<reg51.h> define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;sbit beep=P2^3;unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;unsigned int pp;unsigned char code table[]={0x3f,0x06...

基于51单片机简易时钟闹钟八位数码管显示Proteus仿真
按下设置键进入设置模式,时钟、分钟、秒钟分别闪烁以表示当前正在设置相应参数。设置完毕后,按下设置键退出设置模式,数码管恢复正常显示。用户可以通过功能切换按键显示闹钟时间,并通过类似步骤设置闹钟时间。闹钟时间到时,蜂鸣器将鸣响,每隔1秒响一次,持续6秒,可通过按键停止闹钟。程序代码 使用KEIL4或...

为什么我的51单片机数码管温度显示只显示-00000.06而且不能事实...
51单片机数码管温度显示只显示-00000.06而且不能实时显示,可能有以下几个原因:1.程序问题:程序中可能存在错误或者是不完善的设计,导致温度传感器采集的数据没有正确的进行处理显示,需要检查程序并进行调试对照采集温度数据。2.硬件问题:可能是温度传感器引脚连接的问题导致数据采集不正常,或者是数码管...

51单片机6位数码管显示时间
C51单片机六位数码管时钟 用数码管dot分隔时分秒 用三个按键设置时间:SET键:小时设定->分钟设定->结束设定,小时设定状态时表示小时的两位数码管闪烁,分钟设定时表示分钟的两位数码管闪烁 CHANGE键:在小时设定状态和分钟设定状态改变数值 SET S键:秒置零 C语言代码:\/\/main.c include <REGX52.H>...

51单片机数码管为什么不亮的原因,一点反应都没有
第一、定时器的处理是很有问题的。第二、可能你选择的数码管不对,应该用共阴极数码管,可能你选择了共阳极。第三,你的电路图或者接线可能有问题。

51单片机设计数码管显示时钟的程序怎么写
disdat[8];sbit led=P1^0;void delay(unsigned int x){unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<120;j++);}void dischg(){disdat[0]=sec%10;disdat[1]=sec\/10;disdat[2]=10;disdat[3]=min%10;disdat[4]=min\/10;disdat[5]=10;disdat[6]=hour%10;disdat[...

高分:51单片机汇编程序,数码管跳动问题
应该是串口收发导致单片机忙不过来,显示就会闪烁,因为你的延时程序是空操作,也占用CPU,建议你用定时中断做显示程序,中断时间定在5ms就可以了,这个定时器可以通过计数干很多其他事,比如500ms干一次。这样就不用CPU做空操作干等了。给你贴一个我写的显示程序(在定时中断中调用,这个程序显示两组数据...

相似回答