|
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ā)送回車換行
}
|
|