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

下載本文檔

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

文檔簡介

1、<p><b>  單片機課程設(shè)計報告</b></p><p>  課 程 單片機課程設(shè)計 </p><p>  設(shè)計題目 串行數(shù)據(jù)接收器3 </p><p><b>  設(shè)計題目:</b></p><p><b>  要求</b></

2、p><p>  了解鍵盤掃描程序,實現(xiàn)對按下鍵鍵值的檢測與傳送。</p><p>  熟悉掌握keil的使用和STC ISP的使用。</p><p>  熟練掌握用C51編程的方法,掌握單片機工作方式。</p><p>  掌握LCD顯示原理,能夠利用LCD顯示文字等。</p><p><b>  分析</

3、b></p><p>  本設(shè)計要求做串口數(shù)據(jù)接收器,掃描鍵盤按下的鍵值作為輸入,經(jīng)串口發(fā)送給本機串口接收端。接收的鍵值送12864LCD顯示的過程,</p><p><b>  設(shè)計</b></p><p><b>  1、硬件設(shè)計</b></p><p><b>  1、設(shè)計說明

4、</b></p><p>  本設(shè)計是基于AT89C51的串行數(shù)據(jù)接收器,由矩陣鍵盤電路的掃描程序,得到按下鍵的鍵值。將檢測到的鍵值送串行數(shù)據(jù)發(fā)送端,即AT89C51單片機的P3.0口。將AT89C51單片機的串行數(shù)據(jù)發(fā)送端與串行數(shù)據(jù)接收端,將串行數(shù)據(jù)接收端的數(shù)據(jù)送12864LCD顯示。</p><p><b>  2、硬件連接圖</b></p>

5、;<p>  2、軟件編程(包括流程圖、完整的匯編源程序及其注釋)</p><p><b>  1、流程圖</b></p><p><b>  主程序流程圖</b></p><p><b>  鍵盤掃描程序</b></p><p><b>  2、源程序

6、</b></p><p>  #include < absacc.h ></p><p>  #include < reg52.h ></p><p>  #include < intrins.h ></p><p>  #define COM8155 XBYTE[0x1000]

7、 </p><p>  #define PA8155 XBYTE[0x1001] </p><p>  #define PB8155 XBYTE[0x1002] </p><p>  #define PC8155 XBYTE[0x1003] </p><p>  #def

8、ine uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit LCM12864_RS=P1^5;</p><p>  sbit LCM12864_RW=P1^6;</p><p>  sbit LCM12864_EN=P1^7;</p>&

9、lt;p>  sfr LCM12864_DPORT=0xA0;</p><p>  uchar lcm12864_font[ ];</p><p>  code unsigned char key_code[]={0x11,0x12,0x14,0x18,</p><p>  0x21,0x22,0x24,0x28,</p><p>  

10、0x41,0x42,0x44,0x48,</p><p>  0x81,0x82,0x84,0x88}; </p><p>  unsigned char led_data[8]={16,16,16,16,16,16,16,16}; </p><p>  void delay_ms(unsigned char n);

11、 </p><p>  unsigned char key_read(void); </p><p>  void lcm12864_busy(void);</p><p>  void lcm12864_disp(uchar x,uchar y,uchar *ch,uchar n);//顯示漢字或字符,x顯示行位置(0-3

12、),y顯示列位置(0-7),*chn 待顯字符串指針,n顯示個數(shù)(<=64)</p><p>  void lcm12864_init(void);//液晶顯示器初始化光標的移動方向,光標左/右移動10H/14H ,整體顯示左/右移動18H/1C</p><p>  void lcm12864_wr(uchar md,uchar dt);//送指令或數(shù)據(jù), md="0&qu

