当前位置: 代码迷 >> 单片机 >> 模拟串口函数,发一般,收只能收到一半
  详细解决方案

模拟串口函数,发一般,收只能收到一半

热度:68   发布时间:2016-04-28 15:10:25.0
模拟串口函数,发正常,收只能收到一半
#include <reg52.h>  
#define uchar unsigned char  
  
sbit P1_0 = 0x90;  
sbit P1_1 = 0x91;  
sbit P1_2 = 0x92;  
sbit A1 = P2^0; 
#define RXD P1_0  
#define TXD P1_1  
#define WRDYN 44                    //写延时  
#define RDDYN 43                    //读延时  
  
void Delay2cp(unsigned char i);  
void WaitTF0( void );  
void SPI2int();
void WByte(uchar);
void RByte(uchar);
void SendStr(unsigned char *s)
#define TM0_FLAG P1_2               //设传输标志位  
  
//计数器及中断初始化  
void SPI2int(void)  
{  
    TMOD |=0x02;                    //计数器0,方式2  
    TH0=0xA0;                       //预值为256-96=140,十六进制A0  
    TL0=TH0;          
    TR0=0;                          //在发送或接收才开始使用  
    TF0=0;   
    ET0=1;                          //允许定时器0中断  
    EA=1;                           //中断允许总开关  
}  
  
//发送一个字符  
void WByte(uchar input)  
{  
     //发送启始位  
     uchar i=8;  
     TR0=1;  
     TXD=(bit)0;  
     WaitTF0();  
  
     //发送8位数据位  
     while(i--)  
     {  
         TXD=(bit)(input&0x01);   //先传低位  
         WaitTF0();  
         input=input>>1;  
     }  
  
     //发送校验位(无)  
  
     //发送结束位  
     TXD=(bit)1;  
     WaitTF0();  
     TR0=0;  
}  
  
//接收一个字符  
uchar RByte()  
{  
    uchar Output=0;  
    uchar i=8;  
    TR0=1;                          //启动Timer0  
    TL0=TH0;  
    WaitTF0();                      //等过起始位  
  
    //发送8位数据位  
    while(i--)  
    {  
        Output >>=1;  
        if(RXD)  
            Output   |=0x80;        //先收低位  
        WaitTF0();                  //位间延时  
    }  
    while(!TM0_FLAG) if(RXD) break;  
  
    TR0=0;                          //停止Timer0  
  
    return Output;  
}  
  
//中断1处理程序  
void IntTimer0() interrupt 1  
{  
     TM0_FLAG=1;                    //设置标志位。  
}  
  
//查询传输标志位  
void WaitTF0( void )  
{  
    while(!TM0_FLAG);   
  相关解决方案