你也许不知道,新手会以你的程序为摸板来完成自己的功能!
第一个程序没有问题,我写的:
//11.0592mhz 4800波特率
//如果接收到$,亮灯指示
#include <at89x52.h>
#define uchar unsigned char // one byte
sbit leddisplay = p2^0;
void main(void)
{
uchar temp;
scon = 0x50; //串口方式1,允许接收
tmod = 0x20; //定时器1定时方式2
//tcon = 0x40; //设定时器1开始计数
th1 = 0xfa; //11.0592mhz 4800波特率
tl1 = 0xfa;
tr1 = 1; //启动定时器
p2 = 0x00;
while(1)
{
if(ri) //接受中断处理
{
temp = sbuf;
if('$' == temp)
//if(65 == temp) //!!!!不能够为"a",字符串
leddisplay = !leddisplay; //逻辑非
p1 = ~temp; //按位非
ri = 0;
}
}
}
第二个是依照你的程序改写的,害死我,最后是别人帮助我找到问题的。虽然用在自己的情况可能没有问题,但是还是要注意严谨!!
//11.0592mhz 4800波特率
//如果接收到$,亮灯指示
//判断是接收到a 有效定位,还是v 无效定位
#include <at89x52.h>
#define uchar unsigned char // one byte
sbit leddisplay = p2^0;
void main(void)
{
uchar temp;
uchar snmea[79] = {0}; //加上“$”和“cr/lf”,每句最到有80个字符。
uchar i = 0;
uchar flag = 0;
scon = 0x50; //串口方式1,允许接收
tmod = 0x20; //定时器1定时方式2
//tcon = 0x40; //设定时器1开始计数
th1 = 0xfa; //11.0592mhz 4800波特率
tl1 = 0xfa;
tr1 = 1; //启动定时器
//p2 = 0x00;
while(1)
{
if(ri)
{
temp = sbuf;
if('$'==temp)
flag = 1;
if(1==flag)
snmea[i++] = temp;
if(13==temp)
{
if('c'==snmea[4])
if('v'==snmea[17])
leddisplay = !leddisplay; //逻辑非
flag = 0;
i = 0;
}
}
ri=0;
}
}
附件为这2个程序的压缩包: