1602lcd仿手機(jī)鍵盤單片機(jī)課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  單片機(jī)課程設(shè)計(jì)報(bào)告書</p><p>  2014年12月26日</p><p>  1602LCD電話撥號(hào)按鍵系統(tǒng)</p><p>  1設(shè)計(jì)目的本方案設(shè)計(jì)一個(gè)電話撥號(hào)鍵盤系統(tǒng):</p><p>  要求以AT89C51單片機(jī)作為微控制器;</p><p>  通過1602LCD顯示屏顯示撥號(hào)

2、屏幕;</p><p>  LED顯示屏輪流顯示數(shù)字;</p><p>  數(shù)字顯示為逐個(gè)顯示方式,最多保留10位。</p><p>  2功能要求及技術(shù)指標(biāo)</p><p>  在鍵盤上點(diǎn)擊數(shù)字時(shí),102LCD顯示屏?xí)@示出相應(yīng)的數(shù)字,并且在點(diǎn)擊的同時(shí),LS1會(huì)發(fā)出“滴”的聲音。3 總體設(shè)計(jì)方案</p><p> 

3、 圖3.1 總體設(shè)計(jì)框圖</p><p><b>  4 硬件電路的設(shè)計(jì)</b></p><p>  4.1 單片機(jī)最小系統(tǒng)</p><p>  單片機(jī)最小系統(tǒng)主要由電源、復(fù)位、震蕩電路以及擴(kuò)展部分等部分組成。</p><p>  圖4.1.1 單片機(jī)的最小系統(tǒng)</p><p>  4.2 輸入按

4、鍵系統(tǒng)</p><p>  獨(dú)立的鍵盤與單片機(jī)相連時(shí),每個(gè)按鍵都需要單片機(jī)的一個(gè)I/O口,若按鍵較多時(shí),占用的I/O口資源就會(huì)過多,為此就引入了矩陣鍵盤。本次設(shè)計(jì)共有0~9、#、*共12個(gè)按鍵,因此引入3*4的矩陣鍵盤,共需要7個(gè)I/O口,7條線分別與單片機(jī)P3口相連。</p><p>  圖4.2.1 按鍵鍵盤</p><p>  1602LCD顯示系統(tǒng)</

5、p><p>  1. LCD1602元件引腳圖:</p><p>  圖4.3.1 1602LCD元件圖</p><p>  2. 1602LCD顯示器的引腳功能</p><p>  第1腳:VSS為地電源;</p><p>  第2腳:VDD接+5V電源;</p><p>  第3腳:VL為液晶顯

6、示器對(duì)比度調(diào)度端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高會(huì)產(chǎn)生“鬼影”,必要時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。</p><p>  第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。</p><p>  第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS低電平R/W為高電平

7、時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W低電平時(shí)可以寫入數(shù)據(jù)。</p><p>  第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。</p><p>  第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。</p><p>  第15腳:背光源正極。</p><p>  第16腳:背光源負(fù)極。</p><p>

8、  3.1602LCD內(nèi)部的控制器指令介紹</p><p>  表4.3.1 1602LCD內(nèi)部控制及其指令</p><p><b>  指令說明:</b></p><p>  指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置;</p><p>  指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H;</p>&

9、lt;p>  指令3:光標(biāo)和顯示位置設(shè)置I/D,光標(biāo)移動(dòng)方向,高電平向右移,低電平向左移,S:屏幕上所有文字是否左移或右移,高電平表示有效,低電平表示無效;</p><p>  指令4: 顯示開關(guān)控制。D:控制整體的顯示開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示。C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo)。B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍;</p><p>

10、;  指令5:光標(biāo)或顯示移位S/C,高電平時(shí)顯示移動(dòng)的文字,低電平時(shí)顯示移動(dòng)的光標(biāo);</p><p>  指令6:功能設(shè)置命令DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線。N:低電平時(shí)為單位行顯示,高電平時(shí)為雙行顯示。F:低電平時(shí)顯示5*7的點(diǎn)陣字符,高電平時(shí)顯示5*10的顯示字符。</p><p>  指令7:字符發(fā)生器RAM地址設(shè)置;</p><p>  指令8

11、:DDRAM地址設(shè)置;</p><p>  指令9:讀忙信號(hào)和光標(biāo)地址。BF:忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或數(shù)據(jù),如果為低電平表示不忙。</p><p><b>  4.?dāng)?shù)字代碼</b></p><p>  1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,其中阿拉伯?dāng)?shù)字的代碼為:</

12、p><p>  代碼 數(shù)字</p><p>  00110000 0</p><p>  00110001 1</p><p>  00110010 2</p><p>  00110011

13、 3</p><p>  00110100 4</p><p>  00110101 5</p><p>  00110110 6</p><p>  00110111 7</p><p>  0

14、0111000 8</p><p>  00111001 9</p><p>  4.4系統(tǒng)的整體電路圖</p><p>  圖4.4.1 1602LCD電話撥號(hào)按鍵系統(tǒng)的硬件電路原理圖</p><p>  注意事項(xiàng):AT89C51單片機(jī),P0口輸出時(shí),必須使用上拉電阻,提高電壓,否則無

15、法得到輸出結(jié)果。</p><p><b>  5 軟件設(shè)計(jì)</b></p><p><b>  5.1程序總流程圖</b></p><p>  圖5.1.1為系統(tǒng)總流程圖。首先系統(tǒng)進(jìn)入初始化,系統(tǒng)開始運(yùn)行,當(dāng)檢測(cè)鍵盤沒有按下時(shí),則返回繼續(xù)檢測(cè)直至有鍵盤按下;當(dāng)掃描到鍵盤按下時(shí),讀取按鍵值,并檢測(cè)是否超過10位,若沒有超過則

16、送入液晶顯示;若超過10位則系統(tǒng)重新初始化。</p><p>  圖5.1.1 系統(tǒng)總流程圖</p><p>  5.2 LCD顯示程序流程圖</p><p>  顯示程序流程圖如圖5.2.1。流程圖分析:首先對(duì)1602顯示屏進(jìn)行初始化,然后檢查忙信號(hào),若BF=0,則獲得顯示RAM的地址,寫入相應(yīng)的數(shù)據(jù)顯示;若BF=1,則代表模塊正在進(jìn)行內(nèi)部操作,不接受人和外部指令

17、和數(shù)據(jù),知道BF=0為止。</p><p>  圖5.2.1 LCD顯示程序流程圖</p><p><b>  5.3系統(tǒng)運(yùn)行程序</b></p><p>  #include<reg51.h></p><p>  #include<intrins.h></p><p> 

18、 #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();} </p><p>  sbit BEEP=P1^0;</p><p>  sbit

19、LCD_RS=P2^0;</p><p>  sbit LCD_RW=P2^1;</p><p>  sbit LCD_EN=P2^2;</p><p>  void DelayMS(uint ms);</p><p>  bit LCD_Busy_Check();</p><p>  void LCD_Set_Pos

20、ition(uchar Position);</p><p>  void Write_LCD_command(uchar cmd);</p><p>  void Write_LCD_data(uchar dat);</p><p><b>  //--標(biāo)題字符串</b></p><p>  char code Tit

21、le_Text[]={"-- phone Code --"};</p><p>  //--鍵盤拔號(hào)與鍵盤符號(hào)映射表</p><p>  uchar code key_Table[]={'1','2','3','4','5','6','7','8

22、9;,'9','*','0','#'};</p><p>  //--鍵盤拔號(hào)數(shù)字緩沖</p><p>  uchar Dial_Code_Str[]={" "}; //此處空格太少,會(huì)在屏幕上顯示一個(gè)字符出來</p><p>  uchar keyNo=

23、0xff;</p><p>  int tCount=0;</p><p>  //------------------------------------</p><p><b>  //延時(shí)</b></p><p>  //------------------------------------</p>

24、<p>  void DelayMS(uint x)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  while(x--)</p><p>  for(i=0;i<120;i++)</p><p&

25、gt;<b>  ; </b></p><p><b>  }</b></p><p>  //--------------------------------</p><p>  //在LCD指定的行上顯示字符串</p><p>  //------------------------------

26、--</p><p>  void Display_String(uchar *str,uchar LineNo)</p><p><b>  {</b></p><p><b>  uchar k;</b></p><p>  LCD_Set_Position(LineNo);</p>

27、<p>  for(k=0;k<16;k++)</p><p>  Write_LCD_data(str[k]);</p><p><b>  }</b></p><p>  //----------------------------------------------</p><p><b&

28、gt;  //忙檢查</b></p><p>  //---------------------------------------------</p><p>  bit LCD_Busy_Check()</p><p><b>  {</b></p><p>  bit LCD_Status;</p

29、><p>  LCD_RS=0;//寄存器選擇</p><p>  LCD_RW=1;//讀狀態(tài)寄存器</p><p>  LCD_EN=1;//開始讀</p><p>  DelayMS(1);</p><p>  LCD_Status=(bit)(P0&0x80) ;</p><p>&

30、lt;b>  LCD_EN=0;</b></p><p>  return LCD_Status;</p><p><b>  }</b></p><p>  //---------------------------------------------------</p><p><b> 

