找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2738|回復(fù): 2
收起左側(cè)

AVR單片機(jī)串口單線半雙工

[復(fù)制鏈接]
ID:154686 發(fā)表于 2019-1-18 13:34 | 顯示全部樓層 |閱讀模式
200黑幣
之前發(fā)了個(gè)帖子,沒(méi)有人回,自己琢磨了幾天,基本實(shí)現(xiàn)了功能,但是還有問(wèn)題http://www.torrancerestoration.com/bbs/dpj-148913-1.html


實(shí)現(xiàn)方法,串口信號(hào)線連接單片機(jī)的RX腳.然后單片機(jī)的RX和TX中間用一個(gè)100歐姆的電阻串聯(lián)


這樣做的話,單片機(jī)發(fā)出的數(shù)據(jù)可以通過(guò)RX腳傳輸?shù)絇C機(jī)上

數(shù)據(jù)顯示正常.但是如果PC機(jī)向單片機(jī)發(fā)數(shù)據(jù),PC機(jī)自己的信號(hào)無(wú)法收到,(即無(wú)法自發(fā)自收,此時(shí)PC串口的RXTX是用680歐姆的電阻短接的,
如果串口信號(hào)單線空置的話,是可以自發(fā)自收)

同時(shí),收到單片機(jī)返回的信號(hào)也是有問(wèn)題的,比如PC發(fā)送123456789,收到的返回?cái)?shù)據(jù)是13579,中間都漏一位

希望有人能解答我的困惑,多謝了

以下是程序代碼,
發(fā)送數(shù)據(jù)時(shí)關(guān)閉單片機(jī)的接收功能,避免單片機(jī)自發(fā)自收進(jìn)出串口接收中斷
發(fā)送完畢后打開(kāi)單片機(jī)的發(fā)送功能
#include <avr/io.h>        
#include <util/delay.h>
#include <avr/interrupt.h>   //中斷函數(shù)頭文件

//常量聲明
#define BAUD 9600
//全局變量聲明
unsigned char Transmit;

//函數(shù)聲明
void Port_Init(void);   //端口初始化配置
void Usart_Init(void);  //USART寄存器設(shè)置
void Usart_PutChar(unsigned char cTXData);  //字節(jié)發(fā)送函數(shù)
void Usart_PutString(unsigned char *pcString);

int main(void)            
{
        Port_Init();
        Usart_Init();

        sei();
        Usart_PutChar(0x31);

        while(1)
        {
                Usart_PutString("ABCC");
                _delay_ms(500);
        }
}

//端口狀態(tài)初始化設(shè)置函數(shù)
void Port_Init()
{
        PORTD = 0X00;          //USART的發(fā)送接收端口分別為PD0和PD1
        DDRD |= (1 << PD1);   //PD0為接收端口,置為輸入口;PD1為發(fā)送端口,置為輸出口
}

//USART寄存器配置函數(shù)
void Usart_Init()
{
    UCSR0C &= ~(1 << UCSZ00) ;  
    UCSR0C |= (1 << USBS0) ;  //異步,數(shù)據(jù)格式7,N,1
          UCSR0B |= (1 << TXCIE0) |(1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);    //發(fā)送使能,接收使能,接收中斷使能
    unsigned int UBRR;
    UBRR = F_CPU/16/BAUD - 1;
    UBRR0H = (uint8_t)(UBRR>>8);
    UBRR0L = (uint8_t)(UBRR);  //設(shè)置波特率
        }

//字節(jié)發(fā)送函數(shù)
void Usart_PutChar(unsigned char cTXData)
{
        UCSR0B &= ~(1 << RXEN0);
        while( !(UCSR0A & (1 << UDRE0)) );  //只有數(shù)據(jù)寄存器為空時(shí)才能發(fā)送數(shù)據(jù)
        {
        UDR0 = cTXData;                         //發(fā)送數(shù)據(jù)送USART I/O數(shù)據(jù)寄存器-UDR
        }
}

//接收中斷函數(shù)
ISR(USART0_RX_vect )
{

        unsigned char Rev0;
        Rev0 = UDR0;
        Usart_PutChar(Rev0);
  //從USART I/O數(shù)據(jù)寄存器-UDR中讀出數(shù)據(jù)
        if (Rev0==0x12)   //將接收到的數(shù)據(jù)發(fā)送
          {
          PORTA=0X00;
        DDRA=0XFF;
          }
}

ISR(USART0_TX_vect )
{
        cli();
        UCSR0B |= (1 << RXEN0 );  
        sei();
}


void Usart_PutString(unsigned char *pcString)
{
        while (*pcString)
        {
                Usart_PutChar(*pcString++);
        }
        Usart_PutChar(0x0D);
        Usart_PutChar(0x0A);  //結(jié)尾發(fā)送回車換行
}




回復(fù)

使用道具 舉報(bào)

ID:439075 發(fā)表于 2019-1-20 13:22 | 顯示全部樓層
建議你把用電阻的方法改為用電子開(kāi)關(guān)來(lái)解決半雙工的問(wèn)題,
回復(fù)

使用道具 舉報(bào)

ID:154686 發(fā)表于 2019-1-21 08:40 | 顯示全部樓層
bucker 發(fā)表于 2019-1-20 13:22
建議你把用電阻的方法改為用電子開(kāi)關(guān)來(lái)解決半雙工的問(wèn)題,

那樣是簡(jiǎn)單很多,但是項(xiàng)目限定了實(shí)現(xiàn)方法,只能加電阻和對(duì)程序修改
多謝你的回復(fù)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表