单片机/MCU论坛
直播中

SuperChshuai

2年用户 15经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[问答]

51单片机串行通信方式1失败(求大神指点 !!!!!)

串行通信.png
左边的单片机是U3(发送机)U4是(接收机)
U3发送成功LED D1就会熄灭(闪烁)
U4接收成功LED D2也会熄灭(闪烁)
U4的P1端就会把U3发送过来的数据显示在八个LED上
不知道怎么回事接收不到数据 (但是U3好像能发送数据D1会闪烁)

U3代码
U3代码1.png
U3代码2.png

U3代码3.png

U3 代码文字版!!!
#include<reg51.h>
#include<intrins.h>
#define Nop() nop()
void DelayUs( int tu);
void DelayMs( int tm);
void SendByte(unsigned char dat);
void InitUATR(void);

sbit LED_1=P1^7;
sbit outdata=P2^7;

void DelayUs(int tu){ //延时US
while(--tu);
}

void DelayMs(int tm){ //延时MS
while(tm--){
DelayUs(248);
DelayUs(248);
}
}

void InitUATR(void){ //串行通信口初始化设置函数
SCON=0x50; //往SCON寄存器写入01010000 SM0=0 SM1=1 让串行通信口工作在方式1 REN=1允许接收数据
TMOD=0x20; //往TMOD寄存器写入00100000, M1=1 M0=0 让定时器T1工作在方式2(8位自动重装计数器)
TH1=0xfa; //往定时器T1的TH1寄存器写入重装值FAH,将串行同行波特率设为4.8kbit/s
TR1=1; //往TCON寄存器的TR1位写入1,启动定时器T1工作
PCON=0x00; //设置串行通信口的波特率保持不变(往PCON寄存器写入00h,SMOD 位=0 波特率保持不便)
EA=1; //IE寄存器开启总中断
ES=1; //IE寄存器打开串行通信口中断
}

void SendByte(unsigned char dat){ //发送字节函数
SBUF=dat;

while(TI==0);
if(TI==1){ //如果发送成功LED_1熄灭
LED_1=1;
}
TI=0; //手动清零中断TI=0

}
void main(void){
InitUATR(); //对串行通信口进行初始化设置
while(1){
LED_1=0;
DelayMs(100);
SendByte(0x00 ); //发送数据
DelayMs(100);
}

}

U4代码

U4代码1.pngU4代码2.png

U4文字代码

#include<reg51.h>
#define LEDP1 P1
void InitUATR(void);
unsigned char ReceiveByte();
sbit LED_3=P3^7;
void InitUATR(void){ //串行通信口初始化设置函数
SCON=0x50; //往SCON寄存器写入01010000 SM0=0 SM1=1 让串行通信口工作在方式1 REN=1允许接收数据
TMOD=0x20; //往TMOD寄存器写入00100000, M1=1 M0=0 让定时器T1工作在方式2(8位自动重装计数器)
TH1=0xfa; //往定时器T1的TH1寄存器写入重装值FAH,将串行同行波特率设为4.8kbit/s
TR1=1; //往TCON寄存器的TR1位写入1,启动定时器T1工作
PCON=0x00; //设置串行通信口的波特率保持不变(往PCON寄存器写入00h,SMOD 位=0 波特率保持不便)
EA=1; //IE寄存器开启总中断
ES=1; //IE寄存器打开串行通信口中断
}

unsigned char ReceiveByte(){ //接收函数
unsigned char dat;
if(RI==0){
LED_3=0;
}
while(RI==0);
if(RI==1){ //如果接收成功就将LED_3 D2熄灭
LED_3=1;
}
dat=SBUF;
return dat;
RI=0;
}

void main(void){
InitUATR();
while(1){
LEDP1=ReceiveByte();
}
}

回帖(3)

阿信509

2022-10-17 09:29:21
程序先不要弄得那么复杂,先简单点弄个数据发送接收,成功了在进行下一步,逐步进取稳扎稳打
举报

华仔stm32

2022-10-25 07:34:35
void main(void){
InitUATR();
while(1){
LEDP1=ReceiveByte();
}
}
在主循环里,加个延时吧。
还有最好是用状态机的思维来给LED灯做驱动。
举报

刘传威

2022-10-25 21:23:03
U4里面那个ReceiveByte函数就有问题,在return语句之后,任何语句都没有意义了。还有,你的程序没有延时,开了中断又没有使用,建议不要开中断。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分