一、目标效果:
串口发送长度小于8的字符,单片机将接收到的数据,将字符数据进行转换后,在数码管上显示对应数据,同时满足高位是0不显示。
二、实验器材:
1、普中51单片机。
2、STC官方下载器自带的串口调试的功能。
三、相关资料:
串口寄存器
文本模式和HEX模式
1.HEX模式
收到的是16进制的数,例如0x33,0x35等(一般不显示0x),可理解为下图的Hex行。
2.文本模式
收到的是ASCII码表上的字符。
3、代码实现
#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
u16 shuju[8]=0;
u32 a;//a用来接收收到的数字
u8 num = 0, flag = 0, dp_pos = 0, received_length = 0; //dp_pos用来存储小数点位置
void configuart(u16 baud)
{
SCON=0x50;
TMOD&=0x0f;
TMOD|=0X20;
TH1=256-(11059200/12/32/baud);
TL1=TH1;
ET1=0;
TR1=1;
ES=1;
}
void delay (u16 time)
{
while(time--);
}
void interruptUART() interrupt 4
{
unsigned long int i,b,c;
EA=0;
if(RI==1)
{
RI=0;
if(SBUF=='.')
{
dp_pos=num; //记录小数点位置
}
else
{
shuju[num]=SBUF-0x30; num++;
}
received_length = num;//记录接收到的数组的长度
flag=1;
}
EA=1;
if(flag==1)
{
a=0;
for(i=0;i<num;i++)
{
b=shuju[i]/16;
c=shuju[i]%16;
if(b!=0)
{
a=a*16*16+shuju[i];
}
else
{
a=a*16+c;
}
}
}
if(TI==1)
TI=0;
}
void smg_display(u32 b)
{
u8 i=0,flag=0;
shuju[0]=b%16;
shuju[1]=b/16%16;
shuju[2]=b/16/16%16;
shuju[3]=b/16/16/16%16;
shuju[4]=b/16/16/16/16%16;
shuju[5]=b/16/16/16/16/16%16;
shuju[6]=b/16/16/16/16/16/16%16;
shuju[7]=b/16/16/16/16/16/16/16%16;
for(i=7;i>=0;i--)
{
if(shuju[i]==0)
shuju[i]=16;
else if(shuju[i]!=0)//从高位开始检测是不是有0一旦检测到有0退出循环
break;
}
for(i=0;i<8;i++)
{
switch(i)//位选
{
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;
}
if(i==received_length-dp_pos)//小数点显示的位置计算
SMG_A_DP_PORT=gsmg_code[shuju[i]] |0x80;
else
{
SMG_A_DP_PORT=gsmg_code[shuju[i]];//传送段选数据
}
delay(100);//延时一段时间,等待显示稳定
SMG_A_DP_PORT=0x00;//消影
}
}
void main()
{
EA=1;
configuart(9600);
while(1)
{
smg_display(a);
num=0;
if (dp_pos == 0)
{
dp_pos = 8; // 如果数组中没有小数点,将dp_pos设置为8
}
}
}
四、实验步骤:
1、首先要打开串口助手页面,并打开串口
2、选择合适的波特率,这里根据代码选择9600
3、在发送缓冲区选择文本模式(字符),单片机接收数据后,单片机处理后将在单片机数码管上显示数据(将字符转换为hex数据)
4、在发送缓冲区填入数字即可看到对应的结果
五、实验现象
串口发送文本模式(字符)数据
数码管显示hex数据