qq_33787388 2016-07-08 13:56 采纳率: 0%
浏览 1542

stc io模拟串口接收端

stc12c5a60s2 io模拟串口接收端(Rxd)接收波特率1200bps的数据,在通过单片机实际串口1以波特率9600bps发送到上位机,出现问题只有串口一发送1200bps才能得到正确地数据!求哪里出问题啦

``#include
#include
#include
typedef unsigned char uchar;
#define F11_0592

uchar tmpbuf2[64]={0}; //用来作为模拟串口接收数据的缓存
struct
{ uchar recv :6; //tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中
uchar send :6; //tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口
}tmpbuf2_point={0,0};
sbit newRXD=P2^2; ////模拟串口的接收端设为P2.2
void UartInit()
{ SCON=0x50 ; // SCON: serail mode 1, 8-bit UART

TMOD|=0x20 ; // TMOD: timer 1, mode 2, 8-bit reload,自动装载预置数(自动将TH1 送到TL1);T0工作在方式1,十六位定时
PCON|=0x80; // SMOD=1
TH1=0xa0; // Baud:9600 fosc=11.0592MHz 9600bps为从串口接收数据的速率

TL1=0xa0; // 计数器初始值,fosc=11.0592MHz 因为TH1一直往TL1送,所以这个初值的意义不大
TR1=1; // 启动TIMER1,用于产生波特率
TH0=0xFF; // 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps
TL0=0xA0 ; // 定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bps
TF0 = 0; //清除TF0标志
IT0=1 ; //设置外部中断0为边沿触发方式
//TR0=1;
}

void WaitTF0(void)
{ TF0=0;
while(!TF0);

  TF0=0 ;       

 //TH0=0xFF; // 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz     
// TL0=0xA0; // 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz

}
uchar RByte()
{ uchar Output=0;
uchar i=8 ;

// TR0=1 ; //启动Timer0
TH0=0xFF; // 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz

TL0=0xA0; // 定时器重装初值 模拟串口的波特率为9600bps fosc=11.0592MHz
TF0=0;
WaitTF0();//等过起始位 //接收8位数据位
while(i--)

{ Output>>=1;

if(newRXD)Output|=0x80; //先收低位

WaitTF0();//位间延时
}
// while(!TF0) if(newRXD) break; //此句和下一句不能加,如果加上了将导致耗时过长,影响下一个字节的接收 //

// WaitTF0();

// TR0=0; //停止Timer0
return Output ;
}

//向COM1发送一个字符 void SendChar(uchar byteToSend)//
void SendChar(uchar byteToSend)
{ SBUF=byteToSend ;
while(!TI);
TI=0;
}
void main()
{
UartInit();
Timer0Init();
while(1)
{

       if(tmpbuf2_point.recv!=tmpbuf2_point.send)//差值表示模拟串口接收数据缓存中还有多少个字节的数据未被处理(发送至串口)
        {
              SendChar(tmpbuf2[tmpbuf2_point.send++]); 

         }
  }

}
//外部中断0,说明模拟串口的起始位到来了
void Simulated_Serial_Start()interrupt 0
{
EX0=0 ; //屏蔽外部中断0

tmpbuf2[tmpbuf2_point.recv++]=RByte();//从模拟串口读取数据,存放到tmpbuf2数组中
IE0=0; //防止外部中断响应2次,防止外部中断函数执行2次
EX0=1 ; //打开外部中断0

}

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料