标题:
51单片机串口中断方式接收数据错误
[打印本页]
作者:
Henzie0226
时间:
2021-4-9 09:36
标题:
51单片机串口中断方式接收数据错误
我想实现51单片机接收串口发送过来的数据(中断方式),数据是以字符数组的形式发送过来的,然后显示到LCD屏上,同时再发送出去。测试的时候,显示和发送出去的都是乱码,大佬们谁知道怎么解决?(只接收2个字符还行,多了就不行了)
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="The temperature:";
uchar table1[]="";
uchar flag,rebuf;
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)
{
flag=0;
write_com(0x80+0x40);
for(b=0;b<5;b++)
{
write_data(table1[b]);
DelayMS(5);
}
for(b=0;b<5;b++)
{
send(table1[b]);
}
}
}
}
void ser() interrupt 4
{
if(RI==1)
{
RI=0;
rebuf=SBUF;
table1[j++]=rebuf;
if(j>4)
{
j=0;
flag=1;
}
}
}
复制代码
作者:
Secret丶
时间:
2021-4-10 15:08
看下晶振的大小对应的波特率对不对,收发机两端波特率配置一不一样,你代码写的最多可以收发四个字符
作者:
Henzie0226
时间:
2021-4-10 20:31
Secret丶 发表于 2021-4-10 15:08
看下晶振的大小对应的波特率对不对,收发机两端波特率配置一不一样,你代码写的最多可以收发四个字符
你好,波特率收发都是9600
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1