要求:实现用串口调试助手向串口发送一个字符X,串口将发回“I get X”
我用keil的串口助手发送X ,
单片机只发回 I get ,不发回X,是哪里错了呢?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//全局变量
uchar flag,a,i;
//定义数组
uchar code table[]="I get";
//函数原型
void init(void);//串口设定初始化函数
void ser();
/*串口中断函数*/
void ser()interrupt 4
{
RI=0; //现在单片机是由读数据进入中断(RI=1),要将RI清零,才能在下一次进入中断。
a=SBUF; //将外界(电脑)给单片机的数据赋值给a
flag=1; //这是方便查询是否已经收到数据的变量 flag=1说明已经收到数据
}
/*串口设置(初始化)函数*/
void init(void)
{
TMOD=0x20;//16进制一位对应2进制 4位:0010 0000 方式2:设定时器1为8位初值自动重装的 8位 定时器
TH1=0xfd; //设定波特率 1111 1101
TL1=0xfd; //设定波特率
SCON=0x50;//0101 0000 没有定义的则设为0即可。
EA=1;//开总中断
ES=1;//开串口中断
TR1=1;//启动定时器1
}
/*接受字符并反馈函数*/
void f(void)
{
if(flag==1) // 若已经收到数据
{
ES=0; //关闭串口中断。使单片机在进行对这次电脑发来的数据的处理的过程中,SBUF等的值不改变。
for(i=0;i<6;i++) //"I get " :4个字母 加2个空格 一共6个字符 ,所以要循环6次。
{
SBUF=table[i]; // 把table[]中的字符发回电脑
while(!
ti);//没发送完时TI=0
TI=0; //发送完时TI被硬件置为1,必须用软件清零,才能进行下一次发送(SBUF=XXX)
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
/*主函数*/
void main(void)
{
init();//对串口进行初始化
while(1)
{
f();
}
}
额,还是没好。
不知道怎么回事,都是我改成一个字符一个字符地发,发回的就对了。。。
上位机通过串口助手发送一个字符“X”,单片机收到后返回给上位机“I get X ”;程序代码如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]="I get ";
uchar flag=0,a;
void init_ser()
{
TMOD=0X20;//定时器1工作在方式2
TH1=0XFD;
TL1=0XFD; //波特率9600,51单片机大多用这个
TR1=1; //定时器/计数器1启动
REN=1;//允许串口接收
SM0=0;
SM1=1; //串行口方式1
REN=1;//允许串口接收
EA=1; //开放总中断
ES=1;//开串口 中断
}
void main()
{
init_ser();
while(1)
{
if(flag==1)
{
ES=0; //关闭中断
// flag=0; //重置
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0; //为下次发送做准备
ES=1;
flag=0;
}
}
void ser_int() interrupt 4 //中断函数不用声明
{
if(RI==1)
{
RI=0;
a=SBUF;
flag=1;
}
}
上述程序进行实例验证后单片机不能发送字符给上位机!!重点在于 串口初始程序现将修改,更改了串口允许接受的位置,如下所示
void init_ser()
{
TMOD=0X20;//定时器1工作在方式2
TH1=0XFD;
TL1=0XFD; //波特率9600,51单片机大多用这个
TR1=1; //定时器/计数器1启动
EA=1; //开放总中断
SM0=0;
SM1=1; //串行口方式1
REN=1;//允许串口接收
ES=1;//开串口 中断
}
谢谢哈,但是这两个的区别不就是把初始化函数里面几条语句的顺序换了一下吗?为什么执行效果不一样?
一周热门 更多>