久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 376|回復: 1
打印 上一主題 下一主題
收起左側

將串口回復的字符展示于單片機的數碼管上

[復制鏈接]
跳轉到指定樓層
樓主
ID:1150963 發表于 2025-5-19 16:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. 一、實驗要求
  2. 1. 通過PC電腦與開發板的串行接口連接,實現雙向串行通訊,設定波特率為4800。
  3. 2. 在PC端輸入“0”-“9”和“A”-“F”中的任何字符,51處理器將此字符開始的后續6個字符顯示在單片機的數碼顯示管上。
  4. 3. 當輸入字符達到字母表末尾時,遵循以下跳轉規則:大寫字母'F'后跳轉至數字'0',數字'9'后跳轉至大寫字母'A'。
  5. 4. 必須考慮輸入數據的合法性,對于不在處理范圍內的字符,數碼管應顯示“ERROR_ _ _”。
  6. 5.任意設置一個獨立按鍵為清除鍵,用于一鍵清除顯示管內容。
  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(){        //一鍵清除顯示管內容
  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;        //按鍵狀態記錄

  29.         TMOD=0X20;        //設置波特率為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)        //數據處理子程序
  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)     //判斷接收到的數據是否在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;       //數碼管最后兩位熄滅
  63.                     disp[7]=0x00;
  64.                  }else if(vaild_data>=0x41&&vaild_data<=0x46)   //判斷數據是否在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;  //無效數據給顯示賦值為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;        //數碼管顯示函數
  85.     for(i=0;i<8;i++)
  86.     {
  87.        switch(i)
  88.        {
  89.           case(0):P2 = 0x00;break;        //選中最右邊數碼管
  90.           case(1):P2 = 0x04;break;       //依次從右到左點亮數碼管
  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];        //將顯示緩存數據給P0口
  99.           delay(200);        //延時點亮時長
  100.           P0=0x00;
  101.           }
  102.     }
  103. void delay(unsigned int i)        //延時函數
  104.     {while(i--);}
復制代碼


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

使用道具 舉報

沙發
ID:1110477 發表于 2025-5-20 08:16 | 只看該作者
基本看懂了,馬上試試,謝謝了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看免费黄色 | 亚洲欧美日韩一区二区三区四区 | 免费的黄色小视频 | 亚洲性天堂 | 亚洲天堂免费视频 | 亚洲免费在线观看 | 懂色av一区二区夜夜嗨 | 在线观看欧美 | 中国av片 | 国产九九热 | 久久av一区二区 | 91久久国产综合久久 | aaa国产精品| 国产精品成人免费视频 | 福利视频午夜 | 日韩欧美国产一区二区三区 | 亚洲区一区二 | 性一交一乱一伧老太 | 国产二区三区 | 国产成人免费在线观看 | 免费三级网站 | 99re视频| 免费av网址在线观看 | 一区二区三区视频 | 精品久久一区二区三区 | av免费观看网址 | 香蕉成人 | 国产精品二区一区二区aⅴ污介绍 | 激情小说图片视频 | 国产欧美在线播放 | 蜜臀av中文字幕 | 黄色片视频网站 | 黑人一级黄色片 | 黄av在线| 国产精品成人一区二区 | www午夜| 日韩亚洲欧美在线 | 激情综合色 | 不卡在线视频 | 免费看黄色小视频 | 亚洲视频在线免费观看 |