请大侠帮忙看看这个程序错在哪里?没反应 串口的 51
{
TMOD=0X20; //定时器1
SCON=0X50; //串口1
PCON=0X00; //不分屏
TH1 =0XFD; //253
TL1 =0XFD; //253
TI =0; //发送状态清零
RI =0; //接受状态清零
TR1 =1; //开定时器1
EA =1; //开总中断
ES =1; //开串口中断1
}
void uartes() interrupt 4
{
if(RI)
{
RI=0; //标志清零
recevi=SBUF;
stat=1;
}
if(TI)
{
TI=0;
busy=1;
}
}
void main()
{
uart_init();
while(1)
{
if((busy==1)&&(stat=1))
{
SBUF=recevi;
busy=0;
stat=0;
}
}
}
if((busy==1)&&(stat=1))应该为 if((busy==1)&&(stat==1))
RX TX口换着插一下,是不是接错了。
不是,,,,,晶振11.0592
弄个示波器一看就知道了,最方便了
不用示波器查,就看着程序有没有觉得不对的地方?
认真。谢谢了。
原来是 找茬 游戏。
if((busy==1)&&(stat=1))改为 if((busy==1)&&(stat==1))
没有,你回答前已经自己找到错误了
if(busy&&stat)
你好,试问下
if(RI)
{
RI=0; //标志清零
recevi=SBUF;
stat=1;
}
中的 recevi=SBUF;改为 SBUF=recevi;而
if((busy==1)&&(stat==1))
{
SBUF=recevi;
busy=0;
stat=0;
}
中的SBUF=recevi;改为recevi=SBUF会怎样?
为什么我的串口助手智能这样改才会正常显示?
你好,试问下
if(RI)
{
RI=0; //标志清零
recevi=SBUF;
stat=1;
}
中的 recevi=SBUF;改为 SBUF=recevi;而
if((busy==1)&&(stat==1))
{
SBUF=recevi;
busy=0;
stat=0;
}
中的SBUF=recevi;改为recevi=SBUF会怎样?
为什么我的串口助手智能这样改才会正常显示?
你好,试问下
if(RI)
{
RI=0; //标志清零
recevi=SBUF;
stat=1;
}
中的 recevi=SBUF;改为 SBUF=recevi;而
if((busy==1)&&(stat==1))
{
SBUF=recevi;
busy=0;
stat=0;
}
中的SBUF=recevi;改为recevi=SBUF会怎样?
为什么我的串口助手智能这样改才会正常显示?
SBUF=recevi发送这样写 recevi=SBUF接收这样写,你把全部程序发过来我看看什么问题
你这样试试
void uart_init()
{
TMOD=0X20; //定时器1
SCON=0X50; //串口1
PCON=0X00; //不分屏
TH1 =0XFD; //253
TL1 =0XFD; //253
TI =0; //发送状态清零
RI =0; //接受状态清零
TR1 =1; //开定时器1
EA =1; //开总中断
ES =1; //开串口中断1
}
void uartes() interrupt 4
{
if(RI)
{
RI=0; //标志清零
recevi=SBUF;
stat=1;
}
}
void main()
{
uart_init();
while(1)
{
if(stat==1)
{
stat=0;
SBUF=recevi;
while(TI==0);
TI=0;
}
}
}
你好,这个是我的程序。如果把if(RI)里面的SBUF=RECEVI;改为RECEVI=SBUF;就显示不了了,同样把TI的也改了也是显示不了的。
#include "reg52.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
u8 RECEVI; //接收发送变量
u8 STAT=0; //接送完毕
u8 busy=0; //忙检测
void time_init()
{
TMOD=0X20; //定时器1 方式2 自动重装载 8位定时器
SCON=0X50; //串口模式1
PCON=0X00; //不分屏
TH1 =0XFD; //高位初始值253
TL1 =0XFD; //波特率计算:9600=1*11059200/(2*(256-253)*32)
TR1 =1; //开启定时器
EA =1; //开总中断
ES =1; //开串口中断
TI =0; //清零发送
RI =0; //清零接收
}
void busy_init()
{
if(STAT&&busy) //当检测到发送一帧完毕后与接送完毕
{
STAT=0; //清零标志位
TI=0; //清零接收标志
RECEVI=SBUF; //把数据传给串口助手
}
}
void main()
{
time_init(); //初始化
while(1)
{
busy_init(); //调用函数
}
}
void time() interrupt 4 //串口中断函数 串口中断模式4
{
if(RI) //检测是否接收到数据 被置1表示接收到数据
{
RI=0; //清零标志位
SBUF=RECEVI; //数据传送给接收缓冲器
STAT=1; //置1表示接收到数据
}
if(TI) //检测是否接收到数据
{
TI=0; //清零标志位
busy=1; //忙检测
}
}
好,明天我去试一下,板不在身边
可以用,只要在接收中断里不加
if(TI) //检测是否接收到数据
{
TI=0; //清零标志位
busy=1; //忙检测
}
就可以使用。
有个疑问?为什么要在接收中断里面判断是否发送了?if(TI)?
if((busy==1)&&(stat=1))中的stat==1 怎么不用代码生成器