|
本帖最后由 红尘笑客288 于 2013-10-23 21:03 编辑
我用51单片机自己写了一个串口控制的程序。但是现在是,用电脑控制,传回的数据就和发的数据一样。但是用手机控制就,不可以,而且回传的数据多数时候都错位了。大侠们怎么办呢?下面是我写的程序,希望大家看看!
补充说明一点,那就是我的这个703N的信号是直接接在单片机RXD端的,我刚才看见论坛里面的帖子,说要先把703N接MAX232再接单片机,请问是不是这个的问题?
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Uart[5];
uint i=0;
bit flag;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
/**************
*函数名称: go
*函数功能: 前进
*函数调用: 无
*入口参数: 无
*出口参数: 无
*************/
void go()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
/**************
*函数名称: back
*函数功能: 后退
*函数调用: 无
*入口参数: 无
*出口参数: 无
*************/
void back()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
/**************
*函数名称: left
*函数功能: 左转
*函数调用: 无
*入口参数: 无
*出口参数: 无
*************/
void left()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
/**************
*函数名称: right
*函数功能: 右转
*函数调用: 无
*入口参数: 无
*出口参数: 无
*************/
void right()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void Play_Decode()
{
switch(Uart[2])
{
case 0x00:stop(); return;
case 0x01:back(); return;
case 0x02:go(); return;
case 0x03:left(); return;
case 0x04:right(); return;
default: return;
}
}
/******************
*串口方式1初始化
****************/
void UART_Init(void)
{
SCON = 0x50; //串口方式1(8位UART,波特率可变),允许接收
TMOD =0x20; //T1定时器,工作2模式(8位自动重装)
PCON=0x00; //波特率不加倍
TH1 = 0xfd; //设置定时器初值(9600的波特率)
TL1 = 0xfd;
EA=1; //开总中断
TR1=1; //开定时器中断
ES=1; //开串口中断
}
void Uart_Send(uchar date)
{
ES=0;
SBUF = date; //数据给SBUF缓冲区
while(!TI); //等待发送完毕(在发送时TI为0,)
TI=0;
ES=1; //发送标志位清零
}
void main()
{
uint j;
UART_Init();
while(1)
{
Play_Decode();
if((i==5)&&(flag==1))
{
ES=0;
i=0;
for(j=0;j<5;j++)
{
Uart_Send(Uart[j]);
}
ES=1;
}
}
}
void Uart_Receive(void) interrupt 4
{
if(TI==1)TI=0;
if(RI==1) //查询接收标志位(有数据发送过来时置为1)
{
ES=0;
RI =0;
Uart=SBUF;
i=i+1;
flag=1;
ES=1;
}
}
|
|