单片机之间使用串口通信是,SBUF内的值无法改变 10
用发送单片机去控制接收单片机P2口的LED灯发送单片机的程序如下:#include<reg52.h>#include<intrins.h>#defineucharunsi...
用发送单片机去控制接收单片机P2口的LED灯
发送单片机的程序如下:
#include<reg52.h> #include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar);void initial();//初始化定时器1,使其工作在方式2,波特率设定9600
void delay(uchar Z)
{uchar x; for(x=Z;x>0;x--) { _nop_(); } }
void initial()
{ TMOD=0x20; TH1=0xfd; //波特率设定值 TL1=0xfd; TR1=1;//定时器1开始工作 REN=1;//允许串口接收数据 SM0=0; SM1=1; TI=0; RI=0; EA=1; ES=1; delay(2); }
void main()
{ uchar x,y; initial(); for(x=0;x<=16;x++) {y=(16-x); SBUF=y; //此处给发送缓冲器输入值时,经过调试SBUF的值为0x7f;保持不变 while(TI==0); TI=0; delay(100); } P0=0x00; while(1);//程序停在此处 }接收单片机的接受程序如下:#include<reg52.h>
#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar);void initial();//初始化定时器1,使其工作在方式2,波特率设定9600
void delay(uchar Z)
{uchar x; for(x=Z;x>0;x--) { _nop_(); } }
void initial()
{ TMOD=0x20; TH1=0xfd; //波特率设定值 TL1=0xfd; TR1=1;//定时器1开始工作 REN=1;//允许串口接收数据 SM0=0; SM1=1; TI=0; RI=0; EA=1; ES=1; delay(2); }
void main()
{ initial(); while(1) { ES=1; } }
void series () interrupt 4
{ RI=0; P2=SBUF; ES=0;}
Proteus仿真图如下所示: 展开
发送单片机的程序如下:
#include<reg52.h> #include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar);void initial();//初始化定时器1,使其工作在方式2,波特率设定9600
void delay(uchar Z)
{uchar x; for(x=Z;x>0;x--) { _nop_(); } }
void initial()
{ TMOD=0x20; TH1=0xfd; //波特率设定值 TL1=0xfd; TR1=1;//定时器1开始工作 REN=1;//允许串口接收数据 SM0=0; SM1=1; TI=0; RI=0; EA=1; ES=1; delay(2); }
void main()
{ uchar x,y; initial(); for(x=0;x<=16;x++) {y=(16-x); SBUF=y; //此处给发送缓冲器输入值时,经过调试SBUF的值为0x7f;保持不变 while(TI==0); TI=0; delay(100); } P0=0x00; while(1);//程序停在此处 }接收单片机的接受程序如下:#include<reg52.h>
#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar);void initial();//初始化定时器1,使其工作在方式2,波特率设定9600
void delay(uchar Z)
{uchar x; for(x=Z;x>0;x--) { _nop_(); } }
void initial()
{ TMOD=0x20; TH1=0xfd; //波特率设定值 TL1=0xfd; TR1=1;//定时器1开始工作 REN=1;//允许串口接收数据 SM0=0; SM1=1; TI=0; RI=0; EA=1; ES=1; delay(2); }
void main()
{ initial(); while(1) { ES=1; } }
void series () interrupt 4
{ RI=0; P2=SBUF; ES=0;}
Proteus仿真图如下所示: 展开
4个回答
展开全部
我觉得是你串口初始化比特率设置没成功,这是我找的一段串口初始化的程序,希望帮到你!
//12MHZ 9600波特率,定时器1T方式,串口1,波特率倍数开启
void UART_Init(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xB2; //设定定时初值
TH1 = 0xB2; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
//12MHZ 9600波特率,定时器1T方式,串口1,波特率倍数开启
void UART_Init(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xB2; //设定定时初值
TH1 = 0xB2; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
追问
这不是正确的解答方法,不过一样感谢
展开全部
不明白原因,但你的发送端开了串口中断,但却没有串口中断程序,这样程序肯定会跑飞。仔细检查吧,最好不要用软件仿真,用硬件。另外两个单片机,晶振这样接合理么,如果是硬件的话,第二个单片机复位脚不接肯定不合理哦。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先在发光二级管前面加上10k的电阻,不然无法显示;
然后把发射端的delay函数时间设置长一点,看看接收端再调试。
然后把发射端的delay函数时间设置长一点,看看接收端再调试。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发送中SBUF的值是不能读的,所以你也不知道该值是否改变。而且只发送一次,接收端是不一定收到的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询