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

用i/o口模拟串口解决方案

热度:84   发布时间:2016-04-28 15:13:24.0
用i/o口模拟串口
在网上看了三种方法,但是我用着都实现不了。。代码复制上去,就是不能实现。

------解决方案--------------------
引用:
Quote: 引用:


sbit TXD1 = P0^1; //定义模拟输出脚
sbit RXD1 = P0^2;   //定义模拟输入脚

bdata unsigned char SBUF1;   //定义一个位操作变量
sbit SBUF1_bit0 = SBUF1^0;
 sbit SBUF1_bit1 = SBUF1^1;
 sbit SBUF1_bit2 = SBUF1^2;
 sbit SBUF1_bit3 = SBUF1^3;
 sbit SBUF1_bit4 = SBUF1^4;
 sbit SBUF1_bit5 = SBUF1^5;
 sbit SBUF1_bit6 = SBUF1^6;
 sbit SBUF1_bit7 = SBUF1^7;

 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()的一半
     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(unsigned char 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();    
 }

不懂"直接用貌似没法用"

要个初始化的,主要就是开机时TXD,RXD保持高电平
最好弄个逻辑分析仪看下时间到底对不对


这个怎么初始化?
void SPI_Init( void )
{
 
  TMOD = 0x20;  //定时器工作方式2,初值自动装入
  PCON = 0x00;  //波特率不增倍
  SCON = 0x50;  //串行工作方式设定
        TH1 = 0xFD;   //定时器初值高位
        TL1 = 0xFD;   //定时器初值地位
        TR1 = 1;      //启动定时器
  ES = 1;       //串口中断开关,当ES置0时,只有串口终端不响应    
}
这是原来的那个串口初始化,我再定义一个void SPI_Init2( void )?这个串口该怎么初始化?

因为你现在这个是延时控制时间的,所以定时器设置不用管了

void init_uart(void)
{
  TXD1=1;
  RXD1=1;
}

其他的只要延时够精确就没什么问题了,一般都是高位先发,不过你自己收发都低位先也没什么
  相关解决方案