2020单片机V2.0-试题2 串口发送协议

你需要按照协议接收一串信息,把其中信息提取出来,发送给电脑。
电脑将一个无符号16位数字A拆分成两个无符号8位数字B和C通过串口,以16进制数的形式发送给单片机,波特率4800。
电脑发送数据时遵循以下格式:
0xA5、B、C、0x0d、0x0a(顿号不包含在发送数据里)。
其中B代表无符号数的高八位,C代表无符号数的低八位。
你需要在单片机里编写程序读取B和C并且拼接为原来的数字,将原来的数字以10进制的形式发送给单片机显示。
附加题:如果电脑发送的数据不属于以上格式,需要用串口向电脑发送“error”

/************************************************

                      串 口 发 送 协 议(例程)

************************************************/

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit x = P2 ^0;
sbit y = P2 ^1;
sbit z = P2 ^2;

uchar i = 0, j = 0, flag = 0;
uint record[8] = {0}, number = 0;
uchar code err[] = "error";
uchar code table[] = {
        0x3f,0x06,0x5b,0x4f,  //0,1,2,3
        0x66,0x6d,0x7d,0x07,    //4,5,6,7
        0x7f,0x6f,0x77,0x7c,    //8,9,A,B
        0x39,0x5e,0x79,0x71   //C,D,E,F
};

void init();
void display(uint num);  //数码管显示数字
void digit(uchar num);  //数码管位选
void delay(uint z);  //延时(ms)

void main() {
    init();
    while (1) {
        if (flag == 1)  //接收成功标志
            display(number);
    }
}

/*  串口中断  */
void serial() interrupt 4
{
        uchar buf;
        buf = SBUF;
        record[i] = buf;  //将接收到的数据存入数组
        i++;
        RI = 0;      //清除串行接受标志位
        if(i == 5)
        {
                if(record[0] != 0xA5 || record[3] != 0x0D || record[4] != 0x0A)  //不符合要求
                {
                        for(j = 0;j < 5; j++)  //发送错误信息
                        {
                                SBUF = err[j];
                                while(!TI);  //发送完数据TI发送中断标志位硬件置1
                                TI = 0;     //手动复位
                        }
                }
                else
                {
                        record[1] <<= 8;
                        number = record[1] | record[2];  //合并数字
                        flag = 1;
                }
        }
}

/* 初始化 */
void init() {
    TMOD = 0x20;  // 0010 0000 即8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1.
    TH1 = 0xf3;  //计时器初值
    TL1 = 0xf3;  //TL1的初值自动从TH1中取  此处相当于波特率4800
    TR1 = 1;  // 开启定时器1
    PCON = 0x80;
    SM0 = 0;  //SM0=0,SM1=1为工作方式1,10位异步收发,波特率可变
    SM1 = 1;
    REN = 1;  //允许串口接收
    EA = 1;  // 中断总开关
    ES = 1;  // 串行口中断开关
}

/* 延时(ms) */
void delay(uint z)
{
    uint x, y;
    for (x = z; x > 0; x--)
        for (y = 110; y > 0; y--);
}

/* 数码管显示数字 */
void display(uint num) {
    uchar nums[9], j = 0, i = 0;
    while (num > 0)  //取出各位数,组成数组
    {
        nums[i] = num % 10;
        num /= 10;
        i++;
    }
    for (j = 0; j < i; j++)  //输出数组中的数
    {
        digit(j);
        P0 = table[nums[j]];
        delay(1);
        P0 = 0;  //消影
    }
}

/* 数码管位选 */
void digit(uchar num) {
    switch (num) {
        case 0:x = 1;y = 1;z = 1;break;
        case 1:x = 1;y = 1;z = 0;break;
        case 2:x = 1;y = 0;z = 1;break;
        case 3:x = 1;y = 0;z = 0;break;
        case 4:x = 0;y = 1;z = 1;break;
        case 5:x = 0;y = 1;z = 0;break;
        case 6:x = 0;y = 0;z = 1;break;
        case 7:x = 0;y = 0;z = 0;break;
    }
}

暂无评论

相关推荐

微信扫一扫,分享到朋友圈

2020单片机V2.0-试题2 串口发送协议