用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模拟串口,死延时的确是一种方法,但却是最不实用的一种,建议用中断来按位发,这样不仅误差小,更重要的是不占用单片机资源!