通信技術專業畢業設計
- 畢業設計
- 關注:2.4W次
誠 信 聲 明
本人鄭重聲明:所呈交的畢業設計文本和成果,是本人在指導老師的指導下,獨立進行研究所取得的成果。成果不存在知識產權爭議,本畢業設計不含任何其他個人或集體已經發表過的作品和成果。本人完全意識到本聲明的法律結果由本人承擔。
畢業設計者簽名:
年 月 日
摘要:本文介紹了基於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以及少許自己搭建的外圍電路實現的;再此過程中,分步調試時顯示出了正計時、倒計時、數據存儲以及倒計時蜂鳴器提示,集中調試時沒有達到預期效果。此電子數字秒錶具有讀顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優點,符合電子儀器儀表的發展趨勢,具有廣闊的市場前景。
在整個設計過程中學到了許多沒學到的知識,在電路焊接時雖然沒什麼大問題,但從中也知道了焊接在整個作品中的重要性,電路工程量大,不能心急,一個個慢慢來不能急於求成。反而達到事半功倍的效果。對電路的設計、佈局要先有一個好的構思,才顯得電路板美觀、大方。程序編寫中,由於思路不清晰,開始時遇到了很多的問題,經過靜下心來思考,理清了思路,反而得心應手。
從這次的論文設計中,我真正的體會到,知識的重要性,特別是要理論聯繫實際,把我們所學的理論知識運用到實際生活當中,要用知識改變一切。
致 謝
歷時將近兩個月的時間終於將這篇論文寫完,在論文的寫作過程中遇到了無數的困難和障礙,都在同學和老師的幫助下度過了。尤其要強烈感謝我的論文指導老師—鄧明元老師,他對我進行了無私的指導和幫助,不厭其煩的幫助進行論文的修改和改進。另外,在校圖書館查找資料的時候,圖書館的老師也給我提供了很多方面的支持與幫助。在此向幫助和指導過我的各位老師表示最中心的感謝!感謝這篇論文所涉及到的各位學者。本文引用了數位學者的研究文獻,如果沒有各位學者的研究成果的幫助和啟發,我將很難完成本篇論文的寫作。感謝我的同學和朋友,在我寫論文的過程中給予我了很多的素材。
- 文章版權屬於文章作者所有,轉載請註明 https://wjfww.com/biye/sheji/elx03w.html