#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0123456789-
//void display(uchar ha ,uchar hb,uchar m,uchar ma,uchar mb);
void display(); //声明显示函数
void init(); //声明初始化函数
#define cont 50000 //to计数值,约50ms
#define TH_M1 (65636-cont)/256 //t0计数高八位
#define TL_M1 (65636-cont)%256//t0计数低八位
uchar sec,mshi,mge,hshi,hge,a; //mshi分十位,mge分个位,hshi小时十位,hge小时个位 ,sec秒
uchar min,hour;
#define duxu P2//段选
#define wei P1 //位选
void delay(uint z) //延迟z*1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{ init();
while(1)
{
{ if(sec==59)
{
sec=0;
min++;
if(min==59)
{ min=0;
hour++;
}
else{mshi=min/10;
mge=min%10;}
if(hour==23)
hour=0;
else{hshi=min/10;
hge=min%10;}
}
}
delay(10);
display();
}
}
void init() //初始化
{
IE=0X82; //开总中断,开定时器0
TMOD=0X01; //TO采用mode1
TH0=TH_M1; //装初值
TL0=TL_M1;
TR0=1;//启动T0
sec=0;
min=0;
hour=12;
a=0;
}
void timer0(void) interrupt 1 //中断t0
{
TH0=TH_M1; //装初值
TL0=TL_M1;
//a++;
if(++a==20)
{ a=0;
sec++;
{ if(sec==59)
{
sec=0;
min++;
if(min==59)
{ min=0;
hour++;
}
else{mshi=min/10;
mge=min%10;}
if(hour==23)
hour=0;
else{hshi=min/10;
hge=min%10;}
}
}
}
}
void display()
{
wei=0xfe;
duxu=dula[hshi];
delay(5);
wei=0xfd;
duxu=dula[hge];
delay(5) ;
wei=0xfb;
duxu=dula[10];
delay(5) ;
wei=0xff;
wei=0xf7;
duxu=dula[mshi];
delay(5) ;
wei=0xef;
duxu=dula[mge];
delay(5) ;
}
-
时钟仿真图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0123456789-
//void display(uchar ha ,uchar hb,uchar m,uchar ma,uchar mb);
void display(); //声明显示函数
void init(); //声明初始化函数
#define cont 50000 //to计数值,约50ms
#define TH_M1 (65535-cont)/256 //t0计数高八位
#define TL_M1 (65535-cont)%256//t0计数低八位
uchar sec,mshi,mge,hshi,hge,a; //mshi分十位,mge分个位,hshi小时十位,hge小时个位 ,sec秒
uchar min,hour;
#define duxu P2//段选
#define wei P1 //位选
void delay(uint z) //延迟z*1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{ init();
while(1)
{
mshi=sec/10;
mge=sec%10;
hshi=min/10;
hge=min%10;
display();
}
}
void init() //初始化
{
IE=0X82; //开总中断,开定时器0
TMOD=0X01; //TO采用mode1
TH0=TH_M1; //装初值
TL0=TL_M1;
TR0=1;//启动T0
sec=0;
min=0;
hour=12;
a=0;
}
void timer0(void) interrupt 1 //中断t0
{
TH0=TH_M1; //装初值
TL0=TL_M1;
//a++;
if(++a==20)
{ a=0;
sec++;
{ if(sec==60) //
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
}
}
void display()
{
wei=0xfe;
duxu=dula[hshi];
delay(5);
wei=0xfd;
duxu=dula[hge];
delay(5) ;
wei=0xfb;
duxu=dula[10];
delay(5) ;
wei=0xff;
wei=0xf7;
duxu=dula[mshi];
delay(5) ;
wei=0xef;
duxu=dula[mge];
delay(5) ;
}
{
mshi=sec/10;
mge=sec%10;
hshi=min/10;
hge=min%10;
display();
}
}
非常谢谢楼上的,因为不想显示秒,就改了一下,有时间我在加上按键扫描的函数
另外楼主要注意时 分 秒进位时的判断条件,如果是计数0~59应该写成
if(sec==60) //这里是60 同理min和hour应该是60和24
{
sec=0;
}
或者写成 :
if(sec>59)
{
sec=0;
}
一周热门 更多>