STC12C2052AD單片機控製的數碼管時鍾,數碼管是共陽4位時鍾數碼管,由於(yu) 使用單片機真驅,電路比較簡單,且使用的材料和工具也很簡單,用數碼管顯示,單片機控製,兩(liang) 個(ge) 按鍵調時,蜂鳴器整點報時。所需要的元件如下:
材料有以下這些:
STC12C2052AD單片機一片
黃色共陽4位時鍾數碼管一塊
6mm×6mm按鍵兩(liang) 個(ge)
杜邦線插針2p兩(liang) 個(ge)
無源蜂鳴器一個(ge)
20腳+14腳芯片座各一個(ge)
洞洞板一塊(截取一小部分)
100歐電阻4個(ge)
程序如下:
/************************************************************************************/
#include <STC12C2052AD.h> //聲明頭文件
sbit key1=P3^4; //按鍵接口定義(yi)
sbit key2=P3^5; //按鍵接口定義(yi)
sbit speaker=P3^7; //蜂鳴器接口定義(yi)
/************************************************************************************/
unsigned char code LED[10]={0x20,0xA7,0x90,0x82,0x07,0x42,0x40,0xA6,0x00,0x02};//數碼管段位碼定義(yi)
unsigned int time; //全局秒基準定義(yi)
/*-------------------------------------延時函數-------------------------------------*/
void delayms (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*----------------------------------蜂鳴器驅動函數----------------------------------*/
void beep (void)
{
unsigned char i=30;
while(i--)
{
speaker=~speaker;
delayms(3);
}
}
/*----------------------------------數碼管驅動函數----------------------------------*/
void display (unsigned char hour,min)
{
unsigned char H1,H2,M1,M2;
P3=0xf8; //數碼管位選
P1 = LED[H1]; //數碼管段選
delayms (2); //掃描延時
P3=0xf4; //數碼管位選
P1 = LED[H2]; //數碼管段選
delayms (2); //掃描延時
P3=0xf2; //數碼管位選
P1 = LED[M1]; //數碼管段選
delayms (2); //掃描延時
P3=0xf1; //數碼管位選
P1 = LED[M2]; //數碼管段選
delayms (2); //掃描延時
/*--------------------------------------分定義(yi) --------------------------------------*/
M1=min/10;//取分十位
min=min%10;//取餘(yu)
M2=min;//取分個(ge) 位
/*--------------------------------------時定義(yi) --------------------------------------*/
H1=hour/10;//取時十位
hour=hour%10;//取餘(yu)
H2=hour;//取時個(ge) 位
}
/*-----------------------------------按鍵去抖函數-----------------------------------*/
void qudou (unsigned char hour,min)
{
unsigned char i;
for(i=0;i<25;i++){//循環顯示,等於(yu) 鍵盤去抖的功能
display (hour,min);
}
}
/*--------------------------------------主函數--------------------------------------*/
void main(void)
{
////定時器初始設置
TMOD=0x01;//定時器工作方式1
TH0=0x3C;//定時器初始產(chan) 生50ms時基信號
TL0=0xB0;//定時器初始產(chan) 生50ms時基信號
ET0=1;//開定時器中斷
EA=1;//開總中斷
TR0=1;//啟動定時器
/*************************************************************************************/
while(1)
{
unsigned char hour,min;//定義(yi) 時分
display (hour,min);//調用顯示函數
if (time>59)//60秒向分進1
{
time=0;
min++;
}
if (min>59)//60分向時進1
{
min=0;
hour++;
beep ();
}
if (hour>23)//24時時分秒清零
{
hour=0;
min=0;
time=0;
}
/*-----------------------------------按鍵判斷程序-----------------------------------*/
if(key1==0)
qudou (hour,min);
if (key1==0) {hour++;}
if(key2==0)
qudou (hour,min);
if (key2==0) {min++;}
}
}
/*-----------------------------------中斷服務程序-----------------------------------*/
void Timer0_Routine(void) interrupt 1
{
unsigned char a;
TH0=0x3C;//定時器初始產(chan) 生50ms時基信號
TL0=0xB0;//定時器初始產(chan) 生50ms時基信號
a++;//定時器循環計數20次為(wei) 一秒
if (a==20){//定時器循環計數20次為(wei) 一秒
a=0;//次數清零,從(cong) 新循環計數
time++;//秒加一
}
}
/************************************************************************************/