你需要按照协议接收一串信息,把其中信息提取出来,发送给电脑。
电脑将一个无符号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;
}
}
暂无评论
要发表评论,您必须先 登录