久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2657|回復: 2
打印 上一主題 下一主題
收起左側

AVR單片機串口單線半雙工

[復制鏈接]
跳轉到指定樓層
樓主
ID:154686 發表于 2019-1-18 13:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
200黑幣
之前發了個帖子,沒有人回,自己琢磨了幾天,基本實現了功能,但是還有問題http://www.zg4o1577.cn/bbs/dpj-148913-1.html


實現方法,串口信號線連接單片機的RX腳.然后單片機的RX和TX中間用一個100歐姆的電阻串聯


這樣做的話,單片機發出的數據可以通過RX腳傳輸到PC機上

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

同時,收到單片機返回的信號也是有問題的,比如PC發送123456789,收到的返回數據是13579,中間都漏一位

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

以下是程序代碼,
發送數據時關閉單片機的接收功能,避免單片機自發自收進出串口接收中斷
發送完畢后打開單片機的發送功能
#include <avr/io.h>        
#include <util/delay.h>
#include <avr/interrupt.h>   //中斷函數頭文件

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

//函數聲明
void Port_Init(void);   //端口初始化配置
void Usart_Init(void);  //USART寄存器設置
void Usart_PutChar(unsigned char cTXData);  //字節發送函數
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);
        }
}

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

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

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

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

        unsigned char Rev0;
        Rev0 = UDR0;
        Usart_PutChar(Rev0);
  //從USART I/O數據寄存器-UDR中讀出數據
        if (Rev0==0x12)   //將接收到的數據發送
          {
          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);  //結尾發送回車換行
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:439075 發表于 2019-1-20 13:22 | 只看該作者
建議你把用電阻的方法改為用電子開關來解決半雙工的問題,
回復

使用道具 舉報

板凳
ID:154686 發表于 2019-1-21 08:40 | 只看該作者
bucker 發表于 2019-1-20 13:22
建議你把用電阻的方法改為用電子開關來解決半雙工的問題,

那樣是簡單很多,但是項目限定了實現方法,只能加電阻和對程序修改
多謝你的回復了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人一区二区三区 | 中文字幕日韩在线 | 亚洲男人的天堂网站 | 国产www成人 | 91极品欧美视频 | 丁香综合 | 亚洲精品视频网站在线观看 | 91不卡在线| 99成人在线视频 | 成人欧美一区二区三区白人 | 成人影院免费视频 | 欧美在线视频一区 | 香蕉一区二区 | 福利精品 | 成人特级毛片 | 性欧美xxxx | 国产综合久久 | 成人午夜影院 | 中文av字幕 | 我我色综合 | 一级免费看 | www.4hu影院 | 国产精品久久久久久久久久尿 | 国产精品毛片一区二区三区 | 日本一道本视频 | 亚洲视频一区在线观看 | 日韩欧美二区 | 亚洲www | 午夜欧美a级理论片915影院 | 中文字字幕一区二区三区四区五区 | 一区二区三区在线 | 精品美女视频在免费观看 | 国产精品日韩欧美一区二区三区 | 欧美一区二区三区视频在线播放 | 美女天堂| 亚洲精品乱码久久久久久按摩 | 国产一区久久 | 中文字幕在线观看精品 | 久久精品视频免费看 | 成人在线 | 黄色大片视频 |