Atmega128串口485通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
软件环境:ICC AVR 6.31A
硬件平台:atmega128a
实现UART0的半双工485通信,中断方式接受,查询方式发送。485的收发控制引脚为PE2。
供大家学习交流使用
}
1,以下是delay.h文件
#ifndef _delay_h_
#define _delay_h_
//void delay_nus(unsigned int n);
//void delay_nms(unsigned int n);
//void delay_1us(void);
//void delay_1ms(void);
void delay_1us(void) //1us延时函数
{
NOP();
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i } void delay_1ms(void) //1ms延时函数 { unsigned int i; for (i=0;i<1140;i++) ; } void delay_nms(unsigned int n) //N ms延时函数 { unsigned int i=0; for (i=0;i } #endif /*********** 2,以下是uart.h头文件 /***********uart.h 使用端口:uart0及控制端口PE2; uart1及控制端口PD4 晶振:11.0592M 查询方式发送,中断接收。 *************************************************/ #ifndef _uart_h #define _uart_h #include #include #include "delay.h" #define fosc 11059200 #define baud 9600 #define uchar unsigned char //#define amount 8 //data amount //uchar inbox[amount]; //transmited and received data buff. //uchar buff = 0; //unsigned char inbox[10]; /****uart0 initialize************/ void Uart0_initial(void) { UCSR0B = 0x00;// disable while setting uart UCSR0A = 0x00; UCSR0C = (1< UBRR0L = (fosc/16/(baud+1))%256;//此公式为datasheet上,是正确的// UBRR0H = (fosc/16/(baud+1))/256;//网上例程很多用baud+1,经试验不行// UCSR0B = (1< DDRE |= BIT(PE2); // RXD0 enable. } /**uart1 initialize**************/ void Uart1_initial(void) { UCSR1B = 0x00;//disable while setting uart UCSR1A = 0x00; UCSR1C = (1< UBRR1L = (fosc/16/baud-1)%256; UBRR1H = (fosc/16/baud-1)/256; UCSR1B = (1< DDRD |= BIT(PD4); //RXD1 enable. } /***uart0 transfer one char****/ void putchar0(uchar c) { PORTE &=~ BIT(PE2); delay_nms(5); while (!(UCSR0A&(1< UDR0 = c; delay_nms(5); //PORTE |= BIT(PE2); } /***uart0 transfer char strings***/ void puts0(uchar *s) { uchar k=0; CLI(); //PORTE &=~ BIT(PE2); delay_nms(5); while (k<8) { putchar0(*s); s++; k++; } PORTE |= BIT(PE2); delay_nms(3); SEI(); } /****uart1 transfer one char **/ void putchar1(unsigned char c) { CLI(); PORTD &=~ BIT(PD4); while (!(UCSR1A&(1< UDR1 = c; SEI(); //PORTD |= BIT(PD4); //set as RX after TX. } /***uart1 transfer char strings**/ void puts1(uchar *s) { while (*s) { putchar1(*s);