求单片机C语言时钟程序~~~

我用的是STC的89C52芯片,哪位高手给个C语言的时钟程序啊? 要求不很多,有时分秒,可调时分就好。

#include <AT89X52.H> unsigned char dispbitcnt; //数码管位码扫描变量
unsigned char second; //秒变量
unsigned char minite; //分变量
unsigned char hour; //时变量
unsigned char tcnt; //秒信号产生变量
unsigned char mstcnt; //扫描时间变量 const unsigned char dispcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,<br> 0x92,0x82,0xf8,0x80,0x90};
//0123456789段码
const unsigned char dispbitcode[6]={0xfe,0xfd,0xfb,0xf7,<br> 0xef,0xdf};
//123456位码
unsigned char dispbuf[6]={0,0,0,0,0,0};
//缓冲数组
//**************TMR0中断数码管扫描程序*********************
void Timer0() interrupt 1
{ P2=dispcode[dispbuf[dispbitcnt]];//段码
P1=dispbitcode[dispbitcnt];//位码
dispbitcnt++;
if(dispbitcnt==6)
{dispbitcnt=0;<br> }

tcnt++; //中断产生秒信号
if(tcnt==244)
{tcnt=0;<br> second++;<br> if(second==60)<br> {second=0;<br> minite++;<br> if(minite==60)<br> {minite=0;<br> hour++;<br> if(hour==24)<br> {hour=0;<br> }
}
}
dispbuf[4]=second%10; //得秒钟的低位,送缓冲数组
dispbuf[5]=second/10; //得秒钟的高位,送缓冲数组
dispbuf[2]=minite%10; //得分钟的低位,送缓冲数组
dispbuf[3]=minite/10; //得分钟的高位,送缓冲数组
dispbuf[0]=hour%10; //得时钟的低位,送缓冲数组
dispbuf[1]=hour/10; //得时钟的高位,送缓冲数组

}
TMOD=0x01;
TL0=0x10;
TH0=0xf0; }
///****************1ms延时程序******************
void delay_1ms(unsigned char i)
{
unsigned char j;
for(i=0;i<144;i++)
for(j=0;j<144;j++);
} ///****************按键检测*********************
void key_scan(void)
{
while(1)
{
if(P3_0==0)
{
delay_1ms(20);
if(P3_0==0)
{second++;<br> if(second==60)<br> {second=0;<br> }
dispbuf[4]=second%10;
dispbuf[5]=second/10;
while(P3_0==0);
}
}
if(P3_1==0)
{
delay_1ms(20);
if(P3_1==0)
{
minite++;
if(minite==60)
{minite=0;<br> }
dispbuf[2]=minite%10;
dispbuf[3]=minite/10;
while(P3_1==0);
}
}
if(P3_2==0)
{
delay_1ms(20);
if(P3_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
dispbuf[0]=hour%10;
dispbuf[1]=hour/10;
while(P3_2==0);
}
}
}
//*************主程序********************
void main(void)
{
TMOD=0x01;TL0=0x10;
TH0=0xf0;
while(1)
{
dispbitcnt=0;P1=0x00; //开段码
P2=0x00; //开位码
delay_1ms(200); //延时
delay_1ms(200); //延时
delay_1ms(200); //延时
delay_1ms(200); //延时
P2=0xff; //关位码EA=1;
ET0=1;
TR0=1;
key_scan();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-06-07
这个是简单的数码管时钟显示如果有需要,我写过比较完善的1602显示时钟.显示控制年月日等等.#include<reg51.h>
sbit Begin=P2^0;
sbit Hour=P2^1;
sbit Mus=P2^2;
sbit End=P2^3;
unsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
unsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char Time[]={0,0,16,0,0,16,0,0};
unsigned char a;
unsigned int x,m,th;
void init()
{
TMOD=0x01;
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char keyboard()
{
if(Begin==0){
delay(5);
if(Begin==0)
return 1;
}
if(Hour==0){
delay(30);
if(Hour==0)
return 2;
}
if(Mus==0)
return 3;
if(End==0)
return 4;
}
void display()
{
unsigned char i; for(i=0;i<8;i++)
{
P3=num[i];
P0=Tab[Time[i]];
delay(5);
}
}
void main()
{
unsigned char Key;
init();
Key=keyboard();
if(Key==1)
{
while(1){
Key=keyboard();
display();
if(Key==2)
x+=3600;
if(Key==3)
x+=1;
if(Key==4)
return;
}
}}
void holes() interrupt 1 using 2
{
TH0=(65535/50000)/256;
TL0=(65535/50000)%256;
a++;
if(a>=20)
{
x++;
m=x;
th=m/3600; //设置小时
Time[0]=th/10;
Time[1]=th%10;
m=m%3600; Time[2]=16; th=m/60; //设置分钟
Time[3]=th/10;
Time[4]=th%10;
m=m%60; Time[5]=16; th=m; //设置秒
Time[6]=th/10;
Time[7]=th%10; a=0;
}
}本回答被网友采纳
第2个回答  2013-12-04
/***********************************************************
实验名称:可调电子钟(数码管显示)示例程序
程序说明:按键S1切换时分秒,按下S6加一,按下S3减一
***********************************************************/#include <AT89X52.H>
unsigned char code SEG7[11]={0xC0,/*0*/<br> 0xF9,/*1*/<br> 0xA4,/*2*/<br> 0xB0,/*3*/<br> 0x99,/*4*/<br> 0x92,/*5*/<br> 0x82,/*6*/<br> 0xF8,/*7*/<br> 0x80,/*8*/<br> 0x90,/*9*/<br> 0xbf,/*-*/<br> };unsigned short int tcount;struct time
{
unsigned char second;
unsigned char minute;
unsigned char hour;
}time1;
/***************************************/
/* 延时子程序 */
/***************************************/
void delay(k)
unsigned int k;
{
unsigned char j;
while((k--)!=0)
for(j=0;j<125;j++);
}
/***************************************/
/* 时钟调整子程序 */
/***************************************/
TimeUpDown(n,x,y)
unsigned char n,x,y;
{
if(P3_2==0)
{
delay(50);
if(P3_2==0)
{
n++;
if(n==x)
n=0;
while(P3_2==0);
}
} if(P3_3==0)
{
delay(50);
if(P3_3==0)
{
if(n==0)
n=y;
else
n--;
while(P3_3==0);
}
}
return n;
}
/***************************************/
/* 显示子程序 */
/***************************************/
void display(DisSecondH,DisSecondL,DisMinutH,DisMinutL,DisHourH,DisHourL)
unsigned char DisSecondH,DisSecondL,DisMinutH,DisMinutL,DisHourH,DisHourL;
{
P0=SEG7[DisSecondH]; //显示秒钟的十位
P2=0xfe;
delay(2); P0=SEG7[DisSecondL]; //显示分钟的个位
P2=0xfd;
delay(2); P0=0xbf; //显示-
P2=0xfb;
delay(2);

P0=SEG7[DisMinutH]; //显示秒钟的十位
P2=0xf7;
delay(2); P0=SEG7[DisMinutL]; //显示分钟的个位
P2=0xef;
delay(2);

P0=0xbf; //显示-
P2=0xdf;
delay(2);

P0=SEG7[DisHourH]; //显示小时的个位
P2=0xbf;
delay(2);
P0=SEG7[DisHourL]; //显示小时的十位
P2=0x7f;
delay(2);
}
/***************************************/
/* 主程序 */
/***************************************/
main()
{
unsigned char Flag;
TMOD = 0x01;
TH0 = (65536-63000)/256;
TL0 = (65536-60000)%256;
ET0 = 1;
EA = 1;
while(1)
{
if(P3_4 == 0) //设置标志位 Flag
{
delay(50);
if(P3_4 == 0)
{
TR0 = 0;
Flag++;
if(Flag > 3)
Flag = 0;
}
while(P3_4== 0);
} switch(Flag)
{
case 0:
TR0=1;
display(time1.second%10,time1.second/10,time1.minute%10,time1.minute/10,time1.hour%10,time1.hour/10);
break; case 1: //时钟小时调整
TR0=0;
time1.hour=TimeUpDown(time1.hour,24,23);
display(10,10,10,10,time1.hour%10,time1.hour/10);
break; case 2: //时钟分钟调整
time1.minute=TimeUpDown(time1.minute,60,59);
display(10,10,time1.minute%10,time1.minute/10,10,10);
break; case 3: //时钟秒调整
time1.second=TimeUpDown(time1.second,60,59);
display(time1.second%10,time1.second/10,10,10,10,10);
break; default:
break;
} }
}

/***************************************/
/* 中断子程序 */
/***************************************/
void t0(void) interrupt 1 using 0 {

tcount++;
if(tcount==10)
{
tcount=0;
time1.second++;
} if (time1.second>=60)
{
time1.second=0;
time1.minute++;
} if (time1.minute>=60)
{
time1.minute=0;
time1.hour++;
} if(time1.hour>=24)
time1.hour=0; TH0=(65536-63000)/256;
TL0=(65536-60000)%256;
}
相似回答