有理想_Re 2019-02-22 20:48 采纳率: 0%
浏览 1719

正在学51单片机,对串口通信SBUF数据传输方式不是很清楚。。

为了实现在串口调试助手上输入一个值(0~65535),接收处理后能够在动态数码管上显示。因为不清楚SBUF内的数据存储方式,所以无从下手,特来求解。网上已有的解释是SBUF每次只读一个字节,那么输入12345,它的读取方式是怎样的,希望大家能够给一些指导。

PS:重点是串口中断函数部分接收到的数据转变为整型数据类型的实现方法.

附上代码:

#include <reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

u8 n=0;
u8 disp[5];
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值,共阴

sbit LSA=P2^2;          //定义“三”管脚
sbit LSB=P2^3;
sbit LSC=P2^4;

void delay(u16 i)       //延时函数,i=1时,大约延时10us
{
    while(i--);
}

void DigDisplay()       //动态扫描,逐个显示
{
    u8 i;
    for(i=0;i<5;i++)
    {
        switch(i)    //位选,选择点亮的数码管
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
        }
        P0=disp[i];//发送段码
        delay(100);//单次扫描间隔 
        P0=0x00;//消隐
    }
}

void UsartInit()
{
    SCON=0x50;  //设置为工作方式1
    TMOD=0x20;  //设置计数器工作方式2
    PCON=0x80;  //波特率加倍
    TH1=0xF4;   //计数器初始值设置,波特率为4800
    TL1=0xF4;
    ES=1;       //打开接收中断
    EA=1;       //打开总中断
    TR1=1;      //打开计数器
}

void datapros()
{
    disp[0]=smgduan[n/10000];           //万位            
    disp[1]=smgduan[n%10000/1000];      //千位
    disp[2]=smgduan[n%10000%1000/100];  //百位
    disp[3]=smgduan[n%10000%1000%100/10];   //十位
    disp[4]=smgduan[n%10000%1000%100%10];    
                        //个位                            
}

void main()
{
    UsartInit();    //串口初始化
    while(1)
    {
        datapros(); //数据处理函数
        DigDisplay();
    }
}

void Usart() interrupt 4     //接收停止位的中间时,由内部硬件使RI置1,进入中断
{
    n=SBUF;     //存储接收到的数据
    RI=0;       //清除接收中断标志位
}
  • 写回答

4条回答 默认 最新

  • threenewbee 2019-02-22 23:38
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名