通訊技術專業畢業設計
誠 信 聲 明
本人鄭重宣告:所呈交的畢業設計文字和成果,是本人在指導老師的指導下,獨立進行研究所取得的成果。成果不存在智慧財產權爭議,本畢業設計不含任何其他個人或集體已經發表過的作品和成果。本人完全意識到本宣告的法律結果由本人承擔。
畢業設計者簽名:
年 月 日
摘要:本文介紹了基於at89s51微控制器設計的電子數字秒錶的除錯和使用方法。本設計通過at89s51微控制器以及微控制器最小系統和三極體驅動以及外圍的按鍵和數碼管顯示等部件,設計一個基於微控制器的簡易計時器。設計通過四位一體共陽極數碼管顯示,數碼管前兩位顯示分鐘,後兩位顯示秒。通過按鍵能對秒進行設定,並利用微控制器內部儲存器eeprom,可以儲存十組資料,可進行正計時、倒計時的切換。當倒計時結束蜂鳴器報警,倒計時時間可設定,可以檢視記錄的資料,暫停,清零等功能。電子數字秒錶計時器是能夠精確的記錄時間,廣泛用於各種繼電器、電磁開關、延時器、定時器等的時間測試;在體育競技計時方面也得到廣泛應用,擁有較強的實用性。
關鍵字:at89s51微控制器;驅動晶片;四位一體數碼管
前 言
時鐘,自從它發明的那天起,就成為人類的朋友,但隨著時間的推移,科學技術的不斷髮展,人們對時間計量的精度要求越來越高,應用越來越廣。怎樣讓時鐘更好的為人民服務,怎樣讓我們的老朋友煥發青春呢?這就要求人們不斷設計出新型時鐘。
現今,高精度的計時工具大多數都使用了石英晶體振盪器,由於電子鐘,石英錶,石英鐘都採用了石英技術,因此走時精度高,穩定性好,使用方便,不需要經常調校,數字式電子鐘用積體電路計時時,譯碼代替機械式傳動,用led顯示器代替顯示器代替指標顯示進而顯示時間,減小了計時誤差,這種表具有時,分,秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。
時間被認為是最寶貴的資源,為了對時間有更深刻的瞭解,同時也在電子方面有更深刻的認識,通過學習,本次設計主要介紹用微控制器內部的定時/計數器來實現電子數字秒錶的方法,本設計由微控制器at89s51晶片和led數碼管為核心,輔以必要的電路,構成了一個微控制器電子數字秒錶。相信它會越來越深入地浸透到人們的生活中,並且將在一定程度上影響人們對生活的理解和詮釋。用單片機制作電子產品也會越來越多,也是眾多領域實施程式設計開發不可缺少的一部分,這將必然成為一種趨勢。為更多的瞭解微控制器的原理和應用,故做此設計來進行鞏固。
下面就是計時器設計的具體過程。
1緒論
1.1 課題研究的背景
隨著科技的快速發展,時間的流逝,從觀太陽、擺鐘到現在電子鐘,人類不斷研究,不斷創新紀錄。從奧運會的計時技術的進步就可以看到計時科技的進步,一百多年過去了,首屆現代奧運會上的計時所用的跑表到如今的一系列高科技計時裝置,如高速數碼攝像機、電子觸控墊、紅外光束、無線應答器等等。隨之當今計時技術的快速發展,即便千分之一秒的差距也決定著冠軍的歸屬。在現在體育競技比賽中,運動員的水平不斷提高,差距也在不斷縮小,這就要求對時間精度要求越來越高,有時冠軍之間的差距只有幾毫秒,因此就要高精度的秒錶來記錄成績。在機械控制和家電計時運作與暫停都需要秒錶來控制,這也是秒錶的一個較為廣泛的應用。秒錶攜帶方便,成本低,應用廣泛,具有廣泛的市場前景。
1.2課題的研究目的與意義
電子數字秒錶計時器是能夠精確的記錄時間,廣泛用於各種繼電器、電磁開關、延時器、定時器等的時間測試;在體育競技計時方面也得到廣泛應用,擁有較強的實用性。
製作電子數字秒錶計時器能夠對我們學習的知識進行一個系統的實踐,進一步鞏固和加深我們對基礎理論知識、基本技能掌握,將知識進行系統化和技能操作的實踐知識綜合化。通過完成電子數字秒錶計時器的設計、製作、除錯,讓我們對電子產品的整個製作過程有一個完整的認識,考驗我們對電路的設計能力,程式的編譯能力,以及產品的焊接組裝能力,在實踐中提高技能水平。
1.3課題解決的主要內容
本課題所研究的電子數字秒錶是微控制器控制技術的一個具體應用,主要研究內容包括以下幾個方面:
(1)選用電子數字秒錶晶片時,應重點考慮功能實在、使用方便、單片儲存、低功耗、抗斷電的器件。
(2)根據選用的電子數字秒錶歷晶片設計外圍電路和微控制器的介面電路。
(3)在硬體設計時,結構要儘量簡單實用、易於實現,使系統電路儘量簡單。
(4)根據硬體電路圖,在開發板上完成器件的焊接。
(5)根據設計的硬體電路,編寫控制at89s51晶片的微控制器程式。
(6)通過程式設計、編譯、除錯,把程式下載到微控制器上執行,並實現本設計的功能。
(7)在硬體電路和軟體程式設計時,主要考慮提高人機介面的友好性,方便使用者操作等因素。
設計任務:掌握微控制器程式設計、除錯和應用電路設計、分析及除錯檢測。
基本要求:設計一按鍵控制數碼管顯示的電子數字秒錶,能實現儲存十組資料,數碼管前兩位顯示分鐘,後兩位顯示秒,可完成正計時、倒計時可以切換。在倒計時結束時蜂鳴器報警,同時倒計時時間可自行設定。還可以檢視記錄的資料,具備暫停,清零等功能。
1.4系統硬體設計
1.4.1 電路設計框圖
本設計通過at89s51微控制器以及微控制器最小系統和三極體驅動以及外圍的按鍵和數碼管顯示等部件,設計一個基於微控制器的簡易計時器。設計通過四位一體共陽極數碼管顯示,並能通過按鍵對秒進行設定,對資料進行儲存和檢視。
圖1 電路設計框圖
1.4.2 功能實現
系統在正常工作時,led液晶上分和秒都顯示為零,當按下k1鍵時,電子數字秒錶開始計時,如果想要對時間進行調整,可以通過調整設定模組來實現。當按下k2鍵時,可以儲存資料,每按一次儲存一組資料,能儲存最近十組資料。如想要倒計時可以按下k5鍵來調節倒計時的秒數,倒計時結束時蜂鳴器響五聲後停止。如想要切換到正計時可以按下k4鍵,同時k5鍵還可以調鬧鐘,鬧鐘時間到時,蜂鳴器響五聲數碼管閃五下停止。如果想要退出重新計時就再按一下k6即可復位。
系統原理圖如圖2:
圖2原理圖
2軟體設計
時間被認為是最寶貴的資源,為了對時間有更深刻的瞭解,同時也在電子方面有更深刻的認識,通過學習,選擇做一個通過按鍵控制數碼管的電子數字秒錶設計,電子數字秒錶的核心部件微控制器at89s51,它在整個人類史上的地位已經不容置疑地確立了,相信它會越來越深入地浸透到人們的生活中,並且將在一定程度上影響人們對生活的理解和詮釋。用單片機制作電子產品也會越來越多,也是眾多領域實施程式設計開發不可缺少的一部分,這將必然成為一種趨勢。為更多的瞭解微控制器的原理和應用,故做此設計來進行鞏固。
本電路以at89s51微控制器最小系統為控制核心,數碼管顯示由三極體8550驅動,輸入部分採用五個獨立式按鍵k1、k2、k3、k4、k5。顯示部分的型與微控制器p0口相連,數碼管的的位由微控制器的p2口控制。對於不同型號的微控制器只需要相應的改變一下地址即可。該軟、硬體系統具有很好的通用性,很高的實際使用價值。
2.1 軟體系統框圖
系統設計圖如圖2所示。
圖3 軟體設計圖
2.2 程式流程圖
圖4程式流程圖
2.3 程式編寫
#include <reg52.h>
#define uc unsigned char
#define ui unsigned int
void display();
char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//數字對應顯示碼錶
char code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//小數點
char code index[]={0xf7,0xfb,0xfd,0xfe}; //每位數字對應數碼管顯示位置
uc num[8]; //每位數字存放陣列
uc val[10][4];//儲存的記錄 [10]為記錄序列,[8]為每組記錄中的數字
char val_index;//記錄序列標誌位
uc set_index,ok_flag,timing;
bit mode=1;//執行模式,1為正向計數,0為反向計數。
bit fin_flag=0;//完成標誌位,當反向計數結束時,此位為高電平,觸發蜂鳴器
bit set_shan;
sbit beep=p3^6; sbit key1=p1^0; sbit key2=p1^1; sbit key3=p1^2; sbit key4=p1^3; sbit key5=p1^4;
void delay(ui z)
{ ui i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
void init()//初始化設計
{ tmod=0x11; th0=0x4b; tl0=0xff; th1=0x4b; tr0=0;
tl1=0xff; et1=1; tr1=1; et0=1; ea=1;
val_index=0;
}
void clr()
{ uc i;
for(i=0;i<8;i++)
num[i]=0;
}
void setup()
{ ok_flag=0xff;
set_index=0;
while (ok_flag)
{ display();
if(key1==0) //按動key1設定值加1
{ delay(5);
if(key1==0)
{ if ((set_index==0)|(set_index==2)|(set_index==4)|(set_index==6))
{ num[set_index]++;
if(num[set_index]==10)
num[set_index]=0;
}
else if((set_index==1)|(set_index==3)|(set_index==5)|(set_index==7))
{ num[set_index]++;
if(num[set_index]==6)
num[set_index]=0;
}
while(!key1) display();
}
}
if(key2==0) //按動key2設定位置加1
{ delay(5);
if(key2==0)
{ set_index++;
if(set_index==8)
{ set_index=0;
if((num[4]!=0)||(num[5]!=0)||(num[6]!=0)||(num[7]!=0))
{
num[0]=0;num[1]=0;num[2]=0;num[3]=0;mode=1;
}
else if((num[4]==0)&&(num[5]==0)&&(num[6]==0)&&(num[7]==0))
{ if((num[0]==0)&&(num[1]==0)&&(num[2]==0)&&(num[3]==0))
mode=1;
else if((num[0]!=0)||(num[1]!=0)||(num[2]!=0)||(num[3]!=0))
mode=0;
}
}
while(!key2) display();
}
}
if(key5==0) //按動key5設定結束
{ delay(5);
if(key5==0)
{ ok_flag=0x00;
if((num[4]!=0)||(num[5]!=0)||(num[6]!=0)||(num[7]!=0))
{
num[0]=0;num[1]=0;num[2]=0;num[3]=0;mode=1;
}
else if((num[4]==0)&&(num[5]==0)&&(num[6]==0)&&(num[7]==0))
{ if((num[0]==0)&&(num[1]==0)&&(num[2]==0)&&(num[3]==0))
mode=1;
else if((num[0]!=0)||(num[1]!=0)||(num[2]!=0)||(num[3]!=0))
mode=0;
}
//mode=0;
while(!key5) display();
}
}
}
}
void display()
{ uc i;
if(ok_flag!=0xff)
{ if(timing==0)
{ for(i=0;i<4;i++)
{ p0=0xff;
p2=index[i];
if(i==2)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
}
}
else
{ if(set_shan==0)
{ for(i=0;i<4;i++)
{ p0=0xff;
p2=index[i];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
}
}
else if(set_shan==1)
{ for(i=0;i<4;i++)
{ p0=0xff;
p2=index[i];
if(i==2)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
}
}
}
}
else
{ if(set_shan==0)
{ if(set_index==0)
{ for(i=0;i<4;i++)
{ if(i==0)
{ p2=index[0];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i];
if(i==2)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==1)
{ for (i=0;i<4;i++)
{ if(i==1)
{ p2=index[1];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i];
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==2)
{ for (i=0;i<4;i++)
{ if(i==2)
{ p2=index[2];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i];
if(i==2)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==3)
{ for (i=0;i<4;i++)
{ if(i==3)
{ p2=index[3];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i];
if(i==2)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==4)
{ for (i=4;i<8;i++)
{ if(i==4)
{ p2=index[0];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i-4];
if(i==6)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==5)
{ for (i=4;i<8;i++)
{ if(i==5)
{ p2=index[1];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i-4];
if(i==6)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==6)
{ for (i=4;i<8;i++)
{ if(i==6)
{ p2=index[2];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i-4];
if(i==6)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
else if(set_index==7)
{ for (i=4;i<8;i++)
{ if(i==7)
{ p2=index[3];
p0=tab[10];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
else
{ p2=index[i-4];
if(i==6)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
}
else
{ if(set_index<4)
{ for (i=0;i<4;i++)
{ p2=index[i];
if(i==2)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
else
{ for (i=4;i<8;i++)
{ p2=index[i-4];
if(i==6)
p0=tab1[num[i]];
else
p0=tab[num[i]];
delay(2);//修改此引數可修改重新整理頻率
p0=0xff;
}
}
}
}
}
void alarm()
{ if((num[4]==0)&&(num[5]==0)&&(num[6]==0)&&(num[7]==0))
{timing=0;}
else
{
if((num[4]==num[0])&&(num[6]==num[2])&&(num[5]==num[1])&&(num[7]==num[3]))
{timing=1;tr0=0;}
}
}
void main()//主函式
{ uc h,g,k;
init();
clr();
while(1)
{ display(); //刷屏顯示數碼管
alarm();
if(key1==0) //開始/暫停按鈕
{ delay(5);
if(key1==0)
{ tr0=~tr0;
while(!key1) display();
}
}
if(key2==0) //記錄按鈕
{ delay(5);
if(key2==0)
{ if(tr0==1)//當在執行中按下記錄鍵則儲存記錄
{ for(g=1;g<10;g++)
{
for(k=0;k<4;k++)
{val[g-1][k]=val[g][k];}
}
for(h=0;h<4;h++)
{ val[9][h]=num[h];//將當前時間儲存 }
}else//在停止狀態下按下記錄鍵檢視記錄,按動一次序列遞減一次,即檢視上一次記錄
{ for(h=0;h<4;h++)
num[h]=val[val_index][h];//將當前時間儲存
val_index--;
if(val_index<0)
val_index=9;
}
while(!key2) display();
}
}
if(key3==0) //復位按鈕
{ delay(5);
if(key3==0)
{ clr(); while(!key3) display();}
}
if((key4==0)&&(tr0==0)) //模式選擇按鈕,僅在停止狀態下有效
{ delay(5);
if(key4==0)
{ mode=~mode;
while(!key4) display();}
}
if((key5==0)&&(tr0==0)) //時間設定,僅在停止狀態下有效
{ delay(5);
if(key5==0)
{ while(!key5)
display();
setup();}
}
}
}
void t0_time() interrupt 1
{ uc m;
th0=0x4b; //定時器定時時間為50ms
tl0=0xff;
m++;
if(m==20)
{ m=0;
if(mode==1) //正向計數
{ num[0]++;
if(num[0]==10)
{ num[0]=0;
num[1]++;
if(num[1]==6)
{ num[1]=0;
num[2]++;
if(num[2]==10)
{ num[2]=0;
num[3]++;
if(num[3]==10)
num[3]=0;}
}
}
}
else
{ num[0]--;
if(num[0]>9)
{ num[0]=9;
num[1]--;
if(num[1]>5)
{ num[1]=5;
num[2]--;
if(num[2]>9)
{ num[2]=9;
num[3]--;
if(num[3]>9)
{ num[3]=0;
tr0=0;
fin_flag=1;
clr();}
}
}
}
}
}
}
void t1_time() interrupt 3
{ uc shan,beep_stop;
th1=0x4b;
tl1=0xff;
shan++;
if(shan==10)
{ shan=0;
set_shan=~set_shan;
if((fin_flag)||(timing)) //當反向計數完成時 或計時時間到時
{ beep_stop++;
beep=~beep;
if(beep_stop==10)
{ fin_flag=0;
timing=0;
num[4]=0;num[5]=0;num[6]=0;num[7]=0;
beep_stop=0;
beep=1;}
}
}
}
2.4軟體模擬
為了使電子數字秒錶能實現微控制器內部儲存器eeprom,可以儲存十組資料。數碼管前兩位顯示分鐘,後兩位顯示秒。正計時、倒計時可以切換。倒計時結束蜂鳴器報警,倒計時時間可設定。可以設定鬧鐘,檢視記錄的資料,暫停,清零等功能。用keil c51軟體編輯c語言程式並且編譯除錯,在編寫程式和編譯除錯的過程中出現了很多問題。在編寫程式的時候將數碼管顯示的子程式和中斷漏寫了,導致程式不能編譯成功。在編寫程式是將特殊符號弄錯或漏寫,在程式設計時最容易出現的就是將“;”漏寫和將“,”和“、”弄錯,以至程式不能正常編譯。
2.5軟硬體模擬
用keil c51軟體編輯c語言程式,將編寫好的c語言程式編譯成功後生成hex程式碼,供下載器使用。使用proteus isis繪製原理圖,將keil c51和proteus isis連線起來除錯,進行模擬。當按下k1鍵時,電子數字秒錶開始計時,如果想要對時間進行調整,可以通過調整設定模組來實現。當按下k2鍵時,可以儲存資料,每按一次儲存一組資料,能儲存最近十組資料。如想要倒計時可以按下k5鍵來調節倒計時的秒數,倒計時結束時蜂鳴器響五聲後停止。如想要切換到正計時可以按下k4鍵,同時k5鍵還可以調鬧鐘,鬧鐘時間到時,蜂鳴器響五聲數碼管閃五下停止。如果想要退出重新計時就再按一下k6即可復位。
結 論
在整個設計過程中軟體方面藉助各個渠道的資料,主要設計了正計時程式、倒計時程式、 設定時間程式、倒計時蜂鳴器提示程式以及lcd顯示程式;系統的除錯主要是通過一塊at89s51開發板,再借助於keil、stc以及少許自己搭建的外圍電路實現的;再此過程中,分步除錯時顯示出了正計時、倒計時、資料儲存以及倒計時蜂鳴器提示,集中除錯時沒有達到預期效果。此電子數字秒錶具有讀顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優點,符合電子儀器儀表的發展趨勢,具有廣闊的市場前景。
在整個設計過程中學到了許多沒學到的知識,在電路焊接時雖然沒什麼大問題,但從中也知道了焊接在整個作品中的重要性,電路工程量大,不能心急,一個個慢慢來不能急於求成。反而達到事半功倍的效果。對電路的設計、佈局要先有一個好的構思,才顯得電路板美觀、大方。程式編寫中,由於思路不清晰,開始時遇到了很多的問題,經過靜下心來思考,理清了思路,反而得心應手。
從這次的論文設計中,我真正的體會到,知識的重要性,特別是要理論聯絡實際,把我們所學的理論知識運用到實際生活當中,要用知識改變一切。
致 謝
歷時將近兩個月的時間終於將這篇論文寫完,在論文的寫作過程中遇到了無數的困難和障礙,都在同學和老師的幫助下度過了。尤其要強烈感謝我的論文指導老師—鄧明元老師,他對我進行了無私的指導和幫助,不厭其煩的幫助進行論文的修改和改進。另外,在校圖書館查詢資料的時候,圖書館的老師也給我提供了很多方面的支援與幫助。在此向幫助和指導過我的各位老師表示最中心的感謝!感謝這篇論文所涉及到的各位學者。本文引用了數位學者的研究文獻,如果沒有各位學者的研究成果的幫助和啟發,我將很難完成本篇論文的寫作。感謝我的同學和朋友,在我寫論文的過程中給予我了很多的素材。
-
護理類專業畢業設計開題報告大綱
設計(報告)題目1例腎臟移植術後護理設計(報告)題目來源自選設計(報告)題目範疇臨床護理(外科護理)開題時間XX年11月13日一、設計(報告)研究意義腎臟是重要的排洩器官,如果腎臟功能完全喪失,導致體內代謝物積聚過多或排出過多,使體內的正常功能受到損害。近年來已有很多患者...
-
畢業設計任務書(計算機資訊管理專業)
學生姓名曹xx學號122508xxx指導教師西xx畢業設計題目入口網站的規劃-以新浪為例畢業設計型別方案設計一、基本任務與要求第1章入口網站設計的一般技術2.1門戶型別網站功能分析2.2資料庫設計軟體介紹2.3介面設計軟體介紹2.4後臺設計軟體介紹第2章入口網站設計技...
-
室內設計專業畢業設計開題報告大綱
課題名稱複式樓設計課題的意義和目標運用設計手段和裝飾材料,滿足使用功能的要求,滿足視覺、聽覺、觸覺等生理和心理享受。給人創造一個舒適、實用、安全、健康、優美的室內環境,在一個有限的空間裡,合理地佈置其中的物品,最大限度地發揮各自的功能,體現一種品味和文...
-
工程造價專業畢業設計(論文)指導書
設計(論文)題目:步步高綜合樓工程預算一、本畢業設計(論文)課題應達到的目的:1.通過畢業設計,達到複習、鞏固和運用所學的各科專業知識,培養學生綜合運用所學理論知識和專業技能的能力之目的。學會分析解決一般建築安裝工程設計、施工、施工組織及施工圖預決算中的實...