版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 單片機課程設(shè)計</b></p><p> 題目名稱基于51單片機的簡易計算器</p><p> 學(xué)生學(xué)院____ 信息工程學(xué)院_______</p><p> 專業(yè)班級信息工程(應(yīng)用電子方向)12(2)班 </p><p> 姓 名______虞君權(quán)__________ <
2、/p><p> 學(xué) 號 3112002559 </p><p> 指導(dǎo)教師_ _____李優(yōu)新 ___</p><p><b> 2015年1月15</b></p><p><b> 一、課程設(shè)計的內(nèi)容</b></p><p> 本
3、次課程設(shè)計的內(nèi)容從下面兩個方面任選一個:一是在學(xué)院的單片機實驗平臺上進(jìn)行,開發(fā)一個基于單片機與PWM技術(shù)的燈光調(diào)節(jié)系統(tǒng),主要開發(fā)內(nèi)容為按鍵定義、輸入與防抖動技術(shù)、PWM調(diào)節(jié)技術(shù)以及顯示技術(shù)等程序設(shè)計。二是利用51系列單片機及必要的外圍芯片、輸入輸出等接口電路設(shè)計開發(fā)一個簡易的單片機系統(tǒng),在此基礎(chǔ)上,自行設(shè)計一個單片機應(yīng)用程序來實現(xiàn)一些實用的功能。</p><p> 通過這些內(nèi)容的設(shè)計、開發(fā)、安裝、調(diào)試等一系列工
4、作,熟練掌握單片機系統(tǒng)的開發(fā)流程與工作機理,加深對所學(xué)課程知識的理解與把握,為將來相關(guān)的研究開發(fā)工作打下堅實的基礎(chǔ)。</p><p><b> 二、設(shè)計內(nèi)容</b></p><p> 本次實驗的任務(wù)就是要以51系列單片機為核心實現(xiàn)一個簡易計算器計算器,它的結(jié)構(gòu)非常簡單,外部主要由4*4矩陣鍵盤和一個液晶顯示屏構(gòu)成,內(nèi)部由一塊AT89C51單片機構(gòu)成,通過軟件編程可
5、實現(xiàn)簡單加減乘除。</p><p><b> 三、方案論證</b></p><p> 經(jīng)分析,計算器電路包括三個部分:顯示電路、4*4鍵掃描電路、單片機微控制電路。具體如下:</p><p><b> LCD顯示電路</b></p><p> LCD1602作為一個成熟的產(chǎn)品,使用簡單,模式
6、固定,便于移植到各種類型的程序,但是初學(xué)者往往要注意結(jié)合LCD本身的時序圖來完善初始化程序。又以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點,故采用LCD.</p><p> 4*4鍵盤掃描電路(中斷式,掃描式,反轉(zhuǎn)式)</p><p> 用戶設(shè)計行列鍵盤接口,一般常采用3 種方法讀取鍵值。一種是中斷式,外兩種是掃描法和反轉(zhuǎn)法。</p><p> 中斷式
7、:在鍵盤按下時產(chǎn)生一個外部中斷通知CPU,并由中斷處理程序通過不同的地</p><p> 址讀取數(shù)據(jù)線上的狀態(tài),判斷哪個案件被按下。本實驗采用中斷式實現(xiàn)用戶鍵盤接口。</p><p> 掃描法:對鍵盤上的某一行送低電平,其他行為高電平,然后讀取列值。若列值中有一</p><p> 位是低,則表明該行與低電平對應(yīng)列的鍵被按下;否則,掃描下一行。</p>
8、;<p> 反轉(zhuǎn)法:先將所有行掃描線輸出低電平,讀列值。若列值有一位是低,則表明有鍵按下,</p><p> 讀列值;然后所有列掃描線輸出低電平,再讀行值。根據(jù)讀到的值組合就可以查表1 得到的</p><p><b> 鍵碼。</b></p><p> 這個就仁者見仁智者見智了,不過如果熟悉了掃描式,建議果斷升級自己的硬件
9、(很簡單加個74LS08與門),故采用節(jié)省CPU的中斷式掃描電路。</p><p> ?、常?單片機微控制電路</p><p> 微控制電路就是以AT89C51為核心的控制核心,主要注意晶振電路的接法和復(fù)位電路的接法。</p><p><b> 四、硬件電路的設(shè)計</b></p><p> 2.1 硬件設(shè)計電路
10、框圖</p><p> 2.2 硬件設(shè)計電路的元件清單</p><p> 2.3 硬件設(shè)計電路圖</p><p> 將4*4的鍵盤直接接在P2口上,用P0口作為LCD的顯示輸出,P3.2口的INT0作為外部中斷位。</p><p> 五、軟件設(shè)計程序及描述</p><p> 本程序組成可分為3個模塊:
11、矩陣鍵盤模塊,LCD顯示模塊,和運算模塊</p><p> 六、硬軟件的調(diào)試及方法</p><p> 我個人遇到的主要問題出現(xiàn)在LCD1602上,要不是我自己買了塊新的LCD恐怕我的結(jié)論,就只能在軟件仿真實現(xiàn)了。</p><p> 硬件上:在不加芯片調(diào)試時,LCD1602只顯示一排全黑,一般說明該元件是好的。(但也不一定,我那時就一直認(rèn)為我的元件沒壞);給15
12、,16管腳分別接上+5v和0v,測試背光是否完好;給VEE接上電位器,檢查對比度是否可調(diào);</p><p> 七、實驗結(jié)果與性能達(dá)標(biāo)</p><p> 我的計算器能準(zhǔn)確進(jìn)行包括整數(shù)及小數(shù)的加減乘除四則運算。</p><p> 八、實驗改進(jìn)與心得體會</p><p> 這個實驗給我的感覺,硬件和軟件上都不是很難。在將燒寫進(jìn)單片機芯片之前
13、,進(jìn)行過仿真,所以方便很多,覺得proteus軟件在邏輯電路仿真中非常有用,特別是進(jìn)行單片機的仿真。我在這次實驗上,又加深了對單片機的認(rèn)識和理解,感覺收獲的更多。 </p><p><b> 下面是源代碼:</b></p><p> #include<reg51.h></p><p> #include <intrins
14、.h></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include<math.h></p><p> sbit RS= P1^2;</p><p> sbit RW = P1^1
15、;</p><p> sbit E = P1^0; //定義lcd端口,RS:數(shù)據(jù)、命令選擇端,RW:讀、寫選擇端</p><p> sbit H1=P2^4;</p><p> sbit H2=P2^5;</p><p> sbit H3=P2^6;</p><p> sbit H4=P2^7;<
16、/p><p> char input,flag,f,i; //定義每次的輸入input,和對輸入的分類標(biāo)志flag</p><p> char buf[16]="",num1[10]="",num2[10]="",result[16]="",sign;</p><p> float
17、temp;</p><p> void delay(unsigned char x) //延時函數(shù) </p><p><b> {</b></p><p> unsigned char y;</p><p> for(;x>0;x--)</p>&l
18、t;p> for(y=0;y<=110;y++)</p><p><b> ;</b></p><p><b> }</b></p><p> void delay_4nop()//延時函數(shù)</p><p><b> {</b></p>&
19、lt;p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> }
20、</b></p><p> void keyscan() //矩陣鍵盤掃描函數(shù)</p><p><b> {</b></p><p><b> P2=0XF7;</b></p><p><b> if(H1==0)</b>&
21、lt;/p><p><b> {</b></p><p> delay(10);</p><p><b> if(H1==0)</b></p><p><b> {</b></p><p> input='0'; //掃描按鍵
22、0,下面同理</p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H1==0)</p><p><b> ;</b></p><p><b> }</b>&
23、lt;/p><p> P2=0XF7; </p><p><b> if(H2==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H2==0)</b></p>
24、;<p><b> {</b></p><p> input='.';</p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H2==0)</p><p&
25、gt;<b> ;</b></p><p><b> }</b></p><p><b> P2=0XF7;</b></p><p><b> if(H3==0)</b></p><p><b> {</b></p&g
26、t;<p> delay(10);</p><p><b> if(H3==0)</b></p><p><b> {</b></p><p> input='=';</p><p><b> flag=3;</b></p>
27、<p><b> }</b></p><p> while(H3==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XF7;</b></p><p
28、><b> if(H4==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H4==0)</b></p><p><b> {</b></p><
29、p> input='/';</p><p><b> flag=2;</b></p><p><b> }</b></p><p> while(H4==0)</p><p><b> ;</b></p><p><
30、b> }</b></p><p><b> P2=0XFB;</b></p><p><b> if(H1==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><
31、b> if(H1==0)</b></p><p><b> {</b></p><p> input='1';</p><p><b> flag=1;</b></p><p><b> }</b></p><p&
32、gt; while(H1==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XFB;</b></p><p><b> if(H2==0)</b></p><
33、p><b> {</b></p><p> delay(10);</p><p><b> if(H2==0)</b></p><p><b> {</b></p><p> input='2';</p><p><
34、b> flag=1;</b></p><p><b> }</b></p><p> while(H2==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b>
35、P2=0XFB;</b></p><p><b> if(H3==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H3==0)</b></p><p><
36、;b> {</b></p><p> input='3';</p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H3==0)</p><p><b> ;
37、</b></p><p><b> }</b></p><p><b> P2=0XFB;</b></p><p><b> if(H4==0)</b></p><p><b> {</b></p><p>
38、delay(10);</p><p><b> if(H4==0)</b></p><p><b> {</b></p><p> input='*';</p><p><b> flag=2;</b></p><p><b
39、> }</b></p><p> while(H4==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XFD;</b></p><p><b>
40、if(H1==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H1==0)</b></p><p><b> {</b></p><p> input=
41、39;4';</p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H1==0)</p><p><b> ;</b></p><p><b> }</b&
42、gt;</p><p><b> P2=0XFD;</b></p><p><b> if(H2==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H2==0
43、)</b></p><p><b> {</b></p><p> input='5';</p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H2==
44、0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XFD;</b></p><p><b> if(H3==0)</b></p><p><b>
45、 {</b></p><p> delay(10);</p><p><b> if(H3==0)</b></p><p><b> {</b></p><p> input='6';</p><p><b> flag=1;&
46、lt;/b></p><p><b> }</b></p><p> while(H3==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XFD;</b&
47、gt;</p><p><b> if(H4==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H4==0)</b></p><p><b> {</b
48、></p><p> input='-';</p><p><b> flag=2;</b></p><p><b> }</b></p><p> while(H4==0)</p><p><b> ;</b></
49、p><p><b> }</b></p><p><b> P2=0XFE;</b></p><p><b> if(H1==0)</b></p><p><b> {</b></p><p> delay(10);</
50、p><p><b> if(H1==0)</b></p><p><b> {</b></p><p> input='7';</p><p><b> flag=1;</b></p><p><b> }</b&g
51、t;</p><p> while(H1==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XFE;</b></p><p><b> if(H2==0)</b
52、></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H2==0)</b></p><p><b> {</b></p><p> input='8';</
53、p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H2==0)</p><p><b> ;</b></p><p><b> }</b></p>
54、<p><b> P2=0XFE;</b></p><p><b> if(H3==0)</b></p><p><b> {</b></p><p> delay(10);</p><p><b> if(H3==0)</b><
55、/p><p><b> {</b></p><p> input='9';</p><p><b> flag=1;</b></p><p><b> }</b></p><p> while(H3==0)</p>&
56、lt;p><b> ;</b></p><p><b> }</b></p><p><b> P2=0XFE;</b></p><p><b> if(H4==0)</b></p><p><b> {</b><
57、;/p><p> delay(10);</p><p><b> if(H4==0)</b></p><p><b> {</b></p><p> input='+';</p><p><b> flag=2;</b></p
58、><p><b> }</b></p><p> while(H4==0)</p><p><b> ;</b></p><p><b> }</b></p><p><b> }</b></p><p&g
59、t; bit lcd_bz()//測試lcd是否忙碌,result=1表示忙,=0表示不忙</p><p><b> {</b></p><p><b> bit BF;</b></p><p><b> RS = 0;</b></p><p>&l
60、t;b> RW = 1;</b></p><p><b> E = 1;</b></p><p> delay_4nop();</p><p> BF =(bit)(P0 & 0x80);</p><p><b> E = 0;</b></p>&l
61、t;p> return BF;</p><p><b> }</b></p><p> void lcd_wcmd(unsigned char cmd)//對lcd寫指令</p><p><b> {</b></p><p> while(lcd_bz());//當(dāng)
62、LCD不忙碌時才寫入指令</p><p><b> RS = 0;</b></p><p><b> RW = 0;</b></p><p><b> E = 0;</b></p><p> delay_4nop();</p><p><
63、b> P0 = cmd;</b></p><p> delay_4nop();</p><p><b> E = 1;</b></p><p> delay_4nop(); //當(dāng)E由1變?yōu)?時開始執(zhí)行指令</p><p><b> E = 0;</b></
64、p><p><b> }</b></p><p> void lcd_wdat(unsigned char dat) //對lcd寫數(shù)據(jù)</p><p><b> {</b></p><p> while(lcd_bz());//當(dāng)LCD不忙碌時才寫入指令</p>
65、;<p><b> RS = 1;</b></p><p><b> RW = 0;</b></p><p><b> E = 0;</b></p><p> delay_4nop();</p><p><b> P0 = dat;</b
66、></p><p> delay_4nop();</p><p><b> E = 1;</b></p><p> delay_4nop();</p><p><b> E = 0;</b></p><p><b> }</b><
67、/p><p> void lcd_init() //lcd初始化</p><p><b> {</b></p><p> lcd_wcmd(0x38); //8位總線,雙行顯示,顯示5*7的點陣字符</p><p><b> delay(4);</b></p>
68、<p> lcd_wcmd(0x0c); //開lcd顯示,無光標(biāo),光標(biāo)不閃爍</p><p><b> delay(4);</b></p><p> lcd_wcmd(0x06); //光標(biāo)右移,屏幕上的所有文字不移動</p><p><b> delay(4);</b></p
69、><p> lcd_wcmd(0x01); //清顯示</p><p><b> delay(4);</b></p><p><b> }</b></p><p> void lcd_display(char a[])//lcd顯示輸入輸出結(jié)果的函數(shù)</p><p&
70、gt;<b> {</b></p><p> unsigned char j; </p><p> delay_4nop();</p><p> lcd_wcmd(0x00+0x80);//設(shè)置顯示的位置 </p><p><b> j = 0;</b>&
71、lt;/p><p> while(a[j]!= '\0')</p><p><b> {</b></p><p> delay_4nop();</p><p> lcd_wdat(a[j]);//顯示的內(nèi)容</p><p><b> j++;<
72、;/b></p><p><b> }</b></p><p> delay_4nop();</p><p><b> }</b></p><p> void null(char *a) //清空一個字符數(shù)組的函數(shù)</p><p><b> {
73、</b></p><p> unsigned char j=0;</p><p> while(*(a+j)!='\0')</p><p><b> {</b></p><p> *(a+j)='\0';</p><p><b> j
74、++;</b></p><p><b> } </b></p><p><b> }</b></p><p> void copy(char *a,char *b) //將指針b所指字符串復(fù)制到指針a所指字符串</p><p><b> {</b><
75、;/p><p> unsigned char j=0;</p><p> while(*(b+j)!='\0')</p><p><b> {</b></p><p> *(a+j)=*(b+j);</p><p><b> j++;</b></p
76、><p><b> }</b></p><p><b> }</b></p><p> void simplify_result(char *a) //去除結(jié)果的尾數(shù)中多余的零和小數(shù)點的函數(shù)</p><p><b> {</b></p><p>
77、 unsigned char j=15;</p><p> while(((*(a+j)=='\0')||(*(a+j)=='0')||(*(a+j)=='.'))&&(j>0))</p><p><b> {</b></p><p> if(*(a+j)=='
78、;0')</p><p> *(a+j)='\0';</p><p> else if(*(a+j)=='.')</p><p><b> { </b></p><p> *(a+j)='\0';</p><p><b>
79、 break;</b></p><p><b> }</b></p><p> j--; </p><p><b> }</b></p><p><b> }</b></p><p> temp_to_buf()//
80、將運算結(jié)果temp轉(zhuǎn)移到buf()顯示出來,并準(zhǔn)備好下一次運算的函數(shù)</p><p><b> {</b></p><p> unsigned char j;</p><p> sprintf(result,"%.5f",temp);</p><p> null(buf);</p>
81、<p> sign='\0';</p><p> simplify_result(result);</p><p> copy(buf,result);</p><p><b> j=0;</b></p><p> while(buf[j]!='\0')</p
82、><p><b> j++;</b></p><p><b> i=j;</b></p><p> null(result);</p><p> null(num1);</p><p> null(num2);</p><p><b>
83、 temp=0;</b></p><p> lcd_wcmd(0x01);</p><p> return(result,buf,num1,num2,temp,i);</p><p><b> }</b></p><p> void equal_deal() //等號的運算處理</p>
84、<p><b> {</b></p><p> unsigned char j;</p><p> for(j=f+1;buf[j]!='\0';j++) //將符號之后的數(shù)裝進(jìn)字符串num2[]</p><p> num2[j-f-1]=buf[j];</p><p> sw
85、itch(sign) //根據(jù)之前輸入的運算符號進(jìn)行相應(yīng)處理</p><p><b> {</b></p><p> case '+': </p><p> temp=strtod(num1,NULL)+strtod(num2,NULL);//strtod()為將字符串轉(zhuǎn)換為浮點數(shù)的函數(shù) </p
86、><p><b> break;</b></p><p><b> case '-':</b></p><p> temp=strtod(num1,NULL)-strtod(num2,NULL);</p><p><b> break;</b></p&
87、gt;<p><b> case '*':</b></p><p> temp=strtod(num1,NULL)*strtod(num2,NULL);</p><p><b> break;</b></p><p><b> case '/':</b&
88、gt;</p><p> temp=strtod(num1,NULL)/strtod(num2,NULL);</p><p><b> break;</b></p><p> case '\0':</p><p> temp=strtod(buf,NULL);</p><p&g
89、t; default:break;</p><p><b> }</b></p><p> temp_to_buf(); </p><p><b> }</b></p><p> void main()</p><p><b> {</b&g
90、t;</p><p> unsigned char j;</p><p> lcd_init();// 初始化LCD</p><p> delay(10);</p><p><b> while(1)</b></p><p><b> {</b></
91、p><p><b> flag=0;</b></p><p> keyscan();</p><p> if(flag==1) //當(dāng)輸入為數(shù)字時,將其裝進(jìn)buf[]</p><p><b> {</b></p><p> buf[i]=input;</p>
92、;<p><b> i++;</b></p><p><b> }</b></p><p> if(flag==2) //當(dāng)輸入為+ - * / 符號時的處理</p><p><b> {</b></p><p> if(sign!='\0&
93、#39;)//若之前有輸入過符號,先對前面的式子進(jìn)行處理</p><p> equal_deal();</p><p> sign=input;</p><p> buf[i]=input; </p><p><b> f=i;</b></p><p> for(j=0;j&l
94、t;f;j++)//將符號之前的數(shù)裝進(jìn)字符串num1[]</p><p> num1[j]=buf[j]; </p><p><b> i++; </b></p><p><b> }</b></p><p> if(flag==3)</p><p><
95、;b> {</b></p><p> switch(input)</p><p><b> {</b></p><p> case '='://輸入為 = 號時的處理</p><p> equal_deal();</p><p><b>
96、 break;</b></p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p><b> delay(1);</b></p><p> simpl
97、ify_result(result); //去除運算結(jié)果中多余的0和小數(shù)點</p><p> lcd_display(buf); //將輸入或運算結(jié)果顯示出來</p><p> delay(10); </p><p><b> } </b></p><p><b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計基于c51簡易計算器
- 基于c51單片機簡易計算器的課程設(shè)計
- 基于c51單片機的簡易計算器設(shè)計
- 基于51單片機簡易計算器課程設(shè)計
- c51單片機課程設(shè)計
- 單片機課程設(shè)計--簡易計算器
- 單片機課程設(shè)計簡易計算器
- 單片機課程設(shè)計-簡易計算器
- 單片機課程設(shè)計簡易計算器
- 單片機課程設(shè)計--簡易計算器
- c51單片機課程設(shè)計
- 課程設(shè)計---單片機簡易計算器設(shè)計
- 51單片機計算器設(shè)計課程設(shè)計
- 基于c51簡易計算器
- 單片機課程設(shè)計---簡易計算器的設(shè)計
- 單片機課程設(shè)計報告---簡易計算器
- 單片機課程設(shè)計--簡易計算器的設(shè)計
- 單片機課程設(shè)計報告-簡易計算器
- 單片機課程設(shè)計--簡易數(shù)字計算器
- 簡易計算器單片機課程設(shè)計報告
評論
0/150
提交評論