标题:
关于串行口问题
[打印本页]
作者:
55123
时间:
2015-6-1 23:57
标题:
关于串行口问题
我输入1后但是回来的却是乱码,原本应该是i get 1,对吧!
#include<reg52.h>
#define uchar unsigned char
uchar flag,a,i;
uchar code table[]={'I',' ','g','e','t',' '};
void main()
{
TMOD=0X20; //开定时器2
TH1=0XFD; //自动八位重装
TL1=0XFD;
TR1=1; //开启定时器
REN=1; //允许串行接收
EA=1; //开总中断
ES=1; //串行口中断允许位
SM1=1; //选择模式1
SM0=0; //选择模式1
while(1)
{
/*if(RI==1)
RI=0;
P0=SBUF;
*/
if(flag==1) //标志位
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
flag=0;
SBUF=a; //再将a送给SBUF ??????
while(!TI); //送数据。。。。。检测TI是否为1,串行发送停止位的中间时 由内部硬件使RI置1,开中断,后人工置0
TI=0;
ES=1;
}
}
}
void ser() interrupt 4 //进入串行中断
{
RI=0; // 接收时。。。。。 串行发送停止位的中间时 由内部硬件使RI置1,开中断,后人工置0
P1=SBUF; //P1接收SBUF中的数据
a=SBUF; //将SBUF送给a
flag=1; //开启标志位
}
作者:
yesonjob
时间:
2015-6-2 08:19
这个是郭老师教材上面的程序,串口中断服务程序里面,把上位机发送给单片机的数据给a,然后置flag=1,返回主函数之后,
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
就首先把“I get ”这六个字符发送给上位机。
SBUF=a; //再将a送给SBUF ??????
这句的意思就是接着把刚才单片机接收到的a也发送给上位机咯。
这样上位机发送一个字符x后,单片机就会马上返回一个I get x
在这里有个小小的技巧,自己一直在用也觉得很好记忆。在串口通信中肯定存在SBUF这寄存器赋值的情况,我就这样理解,等号一边是寄存器另外一边是单片机,比如SBUF=a,那么a就是单片机,单片机赋值给SBUF,很明显就是单片机发送数据,反之a=SBUF就是寄存器赋值给单片机,就是单片机接收数据。
作者:
yesonjob
时间:
2015-6-2 19:36
之前搞错了没看到你的提问。
波特率要用定时器0产生,TMOD=0x02;
串口助手波特率要与设置一致;
串口助手接收与发送的类型要相同,同是文本或16进制数据。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1