第一篇:單片機計算器課程設計報告
大連民族學院2007級電子信息工程專業單片機系統課程設計報告
機電信息工程學院
單片機系統課程設計報告
完成日期:2010年5月31日
系: 專
業: 班
級: 設計題目: 學生姓名: 指導教師:
多功能簡易計算器
大連民族學院2007級電子信息工程專業單片機系統課程設計報告
目
錄
一、設計任務和性能指標......................................................................2
1.1設計任務..............................................................................................................................2 1.2性能指標..............................................................................................................................2 二.設計方案.............................................................................................2 三.系統硬件設計.....................................................................................3
3.1單片機最小系統......................................................................................3 3.2鍵盤接口電路.....................................................................................................................3 3.3數碼管顯示電路.................................................................................................................4 3.4錯誤報警電路.....................................................................................................................5
四、系統軟件設計..................................................................................6
4.1鍵盤掃描子程序設計..........................................................................................................6 4.2移位子程序及結果計算子程序設計................................................................................10 4.3顯示子程序設計...............................................................................................................12 4.4主程序設計.......................................................................................................................13
五、調試及性能分析............................................................................13
5.1調試步驟...........................................................................................................................13 5.2性能分析...........................................................................................................................14
六、心得體會........................................................................................14 參考文獻................................................................................................14 附錄1 系統硬件電路圖.......................................................................15 附錄2 程序清單.................................................................................16
大連民族學院2007級電子信息工程專業單片機系統課程設計報告
一、設計任務和性能指標
1.1設計任務
利用單片機及外圍接口電路(鍵盤接口和顯示接口電路)設計制作一個計算器,用LED顯示計算數值及結果。
要求用Protel 畫出系統的電路原理圖(要求以最少組件,實現系統設計所要求的功能),印刷電路板(要求布局合理,線路清晰),繪出程序流程圖,并給出程序清單(要求思路清晰,盡量簡潔,主程序和子程序分開,使程序有較強的可讀性)。1.2性能指標
1.2.3.4.5.加法:四位加法,計算結果若超過四位則顯示計算錯誤 減法:四位減法,計算結果若小于零則顯示計算錯誤 乘法:個位數乘法 除法:整數除法
有清零功能,計算錯誤報警
二.設計方案
按照系統設計的功能的要求,初步確定設計系統由主控模塊、顯示模塊、錯誤報警模塊、鍵掃描接口電路共四個模塊組成,電路系統構成框圖如圖1.1所示。主控芯片使用51系列AT89C52單片機,采用高性能的靜態80C51設計,由先進工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應用最多。
鍵盤電路采用4*4矩陣鍵盤電路。
顯示模塊采用4枚共陽極數碼管和74ls273鎖存芯片構成等器件構成。
錯誤報警電路采用5V蜂鳴器。
大連民族學院2007級電子信息工程專業單片機系統課程設計報告
三.系統硬件設計
3.1單片機最小系統
單片機最小系統就是支持主芯片正常工作的最小電路部分,包括主控芯片、復位電路和晶振電路。
主控芯片選取STC89C52RC芯片,因其具有良好的性能及穩定性,價格便宜應用方便。
晶振選取11.0592MHz,晶振旁電容選取30pF。
采用按鍵復位電路,電阻分別選取100Ω和10K,電容選取10μF。以下為單片機最小系統硬件電路圖。
單片機最小系統硬件電路
3.2鍵盤接口電路
計算器所需按鍵有:
數字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’ 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’
共計16個按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行和四列的8個公共端分別接P1.0~P1.7,這樣掃描P1口就可以完成對矩陣鍵盤的掃描,通過對16個按鍵進行編碼,從而得到鍵盤的口地址,對比P1口德掃描結果和各按鍵的地址,我們就可以得到是哪個鍵按下,從而完成鍵盤的功能。
以下為鍵盤接口電路的硬件電路圖
鍵盤接口電路
3.3數碼管顯示電路
采用4位數碼管對計算數據和結果的顯示,這里選取共陽數碼管,利用NPN三極管對數碼管進行驅動,為了節省I/O資源,采取動態顯示的方法來顯示計算數據及結果。
利用74273鎖存器來實現數碼管的動態顯示,P0口輸出顯示值,P2.4為段選口,控制273鎖存器的時鐘引腳,從而得到對數碼管輸入數據的控制。
P2.0~P2.3用來作為位選端,控制哪幾位數碼管進行顯示。
以下為數碼顯示電路的硬件電路圖
大連民族學院2007級電子信息工程專業單片機系統課程設計報告
數碼顯示電路硬件電路圖
3.4錯誤報警電路
錯誤報警電路就是在計算結果出現錯誤時或輸入數據出現錯誤時,發出聲音警報,提示使用者錯誤出現。
這里就采用5V蜂鳴器作為報警設備,利用PNP三極管對蜂鳴器進行驅動,有P2.5對其進行控制,這樣在出現錯誤的同時用P2.5輸出低,就可以使蜂鳴器工作,完成報警任務。
以下為報警電路硬件電路圖
大連民族學院2007級電子信息工程專業單片機系統課程設計報告
報警電路硬件電路圖
系統整體硬件電路圖見附錄一
四、系統軟件設計
4.1鍵盤掃描子程序設計
要進行數據的計算就必須先進行數據的輸入,也就必須確定按鍵輸入的數值是什么,這就需要對鍵盤進行掃描,從而確定究竟是哪個鍵按下。
對于鍵盤的掃描,既可以用行掃描也可以用列掃描,這里采用行掃描的方法來完成對鍵盤的掃描。
行掃描就是逐行掃描鍵盤,看是哪一行有鍵按下,再通過返回的鍵碼來確定究竟是哪個按鍵按下。如對第一行掃描就令P1.0為低,P1口其余為高,這樣若第一行有鍵按下,則P1口的值就會由0xfe變為其他值,再由這個值來確定是哪個鍵按下。
以下為鍵盤掃描子程序的程序清單。
uchar keyscan(){
int i;
P1=0xfe;
temp=P1;
temp=temp&0xf0;大連民族學院2007級電子信息工程專業單片機系統課程設計報告
while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:{rdat++;num=1;left(rdat,num);}
break;
case 0xde:{rdat++;num=2;left(rdat,num);}
break;
case 0xbe:{rdat++;num=3;left(rdat,num);}
break;
case 0x7e:{rdat++;num=4;left(rdat,num);}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:{rdat++;num=5;left(rdat,num);}
break;
case 0xdd:{rdat++;num=6;left(rdat,num);}
break;大連民族學院2007級電子信息工程專業單片機系統課程設計報告
}
case 0xbd:{rdat++;num=7;left(rdat,num);}
break;
case 0x7d:{rdat++;num=8;left(rdat,num);}
break;} while(temp!=0xf0){
temp=P1;
temp=temp&0xf0;} }
P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:{rdat++;num=9;left(rdat,num);}
break;
case 0xdb:{rdat++;num=10;left(rdat,num);}
break;
case 0xbb:{equ();}
break;
case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0;
result=0;
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
} 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
} }
P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;大連民族學院2007級電子信息工程專業單片機系統課程設計報告
} return num;}
} while(temp!=0xf0){
temp=P1;
temp=temp&0xf0;} }
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
} break;4.2移位子程序及結果計算子程序設計
輸入數據要存儲在一四位數組內,而我們鍵入的值是數據的高位,后鍵入的值是低位,這樣我們就需要在輸入低位數值時將高位數值從數組的低位移向數組的高位,這就是編寫移位子程序的目的。
對于結果計算子程序,包含加、減、乘、除四種運算。以加法運算為例,各種運算各有其標志位來代表計算類型,當加法標志位add=1是,就將輸入的兩個數據按照加法進行計算。
首先將數組內的數按照對應的位關系,將其轉化為一個十進制數,這樣我們就得到了加速和被加數這樣倆個十進制數,從而我們就可以簡單的將兩個數進行相加,結果就是我們所求的數值。但這個數值不能直接顯示到數碼管上,我們還要對其進行處理,使其變為對應進位的四個數存入數組內,以便顯示。既通過對結果數值分別除以1000、100、10和對10取余,得到我們想要的四個數,送顯示子程序顯示。其余減、乘、除的計算方法與加法的計算方法一樣,這里不再累述。
以下為移位子程序和結果計算子程序的程序清單。
void left(uchar rx,uchar date){
switch(rx)
{
case 1:dat[0]=date;break;大連民族學院2007級電子信息工程專業單片機系統課程設計報告
void equ(){
int i,j,k;
long int s;
if(add==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result+s;add=0;}
if(subb==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result-s;subb=0;}
if(mul==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result*s;mul=0;
}
if(div==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result/s;div=0;
}
If(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;}
if(result<=9999)
{
dat[0]=result%10;
dat[1]=(result/10)%10;
dat[2]=(result/100)%10;
dat[3]=(result/1000)%10;
} for(j=3;j>0;j--)
{ if(dat[j]>0)
{
case 2:dat[1]=dat[0],dat[0]=date;break;
case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
} } 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
for(k=j-1;k>=0;k--)
{
if(dat[k]==0){dat[k]=10;}
}
}
} if(dat[0]==0){dat[0]=10;} } 4.3顯示子程序設計
從始至終無論是輸入的計算數據,還是計算后的結果值。都存儲在同一數組dat[ ]中,這樣我們只要在顯示時一直調用dat[ ]中的值,就能正確的顯示數據。
以下為顯示子程序的程序清單。
void display(){
uchar aa;
keyscan();
P2=0x07;
aa=dat[0];
P0=table[aa];
P2=0x27;
delay(3);
P2=0x0b;
aa=dat[1];
P0=table[aa];
P2=0x2b;
delay(3);
P2=0x0d;
aa=dat[2];
P0=table[aa];
P2=0x2d;
delay(3);
P2=0x0e;
aa=dat[3];
P0=table[aa];
P2=0x2e;
delay(3);
} 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
4.4主程序設計
主程序既把以上各子程序串連成一個整體,使整個程序循環運行。而在以上程序中也已經加入了個程序之間的連接點,首先進入程序后就立即進入顯示子程序,而顯示子程序內又調用鍵盤掃描子程序,若有鍵按下,則會跳轉到移位子程序和結果計算子程序進行相應的處理。通過計算或移位后,數組內的值發生改變,顯示的值也會同時發生改變。之后再進行鍵盤掃描,如此反復運行,就構成了程序的整體。
以下為主程序清單。
void main(){ num=0;
while(1)
{
display();
} }
整體程序清單見附錄二。
五、調試及性能分析
5.1調試步驟
在焊接好器件后,先不要將芯片插在芯片座上,要先驗證先板上電源是否好用,有無短路等。接上USB電源,用萬用表測量個芯片座對應電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續測試其他功能。
將芯片插上后,對各個模塊進行調試,按鍵是否工作正常,數碼管是否顯示正常等。編寫相關部分的測試程序對其進行測試。
各部分硬件檢測無誤后,下載程序進行整體調試,一切正常后,結束調試過程。
在具體調試時首先遇到的問題是程序無法下載進入單片機,通過將電路板接線與原理電路圖接線的對比發現,串口芯片與單片機連接的輸入,輸出接反,重新用銅線連接后,依然無法下載程序。后找到原因是由于下載串口與設計封裝不符,用相對應的下載線可以下載。
成功下載程序后,發現數碼管顯示不正確,查看后發現有先沒有連接,可能是制板時漏印,連接后顯示正常。大連民族學院2007級電子信息工程專業單片機系統課程設計報告
5.2性能分析
對于計算器的性能,主要的衡量指標就在于計算的精度,本次制作的計算器性能情況如下:
加法運算:四位加法運算,和值不超過9999,若超過上限,則顯示錯誤提示E,蜂鳴器報警提示。
減法運算:四位減法運算,若結果為負,對其取絕對值。
乘法運算:積不超過9999的乘法運算,若超出上限,顯示錯誤提示E,蜂鳴器報警提示。
除法運算:整數除法,既計算結果為整數,若除數為零,則顯示錯誤提示E,蜂鳴器報警提示。
通過對實際性能的分析,可以得到本次設計滿足設計的要求。
六、心得體會
通過本次課程設計我真正的自己完成了對給定要求系統的硬件設計、電路設計、電路板設計、軟件設計以及對成品的調試過程。從整個過程中學習到了很多方面的知識,了解到以往學習中自己知識在某方面的不足之處,是對以往學習科目的一種貫穿和承接,從而能更好的認識和學習,也對將來從事工作大有裨益。
從本次課設中我也看到了自身的很多不足之處,對知識的掌握不夠扎實,有一知半解的現象。有時做事不夠穩定,過于毛躁,不能平心靜氣的去分析所遇到的問題和錯誤。這在以后的工作和生活中是不可取的,通過對自身問題的認識與改正相信再遇到同樣問題時會更好的解決。以后的設計實驗也會更好的完成。
參考文獻
[1] 徐維祥、劉旭敏.單片微型機原理及應用.大連:大連理工大學出版社,1996 [2] 李光飛、樓然苗、胡佳文、謝象佐.單片機課程設計與實例指導.北京: 北京航空航天大學出版社,2004
[3] 余永權.89系列FLASH單片機原理及應用.北京:電子工業出版社,2002 [4] 李群芳,黃建.單片機微型計算機與接口技術.北京:電子工業出版社,2001 [5] 樓然苗、李光飛.51系列單片機設計實例.北京:北京航空航天大學出版社,2003 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
附錄1 系統硬件電路圖 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
附錄2 程序清單
#include
for(y=110;y>0;y--);}
void display();void main(){ num=0;
while(1)
{
display();
} } void display(){
uchar aa;
keyscan();
P2=0x07;
aa=dat[0];大連民族學院2007級電子信息工程專業單片機系統課程設計報告
P0=table[aa];
P2=0x27;
delay(3);
P2=0x0b;
aa=dat[1];
P0=table[aa];
P2=0x2b;
delay(3);
P2=0x0d;
aa=dat[2];
P0=table[aa];
P2=0x2d;
delay(3);
P2=0x0e;
aa=dat[3];
P0=table[aa];
P2=0x2e;
delay(3);
} uchar keyscan(){
int i;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:{rdat++;num=1;left(rdat,num);}
break;
case 0xde:{rdat++;num=2;left(rdat,num);}
break;
case 0xbe:{rdat++;num=3;left(rdat,num);}
break;大連民族學院2007級電子信息工程專業單片機系統課程設計報告
}
case 0x7e:{rdat++;num=4;left(rdat,num);}
break;} while(temp!=0xf0){
temp=P1;
temp=temp&0xf0;} } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:{rdat++;num=5;left(rdat,num);}
break;
case 0xdd:{rdat++;num=6;left(rdat,num);}
break;
case 0xbd:{rdat++;num=7;left(rdat,num);}
break;
case 0x7d:{rdat++;num=8;left(rdat,num);}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} }
P1=0xfb;temp=P1;大連民族學院2007級電子信息工程專業單片機系統課程設計報告
temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:{rdat++;num=9;left(rdat,num);}
break;
case 0xdb:{rdat++;num=10;left(rdat,num);}
break;
case 0xbb:{equ();}
break;
case 0x7b:{rdat=0;add=0;subb=0;mul=0;div=0;
result=0;
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} }
P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)大連民族學院2007級電子信息工程專業單片機系統課程設計報告
{
case 0xe7:{rdat=0;add=1;subb=0;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xd7:{rdat=0;add=0;subb=1;mul=0;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0xb7:{rdat=0;add=0;subb=0;mul=1;div=0;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
case 0x77:{rdat=0;add=0;subb=0;mul=0;div=1;
for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
result=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
dat[0]=10;dat[1]=dat[2]=dat[3]=0;
}
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
} 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
} return num;}
void left(uchar rx,uchar date){
switch(rx)
{
case 1:dat[0]=date;break;
case 2:dat[1]=dat[0],dat[0]=date;break;
case 3:dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
case 4:dat[3]=dat[2],dat[2]=dat[1],dat[1]=dat[0],dat[0]=date;break;
} }
void equ(){ int i,j,k;long int s;
if(add==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result+s;add=0;} if(subb==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
if(s>result){result=s-result;} else result=result-s;subb=0;} if(mul==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
result=result*s;mul=0;
} 大連民族學院2007級電子信息工程專業單片機系統課程設計報告
if(div==1){for(i=0;i<5;i++){
if(dat[i]==10){dat[i]=0;}
}
s=dat[0]+10*dat[1]+100*dat[2]+1000*dat[3];
if(s==0)result=10000;
else result=result/s;div=0;
} if(result>9999){dat[0]=11;dat[3]=dat[2]=dat[1]=0;} if(result<=9999){ dat[0]=result%10;dat[1]=(result/10)%10;dat[2]=(result/100)%10;dat[3]=(result/1000)%10;} for(j=3;j>0;j--)
{ if(dat[j]>0)
{
for(k=j-1;k>=0;k--)
{
if(dat[k]==0){dat[k]=10;}
}
}
}
if(dat[0]==0){dat[0]=10;} } 22
第二篇:單片機計算器課程設計報告
基于單片機的簡易計算器設計
基于單片機的簡易計算器設計
一、設計任務和性能指標
1.1設計任務
利用單片機及外圍接口電路(鍵盤接口和顯示接口電路)設計制作一個計算器,用四位一體數碼管顯示計算數值及結果。要求用Protel 畫出系統的電路原理圖(要求以最少組件,實現系統設計所要求的功能),繪出程序流程圖,并給出程序清單(要 求思路清晰,盡量簡潔,主程序和子程序分開,使程序有較強的可讀性)。1.2性能指標
1加法:能夠計算四位以內的數的加法。2減法:能計算四位數以內的減法。3乘法:能夠計算兩位數以內的乘法。
4除法:能夠計算四位數的乘法
5有清零功能,能隨時對運算結果和數字輸入進行清零。
二、系統設計方案
按照系統設計的功能的要求,初步確定設計系統由單片機主控模塊、四位一體數碼管顯示模塊、鍵掃描接口電路共三個主要模塊組成。主控芯片使用51系列AT89C51單片機,采用高性能的靜態80C51設計,它由先進工藝制造,并帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位COMS微處理芯片,市場應用最多。
鍵盤電路采用4*4矩陣鍵盤電路。
顯示模塊采用四位一體共陽極數碼管和SN74LS244鎖存芯片構成等器件構成。
三、硬件系統設計
1.單片機最小系統
單片機最小系統就是支持主芯片正常工作的最小電路部分,包括主控芯片、復位電路和晶振電路。
主控芯片選取STC89C51RC芯片,因其具有良好的性能及穩定性,價格便宜應用方便。
晶振選取11.0592MHz,晶振旁電容選取30pF。
采用按鍵復位電路,電阻分別選取100Ω和10K,電容選取10μF。單片機最小系統硬件電路圖如圖(1)所示。
圖(1)單片機最小系統
2.鍵盤接口電路
計算器所需按鍵有:
數字鍵:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’
功能鍵:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C(清零)’
共計16個按鍵,采用4*4矩陣鍵盤,鍵盤的行和列之間都有公共端相連,四行采用端口P0.0~P0.3,四列采用端口P3.0~P3.3,通過8個端口的的高低電平完成對矩陣鍵盤的控制。通過對16個按鍵進行編碼,從而得到鍵盤的口地址,對比P1口德掃描結果和各按鍵的地址,我們就可以得到是哪個鍵按下,從而完成鍵盤的功能。
3.數碼管顯示電路
采用4位一體的數碼管對計算數據和結果進行顯示,這里選取共陽數碼管,利用NPN三極管對數碼管進行驅動,為了節省I/O資源,采取動態顯示的方法來顯示計算數據及結果。
利用SN74LS244N鎖存器來實現數碼管的動態顯示,P1口輸出顯示值,P2.0~P2.3為位選端口。通過鎖存器對段選信號的鎖存,最終得到對數碼管輸入數據的控制。
以下為數碼顯示電路的硬件電路圖,左圖為數碼管驅動電路,右圖為段選信號鎖存電路。
四.軟件設計部分
根據選題要求,系統編程如下所示: #include “reg51.h” sbit P3_0=P3^0;sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;unsigned char sz[11],xs1[4],xs2[4],sj;int i,cs,bb,t1,t2,fh,s1,s2;void chushihua(){
} void xianshi(unsigned char xs[4]){ int i,j;unsigned char zy;bb=1;xs1[0]=10;xs1[1]=10;xs1[2]=10;xs1[3]=10;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;t1=0;t2=0;s1=s2=0;fh=0;cs=1;
// zy=0x08;for(i=0;i<4;i++){ P2=(0xff-zy);
P1=sz[xs[i]];
} zy=(zy>>1);for(j=0;j<100;j++);
for(i=0;i<100;i++);return;} unsigned char saomiao(){
int i,j;unsigned char pp;for(i=0;i<1000;i++);P0=0xfe;P3=0x0f;pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)
{P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 7;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 8;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 9;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 11;} //==========1 P0=0xfd;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 4;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 5;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 6;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 12;} //==========2 P0=0xfb;P3=0x0f;pp=P3;if(P3_0==0){P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 1;} if(P3_1==0){P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 2;} if(P3_2==0){P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 3;} if(P3_3==0){P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 13;} //==========3 P0=0xf7;P3=0x0f;
pp=P3;if(P3_0==0)if(P3_1==0)if(P3_2==0)if(P3_3==0)return 10;
{P3=0x0f;pp=P3;while(P3_0==0);for(i=0;i<1000;i++);return 16;} {P3=0x0f;pp=P3;while(P3_1==0);for(i=0;i<1000;i++);return 0;} {P3=0x0f;pp=P3;while(P3_2==0);for(i=0;i<1000;i++);return 15;} {P3=0x0f;pp=P3;while(P3_3==0);for(i=0;i<1000;i++);return 14;} //===========4 } void chuli(unsigned char x){
int i;if(x==16){
} cs=0;return;if(x>=0 && x<10){ if(bb==1)
{
} if(s1= =4){cs=0;return;} else { for(i=3;i>0;i--)xs1[i]=xs1[i-1];
} xs1[0]=x;s1++;t1=t1*10+x;if(bb==2){
if(s2==4){cs=0;return;} else {
} for(i=3;i>0;i--)xs2[i]=xs2[i-1];xs2[0]=x;s2++;t2=t2*10+x;} } if(x>10)
{
if(bb==1){fh=x;bb=2;return;} if(bb==2){ if(fh==11)t1=t1/t2;
if(fh==12)t1=t1*t2;if(fh==13)t1=t1-t2;if(fh==14)t1=t1+t2;if(t1>=10000){cs=0;return;} else { if(t1>=0 && t1<10)
{xs1[0]=t1;xs1[1]=10;xs1[2]=10;xs1[3]=10;}
if(t1>=10 && t1<100){xs1[0]=t1%10;xs1[1]=t1/10;xs1[2]=10;xs1[3]=10;}
if(t1>=100 && t1<1000)
{xs1[0]=t1%10;xs1[1]=(t1-(t1/100)*100)/10;xs1[2]=t1/100;xs1[3]=10;}
if(t1>=1000 && t1<10000)
{xs1[0]=t1%10;xs1[1]=t1%100/10;xs1[2]=(t1-(t1/1000)*1000)/100;xs1[3]=t1/1000;}
bb=2;
}
}
} s2=0;t2=0;xs2[0]=10;xs2[1]=10;xs2[2]=10;xs2[3]=10;fh=x;} void main(){
sz[0]=0xfc;sz[1]=0x60;sz[2]=0xda;sz[3]=0xf2;sz[4]=0x66;sz[5]=0xb6;sz[6]=0xbe;sz[7]=0xe0;sz[8]=0xfe;sz[9]=0xf6;sz[10]=0x00;cs=0;
for(;;)
{
if(cs==0)chushihua();if(cs==1)sj=saomiao();if(cs==1 && sj!=10)chuli(sj);if(cs==1 &&(bb==1 || bb==2 && s2==0))xianshi(xs1);if(cs==1 &&(bb==2 && s2!=0))xianshi(xs2);
} } 軟件設計好后,在KEIL上面進行仿真,把仿真得到的文件下載到Proteus里面進行仿真,得到Proteus仿真電路圖如下所示:
圖(2)
計算器Proteus仿真電路圖
五.硬件電路焊接及調試
根據電路圖紙,焊接好硬件電路,把程序下載到單片機芯片,接通好電源,進行調試。在焊接好器件后,先不要將芯片插在芯片座上,要先驗證先板上電源是否好用,有無短路等。接上USB電源,用萬用表測量個芯片座對應電源和地之間的電壓值,觀察電壓值是否正常。一切正常后方可將芯片插入芯片座,以繼續測試其他功能。
將芯片插上后,對各個模塊進行調試,按鍵是否工作正常,數碼管是否顯示正常等。編寫相關部分的測試程序對其進行測試。
各部分硬件檢測無誤后,下載程序進行整體調試,一切正常后,結束調試過程。
用所設計的單片機進行數字計算,顯示結果與任務要求一致,焊接電路符合要求。六.課程設計心得
兩周的時間,終于把單片機課程設計搞完了。整個體會還是比較多的。首先是題目的選擇,各方面的原因,自己還是想選個簡單點的題目,不過最后選來選去,還是選擇了計算器。由于自己對單片機編程還不是很熟悉,結果在設計的時候遇到了一系列問題,程序總是調試部處理,不過還好,最后在同學的幫助下終于把程序調試出來了,雖然程序設計實現的功能與老師要求的不盡相同,不過勉強還算可以。從這里我知道了基本知識的重要性。其實進行程序設計的時候主要是對各功能模塊的把握。計算器里面最難的一部分是矩陣鍵盤的掃描和編碼,那個費了很大力氣。
另外一點就是硬件焊接調試部分。焊接的時候到時輕松,一個下午就焊接好了,然后是調試部分。調試花費的時間還是比較長的。不過有了上個學期數字電路焊接調試的經驗,這次單片機調試還算是比較順利。我也是從電路板的正負電源檢測起,一步一步來,最終得到了想要的結果。調試的時候主要遇到了兩個問題。一個是鍵盤總是沒有反應,為了這個自己調試了很久,前前后后把電路板檢查了幾次,最后才發現是鍵盤本身的問題,和同學們換了個好鍵盤才行。另一個問題是總是顯示不出來1、4、7這三個數字。檢測來檢測去,發現來是在測試最小系統時在一個位選端接了高電平,對位選信號產生了影響。當把那個高電平去掉后,終于得到了正確的結果。
總的來說這次課程設計達到了完成了基本任務,達到了基本要求。通過親身對程序設計和電路焊接調試的體會,自己對單片機有了進一步的了解,單片機編程能力也得到了提高。電路板的焊接與調試,使自己電路調試的方法和思想進一步加強了。這次單片機課程設計應該說是比較成功的。
參考文獻:
【1】徐維祥、劉旭敏:,《單片微型機原理及應用》,大連理工大學出版社,1996年。【2】李光飛、樓然苗、胡佳文、謝象佐.,《單片機課程設計與實例指導.》,北京航空航天大學出版社,2004年。
【3】余永權,《89系列FLASH單片機原理及應用.》,電子工業出版社,2002。【4】楊恢先、黃輝先,《單片機原理及應用》,人民郵電出版社,2006年。【5】常敏、王涵、范江波,《單片機應用程序開發與實踐》,電子工業出版社,2009年。
第三篇:基于AT89C51單片機的電子計算器的課程設計
C51單片機電子計算器課程設計
一.課程設計背景
當今時代,是一個新技術層出不窮的時代。在電子領域,尤其是自動化智能控制領域,傳統的分立元件或數字邏輯電路構成的控制系統正以前所未見的速度被單片機智能控制系統所取代。單片機具有體積小、功能強、成本低、應用面廣等優點,可以說,智能控制與自動控制的核心就是單片機。目前,一個學習與應用單片機的高潮正在工廠、學校及企事業單位大規模地興起。過去習慣于傳統電子領域的工程師、技術員正面臨著全新的挑戰,如不能在較短時間內學會單片機,勢必會被時代所遺棄,只有勇敢地面對現實,挑戰自我,加強學習,爭取在較短的時間內將單片機技術融會貫通,才能跟上時代的步伐。
它所給人帶來的方便也是不可否定的,它在一塊芯片內集成了計算機的各種功能部件,構成一種單片式的微型計算機。20世紀80年代以來,國際上單片機的發展迅速,其產品之多令人目不暇接,單片機應用不斷深入,新技術層出不窮。20世紀末,電子技術獲得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。本設計是由單片機實現的模擬計算器,它不僅能實現數據的加減乘除運算,而且還能使數據及其計算結果在數碼管上顯示出來,能夠實現0-256的數字四則運算。本設計是用單片機AT89C51來控制,采用共陽極數碼顯示,軟件部分是由C語言來編寫的。設計任務
二、元器件清單及簡介
89c51型芯片 一片
排阻 兩個
晶振12MHZ 一個
電容22uf 兩個
面包板 三個
導線 若干
三、設計原理及分析
根據功能和指標要求,本系統選用MCS 51 單片機為主控機。通過擴展必要的外圍接口電路,實現對計算器的設計。具體設計考慮如下: ①由于要設計的是簡單的計算器,可以進行四則運算,對數字的大小范圍要求不高,故我們采用可以進行四位數字的運算,選用8 個LED 數碼管顯示數據和結果。
②另外鍵盤包括數字鍵(0~9)、符號鍵(+、-、×、÷)、清除鍵和等號鍵,故只需要16 個按鍵即可。系統模塊圖:
2.1 輸入模塊:
鍵盤掃描計算器輸入數字和其他功能按鍵要用到很多按鍵,如果采用獨立按鍵的方式,在這種情況下,編程會很簡單,但是會占用大量的I/O 口資源,因此在很多情況下都不采用這種方式。為此,我們引入了矩陣鍵盤的應用,采用四條I/O 線作為行線,四條I/O 線作為列線組成鍵盤。在行線和列線的每個交叉點上設置一個按鍵。這樣鍵盤上按鍵的個數就為4×4個。這種行列式鍵盤結構能有效地提高單片機系統中I/O 口的利用率。矩陣鍵盤的工作原理:計算器的鍵盤布局如圖所示:一般有16 個鍵組成,在單片機中正好可以用一個P 口實現16 個按鍵功能,這種形式在單片機系統中也最常用。
以上鍵盤從上到下依次編號為1,2,3,4,D,C,B,A 1
由圖 3 矩陣鍵盤內部電路圖可以知道,當無按鍵閉合時,P10~P13 與P14~P17 之間開路。當有鍵閉合時,與閉合鍵相連的兩條I/O 口線之間短路。判斷有無按鍵按下的方法是:第一步,置列線P14~P17 為輸入狀態,從行線P10~P13 輸出低電平,讀入列線數據,若某一列線為低電平,則該列線上有鍵閉合。第二步,行線輪流輸出低電平,從列線P14~P17 讀入數據,若有某一列為低電平,則對應行線上有鍵按下。綜合一二兩步的結果,可確定按鍵編號。但是鍵閉合一次只能進行一次鍵功能操作,因此須等到按鍵釋放后,再進行鍵功能操作,否則按一次鍵,有可能會連續多次進行同樣的鍵操作。2.2 運算模塊:(單片機控制)AT89C51 單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數器和多功能I/O等一臺計算機所需要的基本功能部件。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數據存儲器(RAM)、程序存儲器(ROM/EPROM)、并行I/O 口、串行口、定時器/計數器、中斷系統及特殊功能寄存器(SFR)。[3][5]單片機是靠程序運行的,并且可以修改。通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,通過使用單片機編寫的程序可以實現高智能,高效率,以及高可靠性!因此我們采用單片機作為計算器的主要功能部件,可以進行很快地實現運算功能。2.3 顯示模塊:
LED 顯示發光二極管LED 是單片機應用系統中的一宗簡單而常用的輸出設備,其在系統中的主要作用是顯示單片機的輸出數據、狀態等。因而作為典型的外圍器件,LED 顯示單元是反映系統輸出和操作輸入的有效器件。LED 具備數字接口可以方便的和大年紀系統連接;它的優點是價格低,壽命長,對電壓電流的要求低及容易實現多路等,因而在單片機應用系統中獲得了廣泛的應用。[2][4]通常的數碼顯示器是由7 段條形的LED 組成(如圖4 所示),點亮適當的字段,就可顯示出不同的數字。我們采用8 段數碼管,其中位于顯示器右下角的LED 作小數點用。LED 顯示器有兩種不同的形式:共陰極和共陽極。本次設計采用共陰極接法(如圖5所示)。
3、軟件設計
在程序設計方法上,模塊化程序設計是單片機應用中最常用的程序設計方法。設計的中心思想是把一個復雜應用程序按整體功能劃分成若干相對獨立的程序模塊,各模塊可以單獨設計、編程和調試,然后組合起來。這種方法便于設計和調試,容易實現多個程序共存,但各個模塊之間的連接有一定的難度。根據需要我們可以采用自上而下的程序設計方法,此方法先從主程序開始設計,然后再編制各從屬程序和子程序,層層細化逐步求精,最終完成一個復雜程序的設計。這種方法比較符合人們的日常思維,缺點是一級的程序錯誤會對整個程序產生影響。功能流程圖如下:
4、硬件原理 以下為簡易計算器的總體電路圖
加運算:
減運算:
乘運算:
除運算:
清零: 四.總結
通過此次單片機實訓設計,我們學到了很多東西,在器件的了解和器件選擇上有個明確的認識,并在程序的設計,及理論在實踐反面的運用能力有巨大的提高。
這次單片機課程設計由我們六位同學經過一周努力設計得到。軟件的編程要我們不斷的調試,最終我們終于完成了單片機實訓課程設計,很高興它能按著設計思想與要求運動起來。
當然,這其中也有很多的問題。第一、不夠細心,由于對課本理論的不熟悉導致的編程錯誤,對于器件的實際情況的不了解,理論與實踐的差距導致我們在設計實際電路時出現了很多錯誤,使得實驗不能一次通過。第二、是在學習態度上,這次課程設計是對我們的學習態度的一次體驗。對于這次單片機綜合課程實習,我們的第一大心得體會就是作為一名工程技術人員,要求具備的首要素質絕對應該是嚴謹,這次的課程設計我們所遇到的問題多半是由于我們不夠嚴謹。第三、在做人上,我們認識到,無論做什么事情,只要你足夠堅強,有足夠的毅力和決心,有足夠的挑戰困難的勇氣,就沒什么辦不到的。還有就是團隊的合作精神。
在這次難得的課程設計過程中我們鍛煉了自己的思考能力和動手能力,加強了我們思考問題的完整性和實際生活聯系的可行性。在方案設計選擇和芯片的選擇上,培養了我們綜合應用單片機的能力,對單片機的各個管腳的功能也有了進一步的認識。還鍛煉我們個人的查閱技術資料的能力,動手能力,發現問題、解決問題的能力。
五.參考文獻
《單片機原理及應用》 張毅剛 高等教育出版社
《MCS—51單片機應用設計》 張毅剛 哈爾濱工業大學出版社 《MCS—51系列單片機實用接口技術》 李華 北京航空航天大學出版社 《單片機應用技術選集》 何立民 北京航空航天大學出版社 《單片機原理及其接口技術》 胡漢才 《數碼管顯示驅動和鍵盤掃描控制器CH451及其應用》
清華大學出版社 施隆照 /*********************************************** **實現說明:
1:變量flag_fuhao為鍵入+、-、*、/運算符標志
(即當前一個鍵值為+、-、*、/運算符時,flag_fuhao為1,其他鍵值則flag_fuhao置零,其用在顯示時)
2:變量flag_shu數輸入情況,flag_shu為0時,輸入的符號無效(flag_shu為2時,變量fuhao更新為新鍵值)
*********************************************/ #include
sbit OFF = P1^0;//關機鍵定義
float shu1,shu2;//進行運算的兩個變量數 uchar num;////鍵盤掃描返回值
char flag1,flag_shu,flag_fuhao,fuhao,newkey,update;
//flag1開機標志newkey新按鍵標志,fuhao運算符,update表示等于號 //之后緊接著輸入的是數的話則清零shu1
char key_shu;//按鍵值 char ge=0xdf;//char code Wela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//六位數碼管的位選
unsigned char code Duan[]={0x3f,0x06,0x5b, //
0 1 2 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 3 4 5 6 7 8 9 無顯示
共陰極數碼管
// 函數聲明
uchar keyscan();//鍵盤掃描函數
void display(float);//數碼管顯示函數
void delay(uint i)//延時函數 {
while(i--);}
/***********************************************
主函數
************************************************/ void main(){
flag1=0;//標志關機
while(1){
if(keyscan()==15)//開機檢測
{
flag1=1;//標志開機
shu1=shu2=fuhao=flag_shu=newkey=0;//初始化變量
while(flag1)//判斷是否已開機
{
if(!flag_fuhao)
display(shu1);//如果輸入的不是
else
display(shu2);
key_shu=keyscan();
if(newkey==1)//有新鍵值
{
if(key_shu==15)//按下ON/C鍵,清零
{
flag_fuhao=update=0;
shu1=shu2=fuhao=flag_shu=newkey=0;
}
else if(key_shu==14&&flag_shu==1&&fuhao)//按下“=”
{
switch(fuhao)
{
case 10:shu1=shu2+shu1;break;
case 11:shu1=shu2-shu1;break;
case 12:shu1=shu2*shu1;break;
case 13:shu1=shu2/shu1;break;
}
flag_fuhao=0;
fuhao=0;
update=1;
} 10
else if((key_shu>=0)&&(key_shu<=9))//按下數字鍵
{
if(update)
shu1=0;
if(shu1<100000)
{
shu1=key_shu+shu1*10;
flag_shu=1;
}
update=0;
flag_fuhao=0;
}
else if((key_shu>=10)&&(key_shu<=13))//按下運算符
{
flag_fuhao=1;//表示按下了運算符號鍵
update=0;
if(flag_shu==1)//表示之前有數字鍵按下
{
if(fuhao==0)//表示計算時只有一次按下運算符,如1*8=8,第二個數字后面是=,而不是其他運算符
{
shu2=shu1;
shu1=0;
fuhao=key_shu;//將按下的運算符號的鍵的值賦值給fuhao,記錄前一個運算符,以便按=后實現相應的計算。
flag_shu=2;
}
else
//表示計算時按了多次運算符,如1*8*9=72,第二個數字后面并沒有=,而是*
{
switch(fuhao)
{
case 10:shu2=shu2+shu1;break;
case 11:shu2=shu2-shu1;break;
case 12:shu2=shu2*shu1;break;
case 13:shu2=shu2/shu1;break;
}
shu1=0;
fuhao=key_shu;//將按下的運算符號的鍵的值賦值給fuhao,記錄前一個運算符,以便按=后實現相應的計算。
}
}
else if(flag_shu==2)
fuhao=key_shu;//將按下的運算符號的鍵的值賦值給fuhao,記錄前一個運算符,以便按=后實現相應的計算。
}
newkey=0;
}
}
} } }
/***********************************************
數碼管顯示函數
************************************************/ void display(float dis_shu){
long zhengshu=(long)dis_shu;char dis_flag,dis_aa,dis_zero=0;uchar dis_data[6]={0,0,0,0,0,0},xiaoshu[6]={0,0,0,0,0,0};
ge=0xdf;//11 01 111 if(zhengshu>99999)dis_flag=6;else if(zhengshu>9999)dis_flag=5;else if(zhengshu>999)dis_flag=4;else if(zhengshu>99)dis_flag=3;else if(zhengshu>9)dis_flag=2;else dis_flag=1;
dis_shu=dis_shu-zhengshu;
for(dis_aa=0;(dis_aa<6-dis_flag)&&(dis_shu=(dis_shu-(char)dis_shu)*10);dis_aa++){
xiaoshu[dis_aa]=(long)dis_shu;}
for(dis_aa=0;(dis_aa<6-dis_flag);dis_aa++){
if(dis_zero||xiaoshu[5-dis_flag-dis_aa])12
{
duan=Duan[xiaoshu[5-dis_flag-dis_aa]];
wei=ge;
ge>>=1;
delay(100);
wei=0xff;
dis_zero=1;
} }
// for(dis_aa=0;dis_aa dis_data[dis_aa]=zhengshu%10; zhengshu=zhengshu/10;} //數碼管段選 for(dis_aa=0;dis_aa if(0xdf!=ge&&dis_aa==0) { duan=Duan[dis_data[dis_aa]]|0x80; wei=ge; ge>>=1; delay(100); wei=0xff; } else { duan=Duan[dis_data[dis_aa]]; wei=ge; ge>>=1; delay(100); wei=0xff; } } //數碼管位選 } /*********************************************** 鍵盤掃描函數 ************************************************/ uchar keyscan()// 函數返回按鍵的值 { //將第一行線置低電平,其余行線全部為高電平,即掃描第一行 key=0xfe; if(key!=0xfe){ delay(500);//延時消抖操作 if(key!=0xfe) { switch(key) { case 0xee:num=7;break;//7 case 0xde:num=8;break;//8 case 0xbe:num=9;break;//9 case 0x7e:num=13;break;//除號 ”/” } newkey=1; delay(500); while(key!=0xfe) { if(flag1)//如果已開機 if(!shu1&&num>=0&&num<=9)//如果輸入的第一個數不為0且第二個數為數字,則顯示第二個數字,否則顯示第一個數字 display(num); else display(shu1); } return num; } } //將第二行線置低電平,其余行線全部為高電平,即掃描第二行 key=0xfd;if(key!=0xfd){ delay(500);//延時消抖操作 if(key!=0xfd) { switch(key) { case 0xed:num=4;break;//4 case 0xdd:num=5;break;//5 case 0xbd:num=6;break;//6 case 0x7d:num=12;break;//* } newkey=1; delay(500); while(key!=0xfd) { if(flag1) if(!shu1&&num>=0&&num<=9)//如果輸入的第一個數不為0且第二個數為數字,則顯示第二個數字,否則顯示第一個數字 display(num); else display(shu1); } return num; } } //將第三行線置低電平,其余行線全部為高電平,即掃描第三行 key=0xfb;if(key!=0xfb){ delay(500); if(key!=0xfb) { switch(key) { case 0xeb:num=1;break;//1 case 0xdb:num=2;break;//2 case 0xbb:num=3;break;//3 15 case 0x7b:num=11;break;//- } newkey=1; delay(500); while(key!=0xfb) { if(flag1) if(!shu1&&num>=0&&num<=9)//如果輸入的第一個數不為0且第二個數為數字,則顯示第二個數字,否則顯示第一個數字 display(num); else display(shu1); } return num; } } //將第四行線置低電平,其余行線全部為高電平,即掃描第四行 key=0xf7;if(key!=0xf7){ delay(500); if(key!=0xf7) { switch(key) { case 0xe7:num=15;break;// ON/C:開關機按鍵 case 0xd7:num=0;break;// 0 case 0xb7:num=14;break;// = case 0x77:num=10;break;// + } newkey=1; delay(500); while(key!=0xf7) { if(flag1) if(!shu1&&num>=0&&num<=9)//如果輸入的第一個數不為0且第二個數為數字,則顯示第二個數字,否則顯示第一個數字 display(num); else display(shu1); } 16 return num; } } //判斷關機按鍵是否被按下 if(!OFF){ delay(500);//延時消抖操作 if(!OFF) { flag1=0;// } } return 100; } 若關機按鍵被按下,則將關機標志位flag1置1 17 《單片機課程設計》報告格式 一、封面(注明:單片機課程設計報告、課題名稱、班級、姓名、指導教師、日期) 二、摘要(課題簡要說明) 三、課題設計目標(功能、性能指標)、方案論證(要求作兩種以上方案比較) 四、設計過程(關鍵電路工作原理、元器件參數選用、程序流程圖、程序) 五、軟硬件的安裝、調試方法 六、完整電路圖、性能參數測試 七、存在的問題和改進方向 八、參考文獻資料 單片機課程設計報告格式要求 統一的A4紙打印。每頁約44行,每行約34字;打印正文用宋體小四號字;版面頁邊距上空2.5cm,下空2cm,左空2.5cm,右空2cm;頁碼用小五號字,底端居中。 A、封面;B、課程設計任務書;C、摘要; D、目錄; E、正文;F、參考文獻;G、附錄(源程序代碼);H、有關圖紙(系統的總體原理圖) 摘要(內容提要) 摘要是論文內容的簡要陳述,應盡量反映主要信息,內容包括研究目的、方法、成果和結論,不含圖表,不加注釋,具有獨立性和完整性,?摘要?字樣位置居中。 目錄 目錄按三級標題編寫,要求層次清晰,且要與正文標題一致。主要包括緒論、正文主體、結論、主要參考文獻及附錄等。 題序層次大致有以下幾種格式: 1、緒論 1.1課題背景 ˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ 1.2交會對接技術發展概況 ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ 1.2.1俄羅斯空間交會對接發展概況 ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ 1.2.2美國空間交會對接發展概況 ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ 2、空間飛行器 2.1引言 ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ 結論 ˉˉˉˉˉˉˉ(正文)ˉˉˉˉˉˉˉˉˉ 主要參考文獻 為了反映報告的科學依據和作者尊重他人研究成果的嚴肅態度,同時向讀者提供有關信息的出處,正文之后一般應列出主要參考文獻(只限于那些作者親自閱讀過的,最重要的且發表在公開出版物上的文獻或網上下載的資料)。報告中被引用的參考文獻序號置于所引用部分的右上角。參考文獻所列著作按報告中引用順序排列,著作按如下格式著錄:序號、著作者、書名、出版地、出版社、出版日期。 例1(著作):1.宋尚桂.大學通識教育的理論和模式.青島:中國海洋大學出版社,2007年9月 例2(文章):2.朱曉剛.以人為本----美國大學通識教育理念和實踐的解讀.民辦教育研究,2005(5) 設計報告裝訂順序 (一)課程設計封面 (二)課程設計任務書 (三)摘要 (四)目錄 例: 1、緒論ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ 11.1課題背景ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ1 1.2交會對接技術發展概況ˉˉˉˉˉˉˉˉˉˉˉˉˉ 31.2.1俄羅斯空間交會對接發展概況ˉˉˉˉˉˉˉˉˉ 51.2.2美國空間交會對接發展概況ˉˉˉˉˉˉˉˉˉˉ72、空間飛行器ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ20 2.1引言ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ20 2.2空間飛行器姿態表示ˉˉˉˉˉˉˉˉˉˉˉˉˉˉ23 結論ˉˉˉˉˉˉˉˉˉˉˉˉ ˉˉˉˉˉˉˉˉˉˉ50 主要參考文獻ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ 51(五)正文 (六)參考文獻 (七)附錄 (八)有關圖紙 撰寫設計報告的幾點要求 1、文字 設計中漢字應采用《簡化漢字總表》規定的簡化字,并嚴格執行漢字的規范,所有文字字面清晰,不得涂改。 第一層次(章)題序和標題居中放置,其余各層次(節、條、款)題序和標題一律沿版面左側邊線頂格排列。第一層次(章)題序和標題距下文雙倍行距。段落開始后縮兩個字。行與行之間,段落和層次標題以及各段落之間均為單倍行距。 第一層次(章)題序和標題用小二號黑體字。題序和標題之間空兩個字,不加標點,下同。 第二層次(節)題序和標題用小三號黑體字。 第三層次(條)題序和標題用四號黑體字。 第四層次及以下層次題序及標題一律用小四號黑體字。 結論(結束語)作為單獨一章排列,但標題前不加?第XXX?字樣。結論是整個設計的總結,應以簡練的文字說明所做的工作。 2、表格 設計中的表格可以統一編序,也可以逐章單獨編序,方式應與插圖及公式的編序方式統一。表序必須連續,不得重復或跳躍。表格的結構應簡潔,各欄都應標注量和相應的單位。表格內數字須上下對齊,相鄰欄內的數值相同時,不能用‘同上’、‘同左’和其它類似用詞,應一一重新標注。表序和表題置于表格上方中間位置,無表題的表序置于表格的左上方或右上方(同一篇論文位置應一致)。 3、插圖 插圖要精選,圖序可以連續編序,也可以逐章單獨編序,方式應與表格、公式的編序方式統一,圖序必須連續,不得重復或跳躍。僅有一圖時,在圖題前加‘附圖’字樣。設計中的插圖以及圖中文字符號應打印,無法打印時一律用鋼筆繪制和標出。由若干個分圖組成的插圖,分圖用a,b,c,……標出。圖序和圖題置于圖下方中間位置。 4、公式 設計中重要的或者后文中須重新提及的公式應注序號并加圓括號,序號一律用阿拉伯數字連續編序或逐章編序,序號排在版面右側,且距右邊距相等。公式與序號之間不加虛線。 5、數字用法 公歷世紀、年代、年、月、日、時間和各種計數、計量,均用阿拉伯數字。年份不能簡寫(如1999年不能寫成99年)。數值的有效數字應全部寫出,如:0.50∶20.0不能寫作0.5∶20。 6、軟件 軟件流程圖和原程序清單要按軟件文檔格式附在報告后面,特殊情況可在答辯時展示,不附在報告內。 7、計量單位的定義和使用方法按國家計量標準執行。第四篇:單片機課程設計報告格式
第五篇:單片機課程設計報告格式