程序如下:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar count,hh,hl,mh,ml,sh,sl; //6个变量分别为时的十位、个位;分的十位、个位,秒的十位、个位
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //数码管段码
void delay(uchar x) //延时程序
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void xianshi(uchar h1,h0,m1,m0,s1,s0) //显示子程序
{
P0=0xff; //防止数码管余辉出现
P2=0x7f; //选择时的十位
P0=seg[h1]; //显示时的十位
delay(10);
P0=0xff;
P2=0xbf;
P0=seg[h0]; //显示时的个位
delay(10);
P0=0xff;
P2=0xdf;
P0=0xbf; //显示横线
delay(10);
P0=0xff;
P2=0xef;
P0=seg[m1]; //显示分的十位
delay(10);
P0=0xff;
P2=0xf7;
P0=seg[m0]; //显示时的个位
delay(10);
P0=0xff;
P2=0xfb;
P0=0xbf; //显示横线
delay(10);
P0=0xff;
P2=0xfd;
P0=seg[s1]; //显示秒的十位
delay(10);
P0=0xff;
P2=0xfe; //显示时的个位
P0=seg[s0];
delay(10);
}
void main()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
TR0=1;
hh=2;hl=3;mh=5;ml=9;sh=5;sl=0; //程序初始化,初始化赋值时间23-59-50;
while(1)
{
if(count==20) //定时器是否到1S,到了count清零,秒个位加1
{
count=0;
sl++;
if(sl==10) //判断秒个位是否到10,到了秒个位清零,秒十位加1
{
sl=0;sh++;
if(sh==6) //判断秒十位是否到6,到了秒十位清零,分个位加1
{
sh=0;ml++;
if(ml==10) //判断分个位是否到10,到了分个位清零,分十位加1
{
ml=0;mh++;
if(mh==6) //判断分十位是否到6,到了分十位清零,时个位加1
{
mh=0;hl++;
if(hl==10) //判断时个位是否到10,到了时个位清零,时十位加1
{
hl=0;hh++;
}
if(hh==2&&hl==4) //时间是否为24时,是时清0
hh=0;hl=0;
}
}
}
}
}
xianshi(hh,hl,mh,ml,sh,sl); //调用显示子程序
}
}
void time50() interrupt 1 //每50ms中断一次
{
TH0=-(50000/256);
TL0=-(50000%256);
count++;
}
这是板子的原理图:
TYD-51-1原理图.pdf
(54.13 KB)
程序是我根据EDA实习时用VHDL写的一个时钟程序该的,上午因为把hh,hl...这6个变量定义成了局部变量出了一堆错误,害的偶调试N久无果后满脑子浆糊的去抄了会书,抄到变量的作用域的时候才恍然大悟...
唉~~菜鸟的悲剧啊~~~
求高手批判啊~
那个显示子程序我总感觉可以写的更简单些的,但是不知道该咋写~~~ |