2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論