标题:
新人求教,51单片机串口通讯问题
[打印本页]
作者:
xzc1109
时间:
2017-10-28 12:53
标题:
新人求教,51单片机串口通讯问题
我在做51单片机串口的时候上位机以16进制发送01,单片机里面用case判断收到的为0x01就发送一个值,这样是可以收到的,但是我在单片机里面用case判断收到的为0x10就发送一个值,这样却不会返回数据,这是什么原因呢?代码如下,求解答
#include <reg52.h> //包含单片机寄存器的头文件
#define port P0
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
#define uchar unsigned char
#define uint unsigned int
#define N 2
uchar temp,j,flag,begin;
uchar dat[N];
unsigned char code table[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
void Delay(int c);
void SendByte(unsigned char d)
{
SBUF = d/10;
while(!TI);
TI = 0;
}
void UARTInit(void)
{
TMOD=0x20; //用定时器设置串口波特率
TH1=0xfd; //配置波特率为9600
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中断
ES=1; //开启串口中断
}
void reset(void)
{
ES=1;
j=0;
flag=0;
}
void display(){
int i=0;//计数器
lsa=0;
lsb=0;
lsc=0;
lsa=1;
lsb=0;
lsc=0;
if (dat[0]<0||dat[0]>9) {reset();port=table[0];}
else port=table[dat[0]];
Delay(10);
lsa=0;
lsb=0;
lsc=0;
port=table[dat[1]];
//port=0x06;
Delay(10);
//i++;
//if(i==10) i=0;
}
void main()
{
uint i;
for(i=0;i<4;i++) dat[i]=0;
reset();
UARTInit();
while(1)
{
if (flag==1)
reset();
display();
}
}
void Delay(int c){
unsigned a,b;
for(;c>0;c--)
for(b=38;b>0;b--);
//for(a=130;a>0;a--);
}
void ser() interrupt 4
{
RI=0;
dat[j]=SBUF;
temp=dat[j];
switch(temp)
{
case 0x01: SendByte(1); break;
default:break;
}
j++;
if (j==N)
{
ES=0; //关闭串口中断
flag=1;
}
}
复制代码
作者:
yzwzfyz
时间:
2017-10-29 12:41
在01的地方,换成10试试呢?
作者:
xzc1109
时间:
2017-11-1 16:28
yzwzfyz 发表于 2017-10-29 12:41
在01的地方,换成10试试呢?
您好,按照你说的试了还是不可以,我试了之后发现只要串口发的是1位数就可以收到,2位数总是不行的,网上也有人说是因为要分两次接收,不知道是不是这样的。
作者:
天123
时间:
2017-11-1 17:15
顶顶。。
作者:
aaa56156
时间:
2017-11-1 18:08
看得不是很懂
作者:
wulin
时间:
2017-11-1 18:11
串口每次可以收发1个字节,从0x00~0xff,从你的程序看杂乱无章,建议找一个例程参考,在其基础上改进。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag; //接收完成标志,
uchar a; //收发变量
void main()
{
TMOD=0x20;//定时器1方式2(8位重载)
TH1=0xfd; //波特率9600
TL1=0xfd; //波特率9600
TR1=1; //开定时器1
REN=1; //允许串行接收
SM0=0; //设置串口方式1(8位UART波特率可变)
SM1=1; //设置串口方式1(8位UART波特率可变)
// PCON=0x80; //波特率加倍9600*2
EA=1; //总中断开
ES=1; //串口中断开
while(1)
{
if(flag==1) //接收完成标志为1
{
ES=0; //关串口中断
flag=0; //接收完成标志清0
SBUF=a; //发送数据
while(!TI); //等待发送中断请求标志位为1
TI=0; //发送中断请求标志位清0
ES=1; //开串口中断
}
P1=~a; //LED显示收到的数据
}
}
void ser() interrupt 4
{ //当接收完成发生中断请求RI由硬件置1
RI=0; //接收中断请求标志位清0,必须软件清0
a=SBUF;//获取SBUF接收到的数据
flag=1;//接收完成标志置1
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1