|
/***********************************************************
实验名称:定时器0时钟
程序说明:烧好程序同时拨码开关2打上 数码管显示分秒
实验平台:HY-M51核心板 51单片机 12M晶振
作者:刘哲
日期:2011-10-01
宏远电子 http://imcu.taobao.com/ 版权所有
***********************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a1,a2,a3,a4;
uchar a,s,f,m;
sbit s1=P2^4;
sbit s2=P2^5;
sbit s3=P2^6;
sbit s4=P2^7;
uchar code table[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};// 定义段码
void delay(uint n)//延时
{
uint x;
while(n--)
{
x=50;
while(x--);
}
}
void disp(uchar n3,n2,n1,n0)//显示子程序
{
P0=table[n3];//开段选
P2=0Xfe; //开位选
delay(10); //延时
P0=table[n2];
P2=0Xfd;
delay(10);
P0=table[n1];
P2=0Xfb;
delay(10);
P0=table[n0];
P2=0Xf7;
delay(10);
}
void Time0()//定时器0中断
{
TMOD=0X01;
TH0=0x3c;//装初值50ms
TL0=0xb0;
TR0=1; //开定时器0中断
ET0 = 1;//IE中断允许寄存器 t0溢出中断允许位
EA=1; //开总中断
}
void main()
{
Time0();
//调用定时器0中断
while(1)
{
a1=s/10;
a2=s%10;
a3=f/10;
a4=f%10;
disp(a1,a2,a3,a4);//显示数字
if(s1 == 0)
{
delay(10);//延时去抖动
if(s3 == 0)
{
if(f<60)
{f++;
if(f==60)
{f=0;
}
}
}
}
if(s2 == 0)
{
if(f<60)
{f++;
if(f==60)
{f=0;
}
}
}
if(s1 == 0)
{
if(s<24)
{s++;
if(s==24)
{s=0;
}
}
}
delay(1);
}
}
void Timer0Interrupt() interrupt 1
//中断服务程序
{
TH0=0x3c;//50ms
TL0=0xb0;
a++;
if(a==20)
{
a=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24)s=0;
}
}
}
}
|
|