/*
名稱:定時器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;
}
|