《單片機(jī)課程設(shè)計-數(shù)字鐘.doc》由會員分享,可在線閱讀,更多相關(guān)《單片機(jī)課程設(shè)計-數(shù)字鐘.doc(7頁珍藏版)》請在裝配圖網(wǎng)上搜索。
單片機(jī)課程設(shè)計--數(shù)字鐘
一、設(shè)計目的及意義
(1)鞏固、加深和擴(kuò)大51系列單片機(jī)應(yīng)用的知識面,提高綜合及靈活運(yùn)用所學(xué)知識解決工業(yè)控制的能力;
(2)培養(yǎng)針對課題需要,選擇和查閱有關(guān)手冊、圖表及文獻(xiàn)資料的自學(xué)能力,提高組成系統(tǒng)、編程、調(diào)試的動手能力;
(3)對課題設(shè)計方案的分析、選擇、比較、熟悉用51單片機(jī)做系統(tǒng)開發(fā)、研制的過程,軟硬件設(shè)計的方法、內(nèi)容及步驟
二、原理圖設(shè)計中簡要說明設(shè)計目的
(1)功能:24小時制時間顯示,可隨時進(jìn)行時間校對調(diào)整,整點報時及鬧鐘功能。
(2)原理圖中所使用的元器件功能在圖中的作用
1. 主要元件AT89C51
P3.2 /INT0(外部中斷0)
定時器/計數(shù)器0溢出中斷
2. LED及按鍵開關(guān)
用于時間的顯示和設(shè)定
(3)各器件的工作過程及順序
計時狀態(tài),AT89C51通過P1口持續(xù)向LED發(fā)送信號,使LED掃描顯示剛前時分秒,當(dāng)出現(xiàn)定時器/計數(shù)器0溢出中斷時,時間加多1秒,AT89C51從P1口向LED輸出新的時間;
只按住SET UP鍵時,進(jìn)入外部中斷0,時間計數(shù)停止,通過點擊按鍵H,M,S對時分秒進(jìn)行調(diào)整,新的時間值送給了計時程序,松開SET UP鍵退出中斷,回到計時狀態(tài);
按住SET UP鍵和ALARM鍵時,進(jìn)入外部中斷0,時間計數(shù)停止,通過點擊按鍵H,M對時分進(jìn)行鬧鐘定時,AT89C51記憶時分值,退出時先松開SET UP鍵再松開ALARM;
鬧鈴:當(dāng)時間值和設(shè)定鬧鈴值一樣時,進(jìn)行鬧鈴一分鐘。
(3)流程圖
鬧鈴
初始設(shè)定
時間相同?
鬧鐘定時
LED掃描顯示
Y
按下鬧鐘?
外部中斷0
Y
按下設(shè)定鍵
定時器溢出中斷0
N
時間調(diào)整
時間加1秒
(4) 程序清單
#include
#define uint unsigned int
#define uchar unsigned char
sbit wela1=P2^0;
sbit wela2=P2^1;
sbit wela3=P2^2;
sbit wela4=P2^3;
sbit wela5=P2^4;
sbit wela6=P2^5;
sbit dp= P1^7;
sbit c0= P0^0;
sbit c1= P0^1;
sbit c2= P0^2;
sbit c3= P0^3;
sbit c4= P0^4;
sbit c5= P0^5;
sbit kai= P3^2;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
void display(void);
void delay(uint);
uint num=0,num1=0,num2=0,num3=0;
uint shi,ge,shi1,ge1,shi2,ge2;uint shi1t,ge1t,shi2t,ge2t;
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
TMOD=0x11;
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
EA =1; //開總中斷
EX0 =1; //開外部中斷0
IT0 =0; //外部中段0設(shè)為電平觸發(fā)
ET0 =1; //T0溢出中斷充許
TR0 =1; //啟動內(nèi)部定時器
IT1=0; //外部中段1設(shè)為邊沿觸發(fā)
while(1)
{
display();
}
}
void display(void) //掃描顯示
{
wela5=1;
P1=table[shi];
delay(5);
wela5=0;
wela6=1;
P1=table[ge];
delay(5);
wela6=0;
wela3=1;
P1=table[shi1];
delay(5);
wela3=0;
wela4=1;
P1=table[ge1];
dp=0;
delay(5);
wela4=0;
wela1=1;
P1=table[shi2];
delay(5);
wela1=0;
wela2=1;
P1=table[ge2];
dp=0;
delay(5);
wela2=0;
}
void int0()interrupt 0 // 時間調(diào)整功能,外部中斷0,與鬧鐘功能,按住SET UP進(jìn)入,松開退出
{
while(kai==0)
{
c3=1; //關(guān)閉鬧鈴
display();
if(c0==1)//秒
{
ge++;delay(10);
if(ge==10)
{
ge=0;shi++;
if(shi==6){shi=0;}
}
while(c0)
display();
}
if(c1==1)//分
{ge1++;delay(10);
if(ge1==10)
{
ge1=0;shi1++;
if(shi1==6){shi1=0;}
}
while(c1)
display();
}
if(c2==1)//時
{ge2++;delay(10);
if(ge2==10)
{
ge2=0;shi2++;
}
if(shi2==2&&ge2==4){shi2=0;ge2=0;}//24進(jìn)0
while(c2)
display();
}
}
if(c4==1)//鬧鐘功能區(qū) ,按住ALARM和SET UP時,就能進(jìn)行鬧鐘設(shè)定 ,設(shè)定完成后,先松開SET UP再松開ALARMF才有效
{shi1t=shi1;ge1t=ge1;shi2t=shi2;ge2t=ge2;}
else
{num1=shi*10+ge;
num2=shi1*10+ge1;
num3=shi2*10+ge2;}
}
void T0time() interrupt 1 //定時器0溢出中斷
{
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
num++;
if(num==5) //num==20時,為現(xiàn)實1秒
{
num=0;
num1++;
if (num1==60)
{
num1=0;
num2++;
}
shi=num1/10;
ge =num1%10;
if (num2==60)
{
num2=0;
num3++;
}
shi1=num2/10;
ge1 =num2%10;
if (num3==24)
{
num3=0;
}
shi2=num3/10;
ge2 =num3%10;
}
if(shi1==0&&ge1==0)//整點檢測報時
{ c3=0; }
else{c3=1;}
if(shi1==shi1t && ge1==ge1t && shi2==shi2t && ge2==ge2t)//鬧鐘檢測
{ c3=0; }
else{c3=1;}
}
鏈接地址:http://zhongcaozhi.com.cn/p-6632865.html