单片机串口

来源:百度知道 编辑:UC知道 时间:2024/05/12 03:21:59
我想研究单片机的串口接收,
单片机通过串口和电脑连接,利用串口调试助手向单片机发送一个字节数据,如果单片机接收到正确的数据,led亮。
我通过单片机可以向串口调试助手发送数据,但是反过来,想通过串口调试助手向单片机发送数据总是不成功,请高手指点一下
#include<reg51.h>
#include <intrins.h>
sbit p1=P1^1;
sbit p2=P1^2;

unsigned char a;

delay(unsigned char ms)
{ // 延时子程序
unsigned char i;
while(ms--)
{
for(i = 0; i< 200; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

void ints() interrupt 4 using 0 //串口中断
{

a=SBUF;

delay(10);
RI=0;

}

void main()
{

SCON=0x40;
TMOD=0x20; /* MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB TR1;启动定时器T1
;以上完成通讯初始化设 */
PCON=0x80;
TH1=0xF3;

把死循环里改一下:

while(1)
{
if(a==6)
{
p1=!p1;
}
else
{
p2=!p2;
}

delay(250); //250ms,变化效果明显一点
}

如果上面这样改后,还是不能通讯,你要看以下两个问题:
1、用数字示波器看单片机接收端能否接收到电脑传来的数据,判断硬件是否连接正常。电脑串口DB9上的第五脚要与单片机系统共地,这些东西都别忽略了。
2、好好看看单片机通讯设置的数据格式是否与电脑上串口调试小程序中的数据格式是否一致,不止包括波特率,还有起始位,校验位,停止位等,是否确定完全一致?如果不一致,上位机发十六进制数06,下位机接收到的就不一定是06,很可能是其它数字,这是两端通讯设置问题,往往容易出错。

我没有用C语言来写过这个..
不过,建议你看一下,你的串口调试助手是不是设置对了,发送数据的时候,选成按16进制发送,如果不选的话,接收到的数据要减去48,这个应该是和发送的是字符,而单片机收到的是ASCII码..比如你直接发送0,单片机接收到的可能就是,48...
希望对你有帮助..

在我的博客上有相关的回答,其实很简单,就是传送的ASII码,你想传6(if(a==6) )
,其实传的是36H,我的博客上有比好的参考程序,你可以去看看.