标题:
51单片机串口接收程序问题
[打印本页]
作者:
Henzie0226
时间:
2021-4-9 10:20
标题:
51单片机串口接收程序问题
下面的程序接收到一个16进制数,我想将其显示到LCD上,但是只能显示出部分位。(如串口接收到0xEB,计划显示23.5,但是只能显示23,大佬们知道这是为啥吗?)
单片机源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="The temperature:";
uchar table1[]="";
uchar flag,temp;
uchar j=0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
void DelayMS(uint xms) //延时大约1ms
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0; //写命令
P0=com;
DelayMS(5);
lcden=1;
DelayMS(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1; //写数据
P0=date;
DelayMS(5);
lcden=1;
DelayMS(5);
lcden=0;
}
void send(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void uartinit()//串口初始化函数
{
SCON=0x50;//串口工作方式为模式1
TMOD=0x20;//定时器T1工作方式2
PCON=0x00;//SMOD=0
TH1=0xfd;//波特率为9600
TL1=0xfd;
EA=1;
ES=1;
TR1=1;//启动定时器
}
void init() //初始化函数
{
dula=0;
wela=0;
lcden=0;
write_com(0x38); //设置16*2显示、5*7点阵、8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后,地址指针自动加一
write_com(0x01); //显示清零,数据指针清零
uartinit();
}
void main()
{
uchar num=0;
uchar b=0;
init();
write_com(0x80);
for(b=0;b<16;b++)
{
write_data(table[b]);
DelayMS(5);
}
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
if(temp>=100)
{
table1[1]=temp/100+48; //ASCII码转换
table1[2]=temp%100/10+48;
table1[3]='.';
table1[4]=temp%10+48;
}
else if(temp>=10) //两位数,百位的零不显示
{
table1[1]=' '; //ASCII码转换
table1[2]=temp%100/10+48;
table1[3]='.';
table1[4]=temp%10+48;
}
else //一位数,前面的两个零都不显示
{
table1[1]=' '; //ASCII码转换
table1[2]='0';
table1[3]='.';
table1[4]=temp%10+48;
}
write_com(0x80+0x40);
for(b=1;b<5;b++)
{
write_data(table1[b]);
DelayMS(5);
}
for(b=1;b<5;b++)
{
send(table1[b]);
}
ES=1;
}
}
}
void ser() interrupt 4
{
if(RI==1)
{
RI=0;
temp=SBUF;
flag=1;
}
}
复制代码
作者:
she
时间:
2021-4-9 14:51
如果你直接让他显示一个定值,能正常显示吗?
作者:
cn_zhx
时间:
2021-4-9 15:28
直接送个"23.5"字符串,看能不能正常显示
作者:
zjy525
时间:
2021-4-9 15:38
因为你的赋值是从table1[1]开始的,table1[0]没有被赋值
作者:
wulin
时间:
2021-4-9 21:31
改这样
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="The temperature:";
uchar table1[4];
uchar flag,temp;
uchar j=0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
void DelayMS(uint xms) //延时大约1ms
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0; //写命令
P0=com;
DelayMS(1);
lcden=1;
DelayMS(1);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1; //写数据
P0=date;
DelayMS(1);
lcden=1;
DelayMS(1);
lcden=0;
}
void send(uchar dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void uartinit()//串口初始化函数
{
SCON=0x50;//串口工作方式为模式1
TMOD=0x20;//定时器T1工作方式2
PCON=0x00;//SMOD=0
TH1=0xfd;//波特率为9600
TL1=0xfd;
EA=1;
ES=1;
TR1=1;//启动定时器
}
void init() //初始化函数
{
dula=0;
wela=0;
lcden=0;
write_com(0x38); //设置16*2显示、5*7点阵、8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后,地址指针自动加一
write_com(0x01); //显示清零,数据指针清零
}
void main()
{
uchar num=0;
uchar b=0;
uartinit();
init();
write_com(0x80);
for(b=0;b<16;b++)
{
write_data(table[b]);
DelayMS(5);
}
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
if(temp>=100)
{
table1[0]=temp/100%10+'0'; //ASCII码转换
table1[1]=temp/10%10+'0';
table1[2]='.';
table1[3]=temp%10+'0';
}
if(temp<100&&temp>=10) //两位数,百位的零不显示
{
table1[0]=' '; //ASCII码转换
table1[1]=temp/10%10+'0';
table1[2]='.';
table1[3]=temp%10+'0';
}
if(temp<10) //一位数,前面的两个零都不显示
{
table1[0]=' '; //ASCII码转换
table1[1]='0';
table1[2]='.';
table1[3]=temp%10+'0';
}
write_com(0x80+0x40);
for(b=0;b<4;b++)
{
write_data(table1[b]);
DelayMS(5);
}
for(b=0;b<4;b++)
{
send(table1[b]);
}
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
temp=SBUF;
flag=1;
}
复制代码
作者:
Henzie0226
时间:
2021-4-10 20:33
wulin 发表于 2021-4-9 21:31
改这样
您好,谢谢您的回复,您的代码我验证了一下可以实现,请问我的不能实现的原因是什么呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1