51单片机串口通讯问题!那位大侠能帮助我嗯!

我想通过串口向单片机发送一个字符,然后让单片机去判断,然后去执行其他的操作!
现在就是判断那里有问题!请大虾指导!
好像是接收的数据类型的问题!
#include <AT89X51.H>//单片机51头文件,存放着单片机的寄存器
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
void Init_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////
{
Init_Com();//串口初始化
// P1=0xf0;
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat

RI=0; //RI清零。 ??、、
if(dat==00000001)
{d1=1;
d2=1;
d3=1;

}
}
if(TI) //如果是发送标志位,清零
TI=0;

}

}
我是想先判断接收到的数据再做操作,p1.0 p1.1 p1.2 p1.3 来驱动L298,比如:pwm调速,正反转,步进电机的控制等!

第1个回答  2013-04-12
单片机接收的数据一般都是十六进制的数,所以说你dat==00000001 你这句话,最好改成0x01
还有你最好在if(dat==00000001)后加上dat=SBUF,使用串口调试助手测试,发送0x01看看你的硬件有没有连通。 以上还有你在电脑上发送的1,2,3,4,5是采用十六进制还是十进制。。这些东西对于在单片机中的判断很重要。
第2个回答  2013-04-12
将SBUF的值传到P1,P2口上,用万用表检测高低电平。就是写一个P1=SBUF的语句,然后万用表检测电平,例如SBUF=0x01的话,P1^0为高电平,其余P1针脚为低电平。追问

我是想先判断接收到的数据再做操作,p1.0 p1.1 p1.2 p1.3 来驱动L298,比如:pwm调速,正反转,步进电机的控制等!

追答

你先进行串口的检测,串口传输没问题了再删掉那句话就好了,这就是一个测试串口的语句,不会在最终程序中出现。

追问

你好,现在串口没问题就是判断那块过不去,我现在把程序改成这样还是不行!P1口的4个二极管根本就不亮!
if(dat==0x01)
{d1=0;
d2=0;
d3=0;

}
else
d1=1;
d2=1;
d3=1;

追答

首先,判断你的灯是不是正常的,然后,你所说的串口没问题指的是什么?你是怎么认为是在判断这里过不去的,如果是判断过不去就是说明,你的dat不是0x01,那么也就是说你串口或许没工作或许工作不正常,导致数据有误。检查串口配置,和波特率等问题,还有就是其它网友所说的,你发的数据对不对。

第3个回答  2013-04-15
#include ?????后面没了???
if(data==0x01)才对,不然是十进制,sbuf是八位的最大255
给分给分
第4个回答  2013-04-12
猜测: 是不是你主机发送的是字符啊. 这样呢if(dat=='1')追问

但是我好像在网上看到串口传过来的是1的ascll码!搞不懂!

追答

    我只是猜测,毕竟我不确定你怎么传的,只是提供一个思路,  你可以改下判断条件测试下吧.. if(dat=='1')或者 if(dat==0x31) 

追问

谢谢你!我是用串口助手试的我改成你说的那样还是不行的!

第5个回答  2013-04-14
串口传过来的确实是ASCII码 改成if(dat==0x49)
相似回答