31、 //寫LCD命令</b></p><p>  //----------------------------------------------------</p><p>  void Write_LCD_Command(uchar cmd)</p><p><b>  {</b></p><p>  wh

32、ile((LCD_Busy_Check()&0x80)==0x80);//忙等待</p><p>  LCD_RS=0;//選取擇命令寄存器</p><p>  LCD_RW=0;//寫</p><p><b>  LCD_EN=0;</b></p><p><b>  _nop_();</b&g

33、t;</p><p><b>  _nop_();</b></p><p><b>  P0=cmd;</b></p><p>  DelayNOP();</p><p><b>  LCD_EN=1;</b></p><p>  DelayNOP();

34、</p><p><b>  LCD_EN=0;</b></p><p><b>  }</b></p><p>  //-----------------------------------------</p><p><b>  //發(fā)送數(shù)據(jù)</b></p>

35、<p>  //----------------------------------------</p><p>  void Write_LCD_Data(uchar Str)</p><p><b>  {</b></p><p>  while((LCD_Busy_Check()&0x80)==0x80);//忙等待&l

36、t;/p><p><b>  LCD_RS=1;</b></p><p><b>  LCD_RW=0;</b></p><p><b>  LCD_EN=0;</b></p><p><b>  P0=Str;</b></p><p>

37、;  DelayNOP();</p><p><b>  LCD_EN=1;</b></p><p>  DelayMS(1);</p><p><b>  LCD_EN=0;</b></p><p><b>  }</b></p><p>  //--

38、-----------------------------------------------</p><p><b>  //LCD初始化</b></p><p>  //-------------------------------------------------</p><p>  void Initialize_LCD()</

39、p><p><b>  {</b></p><p>  Write_LCD_Command(0x38);</p><p>  DelayMS(5);</p><p>  Write_LCD_Command(0x0C);//清屏</p><p>  DelayMS(5);</p><

40、p>  Write_LCD_Command(0x06);//字符進(jìn)入模式,屏幕不動(dòng),字符后移。</p><p>  DelayMS(5);</p><p>  Write_LCD_Command(0x01);//顯示開,關(guān)光標(biāo)。</p><p>  DelayMS(5);</p><p><b>  }</b>&l

41、t;/p><p>  //--------------------------------------</p><p><b>  //設(shè)置顯示位置</b></p><p>  //--------------------------------------</p><p>  void LCD_Set_Position(u

42、char Position)</p><p><b>  {</b></p><p>  Write_LCD_Command(Position | 0x80);</p><p><b>  }</b></p><p>  //-------------------------------------

43、----------</p><p>  //t0控制按鍵聲音</p><p>  //-----------------------------------------------</p><p>  void T0_INT() interrupt 1</p><p><b>  {</b></p>&l

