找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3|回复: 0
打印 上一主题 下一主题
收起左侧

将串口回复的字符展示于单片机的数码管上

[复制链接]
跳转到指定楼层
楼主
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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表