qq_42242130
有理想_Re
采纳率0%
2019-02-22 20:48 阅读 1.4k

正在学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;       //清除接收中断标志位
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

相关推荐