51单片机 c语言写的电子时钟程序 请帮忙指正!

要求是 1,:每1/6秒跑一分钟,24小时4分钟跑完这个 (做完了) 2:可以设置时间(做的不对) 3:可以设置闹钟(还没做),程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P03=P0^3;
sbit P30=P3^0;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
uchar hour,min,keyflag,alarm;
uint codenum,i;
void delay();
uchar code table[]
={
0x0E,0x1E,0x2E,0x3E,0x4E,
0x5E,0x6E,0x7E,0x8E,0x9E
};
void display()
{
P1=table[hour/10];
P2=0xf7;
delay();

P1=table[hour%10];
P2=0xfb;
delay();

P1=table[min/10];
P2=0xfd;
delay();

P1=table[min%10];
P2=0xfe;
delay();
}
void buzzer()
{
P03=0;
delay();
P03=1;
delay();
}
void main()
{

TH0=0/256;
TL0=0%256;
TMOD=0x01;
TR0=1;
EA=1;
ET0=1;
EX0=1;
EX1=1;

IT0=0;
while(1)
{
if(keyflag==0)
{
while(keyflag==0)
{
display();
if(codenum==2)
{codenum=0;
min++;
}
if(min==60)
{ min=0;
hour++;
}
if(hour==24)
hour=0;
}
}

if(keyflag==1)
{ TR0=0;
hour=0;min=0;

while(keyflag==1)
{
if(P34==0)
{
hour++;
while(P34!=1);
}
if(P35==0)
{
min++;
while(P35!=1);
}
}
}

if(keyflag==2)
{
keyflag=0;
TR0=1;
}
}
}

void exint_O() interrupt 0
{
keyflag++;
}

void timer0int() interrupt 1
{
TH0=0/256;
TL0=0%256;
codenum++;
}
void delay()
{
TH1=(65000/256);
TL1=(65000%256);
TR1=1;
while(!TF1);
TR1=0;
TF1=0;
}

单片机程序是基于硬件基础上开发的,你至少添加注释和硬件环境说明,不然大家都不知道怎么帮你。
你直接给出代码,也不清楚需要指正什么,这里也没有设置时间/闹钟的代码,发文前应该清楚表达要问的内容。

1)假设你的晶振是12MHz,那一个机器周期是1MHz,定时器的最长定时周期是(65535/10^6)你想要1/6秒触发一次中断就必须结合软件计时,为了尽量精确:硬件计时40000次,软件计时25次那么定时器的设这应该是TH1=(65535-40000)%256;TL1=(65535-40000)%256,(注意计数器大部分是加法计数)
2)按键监听没有给出思路,也没有处理按键抖动,我只能分析程序:
有一个外部中断触发时间设置,P34设置小时、P35设置分钟,但是调整时间后没有进行显示,你至少要让数码管显示结果才能知道怎么调整。追问

就是51单片机呀,注释写了,不过在另一个帖子上了,太长了,不给发

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-11
写程序要会适当加注释,这样出问题改着也不累。。。
你明明只用了外中断0,怎么还有EX1出现啊。还有,定时器1似乎没有啊任何被初始化的迹象就直接在最后的delay里赋值了,这程序写的怎么一个乱字了得。。。。追问

EX1 是给闹钟准备的,还没用上,TR1 确实忘写了,不过写上反应也没差别呀

不对,TR1 我写在子程序里了

看delay函数

第2个回答  2014-03-11
你定时中断开了吗?ET1 = 1;有这条语句吗??追问

我没用到ET1 ,只用了ET 0 和EX0

相似回答