之前發了個帖子,沒有人回,自己琢磨了幾天,基本實現了功能,但是還有問題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); //結尾發送回車換行
}
|