要求
1、用8位数码显示管显示00-00-00表示小时-分钟-秒。
2、用定时器
定时器代码
#include <reg52.h>
sbit LED=P1^0;
unsigned char numl=0;
int flag=0;
void main()
{
TMOD=0x01; //定时器工作模式
TH0=(65536-50000)/256; //定时高8位
TL0=(65536-50000)%256; //定时低8位
TR0=1; //打开定时器0
ET0=1; //打开定时器0中断
EA=1; //打开总中断
while(1)
{
if(flag)
{
flag=0; //flag清零,下一次flag=1的时候进入
LED=!LED; //LED取反输出
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; //重置定时高8位
TL0=(65536-50000)%256; //重置定时低8位(50ms)
numl++;
if(numl==20) //判断计数到1s
{
numl=0;
flag=1; //flag置1 --> 主函数里执行取反
}
}
时钟程序:
#include <reg52.h>
sbit duan=P2^2;
sbit wei=P2^3;
unsigned char num[11]=//0到9和-显示数据提前储存
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0xbf
};
void delay_ms(unsigned int num)//1ms延时
{
unsigned int x,y;
for(x=0;x<110;x++)
for(y=0;y<num;y++);
}
void delay_10us(unsigned int num)//10us延时
{
unsigned int x;
for(x=0;x<num;x++);
}
unsigned char numl=0;
int flag=0;
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
numl++;
if(numl==20)
{
numl=0;
flag=1;
}
}
void main()
{
int i,hg=0,hd=0,mg=0,md=0,sg=0,sd=0,pd;
wei=0;
duan=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(flag)
{
flag=0;
sd++;
}
if(sd==10)
{
sd=0;
sg++;
}
if(sg==6)
{
sg=0;
md++;
}
if(md==10)
{
md=0;
mg++;
}
if(mg==6)
{
mg=0;
hd++;
}
if(hd==10)
{
hd=0;
hg++;
}
if(hg==2&&hd==4)
{
hd=0;
hg=0;
}
for(i=0;i<8;i++)
{
wei=1;
P0=0x01<<i;
wei=0;
duan=1;
switch(i)
{
case 0:P0=num[hg];break;
case 1:P0=num[hd];break;
case 2:P0=num[10];break;//输出-
case 3:P0=num[mg];break;
case 4:P0=num[md];break;
case 5:P0=num[10];break;
case 6:P0=num[sg];break;
case 7:P0=num[sd];break;
}
duan=0;
delay_10us(150);
wei=1;
P0=0x00;
wei=0;
duan=1;
P0=0xff;
duan=0;
delay_10us(30);
}
}
}