版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 單</b></p><p><b> 片</b></p><p><b> 機</b></p><p><b> 課</b></p><p><b> 程</b></p><p
2、><b> 設</b></p><p><b> 計</b></p><p><b> 報</b></p><p><b> 告</b></p><p><b> 目 錄</b></p><p&g
3、t; 第一章 設計內(nèi)容與設計目的 ……………………………………………… 1</p><p> 第二章 硬件電路的設計 ………………………………………………………1</p><p> 2.1 顯示模塊………………………………………………………………………1</p><p> 2.2 鍵盤模塊………………………………………………………………………2</p&
4、gt;<p> 2.3復位電路………………………………………………………………………2</p><p> 2.4晶振……………………………………………………………………………3</p><p> 2.5 PCB制板………………………………………………………………………3</p><p> 第三章 軟件程序的編寫 …………………………………………
5、……………4</p><p> 第四章 心得體會 ……………………………………………………………… 5</p><p> 附錄 …………………………………………………………………………………6</p><p> 附錄一 實驗電路圖………………………………………………………………6 附錄二 實驗程序…………………………………………………………………7</p
6、><p> 附錄三 元器件清單………………………………………………………………15</p><p> 參考文獻 …………………………………………………………………………15</p><p> 簡易計算器的設計、制作</p><p> 摘要:在如今的高科技時代,數(shù)學運算無處不在,為了節(jié)約計算的時間以及提高計算的準確率,我們需要計算器,需要這
7、么一個工具來幫助我們,從而提高速度與準確率。</p><p> 第一章 設計內(nèi)容與設計目的</p><p> 本設計是一個基于51系列單片機的計算器,它不僅能夠?qū)崿F(xiàn)加減乘除等四則基本運算,而且還能夠?qū)崿F(xiàn)乘方、二次開方、取對數(shù)以及求三角函數(shù)等高級運算。本次實驗的目的包括了解并熟練掌握proteus仿真軟件的使用;掌握C語言,學會用它們進行單片機編程;學會使用Keil編譯工具進行編程和編譯
8、,并掌握proteus和Keil之間的聯(lián)系以實現(xiàn)在proteus上的軟硬件仿真。</p><p> 第二章 硬件電路的設計</p><p><b> 2.1顯示模塊:</b></p><p> 我們采用1602液晶顯示屏,要求能顯示兩行。它的—引腳分別接到單片機的P0.0~P0.7引腳;RS、R/W、E管腳分別接到單片機的P2.2、P2.
9、1、P2.0 。</p><p><b> 2.2鍵盤模塊:</b></p><p> 用STC89C54RD+的P1口中的P1.0,P1.1,P1.2和P1.3四根線作為按鍵的行輸入線,用P1.4,P1.5,P1.6和P1.7作為按鍵的列輸出線。通過按次依次給P1口的高四位的每根線輸出一個低電平列信號,每當一根列線輸出后,將信號鎖住,然后讀取行線,看有沒有哪一根
10、出現(xiàn)低電平。如果有,則說明有按鍵按下了,依據(jù)P1口是哪一根行線出現(xiàn)低電平和列線出現(xiàn)低電平,可以判別是第幾行和第幾列的按鍵按下了,如果讀取行線沒有出現(xiàn)低電平,則表示對應的列沒有按鍵按下,那么換另一列輸出低電平,在讀取行信號,判別新的一列有沒有鍵按下。依此辦法輪流使每一列依次輸出低電平,判別每一列是否有鍵按下,直到把所有的按鍵判別完。</p><p><b> 2.3復位電路:</b><
11、/p><p><b> 2.4晶振:</b></p><p> 2.5 PCB制板:</p><p><b> 單片機最小系統(tǒng):</b></p><p><b> 矩陣鍵盤:</b></p><p> 第三章 軟件程序的編寫</p>
12、<p> 程序共分為一下幾個模塊:主函數(shù),顯示模塊,鍵盤掃描模塊,延時模塊,這里采用的是模塊化編程,程序在后面附錄中。</p><p><b> 第四章 心得體會</b></p><p> 這次課程設計歷時一個星期。通過這一個星期的課程設計,我發(fā)現(xiàn)了自己的很多缺點與不足,自己知識的漏洞,看到了自己的實踐經(jīng)驗還是比較缺乏,理論聯(lián)系實際的能力還急需提高。&
13、lt;/p><p> 在課程設計過程中,光有理論知識是不夠的,還必須懂一些實踐中的知識。首先,我們要做好課前的仿真練習,只有仿真通過了,才能做接下來的硬件焊接部分。其次,在焊接電路之前,我們必須了解我們所用元器件的基本資料。最后,在焊接的時候,一定要細心,不能夠三心二意,因為線比較多,所以一定要全神貫注。</p><p> 結果出不來,不要急躁;看到其他同學提前完成設計了,不要急躁;當找不
14、到問題所在處時,也不要急躁??偠灾?,就是得靜下心來,不急不躁,慢慢檢查,慢慢體會。</p><p> 本次課程設計給我最大的感受是自己的編程能力還不夠,雖然最后結果出來了,但是花了很多時間,也就是說效率并不高。硬件方面:焊接能力也不是很好,經(jīng)常出現(xiàn)虛焊的地方。以致于后來鍵盤模塊基本失效。 </p><p> 這次課程設計也讓我加深了對單片機及其外圍電路的理解,提高了我的綜合運用所學知
15、識的能力,增強了我的根據(jù)課程需要選學參考資料,查閱手冊、圖表和文獻資料的自學能力。同時我也初步學習到了關于課程設計的基本方法、步驟和撰寫設計論文的格式。</p><p> 通過這次課程設計,我想說:為完成這次課程設計我們確實很辛苦,但苦中仍有樂。還記得寫程序那晚,弄到凌晨4點多,但仍睡意全無。這些日子里,從編程到仿真,從仿真到硬件焊接,從硬件焊接到結果出來,我們經(jīng)歷了很多,在這期間,我們學到了很多,也收獲很多。
16、對我而言,知識上的收獲重要,精神上的豐收更加可喜。讓我知道了學無止境的道理:我們不能滿足現(xiàn)在,要不斷的挑戰(zhàn)自己,迎難而上,不屈不撓,奮斗到底!既然是一名戰(zhàn)士,那么就要不停的戰(zhàn)斗,永不停息!</p><p><b> 附 錄</b></p><p><b> 附錄一 實驗電路圖</b></p><p><b>
17、; 附錄二 實驗程序</b></p><p><b> 主函數(shù):</b></p><p> /*----------------------------------------------------------</p><p><b> 名稱:多功能計算器</b></p><p&g
18、t;<b> 作者: 佚名</b></p><p> 日期:2012年3月</p><p> 內(nèi)容:實現(xiàn)"+、-、*、/"等基本運算以及"a^b、sqrt(a)、lna、sin(a)"等高級運算</p><p> ------------------------------------------
19、-----------------*/</p><p> #include <reg52.h></p><p> #include <stdio.h></p><p> #include <math.h></p><p> #include "display.h"</p&g
20、t;<p> #include "keyboard1.h"</p><p> #include "delay.h"</p><p> uchar num,i,s,sign,flag,flag1,flag2,flag3; //flag用來判斷是否將第一位0替換;</p><p> float a1,a2,
21、a,b; //a、b一定要設為浮點型的,不然結果出不來。</p><p> //開始弄了好久,就是因為這個地方搞錯了</p><p> uchar temp[16];//flag1用來判斷是否第一次輸入小數(shù)點;</p><p> //flag2用來判斷是否第一次輸入功能鍵</p><p> vo
22、id main() //flag3用來判斷輸入功能鍵的類型</p><p><b> {</b></p><p><b> a1=1;</b></p><p><b> init();</b></p><p> LCD_clear();</p&g
23、t;<p> write_string(0,3,"Welcome !");</p><p> write_string(1,1,"LCD calculator");</p><p> while(1) //數(shù)值是一個一個的輸入,而不是一下子就輸入進去了</p><p><b>
24、; {</b></p><p> num=key_pro();</p><p> if(num!=0xff) //表示有鍵按下</p><p><b> {</b></p><p><b> if(i==0)</b&g
25、t;</p><p><b> {</b></p><p> LCD_clear();</p><p><b> }</b></p><p> if((num=='+')||(num=='-')||(num=='*')||(num=='
26、/')||(num=='=')||(i==16)) </p><p> { </p><p> i=0; //功能鍵</p><p><b> flag1=0;</b></p><p>
27、; if(flag2==0)//若功能鍵按在數(shù)字之后,則把數(shù)字輸入到a</p><p><b> {</b></p><p> sscanf(temp,"%f",&a);從temp(一個字符串)中輸入數(shù)據(jù)到a</p><p> flag2=1; //將flag2置1,下次輸入數(shù)字時執(zhí)行els
28、e語句</p><p><b> }</b></p><p> else//若功能鍵按在數(shù)字之前,則把數(shù)字輸入到b</p><p><b> {</b></p><p> sscanf(temp,"%f",&b);</p><p>
29、; flag2=0;//從temp(一個字符串)中輸入數(shù)據(jù)到b</p><p><b> }</b></p><p> write_char(1,0,num);</p><p> for(s=0;s<16;s++)</p><p><b> {</b></p>
30、;<p> temp[s]=0;</p><p><b> }</b></p><p> if(flag3==0)</p><p><b> {</b></p><p> if(num!='=')</p><p><b&
31、gt; {</b></p><p><b> sign=num;</b></p><p><b> }</b></p><p> else//每次計算完成后都要按下'='鍵以清零, </p><p> //否則將轉(zhuǎn)換為令一類運算
32、方式</p><p> {//按下'='鍵可以實現(xiàn)不同類運算方式之間的轉(zhuǎn)換</p><p><b> flag2=0;</b></p><p><b> flag3=1;</b></p><p> switch(sign)</p><p><
33、;b> {</b></p><p> case '+':a=a+b;break;</p><p> case '-':a=a-b;break;</p><p> case '*':a=a*b;break;</p><p> case '/':a=a/b
34、;break;</p><p><b> }</b></p><p> sprintf(temp,"%g",a);//輸出運算得到的結果;</p><p> //%g把小數(shù)點后不必要的0不顯示</p><p> write_string(1,0,temp); //顯示所得結果&l
35、t;/p><p><b> sign=0;</b></p><p><b> a=0;</b></p><p><b> b=0;</b></p><p> for(s=0;s<16;s++)</p><p><b> {</
36、b></p><p> temp[s]=0;</p><p> } </p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><
37、p><b> {</b></p><p> if(num!='=')</p><p><b> {</b></p><p><b> sign=num;</b></p><p><b> }</b></p>&
38、lt;p><b> else</b></p><p><b> {</b></p><p><b> flag2=0;</b></p><p><b> flag3=0;</b></p><p> switch(sign)</p>
39、;<p><b> {</b></p><p> case '+':for(a2=0;a2<b;a2++){a1=a1*a;}a=a1;break; //a^b</p><p> case '-':a=sqrt(a);break;</p><p>&l
40、t;b> //sqrt(a)</b></p><p> case '*':a=log(a);break; //lna</p><p> case '/':a=sin(a);break; //sin(a)</p><p><b> }</b></
41、p><p> sprintf(temp,"%g",a);</p><p> write_string(1,0,temp);</p><p><b> sign=0;</b></p><p><b> a=0;</b></p><p><b>
42、 b=0;</b></p><p><b> a1=1;</b></p><p> for(s=0;s<16;s++)</p><p><b> {</b></p><p> temp[s]=0;</p><p><b> }</
43、b></p><p><b> }</b></p><p> } </p><p><b> }</b></p><p> else if(i<16) //輸入數(shù)字與顯示數(shù)字</p><p
44、><b> {</b></p><p> if(temp[0]=='0') //若第一個數(shù)字為0,則執(zhí)行此程序</p><p><b> {</b></p><p> if(num=='.')//若按下的是小數(shù)點,則檢查是否第一次按下小</p><
45、p><b> //數(shù)點</b></p><p><b> {</b></p><p> if(flag1==0) //結果是第一次按下小數(shù)點</p><p><b> {</b></p><p> write_char(0,1,num);</p
46、><p><b> i++;</b></p><p><b> flag=1;</b></p><p><b> flag1=1; </b></p><p><b> }</b></p><p> } &l
47、t;/p><p> else//若按下的不是小數(shù)點,則執(zhí)行此程序</p><p><b> {</b></p><p> if(flag==0)</p><p><b> {</b></p><p> temp[0]=num;</p><p
48、> write_char(0,0,num);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temp[i]=num;</p><p> writ
49、e_char(0,i,temp[i]);</p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> el
50、se if(temp[0]=='.') //若第一個數(shù)字為小數(shù)點,則執(zhí)行此程序</p><p><b> {</b></p><p> if(num!='.')//若按下的不是小數(shù)點,則執(zhí)行此程序</p><p><b> {</b></p><p>
51、 temp[0]='0';</p><p> temp[1]='.';</p><p> temp[2]=num;</p><p> for(s=0;s<3;s++)</p><p><b> {</b></p><p> write_char(0
52、,s,temp[s]);</p><p><b> }</b></p><p><b> flag=1;</b></p><p><b> i=3;</b></p><p><b> }</b></p><p><b&
53、gt; }</b></p><p> else //若第一個數(shù)字既不為0也不為小數(shù)點,則執(zhí)行此程序</p><p><b> {</b></p><p> if(num=='.')//若按下的是小數(shù)點,則檢查是否第一次按下小</p><p><b> //數(shù)點&l
54、t;/b></p><p><b> {</b></p><p> if(flag1==0) //結果是第一次按下小數(shù)點</p><p><b> {</b></p><p> temp[i]=num; </p><p> write_c
55、har(0,i,temp[i]);</p><p><b> i++;</b></p><p><b> flag1=1; </b></p><p><b> }</b></p><p><b> }</b></p><p>
56、; else //若按下的不是小數(shù)點,則執(zhí)行此程序</p><p><b> {</b></p><p> temp[i]=num;</p><p> write_char(0,i,temp[i]);</p><p><b> i++;</b></p><p
57、><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>&
58、lt;b> }</b></p><p><b> 延時模塊:</b></p><p> #include "delay.h"</p><p> void delay_ms(uint z) //z=1約為1ms</p><p&g
59、t;<b> {</b></p><p><b> uint x,y;</b></p><p> for(x=z;x--;x>0)</p><p> for(y=110;y--;y>0);</p><p><b> }</b></p><
60、;p><b> 顯示模塊:</b></p><p> #include <reg52.h></p><p> #include "display.h"</p><p> sbit RS=P2^2;</p><p> sbit RW=P2^1;</p><
61、p> sbit EN=P2^0;</p><p> //sbit dula=P2^0;</p><p> //sbit wela=P2^1;</p><p> /*--------------------------------</p><p><b> 寫指令函數(shù)</b></p><
62、p> --------------------------------*/</p><p> void write_com(uchar com)</p><p><b> {</b></p><p><b> RS_CLR;</b></p><p><b> RW_CLR;
63、</b></p><p> DATAPORT=com;</p><p> delay_ms(5);</p><p><b> EN_SET;</b></p><p> delay_ms(5);</p><p><b> EN_CLR;</b></p
64、><p><b> }</b></p><p> /*--------------------------------</p><p><b> 寫數(shù)據(jù)函數(shù)</b></p><p> --------------------------------*/</p><p>
65、 void write_DATA(uchar DATA)</p><p><b> {</b></p><p><b> RS_SET;</b></p><p><b> RW_CLR;</b></p><p> DATAPORT=DATA;</p>&l
66、t;p> delay_ms(5);</p><p><b> EN_SET;</b></p><p> delay_ms(5);</p><p><b> EN_CLR;</b></p><p><b> }</b></p><p>
67、/*--------------------------------</p><p><b> 初始化函數(shù)</b></p><p> --------------------------------*/</p><p> void init()</p><p><b> {</b></
68、p><p> //dula=0;</p><p> //wela=0;</p><p> //delay_ms(15);</p><p> write_com(0x38);</p><p> delay_ms(5);</p><p> write_com(0x38);</p&
69、gt;<p> delay_ms(5);</p><p> write_com(0x38);</p><p> delay_ms(5);</p><p> write_com(0x38);</p><p> delay_ms(5);</p><p> write_com(0x08);</
70、p><p> delay_ms(5);</p><p> write_com(0x01);</p><p> delay_ms(5);</p><p> write_com(0x06);</p><p> delay_ms(5);</p><p> write_com(0x0c);<
71、;/p><p> delay_ms(5);</p><p><b> }</b></p><p> /*--------------------------------</p><p><b> 清屏函數(shù)</b></p><p> -------------------
72、-------------*/</p><p> void LCD_clear()</p><p><b> {</b></p><p> write_com(0x01);</p><p> delay_ms(5);</p><p><b> }</b></p
73、><p> /*--------------------------------</p><p><b> 寫入字符串函數(shù)</b></p><p> --------------------------------*/</p><p> void write_string(uchar x,uchar y,uchar
74、*s)</p><p><b> {</b></p><p> while(*s)//*s不為零循環(huán)?string前面的是空格,后面的是零?字符不算零。</p><p><b> {</b></p><p> write_char(x,y,*s); //s開始時不一定為0</p&
75、gt;<p><b> s++;</b></p><p><b> y++;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*------------------------
76、--------</p><p><b> 寫入字符函數(shù)</b></p><p> --------------------------------*/</p><p> void write_char(uchar x,uchar y,uchar DATA)//x表示數(shù)據(jù)(符號)出現(xiàn)在第幾行;</p><p>
77、{ //y表示數(shù)據(jù)(符號)出現(xiàn)在該行的</p><p> //第幾位;DATA表示寫入的數(shù)據(jù)(符號)</p><p> if(x==0) //數(shù)據(jù)(符號)出現(xiàn)在第1行</p><p> write_com(0x80+y);//數(shù)據(jù)(符號)出現(xiàn)在第1行的第y+1位</p><p> els
78、e //數(shù)據(jù)(符號)出現(xiàn)在第2行</p><p> write_com(0x80+0x40+y);//數(shù)據(jù)(符號)出現(xiàn)在第2行的第y+1位</p><p> write_DATA(DATA); //寫入數(shù)據(jù)(符號)</p><p><b> }</b></p><p><b
79、> 鍵盤模塊:</b></p><p> #include <reg52.h></p><p> #include "keyboard1.h"</p><p> #include "delay.h"</p><p> #define keyport P1</
80、p><p> uchar key_scan()</p><p><b> {</b></p><p> uchar h,l;</p><p> keyport=0x0f; //列檢測,看是否有鍵按下</p><p> l=keyport&0x0f;</p><p
81、> if(l!=0x0f) //有鍵按下</p><p><b> {</b></p><p> delay_ms(10);//去抖</p><p> if ((keyport&0x0f)!=0x0f)</p><p><b> {</b></p><
82、;p> l=keyport&0x0f;</p><p> keyport=l|0xf0;</p><p> h=keyport&0xf0;</p><p> while((keyport&0xf0)!=0xf0);</p><p> return(h+l);</p><p>&l
83、t;b> }</b></p><p> }return 0xff;</p><p><b> }</b></p><p> /*------------------------------------------------------------</p><p><b> 1 2
84、3 + </b></p><p><b> 4 5 6 -</b></p><p><b> 7 8 9 *</b></p><p><b> 0 . =/</b></p><p> ------------------------------------
85、-------------------------*/</p><p> uchar key_pro()</p><p><b> {</b></p><p> switch(key_scan())</p><p><b> {</b></p><p> case
86、0x7e:return '1';break;</p><p> case 0xbe:return '2';break;</p><p> case 0xde:return '3';break;</p><p> case 0xee:return '+';break;</p><
87、p> case 0x7d:return '4';break;</p><p> case 0xbd:return '5';break;</p><p> case 0xdd:return '6';break;</p><p> case 0xed:return '-';break;<
88、/p><p> case 0x7b:return '7';break;</p><p> case 0xbb:return '8';break;</p><p> case 0xdb:return '9';break;</p><p> case 0xeb:return '*'
89、;;break;</p><p> case 0x77:return '0';break;</p><p> case 0xb7:return '.';break;</p><p> case 0xd7:return '=';break;</p><p> case 0xe7:retur
90、n '/';break;</p><p> default:return 0xff;break;</p><p><b> }</b></p><p><b> }</b></p><p><b> 附錄三 元器件清單</b></p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計報告---簡易計算器
- 單片機課程設計報告-簡易計算器
- 簡易計算器單片機課程設計報告
- 單片機課程設計報告-- 簡易計算器設計
- 單片機課程設計--簡易計算器
- 單片機課程設計簡易計算器
- 單片機課程設計-簡易計算器
- 單片機課程設計簡易計算器
- 單片機課程設計--簡易計算器
- 課程設計---單片機簡易計算器設計
- 單片機課程設計---簡易計算器的設計
- 單片機課程設計--簡易計算器的設計
- 單片機課程設計--簡易數(shù)字計算器
- 基于51單片機簡易計算器課程設計
- 單片機課程設計報告---計算器
- 簡易計算器設計-單片機原理及應用課程設計
- 課程設計-單片機計算器
- 單片機計算器課程設計
- 單片機課程設計--計算器
- 單片機課程設計-計算器
評論
0/150
提交評論