3工位旋轉工作臺的控制系統(tǒng)設計
3工位旋轉工作臺的控制系統(tǒng)設計,旋轉,工作臺,控制系統(tǒng),設計
哈爾濱理工大學課程設計說明書
目錄
第1章 緒論 1
1.1 設計背景 1
1.2 設計的主要任務 1
第2章 系統(tǒng)總體方案及硬件設計 3
2.1 系統(tǒng)總體方案設計 3
2.2 硬件電路設計 3
2.2.1 時鐘電路模塊 4
2.2.2 復位電路模塊 5
2.2.3 顯示模塊 6
2.2.4 報警模塊 7
2.2.5 鍵盤模塊 7
第3章 軟件設計 8
3.1 軟件總體設計方案 8
3.2 軟件設計具體過程 11
3.2.1 延時模塊設計 11
3.2.2 中斷程序 12
3.2.3 鍵盤掃描子程序 13
3.2.4 計分子程序 13
3.2.5 主程序 15
第4章 硬件焊接與調試 16
4.1 硬件實物圖 16
4.2 調試結果 16
課程設計心得 17
附錄1 18
附錄2 19
參考文獻 27
第1章 緒論
1.1 設計背景
體育比賽計時計分系統(tǒng)是對體育比賽過程中所產生的時間,比分等數據進行快速采集記錄,加工處理,傳遞利用的信息系統(tǒng)。根據不同運動項目的不同比賽規(guī)則要求,體育比賽的計時計分系統(tǒng)包括測量類,評分類,命中類,制勝類得分類等多種類型。
籃球比賽是根據運動隊在規(guī)定的比賽時間里得分多少來決定勝負的,因此,籃球比賽的計時計分系統(tǒng)是一種得分類型的系統(tǒng)?;@球比賽的計時計分系統(tǒng)由計時器,計分器等多種電子設備組成,同時,根據目前高水平籃球比賽要求,完善的籃球比賽計時計分系統(tǒng)設備應能夠與現場成績處理,現場大屏幕,電視轉播車等多種設備相聯,以便實現高比賽現場感,表演娛樂觀眾等功能目標。
由于單片機的集成度高,功能強,通用性好,特別是它具有體積小,重量輕,能耗低,價格便宜,可靠性高,抗干擾能力強和使用方便等獨特的優(yōu)點,使單片機迅速得到了推廣應用,目前已經成為測量控制應用系統(tǒng)中的優(yōu)選機種和新電子產品的關鍵部位。世界各大電氣廠家,測控技術企業(yè),機電行業(yè),競相把單片機應用于產品更新,作為實現數字化,智能化的核心部件?;@球計時計分器就是以單片機為核心的計時計分系統(tǒng),由計時器,計分器,綜合控制器和24秒控制器等組成。
1.2 設計的主要任務
本設計是基于AT89C52單片機的籃球計時計分器,利用7段共陰LED作為顯示器件。在此設計中共接入了1個四位一體7段共陰LED顯示器,2個兩位一體7段共陰LED顯示器,前者用來記錄賽程時間,其中2位用于顯示分鐘,2位用于顯示秒鐘,后者用于記錄甲乙隊的分數,每隊2個LED顯示器顯示范圍可達到0~99分。賽程計時采用倒計時方式,比賽開始時啟動計時,直至計時到零為止。
其次,為了配合計時器和計分器校正調整時間和比分,我們特定在本設計中設立了7個按鍵,用于啟動,暫停時間,調整分數和暫停等功能。采用單片機控制是這個系統(tǒng)按鍵操作使用簡潔,LED顯示,安裝方便。
第2章 系統(tǒng)總體方案及硬件設計
2.1 系統(tǒng)總體方案設計
該籃球計時計分器主要包括單片機控制系統(tǒng)、計時顯示模塊、計分顯示模塊、定時報警,按鍵控制鍵盤模塊。通過這幾個模塊的協調工作就可以完成相應的計時計分控制和顯示功能。這四個模塊的相互連接如圖2-1所示:
圖2-1 連接簡圖
2.2 硬件電路設計
AT89C52是一個低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統(tǒng),片內置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業(yè)中有著廣泛的應用。
AT89C52具有如下特點:AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起[1]。
圖2-2 AT89C52單片機引腳圖
2.2.1 時鐘電路模塊
時鐘電路在單片機系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎。在一個單片機應用系統(tǒng)中,時鐘是保障系統(tǒng)正常工作的基準振蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的快慢。為達到振蕩周期是12MHZ的要求,這里要采用12MHZ的晶振,另外有兩個33P的電容,兩晶振引腳分別連到XTAL1和XTAL2振蕩脈沖輸入引腳[4]。具體連接如圖2-3所示。
圖2-3 晶振連接圖
2.2.2 復位電路模塊
復位是單片微機的初始化操作,其主要功能是把PC初始化為0000H,使單片微機從0000H單元開始執(zhí)行程序。除進入系統(tǒng)的正常初始化之外,當由于程序運行出錯或操作錯誤使系統(tǒng)處于死鎖狀態(tài)時,為擺脫困境,可以按復位鍵以重新啟動,也可以通過監(jiān)視定時器來強迫復位。RST引腳是復位信號的輸入端[2]。復位電路在這里采用的是上電+按鈕復位電路形式,具體連接電路如圖2-4所示。
圖2-4 復位電路
2.2.3 顯示模塊
本設計采用共陰極數碼顯示器,通常,共陰極接低電平(一般接地),其它管腳接段驅動電路輸出端。當某段驅動電路的輸出端為高電平時,該端所連接的字符導通并點亮,根據發(fā)光字段的不同組合可顯示出各種數字或字符。同樣,要求段驅動電路能提供額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。本次設計在顯示模塊用到的是一個4位一體和2個兩位一體共陰極數碼管,共有8個代碼輸入口和8個位選輸入口,采用排阻提供上拉電流數碼管,以保證有足夠大的電流點亮數碼管,采用動態(tài)驅動,使各位數碼管逐個輪流受控顯示,這就是動態(tài)驅動[10]。由于掃描速度極快,顯示效果與靜態(tài)驅動相同,其具體圖形如下圖2-5和圖2-6所示。
圖2-5 計時顯示
圖2-6 計分顯示
2.2.4 報警模塊
蜂鳴器通過一NPN型三極管進行驅動,如圖觸發(fā)信號有基極引入[9]。接線圖如圖2-7所示。
圖2-7 報警模塊
2.2.5 鍵盤模塊
圖2-8 鍵盤模塊
第3章 軟件設計
在設計程序之前,我們首先要對單片機應用系統(tǒng)預完成的任務進行深入的分析,明確系統(tǒng)的設計任務、功能要求和技術指標。其次,要對系統(tǒng)的硬件資源和工作環(huán)境進行分析。這是單片機應用系統(tǒng)程序設計的基礎和條件。在單片機應用系統(tǒng)的開發(fā)過程中,主要采用的有匯編語言和C語言。匯編語言比C語言繁瑣,但是匯編語言能更充分的發(fā)揮指令系統(tǒng)的功能和效率,可以獲得最簡練的目標程序。而C語言的應用最為廣泛,C語言能直接對計算機的硬件進行操作,而且語言靈活、程序結構良好、數據類型及運算符豐富、代碼效率高、可移植性好[8]。
3.1 軟件總體設計方案
本次單片機課程設計軟件設計部分采用模塊化程序設計,程序部分由主程序、T0中斷程序、掃描顯示子程序、計時加(減)1秒的子程序、暫停子程序、快表和回表子程序、延時子程序等組成.其程序流程圖如圖3-1和圖3-2。
圖3-1 主程序流程圖
圖3-2 掃描刷新顯示子程序流程圖
3.2 軟件設計具體過程
軟件設計部分采用模塊化程序設計,用C語言編寫。Keil是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學易用。
Keil C51軟件提供豐富的庫函數和功能強大的集成開發(fā)調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現高級語言的優(yōu)勢。
程序部分由主程序、T0中斷程序、掃描顯示子程序、暫停子程序、加分子程序、減分子程序、延時子程序等組成。
3.2.1 延時模塊設計
void display(uchar fen2,uchar fen1,uchar miao2,uchar miao1) //時間顯示程序
{
dula=0;
P0=table[fen2];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[fen1]|0x80;
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[miao2];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[miao1]|0x80;
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
}
本設計中各個數碼管采用動態(tài)驅動,使各位數碼管逐個輪流受控顯示,由于掃描速度極快(本實驗中大約每20毫秒刷新一次),所以顯示效果與靜態(tài)驅動相同。
3.2.2 中斷程序
void time0() interrupt 1 //中斷程序
{
TH0=(65536-46080)/256; //由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發(fā)起一次中斷。
TL0=(65536-46080)%256; //46080的來歷,為50000*11.0592/12
pp++;
}
3.2.3 鍵盤掃描子程序
void keyscan() // 鍵盤掃描程序
{
if(lcden==0)
delay(10);
if(lcden==0)
{
halt=1;
}
if(rs==0)
halt=0;
}
3.2.4 計分子程序
void jifen() // 計分模塊
{
if(A_ADD1==0)
{
delay(10);
if(A_ADD1==0)
{
numa++;
while(!A_ADD1);
}
}
if(A_ADD2==0)
{
delay(10);
if(A_ADD2==0)
{
numa=numa+2;
while(!A_ADD2);
}
}
if(A_DEC==0)
{
delay(10);
if(A_DEC==0)
{
numa=numa--;
while(!A_DEC);
}
}
if(B_ADD1==0)
{
delay(10);
if(A_ADD1==0)
{
numb++;
while(!A_ADD1);
}
}
if(B_ADD2==0)
{
delay(10);
if(A_ADD2==0)
{
numb=numb+2;
while(!A_ADD2);
}
}
if(B_DEC==0)
{
delay(10);
if(B_DEC==0)
{
numb--;
while(!B_DEC);
}
}
}50000*11.0592/12
3.2.5 主程序
void main()
{
TMOD=0x01;
TR0=1;
TH0=(65536-46080)/256; // 由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發(fā)起一次中斷。
TL0=(65536-46080)%256; //46080的來歷,為50000×11.0592/12
ET0=1;
EA=1; //主板初始化 因51單片機芯片開機時各個IO口輸出為高電平,加上以下源代碼是為了防止各種外部模塊誤動作
DS1302=0; //關DS1302模塊,與本實驗無關
SD=0; //關SD卡模塊,與本實驗無關
LCD1602=0; //關LCD1602模塊,與本實驗無關
cs88=0; //關點陣管
lcden=1;
rs=1;
jishi(fen);
}
29
第4章 硬件焊接與調試
4.1 硬件實物圖
對照原理圖進行焊接工作, 把硬件先依次正確插到相應的位置,然后再次檢查器件是否都正確,確定無誤后進行焊接.在焊接的過程中要注意不要將相臨的兩個引腳焊接在一起,防止短路影響使用。
硬件連接好以后,通過ISP下載線向單片機內燒制HEX程序,觀察各部分工作情況。硬件連接如圖4-1所示。
圖4-1 硬件實物圖
4.2 調試結果
經過多次參考源程序代碼,我初步實現了計時模塊功能,能顯示、開始、暫停、報警。計分模塊也實現了顯示功能,但是在結合計分模塊時,由于計時模塊和計分模塊的相互干擾,程序出現不穩(wěn)定性,問題明顯。此次設計重點是計時、計分和鍵盤,難點是其間的相互結合。
課程設計心得
通過這幾天的單片機的實訓,我在理論的基礎上更深刻的掌握了單片機的深層內容及實際生活中的應用,實訓鍛煉了自己動手能力和思維能力,還有在軟件方面的編程能力,讓我受益匪淺,同時也暴露出一些平時學習上的問題,讓我深刻反思。這些問題的發(fā)現將為我以后的學習和工作找明道路,查漏補缺為進一步學習作好準備。
通過實踐,讓我更熟悉掌握了Keil uVision3應用程序的運用,讓我懂得了如何編寫一些簡單的程序,學會了如何制作單片機應用程序,還有焊接和程序下載,。但在中間暴露出很多問題:對平時上課講的理論知識沒有完全掌握消化,到了實際操作中還得請教同學,在焊接中焊接的基本工夫掌握不到家,手上工夫還是很欠缺的,使得電路板不是很美觀。這些問題的發(fā)現,有助于提高我在以后的工作和學習中對此類問題的認識,確保不在同一問題上再次犯錯。嚴謹求實、踏實務實,是我這次實訓的深刻總結。
做課程設計的這幾天翻閱了很多書,也上了很多網站去尋找自己需要的資料。這種尋找有很強的目的性,只是為了自己選定的課題內容而查閱,所以除了自己課題以外的其他方面幾乎還是一無所知。這讓我深刻的認識到了自己專業(yè)知識的貧乏。為我對自己大四生活的規(guī)劃敲響了警鐘。我對單片機的學習不會因為課程設計的結束而結束,在接觸的眾多資料里,做設計只是走馬觀花般的點到。
通過單片機課程設計,我加深了對單片機理論的理解,學回了怎樣將理論很好地應用到實際當中去,而且我還學會了如何去培養(yǎng)我們的不畏困難的挑戰(zhàn)精神,從而不斷地戰(zhàn)勝自己,超越自己,我在這一設計過程中,學會了堅持不懈,不輕易言棄。設計過程,也好比是我們人類成長的歷程,常有一些不如意,也許這就是在對我們提出了挑戰(zhàn),勇敢過,也戰(zhàn)勝了,勝利的鐘聲也就一定會為我們而敲響。
附錄1
附錄2
#include
#define uchar unsigned char
sbit dula=P2^0; //段選信號的鎖存器控制
sbit wela=P2^1; //位選信號的鎖存器控制
sbit cs88=P2^2; //點陣管的鎖存器控制
cs88=0; //關點陣管
sbit beep=P2^3;
sbit LCD1602=P2^5; //定義LCD1602使能端,用于HJ-C52實驗板復位,與本實驗無關
sbit DS1302=P2^7; //定義DS1302時鐘使能端,用于HJ-C52實驗板復位,與本實驗無關
sbit SD=P2^6; //定義SD卡使能端,用于HJ-C52實驗板復位,與本實驗無關
void cmg88() //關數碼管,點陣函數
{
dula=1;
P0=0x00;
dula=0;
cs88=0x00;
P0=0x00;
cs88=1;
}
sbit lcden=P3^0;
sbit restart=P3^1;
sbit A_ADD1=P3^2; //定義按鍵輸入端口 k3
sbit A_ADD2=P3^4; //k5
sbit A_DEC=P3^6; //k7
sbit B_ADD1=P3^3; //定義按鍵輸入端口 k4
sbit B_ADD2=P3^5; //k6
sbit B_DEC=P3^7; //k8
unsigned char halt,min2,min1,sec2,sec1,sec=60 ,min=11;
unsigned int pp,numa=0,numb=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void display(uchar min2,uchar min1,uchar sec2,uchar sec1); //時間顯示模塊
void display1(uchar A2,uchar A1,uchar B2,uchar B1); //計分顯示模塊
void keyscan(); //鍵盤掃描模塊
void jishi(); //計時模塊
void delay(unsigned char i); //延時模塊
void jifen(); //計分模塊
void main()
{
TMOD=0x01;
TR0=1;
TH0=(65536-46080)/256; //由于晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發(fā)起一次中斷。
TL0=(65536-46080)%256; //46080的來歷,為50000*11.0592/12
ET0=1;
EA=1; //主板初始化 因51單片機芯片開機時各個IO口輸出為高電平,加上以下源代碼是為了防止各種外部模塊誤動作
DS1302=0; //關DS1302模塊,與本實驗無關
SD=0; //關SD卡模塊,與本實驗無關
LCD1602=0; //關LCD1602模塊,與本實驗無關
cs88=0; //關點陣管
lcden=1;
restart=1;
while(1)
{
jishi();
jifen();
}
}
void time0() interrupt 1 //中斷程序
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
void jishi() //計時模塊
{
keyscan();
if(halt==0)
{
TR0=1;
if(pp==20)
{
pp=0;
sec--;
if(sec==0)
{
sec=60;
min--;
if(min<=1)
beep=1;
if(min==0)
beep=0;
halt=1;
sec=60;
min=11;
}
}
min2=min/10;
min1=min%10;
sec2=sec/10;
sec1=sec%10;
display(min2,min1,sec2,sec1);
}
else
TR0=0;
display(min2,min1,sec2,sec1);
}
void keyscan() //鍵盤掃描程序
{
if(lcden==0)
delay(5);
if(lcden==1)
{
halt=1;
}
if(restart==1)
halt=0;
}
void delay(unsigned char i) //延時程序
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void jifen() //計分模塊
{
if(A_ADD1==1)
{
numa++;
}
if(A_ADD2==1)
{
(numa++)++;
}
if(A_DEC==1)
{
numa--;
}
if(B_ADD1==1)
{
numb++;
}
if(B_ADD2==1)
{
(numb++)++;
}
if(B_DEC==1)
{
numb--;
}
A2=numa/10;
A1=numa%10;
B2=numb/10;
B1=numb%10;
display1(A2,A1,B2,B1);
}
void display(uchar min2,uchar min1,uchar sec2,uchar sec1) //時間顯示程序
{
dula=1;
P0=table[min1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[min2];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=1;
P0=table[sec1];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);
dula=1;
P0=table[sec2];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=1;
wela=0;
delay(5);
}
void display1(uchar A2,uchar A1,uchar B2,uchar B1) //計分顯示程序
{
dula=1;
P0=table[A1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[A2];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=1;
P0=table[B1];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);
dula=1;
P0=table[B2];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=1;
wela=0;
delay(5);
}
參考文獻
[1] 周堅.單片機輕松入門[M].北京:航空航天大學出版社,2004.
[2] 張毅坤等.單片微型計算機原理及應用[M].西安:西安電子科技大學出版社,1998.
[3] 劉光斌.單片機系統(tǒng)實用抗干擾技術[M].北京:人民郵電出版社,2003.
[4] 張友德 趙志英 涂時亮. 單片微型機原理應用與實驗(第四版)[M].上海:復旦大學出版社,2005.
[5] 劉文濤.單片機語言C51典型應用設計[M].北京:人民郵電出版社,2005.
[6] 張毅剛,譚曉均.MCS-51單片機應用設計[M]. 哈爾濱:哈爾濱工業(yè)大學出版社,1997.
[7] 祁偉.單片機C51程序設計教程與實驗[M].北京:航空航天大學出版社,2006.
[8] 張 虹. 匯編語言程序設計[M].北京:中國礦業(yè)大學出版社,2005.
[9] 熊如貴.遮擋式紅外聲光報警裝置[J].北京:《電子制作》雜志社,2006.
[10] 康華光.電子技術基礎 模擬部分[M].北京:高等教育出版社,2004.
收藏