当前位置: 代码迷 >> 单片机 >> i/o口模拟的串口怎么应用
  详细解决方案

i/o口模拟的串口怎么应用

热度:101   发布时间:2016-04-28 15:12:32.0
i/o口模拟的串口如何应用?
用i/o口模拟的串口怎么用?


void delay_bps()
{
unsigned char i; 
for (i = 0; i < 29; i++); 
_nop_();
_nop_();
} //波特率9600 模拟一个9600波特率

unsigned char getchar2() //模拟接收一个字节数据
{
while (RXD1);
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    delay_bps();
    SBUF1_bit0 = RXD1; //0       
    delay_bps();
    SBUF1_bit1 = RXD1; //1       
    delay_bps();
    SBUF1_bit2 = RXD1; //2       
    delay_bps();
    SBUF1_bit3 = RXD1; //3       
    delay_bps();
    SBUF1_bit4 = RXD1; //4       
    delay_bps();
    SBUF1_bit5 = RXD1; //5       
    delay_bps();
    SBUF1_bit6 = RXD1; //6       
    delay_bps();
    SBUF1_bit7 = RXD1; //7       
 delay_bps();
    return(SBUF1) ;      //返回读取的数据
}

void  putchar2(uchar input)    //模拟发送一个字节数据
{
    SBUF1 = input;
    TXD1 = 0;  //起始位
    delay_bps();    
    TXD1 = SBUF1_bit0;  //0
    delay_bps();    
    TXD1 = SBUF1_bit1;  //1
    delay_bps();    
    TXD1 = SBUF1_bit2;  //2
    delay_bps();    
    TXD1 = SBUF1_bit3;  //3
    delay_bps();    
    TXD1 = SBUF1_bit4;  //4
    delay_bps();    
    TXD1 = SBUF1_bit5;  //5
    delay_bps();    
    TXD1 = SBUF1_bit6;  //6
    delay_bps();    
    TXD1 = SBUF1_bit7;  //7
    delay_bps();    
    TXD1 = 1;       //停止位
    delay_bps();    

按照昨天版主说的方法

void SPI_Init2(void)   //  模拟的串口初始化
{

 TXD1=1;
 RXD1=1;
}

我在main函数里 void main(void)
 {
     SPI_Int2();
      Delay_ms( 1000);
       putchar2( s3 );
        Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);
 Delay_ms( 1000);



Delay_ms()是我定义的延时函数
我想用putchar2输出我的字符串,但是我我在串口精灵上压根看不到。。有人指点一下么。。

------解决方案--------------------
原因很多
1. TXD,RXD接反了
2. 波特率误差太大
3. MAX232没有或者接错线导致没工作
------解决方案--------------------
有条件的话最好接个示波器看你的TXD脚的输出是否有,是否与你想要发送的一致,再看看你发送的每一位的位宽是否是104us(9600波特率),先看是否发送正确再找接收端的原因。
------解决方案--------------------
不管波特率是否正确,如果TXD有输出,在串口精灵上应该有数据,串口精灵必须采用16进制的方式读取数据。如果有数据了,但数据不正确,就是波特率不对,最好用示波器一边看波形,一边调整参数。

------解决方案--------------------
如果你用的接口不是标准的串口的话,你就需要通过I/O口按位发送来模拟了!
------解决方案--------------------
我提一点意见:如果要用IO模拟串口,死延时的确是一种方法,但却是最不实用的一种,建议用中断来按位发,这样不仅误差小,更重要的是不占用单片机资源!
  相关解决方案