|

楼主 |
发表于 2013-1-28 16:24:49
|
翌阳 发表于 2013-1-28 11:31 
用中断方式,自动装载方式定时器,计时精度很高的。注意如果有其它中断,要保证此中断最高优先,且不能被屏 ...
谢谢建议,我使用的就是自动重装初值的模式2,而且使用查询方式,没有其他中断,下面是程序源码,使用12.00M晶振,你方便的话,麻烦帮我分析下,谢了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit set=P3^2;
sbit add=P3^3;
sbit dec=P3^4;
int shi,fen,miao;
void xianshi(int weizhi,int shuzhi);
void xianshi1(int c);
void delay(x);
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code weizhi[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void delay(x)
{
int i;
while(x--)
for(i=0;i<110;i++);
}
main()
{ int i,flag=0;
EA=0;
ET0=0;
TMOD=0X02;
TH0=0X38;
TL0=0X38;
TR0=1;
while(1)
{
if(TF0==1)
{
i++;
TF0=0;
if(i==110)
{
i=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
if(set==0)
{
delay(10);
if(set==0)
{
TR0=0;
flag=1;
while(~set);
}
}
while(flag==1)
{
xianshi(7,miao);
xianshi(4,fen);
xianshi(1,shi);
xianshi1(2);
xianshi1(5);
if(set==0)
{
delay(10);
if(set==0)
{
flag=2;
//TR0=1;
}
while(~set);
}
if(add==0)
{
delay(10);
if(add==0)
{
shi++;
if(shi==24)
{
shi=0;
}
while(~add);
}
}
if(dec==0)
{
delay(10);
if(dec==0)
{
fen++;
if(fen==60)
{
fen=0;
}
}
while(~dec);
}
}
if(flag==2)
{
flag=0;
TR0=1;
}
//TR0=1;
xianshi(7,miao);
xianshi(4,fen);
xianshi(1,shi);
//xianshi1(2);
//xianshi1(5);
}
}
void xianshi(int c,int shuzhi)
{
int a,b;
a=shuzhi/10;
b=shuzhi%10;
P2=weizhi[c];
c--;
P0=table;
delay(1);
P0=0xff;
P2=weizhi[c];
P0=table[a];
delay(1);
}
void xianshi1(int c)
{
P2=weizhi[c];
P0=0x40;
}
void dingshi() interrupt 1
{
TH0=0X38;
TL0=0X38;
} |
|