楼主,你的程序简直是一堆乱码.在这里误人子弟,强烈谴责,再不要拿这样的东西请教别人.做好的东西也不拿出来让人学习,太自私了.你不公布,我公布;代码如下:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSD=P2^0;
sbit LSC=P2^1;
sbit LSB=P2^2;
sbit LSA=P2^3;
//u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//显示0~9和横杠的值//10000000横杠,0x80?
u8 code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0xff};//最后两位是横和关锻
void delay(u16 i)
{
while(i--);
}
void delayms(u16 x) //改三处 //延时函数
{
u8 i;
while(x--)
{
for(i=50;i>0;i--); //改一处;
}
}
void Timer0Init()//定时一秒,完成后进行中断
{
TMOD|=0X01;//0000 0001方式一
TH0=0X15; //给定时器赋初值,定时1s
TL0=0XA0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
u8 a=0,b=11,c=11,d=11,e=11,f=0;
u16 l=0;
u16 i;
void display()
{
P0=smgduan[a];
LSA=1;delayms(3);LSA=0; delayms(0); //第一位数码关断时间
P0=smgduan[b];
LSB=1;delayms(3);LSB=0;delayms(0); //第二位数码关断时间
P0=smgduan[c];
LSC=1;delayms(3);LSC=0; delayms(0); //第一位数码关断时间
P0=smgduan[d];
LSD=1;delayms(3);LSD=0;delayms(0); //第二位数码关断时间
P0=smgduan[e];
LSE=1;delayms(3);LSE=0; delayms(0); //第一位数码关断时间
if(f!=0)
{
P0=0x7f;
LSC=1;delayms(3);LSC=0; delayms(0);//小数点;
}
delayms(3);
}
void main()
{
Timer0Init(); //定时器0初始化
while (1)display();
}
void Timer0() interrupt 1//interrupt后面无括号
{//
TH0=0X15;
TL0=0XA0;
i++;
if(i<10)
{//
a=i;
display();
}//
if(i>=10&&i<60)
{//
a=i%10;
b=i/10;
display();
}//
if(i>=60&&i<600)
{//
f=1;
c=i/60;
b=(i-60*c)/10;
a=i-60*c-10*b;
display();
}//
if(i>=600&&i<3600)
{//
f=1;
d=i/600;
c=(i-600*d)/60;
b=(i-600*d-60*c)/10;
a=i-600*d-60*c-10*b;
display();
}//
if(i>=3600&&i<39600)
{//
if(i>=36000)
{//
f=1;
l=36000;
} //
e=(i-l)/3600;
d=(i-l-3600*e)/600;
c=(i-l-3600*e-600*d)/60;
b=(i-l-3600*e-600*d-60*c)/10;
a=i-l-3600*e-600*d-60*c-10*b;
display();
}//点亮小时,十二小时制。
if(i==39600)
{i=0;display();}
}//
|