單片機的數碼時鐘設計

技術 浪雪飛鴿 2017-05-08

單片機的數碼時鐘設計

#include<reg51.h> // 包含51單片機寄存器定義的頭文件

unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //control shape

unsigned char port[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char int_time ; //中斷次數計數變量

unsigned char second; //秒計數變量

unsigned char minute; //分鐘計數變量

unsigned char hour; //小時計數變量

/////////////////////////////////////////////////////

void delay(void) //延時函數,延時約0.6ms

{

unsigned char j;

for(j=0;j<200;j++)

;

}

/******************************************************************

函數功能:顯示秒的子程序

入口參數:s

********************************************************************/

void DisplaySecond(unsigned char s)

{

P2=0xbf; //P2.6引腳輸出低電平, DS6點亮

P0=Tab[s/10]; //顯示十位

delay();

P2=0x7f; //P2.7引腳輸出低電平, DS7點亮

P0=Tab[s%10]; //顯示個位

delay();

P2=0xff; //關閉所有數碼管

}

/******************************************************************

函數功能:顯示分鐘的子程序

入口參數:m

********************************************************************/

void DisplayMinute(unsigned char m)

{

P2=0xf7; // P2.3引腳輸出低電平, DS3點亮

P0=Tab[m/10];//顯示個位

delay();

P2=0xef; // P2.4引腳輸出低電平, DS4點亮

P0=Tab[m%10];

delay();

P2=0xdf; //P2.5引腳輸出低電平, DS5點亮

P0=0xbf; //分隔符“-”的段碼

delay();

P2=0xff; //關閉所有數碼管

}

/******************************************************************

函數功能:顯示小時的子程序

入口參數:h

********************************************************************/

void DisplayHour(unsigned char h)

{

P2=0xfe; //P2.0引腳輸出低電平, DS0點亮

P0=Tab[h/10]; //顯示十位

delay();

P2=0xfd; //P2.1引腳輸出低電平, DS1點亮

P0=Tab[h%10]; //顯示個位

delay();

P2=0xfb; //P2.2引腳輸出低電平, DS2點亮

P0=0xbf; //分隔符“-”的段碼

delay();

P2=0xff; //關閉所有數碼管

}

/******************************************************************

函數功能:主函數

********************************************************************/

void main(void)

{

TMOD=0x01; //使用定時器T0

EA=1; //開中斷總允許

ET0=1; //允許T0中斷

TH0=(65536-46083)/256; //定時器高八位賦初值

TL0=(65536-46083)%256; //定時器低八位賦初值

TR0=1;

int_time=0; //中斷計數變量初始化

second=0; //秒計數變量初始化

minute=0; //分鐘計數變量初始化

hour=0; //小時計數變量初始化

while(1)

{

DisplaySecond(second); //調用秒顯示子程序

delay();

DisplayMinute(minute); //調用分鐘顯示子程序

delay();

DisplayHour(hour);

delay();

}

}

/******************************************************************

函數功能:定時器T0的中斷服務子程序

********************************************************************/

void interserve(void ) interrupt 1 using 1 //using Time0

{

int_time++;

if(int_time==20)

{

int_time=0; //中斷計數變量清0

second++; //秒計數變量加1

}

if(second==60)

{

second=0; //如果秒計滿60,將秒計數變量清0

minute++; //分鐘計數變量加1

}

if(minute==60)

{

minute=0; //如果分鐘計滿60,將分鐘計數變量清0

hour++; //小時計數變量加1

}

if(hour==24)

{

hour=0; //如果小時計滿24,將小時計數變量清0

}

TH0=(65536-46083)/256; //定時器重新賦初值

TL0=(65536-46083)%256;

}