|
|
/*
名稱:定時(shí)器T0實(shí)現(xiàn)電子表功能
時(shí)間:2018.7.15
功能:8位數(shù)碼管顯示時(shí)分秒(01-25-55);
按鍵Key1顯示秒表計(jì)時(shí),每60s報(bào)時(shí)一次
整時(shí)報(bào)時(shí),
*/
#include <reg51.h>
#define DataPort P1//宏定義端口
sbit Sound = P0^0;//將Sound位定義為P0.0引腳
unsigned char time; //記錄中斷次數(shù)
unsigned char second;//記錄秒
unsigned char min;//記錄分鐘
unsigned char hour;//記錄小時(shí)
unsigned char key = 0;//記錄按鍵次數(shù)
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];//存儲(chǔ)顯示值
unsigned char num2[5];
void Display(unsigned int i,unsigned char j);//顯示函數(shù)
void Init_Timer0(void);//
/*****************延時(shí)************************/
void DelayUs2x(unsigned int t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/****************主函數(shù)**********************/
void main()
{
TMOD = 0x01; //T0方式1
TH0 = 0xd8; //(65536-10000)/256
TL0 = 0xf0; //(65536-10000)%256 0.01s
ET0 = 1;//允許T0中斷
EA = 1; //開(kāi)總中斷
TR0 = 1; // 啟動(dòng)T0
/*PX0 = 0; //中斷1為高優(yōu)先級(jí)
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; //關(guān)閉T0
EA = 0;
time = 0;
second = 0;
Init_Timer0();
switch(key)
{
case 1: //第一次按下
TH1 = 0xd8; //定時(shí)0.01s
TL1 = 0xf0;
ET1 = 1; //允許T1中斷
TR1 = 1; //起動(dòng)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; //關(guān)閉T1
break;
case 3: //第三次按下
key = 0; //鍵值清零
DataPort = 0;
second = 0;
time = 0;
TR0 = 1;
break;
}
}
}
}
/*************顯示函數(shù)*****************/
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; //開(kāi)總中斷
TH1 = 0xd8; //定時(shí)0.01s
TL1 = 0xf0;
}
/****************T0中斷函數(shù)************************/
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中斷函數(shù)*********************************/
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;
}
|
|