E-blue 2023-11-27 17:29 采纳率: 0%
浏览 7

51单片机串口通信问题

这一段代码是c51实现自发自收字符串,让动态数码管实现由00000到00009显示的代码,但是接收字符串似乎出了问题,数码管一直显示默认的数值11111,请问哪里出了问题?

#include <reg51.h>

unsigned int T_count=0;//定时器计数 
unsigned int L_count=0;//数码管计数 led
unsigned int len=0,rec_len=5;//接受缓冲区长度,显示长度
unsigned int i=0,j=0;//i用于动态数码管循环,
                     //j用于替换send_num[]第五位的循环,实现00000到00009
unsigned int L_receive[]={1,1,1,1,1,1,1,1,1,1};//接收缓冲
unsigned char gongyin[] =  //共阴极字库 0-9
  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    // 0-9
unsigned char send_num[]="00000A";//A为截止字符
unsigned char char_num[]="0123456789";
//用于send_num[]第五位的替换,实现00000到00009

//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

void delay_10us(unsigned int ten_us)
{//延时10us
while(ten_us--);
}

void smg_display(unsigned int i_num,i_location)
{//动态数码管显示函数
  switch(i_location)
  {
    case 7: LSC=1;LSB=1;LSA=1;break;
    case 6: LSC=1;LSB=1;LSA=0;break;
    case 5: LSC=1;LSB=0;LSA=1;break;
    case 4: LSC=1;LSB=0;LSA=0;break;
    case 3: LSC=0;LSB=1;LSA=1;break;
    case 2: LSC=0;LSB=1;LSA=0;break;
    case 1: LSC=0;LSB=0;LSA=1;break;
    case 0: LSC=0;LSB=0;LSA=0;break;
  }
  P0=gongyin[i_num];//传送段选数据
  delay_10us(100);//延时一段时间,等待显示稳定
  P0=0x00;//消音
}

void dingshi() interrupt 1
{
  T_count++;
}

void recerive() interrupt 4
{
  //中断式接收
  if(RI)
  {
    RI=0;
    if(SBUF!='A')
    {
      L_receive[len]=(unsigned int)(SBUF-'0');//str转int
      len++;
    }
    else if (SBUF=='A')
    {
      rec_len=len-1;//由于前面接收到'A'后len又++了一次,所以这里-1
      len=0;//len清零,等待下一轮发送
    }
  }
  if(TI)
    TI=0;
}

void Send_str(char *p)
{//查询式发送
  while(*p!='\0')
  {
    SBUF=*p;
    while(!TI);
    TI=0;
    p++;
  }
}
  

void main()
{ 
  //T0定时器初始化,对应中断号为1
  TMOD|=0x02;//T0定时器 方式2
  TH0=0x38;//初值设定 a=56 1s=100000us=200*5000 200 = 256-56
  TL0=0x38;
  TR0=1;//启动定时器 TCON
  EA=1;//enable all
  ET0=1;//enable T1
  //串行通信方式1初始化
    //T1定时器相关
  TMOD|=0x20;//T1定时器 方式2
  TH1=0xfa;//初值设定,波特率4800
  TL1=0xfa;
  PCON=0;//SMOD=0 波特率不加倍
  ES=1;//串口中断
  TR1=1;//启动定时器T1
  SCON=0x50;//0101000 通信方式1 点对点 允许接收 无视第9位 TX RX初值0
  while(1)
  {
    if(T_count==5000)
    { //查询式发送
      send_num[4]=char_num[j];//改变第5位,实现00000到00009
      Send_str(send_num);
      j++;
      if (j==10)
      {
        j=0;
      }
      T_count=0;
    }

    for(i=0;i<rec_len;i++)
    {
      smg_display(L_receive[i],i);
    }
  }
}

img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-27 20:27
    关注

    【以下回答由 GPT 生成】

    问题需要提供更多上下文信息才能回答。请提供你目前的问题描述和你期望的结果。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月27日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误