一个51单片机电子钟程序,求详细的解释啊急急急!!!

#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};
unsigned char dispbitcnt;

unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;

unsigned char i,j;

void main(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;

while(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if (P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}
}

#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义显示用的段码
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义显示用的位码
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //定义显示缓冲区
unsigned char dispbitcnt; //定义显示的位

unsigned char second; //定义秒
unsigned char minite; //定义分钟
unsigned char hour;//定义小时
unsigned int tcnt;//定义定时累加器
unsigned char mstcnt;//定义毫秒累加器

unsigned char i,j;

void main(void) //主函数
{
TMOD=0x02; //设置定时器工作模式
TH0=0x06; //设置初值
TL0=0x06;
TR0=1; //开定时器
ET0=1; //开定时器中断
EA=1; //开总中断

while(1)
{
if(P0_0==0) //判断P00口的按键是否按下
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);//延时消抖
if (P0_0==0) //判断按键真的按下了
{
second++; //秒加1
if(second==60) //秒加到60?
{
second=0; //秒清零
}
dispbuf[0]=second%10; //取秒的个位放在显示缓冲
dispbuf[1]=second/10; //取秒的十位放在显示缓冲
while(P0_0==0); //等待,知道按键松开
}
}
if(P0_1==0) //p01的按键按下,设置分钟,请参考秒的程序,一样的
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0) //p02的按键按下,设置小时,请参考秒的程序,一样的
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0 //定时器中断函数
{
mstcnt++; //累加器加一
if(mstcnt==8) //计时满8毫秒?
{
mstcnt=0; //累加器清零
P1=dispcode[dispbuf[dispbitcnt]]; //送显示段码
P3=dispbitcode[dispbitcnt]; //送显示位码
dispbitcnt++; //显示位加1
if(dispbitcnt==8) //8位都显示完了?
{
dispbitcnt=0; //从第一位开始显示
}
}
tcnt++; //累加器加一
if(tcnt==4000) //记满1秒
{
tcnt=0; //累加器清零
second++; //秒加一
if(second==60) //秒满60?
{
second=0; //秒清零
minite++; //分钟加一
if(minite==60) //分钟满60
{
minite=0; //分钟清零
hour++; //小时加1
if(hour==24) //小时满24
{
hour=0; //小时清零
}
}
}
dispbuf[0]=second%10; //将时分秒的个位与十位分开,装在显示区
dispbuf[1]=second/10;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}
}

其实这个程序不难,仔细想想,有不懂的再问我吧
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-26
你这个程序写的太复杂了,利用中断还简单些。

一个51单片机电子钟程序,求详细的解释啊急急急!!!
if(second==60) \/\/秒加到60?{ second=0; \/\/秒清零 } dispbuf[0]=second%10; \/\/取秒的个位放在显示缓冲 dispbuf[1]=second\/10; \/\/取秒的十位放在显示缓冲 while(P0_0==0); \/\/等待,知道按键松开 } } if(P0_1==0) \/\/p01的按键按下,设置分钟,请参考秒的程序,一样的 { for...

大神快来解释下面51单片机程序的意思呀,着急啊,看了一个下午了
SER应该是位变量,只能是0和1,即595的串行数据输入端 如果dat的最高位是1,那么右移7位后得到SER是1 如果dat的最高位是0,那么右移7位后得到SER是0 由于发送时高位在前,所以每发送一次dat要左移1位,把次高位往最高位推,循环8次即把8位数据全发送出去了 如果dat=0xfe,则循环8次后  Q...

用51单片机实现时钟功能程序???
keyBITP3.7;ORG0000H AJMPMAIN;绝对转移指令,2kb范围(11位)内跳转LJMP16位64kb范围内跳转 ;短转移指令的功能是先使程序计数器PC加1两次(即:取出指令码),然后把加2后的地址和rel相加作为目标转移地址。因此,短转移指令是一条相对转移指令,是一条双字节双周期指令 ORG0030H;指明后面的程序从...

求教一个51单片机程序。。(LCD电子时钟)
以单片机控制的时钟,在LCD显示器上显示当前的时间。设计的基本要求:1.使用文字型LCD显示器显示当前时间。2.显示格式为“时时:分分:妙秒”。3.用4个功能键操作来设置当前时间。功能键K1-K4功能如下:①K1:进入设置现在的时间。②K2:设置小时。③K3:设置分钟。④K4:确认完成设置。4. 程序执行后工作指示灯LED闪烁...

51单片机 电子时钟程序(共阳)。为何老是乱码,求大神指点
首先,像楼上说的,P0送显示数据前应该关一下显示。考虑到你是共阳显示,mov P1,#0才对。像这样 mov P1, #0 \/\/ 关显示。mov P0, 显示数据 mov P1, 显示哪一位。acall delay \/\/ 延时一小段时间,调试的时候可以适当延时长一点。djnz 。。。\/\/ 显示下一位。关显示的位置应该在MOV...

求一个51单片机定时闹钟程序。要C语言。能够调时间
我来发一个C语言51单片机时钟程序,希望能帮到你 \/* 程序功能:带定时闹铃时钟 *\/ \/*---*\/ include <AT89X51.H> \/*包含器件配置文件*\/ define uchar unsigned char define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};\/*...

求一段为51单片机编写的LCD电子时钟的设计,简单就好!高分伺候!
简单的时钟,不用1302即可办到。题目要求的设计已经完成,电路图如下。程序稍长,放在我的百度空间了。可以用百度、网页,进行查找:做而论道 用 LCD1602 显示的时钟 百度一下,即可查到。

基于51单片机的数码管设计电子时钟,可以调时间的,怎么弄唉,大家帮帮...
1、数码管驱动电路设计。一般用三极管如9013或者锁存器如74HC573来驱动,使其能够正常亮灭。2、使用动态扫描的方式让数码管能够显示你想要的数字,这个可以用中断来扫描也可以不用。3、使用实时时钟芯片如DS1302来获得你想要的时间数据。这种网上有很多源程序,你可以搜索看。你要学会几点:(1)对芯片...

51单片机 制作 日历时钟 用汇编语言 要详细的代码和硬件图示
你好这是基于DS1302日历时钟的单片机汇编程序 51单片机 ORG 0000H MOV SP,#30H LOAD EQU P2.0 CLR LOAD MOV R0,#0FH MOV R1,#0AH ;亮度 ACALL TRT MOV R0,#02H MOV R1,#0BH ;扫描位数 ACALL TRT MOV R0,#0FFH MOV R1,#09H ;译码 ACALL TRT MOV R0,#01H MOV R1...

关于用51单片机做一个电子时钟的问题
循环中,不断的依次点亮四个数字和一个小数点,人眼是分不出来的,就可以达到效果了 另外,你需要一个LED闪烁,代表秒的显示,可以利用定时器来完成 观察你的程序,实在是不敢恭维,尤其是数码管的显示部分太乱了 程序中好像还没有自动加时的部分,并且按键处理还没有消抖措施 不多说了,上程序,俺...

相似回答