/*
名称:定时器T0实现电子表功能
时间:2018.7.15
功能:8位数码管显示时分秒(01-25-55);
按键Key1显示秒表计时,每60s报时一次
整时报时,
*/
#include <reg51.h>
#define DataPort P1//宏定义端口
sbit Sound = P0^0;//将Sound位定义为P0.0引脚
unsigned char time; //记录中断次数
unsigned char second;//记录秒
unsigned char min;//记录分钟
unsigned char hour;//记录小时
unsigned char key = 0;//记录按键次数
unsigned int i;
unsigned char code Seg_Code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
unsigned char code Bit_Code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
sbit Seg_Latch = P2^2; //段口
sbit Bit_Latch = P2^3; //位口
unsigned char num[8];//存储显示值
unsigned char num2[5];
void Display(unsigned int i,unsigned char j);//显示函数
void Init_Timer0(void);//
/*****************延时************************/
void DelayUs2x(unsigned int t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/****************主函数**********************/
void main()
{
TMOD = 0x01; //T0方式1
TH0 = 0xd8; //(65536-10000)/256
TL0 = 0xf0; //(65536-10000)%256 0.01s
ET0 = 1;//允许T0中断
EA = 1; //开总中断
TR0 = 1; // 启动T0
/*PX0 = 0; //中断1为高优先级
PX1 = 1;*/
while(1)
{
if(second == 60) //60s/1min
{
second = 0;
min++;
if(min == 60) //60min
{
min =0 ;
hour ++;
Sound = ~Sound;
if(hour == 24) //24h
{
hour = 0;
}
}
}
num[0] = Seg_Code[hour/10];
num[1] = Seg_Code[hour%10];
num[2] = 0x40;
num[3] = Seg_Code[min/10];
num[4] = Seg_Code[min%10];
num[5] = 0x40;
num[6] = Seg_Code[second/10];
num[7] = Seg_Code[second%10];
for(i=0;i<8;i++)
{
Display(i,num[i]);
}
if((P3&0x80)==0x00)//按键被按下
{
key ++;
TR0 = 0; //关闭T0
EA = 0;
time = 0;
second = 0;
Init_Timer0();
switch(key)
{
case 1: //第一次按下
TH1 = 0xd8; //定时0.01s
TL1 = 0xf0;
ET1 = 1; //允许T1中断
TR1 = 1; //起动T1
while(1)
{
if(second == 60) //60s / 1min
{
second = 0;
Sound = ~Sound;
}
num2[0] = Seg_Code[second/10];
num2[1] = Seg_Code[second%10];
num2[2] = 0x40;
num2[3] = Seg_Code[time/10];
num2[4] = Seg_Code[time%10];
for(i=0;i<5;i++)
{
Display(i,num2[i]);
}
}
break;
case 2: //第二次按下
ET1 = 0;
TR1 = 0; //关闭T1
break;
case 3: //第三次按下
key = 0; //键值清零
DataPort = 0;
second = 0;
time = 0;
TR0 = 1;
break;
}
}
}
}
/*************显示函数*****************/
void Display(unsigned int i,unsigned char j)
{
DataPort =0;
Seg_Latch =1;
Seg_Latch =0;
DataPort = Bit_Code[i];
Bit_Latch =1;
Bit_Latch =0;
DataPort = j;
Seg_Latch =1;
Seg_Latch = 0;
DelayUs2x(300);
}
/****************** void Init_Timer0(void);****************************/
void Init_Timer0(void)
{
TMOD = 0x10; //T1方式1
EA = 1; //开总中断
TH1 = 0xd8; //定时0.01s
TL1 = 0xf0;
}
/****************T0中断函数************************/
void int_T0() interrupt 1
{
EA = 0; //屏蔽
TH0 = 0xd8; //(65536-10000)/256
TL0 = 0xf0; //(65536-10000)%256 0.01s
time ++;
if(time == 100) //中断100次(1s)
{
time = 0;
second++;
}
EA = 1;
}
/********************T1中断函数*********************************/
void int_T1() interrupt 3
{
EA = 0; //屏蔽
TH1 = 0xd8; //(65536-10000)/256
TL1 = 0xf0; //(65536-10000)%256 0.01s
time ++;
if(time == 100) //中断100次(1s)
{
time = 0;
second++;
}
EA = 1;
}
|