|
本帖最后由 king@ 于 2016-11-2 19:28 編輯
#include <reg52.h> //添加頭文件
#define uint unsigned int
#define uint32 unsigned long int
#define uchar unsigned char
uint32 num=0;
uchar H,M,S,count=0; //時(shí)分秒uchar DAT[10]={0x3f,0x06;0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數(shù)碼管編碼0~9
void delay() //短延時(shí)主要用于減小數(shù)據(jù)顯示的抖動(dòng)和重影
{
uchar i,j;
for(i=10;i>0;i--)
for(j=30;j>0;j--)
;
}
void judge() //改變時(shí)分秒的值,使分秒都為60進(jìn)制,時(shí)為24進(jìn)制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
H=0;
}
void show() //顯示函數(shù),P2為位選,P0為段選
{
P2=0X7F,P0=DAT[H/10],delay(); //第一位選中時(shí),顯示時(shí)的高位,延時(shí)下
P2=0XBF,P0=DAT[H%10],delay(); //第二位選中時(shí),顯示時(shí)的低位,延時(shí)下
P2=0XDF,P0=0X40,delay(); //第三位選中時(shí),顯示“-”,延時(shí)下
P2=0XEF,P0=DAT[M/10],delay(); //第四位選中時(shí),顯示分的高位,延時(shí)下
P2=0XF7,P0=DAT[M%10],delay(); //第五位選中時(shí),顯示分的低位,延時(shí)下
P2=0XFB,P0=0X40,delay(); //第六位選中時(shí),顯示“-”,延時(shí)下
P2=0XFD,P0=DAT[S/10],delay(); //第七位選中時(shí),顯示秒的高位,延時(shí)下
P2=0XFE,P0=DAT[S%10],delay(); //第八位選中時(shí),顯示秒的低位,延時(shí)下
}
void main() //主函數(shù)
{
TMOD=0X01; //定時(shí)器0工作在方式1
TH0=0X3C;
TL0=0XB0; //設(shè)置定時(shí)器的初值,使得定時(shí)時(shí)間為50ms(晶振為12MHZ時(shí))
EA=1; //開啟總中斷
ET0=1; //允許定時(shí)器0中斷
TR0=1; //開啟定時(shí)器0
while(1)
show(); //一直執(zhí)行顯示函數(shù)
}
void timer0()interrupt 1 //定時(shí)器0中斷服務(wù)程序
{
TH0=0X3C;
TL0=0XB0; //重新設(shè)置初值
count++; //每中斷一次,計(jì)數(shù)寄存器加1
if(count==20) //當(dāng)定時(shí)20次時(shí),即50MS*20=1000ms=1s
{
count==0; //將計(jì)數(shù)值重新歸零
if(num!=3600)
num++;
if(num==3600)
num=0;
judge();
}
|
|