用51单片机写的时钟程序,protues仿真就是数字不跳,各位.....
#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) ;
}
时钟仿真图
C:\Users\Administrator\Desktop\QQ截图20130624231136
扫描。。
问题真不少 你再仿真试试 你对着代码跟你的比较,有什么疑问再交流
#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) ;
}
while(1)
{
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;
}
#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(); //声明显示函数
void init(); //声明初始化函数
void keyscan();
sbit pb1=P3^2; //功能按键,按一下调分,在按一下调时
sbit pb4=P3^3;
sbit pb2=P3^6;
sbit pb3=P3^7;
#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)
{
keyscan();
delay(20);
/* mshi=min/10;
mge=min%10;
hshi=hour/10;
hge=hour%10; */
display();
keyscan();
}
}
void init() //初始化
{
IE=0X82; //开总中断,开定时器0,中断into
TMOD=0X01; //TO采用mode1
// TCON=0X01;
TH0=TH_M1; //装初值
TL0=TL_M1;
TR0=1;//启动T0
sec=0;
min=0;
hour=0;
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()
{
mshi=min/10;
mge=min%10;
hge=hour%10;
hshi=hour/10;
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) ;
}
void keyscan()
{
delay(10);
if(pb2==0) //加分钟
{ delay(20);
if(pb2==0)
min++;
if(min>60)
min=0;
while(!pb2);
}
if(pb3==0) //减分钟
{ delay(20);
if(pb3==0)
min--;
if(min==0)
min=60;
while(!pb3);
}
if(pb1==0) //加小时
{ delay(20);
if(pb2==0)
hour++;
if(hour>24)
hour=0;
while(!pb1);
}
if(pb4==0)//减小时
{ delay(20);
if(pb3==0)
hour--;
if(hour==0)
hour=24;
while(!pb3);
}
}
求解,?我把按键子函数加上去后仿真是数码管就闪烁,这是咋回事?不调用按键函数就正常
发现按键函数有错改了过来就好了,终于好了