找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 29|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

將串口回復(fù)的字符展示于單片機(jī)的數(shù)碼管上

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1150963 發(fā)表于 2025-5-19 16:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. 一、實(shí)驗(yàn)要求
  2. 1. 通過PC電腦與開發(fā)板的串行接口連接,實(shí)現(xiàn)雙向串行通訊,設(shè)定波特率為4800。
  3. 2. 在PC端輸入“0”-“9”和“A”-“F”中的任何字符,51處理器將此字符開始的后續(xù)6個(gè)字符顯示在單片機(jī)的數(shù)碼顯示管上。
  4. 3. 當(dāng)輸入字符達(dá)到字母表末尾時(shí),遵循以下跳轉(zhuǎn)規(guī)則:大寫字母'F'后跳轉(zhuǎn)至數(shù)字'0',數(shù)字'9'后跳轉(zhuǎn)至大寫字母'A'。
  5. 4. 必須考慮輸入數(shù)據(jù)的合法性,對(duì)于不在處理范圍內(nèi)的字符,數(shù)碼管應(yīng)顯示“ERROR_ _ _”。
  6. 5.任意設(shè)置一個(gè)獨(dú)立按鍵為清除鍵,用于一鍵清除顯示管內(nèi)容。
  7. 代碼:
  8. #include <reg51.h>
  9. #include <stdio.h>
  10. unsigned char disp[8]={0,0,0,0,0,0,0,0};
  11. unsigned char receive_data,uart_flag=0;
  12. void process(unsigned char dataa);
  13. void display(void);
  14. void delay(unsigned int i);
  15. void Usart() interrupt 4        //串口中斷子程序
  16. {if(RI==1){
  17.         receive_data=SBUF;
  18.         RI=0;
  19.         uart_flag=1;
  20. }}
  21. void cleardisplay(){        //一鍵清除顯示管內(nèi)容
  22.    unsigned char i;
  23.            for(i=0;i<8;i++)
  24.            {disp[i]=0x00;}
  25.            }
  26. void main(void)
  27. {
  28.    unsigned char seet=1;        //按鍵狀態(tài)記錄

  29.         TMOD=0X20;        //設(shè)置波特率為4800
  30.         TH1 = 0xF3;
  31.          TL1 = 0xF3;
  32.         SCON=0X50;
  33.         PCON |= 0x80;
  34.          EA=1;
  35.          ES=1;
  36.          TR1=1;
  37.         while(1){if(uart_flag)
  38.                      {process(receive_data);
  39.                                  uart_flag=0;}
  40.          if((P3 & 0x04) == 0)        //判斷清除鍵是否被按下
  41.          {if(seet==1)
  42.             {seet=0;
  43.               cleardisplay(); }}
  44.               else seet=1;
  45.         display();}
  46.            }        
  47. void process(unsigned char dataa)        //數(shù)據(jù)處理子程序
  48.            {
  49.               unsigned char i,temp;
  50.               unsigned char vaild_data;
  51.               unsigned char
  52. smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  53.               vaild_data = dataa;   
  54.               temp = vaild_data;
  55.               if(vaild_data>=0x30&&vaild_data<=0x39)     //判斷接收到的數(shù)據(jù)是否在0-9
  56.               {for(i=0;i<6;i++)
  57.                  {if(temp>=0x39)
  58.                     {temp=vaild_data+8+i;
  59.                     disp[i] = smgduan[temp-0x41 + 10];}   //[i]放到顯示緩存
  60.                     else{ temp=vaild_data+1+i;
  61.                     disp[i]=smgduan[temp-0x30 ];}}
  62.                     disp[6]=0x00;       //數(shù)碼管最后兩位熄滅
  63.                     disp[7]=0x00;
  64.                  }else if(vaild_data>=0x41&&vaild_data<=0x46)   //判斷數(shù)據(jù)是否在A-F
  65.                  {for(i=0;i<6;i++)
  66.                     {if(temp>=0x46||temp<=0x39)
  67.                       { temp=vaild_data-22+i;
  68.                          disp[i]=smgduan[temp-0x30];}
  69.                        else {temp=vaild_data+i+1;
  70.                           disp[i]=smgduan[temp-0x41+10];}}
  71.                           disp[6]=0x00;
  72.                     disp[7]=0x00;}
  73.                 else{disp[0] = 0x79;  //無效數(shù)據(jù)給顯示賦值為ERROR___
  74.                    disp[1] = 0x77;   
  75.                    disp[2] = 0x77;   
  76.                    disp[3] = 0x5C;   
  77.                    disp[4] = 0x77;   
  78.                    disp[5] = 0x08;   
  79.                    disp[6] = 0x08;   
  80.                    disp[7] = 0x08;}

  81. }
  82. void display()
  83. {
  84.     static unsigned char i = 0;        //數(shù)碼管顯示函數(shù)
  85.     for(i=0;i<8;i++)
  86.     {
  87.        switch(i)
  88.        {
  89.           case(0):P2 = 0x00;break;        //選中最右邊數(shù)碼管
  90.           case(1):P2 = 0x04;break;       //依次從右到左點(diǎn)亮數(shù)碼管
  91.           case(2):P2 = 0x08;break;   
  92.           case(3):P2 = 0x0C;break;
  93.           case(4):P2 = 0x10;break;
  94.           case(5):P2 = 0x14;break;
  95.           case(6):P2 = 0x18;break;
  96.           case(7):P2 = 0x1C;break;

  97.           }
  98.           P0=disp[7-i];        //將顯示緩存數(shù)據(jù)給P0口
  99.           delay(200);        //延時(shí)點(diǎn)亮?xí)r長(zhǎng)
  100.           P0=0x00;
  101.           }
  102.     }
  103. void delay(unsigned int i)        //延時(shí)函數(shù)
  104.     {while(i--);}
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

無效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表