求只用51单片机设计的能显示时分秒且能校时的C语言程序最好详解哦

是实时时钟

//at89c2051单片机 运用在(sft ck301)时钟上的程序 12m晶振
//省去其他的功能,只有显示时间功能,是24小时显示制。
//三个按键的设置安排由左向右是
//k1:设置秒分时退出的循环按钮 P3.5初始高电平
//k2; 数字上加循环 P3.4初始高电平
//k3: 数字下减循环 P3.2 初始高电平
//
//蜂鸣器 P3.7 初始高电平 低电平触发
//
//数码管
//段码端口P1
//位码分别是 P3.0十万位 P3.4万位 P3.2千位 P3.5百位P3.3十位 P3.1个位
//原11版本的计数器设置TMOD设置为0X20是错误的,应该是0x10,已经更正
//且装填的数字是50000累加中断数字是20都已经更正
#include<reg51.h> //包含单片机寄存器的头文件
unsigned char code Tab[]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0xff};//数码管段码///P1口
////////////////////////----0----1----2---3-----4----5----6----7----8---9---空
unsigned int m; //// 秒
unsigned int f;//// 分
unsigned int s; //// 时
unsigned int a;//////主秒a
unsigned int b;//////主秒 b
unsigned int c; //////调节循环 0//显示 1//调分 2//调时
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p37=P3^7;
sbit p17=P1^7;
/****************************************************************
函数名 delay(); 函数功能:延时一段时间 始
*****************************************************************/
void delay(void) //两个void意思分别为无需返回值,没有参数传递
{
unsigned int i; //定义无符号整数,最大取值范围65535
for(i=0;i<10;i++) //做20000次空循环
; //什么也不做,等待一个机器周期
}
/****************************************************************
函数名 delay(); 函数功能:延时一段时间 终
*****************************************************************/
/****************************************************************
函数名 xianshi(); 函数功能:显示整个时钟 始
*****************************************************************/
void xianshi() //两个void意思分别为无需返回值,没有参数传递
{
////////// 个位
p33=0;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;
P1=Tab[m%10];
delay();
//////////
p33=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
////////// 十位
p33=1;
p31=0;
p32=1;
p35=1;
p30=1;
p34=1;
P1=Tab[m/10];
delay();
//////////
p31=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
////////// 百位
p33=1;
p31=1;
p32=0;
p35=1;
p30=1;
p34=1;
P1=Tab[f%10];
delay();
//////////
p32=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
////////// 千位
p33=1;
p31=1;
p32=1;
p35=0;
p30=1;
p34=1;
P1=Tab[f/10];
delay();
//////////
p35=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
////////// 万位
p33=1;
p31=1;
p32=1;
p35=1;
p30=0;
p34=1;
P1=Tab[s%10];
delay();
//////////
p30=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
//////////十万位
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=0;
P1=Tab[s/10];
delay();
//////////
p34=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;

}
/****************************************************************
函数名 xianshi(); 函数功能:显示整个时钟 终
*****************************************************************/
/****************************************************************
函数名 xianshifen(); 函数功能:显示分 始
*****************************************************************/
void xianshifen() //两个void意思分别为无需返回值,没有参数传递
{
////////// 百位
p33=1;
p31=1;
p32=0;
p35=1;
p30=1;
p34=1;
P1=Tab[f%10];
delay();
//////////
p32=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
////////// 千位
p33=1;
p31=1;
p32=1;
p35=0;
p30=1;
p34=1;
P1=Tab[f/10];
delay();
//////////
p35=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;

}
/****************************************************************
函数名 xianshifen(); 函数功能:显示分 终
*****************************************************************/
/****************************************************************
函数名 xianshishi(); 函数功能:显示时 始
*****************************************************************/
void xianshishi() //两个void意思分别为无需返回值,没有参数传递
{

////////// 万位
p33=1;
p31=1;
p32=1;
p35=1;
p30=0;
p34=1;
P1=Tab[s%10];
delay();
//////////
p30=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
//////////十万位
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=0;
P1=Tab[s/10];
delay();
//////////
p34=1;//////消除鬼影语句
delay();//////消除鬼影语句
P1=0xff;//////消除鬼影语句
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;

}
/****************************************************************
函数名 xianshishi(); 函数功能:显示时 终
*****************************************************************/
/****************************************************************
函数名 leijijiamiao(); 函数功能:利用中断累计加秒 始
*****************************************************************/
void leijijiamiao(void) //两个void意思分别为无需返回值,没有参数传递
{
if(b==1)
{
b=0;
m++;
p17=~p17; ////p17取反实现冒号闪烁
if(m==60)
{
m=0;
f++;
}
if(f==60)
{
f=0;
s++;
}
if(s==24)
{
s=0;
}
}
}
/****************************************************************
函数名 leijijiamiao(); 函数功能:利用中断累计加秒 终
*****************************************************************/
/*******************************************************************
函数功能:主函数 (C语言规定必须有也只能有1个主函数) 始
********************************************************************/
void main()
{ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************
定义初始值
******************************************************************/
p37=1;////蜂鸣器不发声
f=0;
m=0;
s=0;
c=0;
p17=1;
/******************************************************************
定义初始值
******************************************************************/

/***********************************************************************
定时计数器的操作 作为定时器使用1秒计时 始
************************************************************************/
EA=1; //开总中断
ET1=1; //定时器T1中断允许
TR1=1;//启动定时计数器T1
TMOD=0x10;////0001 0000 设置定时计数器T1为定时使用,并使用16位定时器
TH1=(65536-50000)/256;//////装填定时计数器T1高8位//定时5000次的时间是0.05秒。得循环20次才是1秒
TL1=(65536-50000)%256;//////装填定时技数器T1底8位//定时5000次的时间是0.05秒。得循环20次才是1秒
TF1=0;/////////定时计数器1的溢出位清零
/***********************************************************************
定时计数器的操作 作为定时器使用1秒计时 终
************************************************************************/
while(1) ////////////////////////////////////主循环
{////////////////////////////////////主循环 始
//////////////////////////////////////////////////////////显示 循环
while(c==0)
{
xianshi();
leijijiamiao();
if(p35==0)
{
delay();
delay();
delay();
delay();
if(p35==0)
{
c++;
while(!p35)
{
;
}
}
}
}
//////////////////////////////////////////////////////////显示 循环
//////////////////////////////////////////////////////////调分 循环
while(c==1)
{
xianshifen();
////////////////// 调分 上加按钮判断
if(p34==0)
{
delay();
delay();
delay();
delay();
if(p34==0)
{
f++;
if(f==60)
{
f=0;
}
while(!p34)
{
;
}
}
}
/////////////////// 调分 上加按钮判断
/////////////////// 调分 下减按钮判断
if(p32==0)
{
delay();
delay();
delay();
delay();
if(p32==0)
{
if(f==00)
{
f=60;
}
f--;
while(!p32)
{
;
}
}
}
///////////////////调分 下减按钮判断
///////////////////循环按钮判断
if(p35==0)
{
delay();
delay();
delay();
delay();
if(p35==0)
{
c++;
while(!p35)
{
;
}
}
}
///////////////////循环按钮判断
}
//////////////////////////////////////////////////////////调分 循环
//////////////////////////////////////////////////////////调时 循环
while(c==2)
{
xianshishi();
///////////////////调时 上加按钮判断
if(p34==0)
{
delay();
delay();
delay();
delay();
if(p34==0)
{
s++;
if(s==24)
{
s=0;
}
while(!p34)
{
;
}
}
}
///////////////////调时 上加按钮判断
///////////////////调时 下减按钮判断
if(p32==0)
{
delay();
delay();
delay();
delay();
if(p32==0)
{
if(s==00)
{
s=24;
}
s--;
while(!p32)
{
;
}
}
}
///////////////////调时 下减按钮判断
///////////////////循环按钮判断
if(p35==0)
{
delay();
delay();
delay();
delay();
if(p35==0)
{
c=0;
while(!p35)
{
;
}
}
}
///////////////////循环按钮判断
}
//////////////////////////////////////////////////////////调时 循环
}////////////////////////////////////主循环 终
} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*******************************************************************
函数功能:主函数 (C语言规定必须有也只能有1个主函数) 终
********************************************************************/
/*****************************************************************************************************************
中断服务函数;定时器T1中断服务函数//当定时计数器T1有溢出时则执行本函数,执行完本函数后接着执行之前的运行的程序
******************************************************************************************************************/
void Time1(void) interrupt 3 using 0
//interrupt 3 理解是中断函数修饰后面的数字取值由0--31,
//目前数字意义是0--外部中断0、1--定时计数器T0、2--外中断1、3--定时计数器T1、4--串行中断、5--定时计数器T2(其他数值保留)
//using 0 理解是工作寄存器组,可以忽略 通常取0
{
TF1=0;
TH1=(65536-50000)/256;//////装填定时计数器T1高8位//定时5000次的时间是0.05秒。得循环20次才是1秒
TL1=(65536-50000)%256;//////装填定时技数器T1底8位//定时5000次的时间是0.05秒。得循环20次才是1秒
a++;
if(a==20)////检测a的数值为3713后给b加1///当定时器有3713次溢出时最接近1秒计时(20121018号由原来的3713改为3715)之前时钟偏快
{
a=0;
b=1;
}
}
/*****************************************************************************************************************
中断服务函数;定时器T1中断服务函数//当定时计数器T1有溢出时则执行本函数,执行完本函数后接着执行之前的运行的程序
******************************************************************************************************************/
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-11
单片机语言程序设计实训100例里面有,很详细的,你可以看看。
相似回答