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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、鍵系統(tǒng)</p><p>  獨立的鍵盤與單片機相連時,每個按鍵都需要單片機的一個I/O口,若按鍵較多時,占用的I/O口資源就會過多,為此就引入了矩陣鍵盤。本次設計共有0~9、#、*共12個按鍵,因此引入3*4的矩陣鍵盤,共需要7個I/O口,7條線分別與單片機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、示器對比度調度端,接正電源時對比度最弱,接地時對比度最高,對比度過高會產生“鬼影”,必要時可以通過一個10K的電位器調整對比度。</p><p>  第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。</p><p>  第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W同為低電平時可以寫入指令或者顯示地址,當RS低電平R/W為高電平

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

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

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

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

11、:DDRAM地址設置;</p><p>  指令9:讀忙信號和光標地址。BF:忙標志位,高電平表示忙,此時模塊不能接收命令或數(shù)據(jù),如果為低電平表示不忙。</p><p><b>  4.數(shù)字代碼</b></p><p>  1602液晶模塊內部的字符發(fā)生存儲器(CGROM)已經存儲了160個不同的點陣字符圖形,其中阿拉伯數(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電話撥號按鍵系統(tǒng)的硬件電路原理圖</p><p>  注意事項:AT89C51單片機,P0口輸出時,必須使用上拉電阻,提高電壓,否則無

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

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

17、和數(shù)據(jù),知道BF=0為止。</p><p>  圖5.2.1 LCD顯示程序流程圖</p><p><b>  5.3系統(tǒng)運行程序</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>  //--標題字符串</b></p><p>  char code Tit

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

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

23、0xff;</p><p>  int tCount=0;</p><p>  //------------------------------------</p><p><b>  //延時</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);//字符進入模式,屏幕不動,字符后移。</p><p>  DelayMS(5);</p><p>  Write_LCD_Command(0x01);//顯示開,關光標。</p><p>  DelayMS(5);</p><p><b>  }</b>&l

41、t;/p><p>  //--------------------------------------</p><p><b>  //設置顯示位置</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>  //掃描鍵盤獲取按鍵序號</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);//在第一行顯示標題</p><p><b>  while(1)</b></p>

54、<p><b>  {</b></p><p>  keyNo=Getkey();//獲取按鍵值</p><p>  if(keyNo==0xff)</p><p>  continue;//無按鍵時繼續(xù)掃描</p><p>  if(++i==12)//超過11位時清空</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];//將待顯示字符放入待顯示的拔號串中</p><p>  Display_String(Dial_Code_Str,0x40);//在第二行顯示號碼</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>  當鍵盤輸入依次輸入數(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設計總結</b></p><p>  經過一段時間的努力,1602LCD電話撥號按鍵系統(tǒng)基本完成。但設計中的不足之處仍然存在。這次設計是我第一次設計電路,并用Proteus實現(xiàn)了仿真。在這過程中,我對電路設計,單片機的使用等都有

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

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

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

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

溫馨提示

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

評論

0/150

提交評論