44、t;p>  TH0=-600/256;</p><p>  TL0=-600%256;</p><p>  BEEP=~BEEP;</p><p>  if(++tCount==200)</p><p><b>  {</b></p><p><b>  tCount=0;<

45、/b></p><p><b>  TR0=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //-------------------------</p><p><b>

46、  //鍵盤掃描</b></p><p>  //------------------------</p><p>  //=============================================================</p><p>  uchar Getkey()</p><p><b>

47、  {</b></p><p>  uchar i,j,k=0;</p><p>  uchar keyScanCode[]={0xef,0xdf,0xbf,0x7f};//鍵盤掃描碼</p><p>  uchar keyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7

48、d,0x7b};</p><p><b>  P3=0x0f;</b></p><p>  //掃描鍵盤獲取按鍵序號(hào)</p><p>  if(P3!=0X0F)</p><p><b>  {</b></p><p>  for(i=0;i<4;i++)</p&

49、gt;<p><b>  {</b></p><p>  P3=keyScanCode[i];</p><p>  for(j=0;j<3;j++)</p><p><b>  {</b></p><p><b>  k=i*3+j;</b></p&g

50、t;<p>  if(P3==keyCodeTable[k])</p><p><b>  return k;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&l

51、t;/p><p>  else return 0xff;</p><p><b>  } </b></p><p>  //-------------------------------</p><p><b>  //main</b></p><p>  //---------

52、-----------------------</p><p>  void main()</p><p><b>  {</b></p><p>  uchar i=0,j;</p><p>  P0=P2=P1=0XFF;</p><p><b>  IE=0X82;</b&g

53、t;</p><p>  TMOD=0X01;</p><p>  Initialize_LCD(); //LCD初始化</p><p>  Display_String(Title_Text,0x00);//在第一行顯示標(biāo)題</p><p><b>  while(1)</b></p>

54、<p><b>  {</b></p><p>  keyNo=Getkey();//獲取按鍵值</p><p>  if(keyNo==0xff)</p><p>  continue;//無按鍵時(shí)繼續(xù)掃描</p><p>  if(++i==12)//超過11位時(shí)清空</p><p&g

55、t;<b>  {</b></p><p>  for(j=0;j<16;j++)</p><p>  Dial_Code_Str[j]=' ';</p><p><b>  i=0;</b></p><p><b>  }</b></p>

56、<p>  Dial_Code_Str[i]=key_Table[keyNo];//將待顯示字符放入待顯示的拔號(hào)串中</p><p>  Display_String(Dial_Code_Str,0x40);//在第二行顯示號(hào)碼</p><p>  TR0=1;//T0中斷控制按鍵聲音</p><p>  while(Getkey()!=0xff);//等

57、待按鍵釋放</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  6 系統(tǒng)仿真</b></p><p>  當(dāng)鍵盤輸入依次輸入數(shù)字“1”、“8”、“7”、“7”、“3”、“7”、“0”、“2”、“2”、“6”、“1”后,

58、1602LCD顯示屏依次顯示出輸入的數(shù)字。</p><p>  圖6.1.1系統(tǒng)仿真圖</p><p><b>  7設(shè)計(jì)總結(jié)</b></p><p>  經(jīng)過一段時(shí)間的努力,1602LCD電話撥號(hào)按鍵系統(tǒng)基本完成。但設(shè)計(jì)中的不足之處仍然存在。這次設(shè)計(jì)是我第一次設(shè)計(jì)電路,并用Proteus實(shí)現(xiàn)了仿真。在這過程中,我對(duì)電路設(shè)計(jì),單片機(jī)的使用等都有

59、了新的認(rèn)識(shí)。通過這次設(shè)計(jì)學(xué)會(huì)了Proteus和Keil軟件的使用方法,掌握了從系統(tǒng)的需要、方案的設(shè)計(jì)、功能模塊的劃分、原理圖的設(shè)計(jì)和電路圖的仿真的設(shè)計(jì)流程,積累了不少經(jīng)驗(yàn)。</p><p>  通過本次設(shè)計(jì),我對(duì)單片機(jī)這門課有了進(jìn)一步的了解。無論是在硬件連接方面還是在軟件編程方面。本次設(shè)計(jì)采用了AT89C51單片機(jī)芯片,與以往的單片機(jī)相比增加了許多新的功能,使其功能更為完善,應(yīng)用領(lǐng)域也更為廣泛。設(shè)計(jì)中還用到了16

60、02LCD顯示模塊,以前在學(xué)單片機(jī)課程時(shí)只是對(duì)其理論知識(shí)有了初步的理解。通過這次設(shè)計(jì),對(duì)它的工作原理有了更深的理解。在調(diào)試過程中遇到很多問題,硬件上的理論知識(shí)學(xué)得不夠扎實(shí),對(duì)電路的仿真方面也不夠熟練。</p><p>  總之,這次電路的設(shè)計(jì)和仿真,基本上達(dá)到了設(shè)計(jì)的功能要求。在以后的實(shí)踐中,我將繼續(xù)努力學(xué)習(xí)電路設(shè)計(jì)方面的理論知識(shí),并理論聯(lián)系實(shí)際,爭(zhēng)取在電路設(shè)計(jì)方面能有所提升。</p><p&

61、gt;<b>  8參考文獻(xiàn)</b></p><p>  [1]余發(fā)山.單片機(jī)原理及應(yīng)用技術(shù).徐州:中國(guó)礦業(yè)大學(xué)出版社,2003.</p><p>  [2]佟云峰,等.單片機(jī)原理及其應(yīng)用.重慶:重慶大學(xué)出版社,2004,1.</p><p>  [3]吳金戌,等.8051單片機(jī)實(shí)踐與應(yīng)用.北京:清華大學(xué)出版社,2001,8.</p>

62、;<p>  [4]劉瑞新.單片機(jī)原理及應(yīng)用教程.北京:機(jī)械工業(yè)出版社,2005.</p><p>  [5]林立,等.單片機(jī)原理及應(yīng)用.北京:電子工業(yè)出版社,2009.</p><p>  [6]周航慈.單片機(jī)應(yīng)用程序設(shè)計(jì)技術(shù). 北京:北京航空航天大學(xué)出版社,2002.</p><p>  [7]劉衛(wèi)國(guó).C語言程序設(shè)計(jì). 北京:中國(guó)鐵道出版社,200

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論