一:電路原理和器件選擇
制作電路:單片機(AT89S52)實現多功能數字鐘
性能指標:該數字鐘實現時鐘運行,調整,倒計時,秒表功能,且精確度經調試一天的誤差在2S內。
實現原理:利用單片機定時器及計數器產生定時效果通過編程形成數字鐘效果,再利用數碼管動態掃描顯示單片機內部處理的數據。同時通過端口讀入當前外部控制狀態來改變程序的不同狀態,實現不同功能。
電路主要模塊及原理圖:
數碼管驅動電路
2.單片機最小系統:
單片機最小系統
3.LED及單片機電源原理圖
LED及單片機電源
4.外部控制狀態輸入模塊原理圖
外部控制狀態輸入模塊原理圖
主要元器件選擇:
單片機:AT89S52采用市場上比較常用的AT89S52,這里采用AT89S52而不是AT89S51是為了最大限度減小誤差,因為要實現多功能(例如秒表,時鐘,倒計時)為了相互之間不干擾而要用到3個定時/計數器,而51系列只有2個,而52系列有3個,故采用52系列
三極管:用來進行數碼管顯示的位選,這里采用PNP管
數碼管:采用共陽級四位數碼管
晶振:采用的是11.0592MHZ的晶振
電源部分:采用5V電壓供電,采用的是L7805穩壓芯片供電(加濾波)
電阻:大部分時限流電阻,阻值為4.7K或10K,1K
端口分配及連接:
P0:LED數碼管顯示內容通過P1口從單片機傳送到數碼管
P2.4-P2.7:數碼管位選控制端口
P2.0-P2.3:分別連接開關K0,K1,K2,K3通過不同的組合實現外部控制程序狀態
P1.0:蜂鳴器,倒計時完畢產生鳴響
P1.2-P1.5:四個發光二極管,顯示當前時鐘狀態
完整的源程序如下:
附程序源代碼及注釋
#include
#include
#define uint unsigned int
#define uchar unsigned char
/*定義P2口各管腳*/
sbit K0=P2^2;
sbit K1=P2^1;
sbit K2=P2^0;
sbit K3=P2^3;
sbit D0=P2^4;
sbit D1=P2^5;
sbit D2=P2^6;
sbit D3=P2^7;
/*定義P1口各管腳*/
sbit beep=P1^0;
sbit L0=P1^5;
sbit L1=P1^4;
sbit L2=P1^3;
sbit L3=P1^2;
uchar data BUFFER[4]={0,0,0,0}; //顯示緩沖區(依次從低位到高位,共四位數碼管)
uchar data CLOCK[4]={0,0,0,0}; //存放時鐘時間(依次是百分秒,秒,分,時)
uchar data SECOND[3]={0,0,0}; //存放秒表時間(依次時百分秒,秒,分)
uchar data SEVER[4]={0,0,0,0}; //存放倒計時時間(依次是百分秒,秒,分,時)
/*定義程序運行狀態*/
uchar data STATE=0;
/*STATE=0;時鐘運行*/
/*STATE=1;時鐘分調整*/
/*STATE=2;未定義狀態,可添加*/
/*STATE=3;時鐘時調整*/
/*STATE=4;倒計時分調整*/
/*STATE=5;倒計時時調整*/
/*STATE=6;秒表*/
/*STATE=7;倒計時運行*/
/*定義輔助計時全局變量*/
uchar m=60;
/*共陽數碼管顯示“0”-“9”,“-” */
uchar code TABLE[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98,0xbf};
/*自定義子函數*/
void display(); //顯示函數
void delay(); //顯示延時函數
void intsvr(); //調整時間時加1子函數
void delay10ms(); //延時函數
/*主函數體*/
void main(void)
{
EA=1;ET0=1; //開總中斷源,開T0中斷
TMOD=0x61; //T1方式2計數,T0方式1計時
TH0=-9460/256;TL0=-9460%256; //初始化計數器初值
TH1=0xff;TL1=0xff;
T2CON=0;TH2=-9452/256;TL2=-9452%256;
K0=1;K1=1;K2=1; //初始化控制狀態位
STATE=P2&0x07;
for(;;)
{
switch(STATE)
{
case 1: //時鐘分調整程序
{
TR0=0;ET0=0;EX0=0;TR2=0; //關閉定時器,時鐘停止運行,同時關閉外中斷IT0
L3=0;L1=0;L2=0;L0=1;
intsvr(); //調用加1函數
BUFFER[0]=CLOCK[2]%10; //數碼管顯示分鐘個位
BUFFER[1]=CLOCK[2]/10; //數碼管顯示分鐘十位
BUFFER[2]=10; //顯示“-”
BUFFER[3]=10; //顯示“-”
}break;
case 3: //時鐘時調整程序
{
TR0=0;ET0=0;EX0=0;TR2=0; //關閉定時器,時鐘停止運行
L3=0;L1=0;L2=0;L0=1;
intsvr(); //調用加1函數
BUFFER[0]=CLOCK[2]%10; //數碼管顯示分鐘個位
來源;21ic
評論