这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 51单片机串行通信方式1失败

共2条 1/1 1 跳转至

51单片机串行通信方式1失败

工程师
2023-08-08 11:01:36     打赏

串行通信.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();
}
}




关键词: 单片机     串行     通信    

助工
2023-08-08 11:02:32     打赏
2楼

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

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


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]