13、ot; 命令, md="1" 數(shù)據(jù), dt為送入的命令或數(shù)據(jù)的值</p><p>  void main(void)</p><p><b>  {</b></p><p>  unsigned char key_now,key_last; </p><p><b>  int j=0;&

14、lt;/b></p><p>  delay_ms(100);</p><p>  delay_ms(100);</p><p>  delay_ms(100);</p><p>  delay_ms(100);</p><p>  delay_ms(100);</p><p>  COM

15、8155=0x03; </p><p>  key_last=0xff;</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  PCON=0x00;</p><p>  SCON=0x50;</p&g

16、t;<p>  TMOD=0x20;</p><p><b>  TH1=0xF4;</b></p><p><b>  TL1=0xF4;</b></p><p><b>  TR1=1;</b></p><p>  SBUF=key_read();</p

17、><p><b>  RI=0;</b></p><p>  key_now=SBUF;</p><p><b>  TI=0;</b></p><p>  if((key_now!=0xff)&(key_now!=key_last))</p><p><b>

18、  { </b></p><p>  lcm12864_init();</p><p>  switch(key_now)</p><p><b>  {</b></p><p>  case 0x00: lcm12864_font[1]='0';break;</p><

19、;p>  case 0x01: lcm12864_font[1]='1';break;</p><p>  case 0x02: lcm12864_font[1]='2';break;</p><p>  case 0x03: lcm12864_font[2]='3';break;</p><p>  case

20、0x04: lcm12864_font[1]='4';break;</p><p>  case 0x05: lcm12864_font[1]='5';break;</p><p>  case 0x06: lcm12864_font[1]='6';break;</p><p>  case 0x07: lcm1286

21、4_font[1]='7';break;</p><p>  case 0x08: lcm12864_font[1]='8';break;</p><p>  case 0x09: lcm12864_font[1]='9';break;</p><p>  case 0x0a: lcm12864_font[1]=

22、9;a';break;</p><p>  case 0x0b: lcm12864_font[1]='b';break;</p><p>  case 0x0c: lcm12864_font[1]='c';break;</p><p>  case 0x0d: lcm12864_font[1]='d';brea

23、k;</p><p>  case 0x0e: lcm12864_font[1]='e';break;</p><p>  case 0x0f: lcm12864_font[1]='f';break;</p><p><b>  }</b></p><p>  lcm12864_disp(

24、0,0,lcm12864_font,2);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void lcm12864_init(void)//液晶顯示器初始化光標的移動方向,光標左/右

25、移動10H/14H ,整體顯示左/右移動18H/1C</p><p><b>  {</b></p><p>  lcm12864_wr(0,0x30); //0x30---基本指令動作 </p><p>  lcm12864_wr(0,0x01); //清屏,地址指針指向01H</p><p>  delay_m

26、s(100);</p><p>  lcm12864_wr(0,0x06); //光標的移動方向</p><p>  lcm12864_wr(0,0x0c); //開顯示,關(guān)游標</p><p><b>  }</b></p><p>  void lcm12864_wr(uchar md,uchar dt)//

27、送指令或數(shù)據(jù), md="0" 命令, md="1" 數(shù)據(jù), dt為送入的命令或數(shù)據(jù)的值</p><p><b>  {</b></p><p>  lcm12864_busy(); // 測試液晶是否忙</p><p><b>  if(md){ </b></p>

28、<p>  LCM12864_RS=1;</p><p>  } // 判斷是數(shù)據(jù)還是命令</p><p><b>  else {</b></p><p>  LCM12864_RS=0; </p><p><b>  }</b></p><p>  LCM

29、12864_RW=0; // 寫</p><p>  LCM12864_DPORT=dt; // 送數(shù)據(jù)或命令</p><p>  LCM12864_EN=1; // 使能</p><p>  delay_ms(100);</p><p>  LCM12864_EN=0;</p><p><b>

30、;  }</b></p><p>  void lcm12864_busy(void)// 測試液晶是否忙</p><p><b>  { </b></p><p>  LCM12864_DPORT=0xff; // 數(shù)據(jù)口先送 0xff</p><p>  LCM12864_RS=0; // 指令

31、</p><p>  LCM12864_RW=1; // 讀出忙標志(BF)及地址記數(shù)器(AC)</p><p>  LCM12864_EN=1; // 使能</p><p>  while(LCM12864_DPORT&0x80); // 最高位為1則忙,再讀</p><p>  LCM12864_EN=0;<

32、/p><p><b>  }</b></p><p>  //顯示漢字或字符,x顯示行位置(0-3),y顯示列位置(0-7),*chn 待顯字符串指針,n顯示個數(shù)(<=64)</p><p>  void lcm12864_disp(uchar x,uchar y,uchar *ch,uchar n)</p><p>

33、<b>  {</b></p><p>  uchar i,y0;</p><p>  y0=x*16+y*2;</p><p>  lcm12864_wr(0,0x30);</p><p><b>  switch(x)</b></p><p><b>  {&l

34、t;/b></p><p>  case 0:lcm12864_wr(0,0x80+y);break;</p><p>  case 1:lcm12864_wr(0,0x90+y);break;</p><p>  case 2:lcm12864_wr(0,0x88+y);break;</p><p>  case 3:lcm12864

35、_wr(0,0x98+y);break;</p><p><b>  }</b></p><p>  lcm12864_wr(1,ch[0]);</p><p>  for(i=1;i<n;i++)</p><p><b>  {</b></p><p><b&g

36、t;  y0++;</b></p><p>  if(!(y0%16))</p><p>  { switch(y0/16)</p><p><b>  {</b></p><p>  case 0:lcm12864_wr(0,0x80);break;</p><p>  case 1

37、:lcm12864_wr(0,0x90);break;</p><p>  case 2:lcm12864_wr(0,0x88);break;</p><p>  case 3:lcm12864_wr(0,0x98);break;</p><p>  } </p><p>  } </p>&l

38、t;p>  lcm12864_wr(1,ch[i]); </p><p><b>  }</b></p><p><b>  }</b></p><p>  void delay_ms(unsigned char n)</p><p><b>  {</b></p

39、><p>  unsigned char i;</p><p>  while(n--) </p><p><b>  {</b></p><p>  for (i=0;i<125;i++);</p><p><b>  }</b></p>&

40、lt;p><b>  }</b></p><p>  unsigned char key_read(void) </p><p><b>  { </b></p><p>  unsigned char i,scandata;</p><p>  unsigned char key_curr

41、ent,col_out,row_in; </p><p>  scandata=0x01; </p><p>  PA8155=0x0f; </p><p>  delay_ms(5);</p><p>  if((PC8155&0x0f)==0x00) </p><p&

42、gt;<b>  { </b></p><p>  return 0xff;</p><p><b>  }</b></p><p>  for(i=0;i<4;i++)</p><p><b>  {</b></p><p>  PA8155=

43、scandata; </p><p>  col_out=0x0f&scandata; </p><p>  if((PC8155&0x0f)!=0x00) </p><p><b>  {</b></p><p>  row_in=(PC8155&0x0f)<<

44、4; </p><p>  key_current=row_in+col_out; </p><p><b>  }</b></p><p>  scandata=_crol_(scandata,1); </p><p><b>  }</b></p><p>

45、;  for(i=0;i<16;i++) </p><p><b>  {</b></p><p>  if(key_current==key_code[i]) </p><p><b>  {</b></p><p>  return i;

46、 </p><p><b>  }</b></p><p><b>  }</b></p><p>  return 0xff;</p><p><b>  }</b></p><p><b>  3、調(diào)試說明</b><

47、;/p><p>  用KEIL軟件編譯,產(chǎn)生HEX文件后用STC ISP軟件通過USB下載進入單片機。然后取下USB連接跳帽,將P3.0與P3.1口用導線連接。按下鍵盤后液晶顯示器顯示按下鍵的鍵值。</p><p>  4、設(shè)計結(jié)果及錯誤分析</p><p>  在鍵盤按下鍵后液晶顯示器能夠顯示出相應(yīng)的鍵值,如1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。

48、課程設(shè)計比較成功。完成課程設(shè)計所要求的任務(wù)。</p><p>  在課程設(shè)計中,也遇到了很多錯誤,開始將所有待顯示數(shù)全部送往lcm12864_font[]數(shù)組中,結(jié)果全部顯示。經(jīng)過調(diào)整之后才按需要顯示。</p><p><b>  總結(jié)</b></p><p>  經(jīng)過繁忙而又緊張的課程設(shè)計,終于順利的完成了設(shè)計任務(wù)。雖然在這段時間里每天都那么

49、繁忙,但是在這忙碌的過程中卻得到了許多收獲。</p><p>  經(jīng)過課程設(shè)計,在查閱資料的過程中,更加牢靠的掌握了單片機的程序設(shè)計,了解了單片機串行通信的基本知識,對于以后的學習和工作都有很大的益處。</p><p>  在學習的過程中,也遇到了一些困難,比如一開始的時候使用Protues繪制電路圖時,由于不熟悉導致了磕磕絆絆;還有就是因為發(fā)送端和接收端的通信協(xié)議沒有做好,導致數(shù)據(jù)不能正

溫馨提示

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

評論

0/150

提交評論