設計引數
1. 采用定時器實作定時功能;
2. 數碼管作為顯示幕;
3. 能夠實作按鍵調整時間功能;
4. 帶鬧鈴功能。
摘要
20世紀末,電子技識訓得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會資訊化程度的提高,同時也使現代電子產品性能進--步提高,產品更新換代的節奏也越來越快。
單片機模塊中最常見的是數字鐘,數字鐘是一-種用數字電路技術實作時、分、秒計時的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用。
本課題主要研究的是基于單片機的數字鐘設計,采用AT89C51單片機作為系統的主控芯片,外接LED顯示電路,按鍵電路,晶振電路,復位電路模塊構成一個簡單的數字鐘。通過按鍵電路能對時、分、秒分別進行設定和實時調整,并將結果顯示在數碼管上。
關鍵詞:數字鐘、單片機、數碼管
該課題主要涉及到的電路有晶振電路、復位電路、數碼管驅動電路、按鍵控制電路
1.晶振電路、復位電路
2.數碼管驅動電路(主要有74hc573和74hc138芯片組成)
3.按鍵控制電路
剩下的事代碼部分
先是定義自己需要的管腳和變數
typedef unsigned int u8;
typedef unsigned long u16;
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;
sbit bz=P1^3;//定義蜂鳴器管腳
sbit k1=P3^0; //定義P30口是k1
sbit k2=P3^1; //定義P31口是k2
sbit k3=P3^2; //定義P32口是k3
sbit k4=P3^3; //定義P33口是k4
static u16 s=16;//給小時賦值
static u16 f=30;//給分鐘賦值
static u16 m=0;//給秒賦值
static u16 n=2020;//給年賦值
static u16 y=1;//給月賦值
static u16 r=1;//給日賦值
static u16 m1=0;//給鬧鐘秒賦值
static u16 s1=16;//給鬧鐘小時賦值
static u16 f1=31;//給鬧鐘分鐘賦值
static u16 n1=2020;//給鬧鐘年賦值
static u16 y1=1;//給鬧鐘月賦值
static u16 r1=1;//給鬧鐘日賦值
static u16 kb=0;//給鬧玲回應時間賦值
static u16 kb1=0;//給鬧玲回應時間賦值
接著撰寫138芯片的驅動函式
void xs1()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case(1):
LSA=1;LSB=0;LSC=0;break;
case(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
}
P0=a[i];
delay(20);
P0=0x00;
}
}
下面是時間和年月日之間關系的函式
void dy1p()
{
if(m>59)
{
m=0;
f++;
if(f>=60)
{
f=0;
s++;
if(s>23)
{
s=0;
}
}
}
}
void dy1()//顯示時間
{
dy1p();
a[0]=wg[s/10];
a[1]=wg[s%10];
a[2]=0x00;
a[3]=wg[f/10];
a[4]=wg[f%10];
a[5]=0x00;
a[6]=wg[m/10];
a[7]=wg[m%10];
xs1();
}
void dy2p()
{
if(s>23)
{
r++;
if(r>30)
{
r=0;
y++;
if(y>12)
{
y=0;
n++;
}
}
}
}
void dy2()//顯示年月日
{
dy2p();
a[0]=wg[n/1000];
a[1]=wg[n/100%10];
a[2]=wg[n/10%10];
a[3]=wg[n%10];
a[4]=wg[y/10];
a[5]=wg[y%10];
a[6]=wg[r/10];
a[7]=wg[r%10];
xs1();
}
void dy3p()
{
if(m1>59)
{
m1=0;
f1++;
if(f1>=60)
{
f1=0;
s1++;
if(s1>23)
{
s1=0;
}
}
}
}
void dy3()//顯示鬧鐘時間
{
dy3p();
a[0]=wg[s1/10];
a[1]=wg[s1%10];
a[2]=0x00;
a[3]=wg[f1/10];
a[4]=wg[f1%10];
a[5]=0x00;
a[6]=wg[m1/10];
a[7]=wg[m1%10];
xs1();
}
再接著撰寫按鍵調節函式
void keypros1()//分鐘調節函式
{
m=0;
while(1)
{
if(k2==0)
{
delay(1000);
if(k2==0)
{
f++;
if(f>59)
{
f=0;
}
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
f--;
if(f<1)
{
f=0;
}
}
while(!k3);
}
dy1();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
}
void keypros2()//小時調節函式
{
while(1)
{
if(k2==0)
{
delay(1000);
if(k2==0)
{
s++;
if(s>23)
{
s=0;
}
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
s--;
if(f<1)
{
s=0;
}
}
while(!k3);
}
dy1();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
}
void keypros3()//日數調節函式
{
while(1)
{
if(k2==0)
{
delay(1000);
if(k2==0)
{
r++;
if(r>30)
{
r=0;
}
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
r--;
if(r<1)
{
r=0;
}
}
while(!k3);
}
dy2();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
}
void keypros4()//月數調節函式
{
while(1)
{
if(k2==0)
{
delay(1000);
if(k2==0)
{
y++;
if(y>12)
{
y=1;
}
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
y--;
if(y<2)
{
y=1;
}
}
while(!k3);
}
dy2();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
}
void keypros5()//年數調節函式
{
while(1)
{
if(k2==0)
{
delay(1000);
if(k2==0)
{
n++;
if(n>9999)
{
n=1;
}
}
while(!k2);
}
if(k3==0)
{
delay(1000);
if(k3==0)
{
n--;
if(n<2)
{
n=1;
}
}
while(!k3);
}
dy2();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
}
鬧鈴判斷函式及主函式中日期的顯示函式
void nl()//鬧鈴判斷函式
{
if((f1==f)&&(s1==s)&&(r1==r)&&(y1==y)&&(n1==n))
{
kb=0;
while(1)
{
bz=~bz;
dy3();
if(kb>=55)
{
P1=0xff;
break;
}
}
}
}
void nyr()//時間顯示函式
{
kb=0;
while(1)
{
dy1();
if(kb>5)
{
kb=0;
break;
}
}
nl();
while(1)
{
dy2();
if(kb>5)
{
kb=0;
break;
}
}
}
最后是主函式
void main()
{
while(1)//時間日期調節
{
while(1)
{
ET0=0;
EA=0;
TR0=0;
keypros1();
if(k4==0)
{
delay(2000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros2();
if(k4==0)
{
delay(2000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros3();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros4();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros5();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)//鬧鐘調節函式
{
while(1)
{
ET0=0;
EA=0;
TR0=0;
keypros6();
if(k4==0)
{
delay(2000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros7();
if(k4==0)
{
delay(2000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros8();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros9();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
while(1)
{
keypros10();
if(k4==0)
{
delay(1000);
if(k4==0)
{
break;
}
while(!k4);
}
}
Timer0Init();//鬧鐘時間顯示函式
nyr1();
Timer0Init();//鬧鐘日期顯示函式
nyr2();
Timer0Init();//時間日期顯示
while(1)
{
nyr();
if(k1==0)
{
delay(1000);
if(k1==0)
{
break;
}
while(!k1);
}
}
}
}
}
最后是仿真圖
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/62792.html
標籤:單片機/工控
上一篇:急求
下一篇:求解
