標(biāo)題:
新人求教,51單片機(jī)串口通訊問題
[打印本頁(yè)]
作者:
xzc1109
時(shí)間:
2017-10-28 12:53
標(biāo)題:
新人求教,51單片機(jī)串口通訊問題
我在做51單片機(jī)串口的時(shí)候上位機(jī)以16進(jìn)制發(fā)送01,單片機(jī)里面用case判斷收到的為0x01就發(fā)送一個(gè)值,這樣是可以收到的,但是我在單片機(jī)里面用case判斷收到的為0x10就發(fā)送一個(gè)值,這樣卻不會(huì)返回?cái)?shù)據(jù),這是什么原因呢?代碼如下,求解答
#include <reg52.h> //包含單片機(jī)寄存器的頭文件
#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; //用定時(shí)器設(shè)置串口波特率
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;//計(jì)數(shù)器
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; //關(guān)閉串口中斷
flag=1;
}
}
復(fù)制代碼
作者:
yzwzfyz
時(shí)間:
2017-10-29 12:41
在01的地方,換成10試試呢?
作者:
xzc1109
時(shí)間:
2017-11-1 16:28
yzwzfyz 發(fā)表于 2017-10-29 12:41
在01的地方,換成10試試呢?
您好,按照你說的試了還是不可以,我試了之后發(fā)現(xiàn)只要串口發(fā)的是1位數(shù)就可以收到,2位數(shù)總是不行的,網(wǎng)上也有人說是因?yàn)橐謨纱谓邮,不知道是不是這樣的。
作者:
天123
時(shí)間:
2017-11-1 17:15
頂頂。。
作者:
aaa56156
時(shí)間:
2017-11-1 18:08
看得不是很懂
作者:
wulin
時(shí)間:
2017-11-1 18:11
串口每次可以收發(fā)1個(gè)字節(jié),從0x00~0xff,從你的程序看雜亂無章,建議找一個(gè)例程參考,在其基礎(chǔ)上改進(jìn)。
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag; //接收完成標(biāo)志,
uchar a; //收發(fā)變量
void main()
{
TMOD=0x20;//定時(shí)器1方式2(8位重載)
TH1=0xfd; //波特率9600
TL1=0xfd; //波特率9600
TR1=1; //開定時(shí)器1
REN=1; //允許串行接收
SM0=0; //設(shè)置串口方式1(8位UART波特率可變)
SM1=1; //設(shè)置串口方式1(8位UART波特率可變)
// PCON=0x80; //波特率加倍9600*2
EA=1; //總中斷開
ES=1; //串口中斷開
while(1)
{
if(flag==1) //接收完成標(biāo)志為1
{
ES=0; //關(guān)串口中斷
flag=0; //接收完成標(biāo)志清0
SBUF=a; //發(fā)送數(shù)據(jù)
while(!TI); //等待發(fā)送中斷請(qǐng)求標(biāo)志位為1
TI=0; //發(fā)送中斷請(qǐng)求標(biāo)志位清0
ES=1; //開串口中斷
}
P1=~a; //LED顯示收到的數(shù)據(jù)
}
}
void ser() interrupt 4
{ //當(dāng)接收完成發(fā)生中斷請(qǐng)求RI由硬件置1
RI=0; //接收中斷請(qǐng)求標(biāo)志位清0,必須軟件清0
a=SBUF;//獲取SBUF接收到的數(shù)據(jù)
flag=1;//接收完成標(biāo)志置1
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1