Atmega128串口485通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档