AVR单片机串口多机通讯程序

合集下载

单片机多机通信实现

单片机多机通信实现

单片机多机通信实现随着科技的进步和应用的需求,单片机成为了嵌入式系统中不可或缺的一部分。

在很多应用场景中,我们需要将多个单片机之间进行通信,以实现数据的传输和协同工作。

本文将介绍单片机多机通信的实现方法。

一、串口通信串口通信是最常见和简单的单片机通信方式之一。

单片机通过串口将数据以字节的形式传输给另一个单片机。

常见的串口通信协议有RS232、RS485和UART等。

其中,RS232是单片机与计算机之间的标准通信协议,而RS485适用于单片机与多个设备之间的通信。

串口通信需要注意以下几个方面:1. 波特率的设置:通信双方需要设定相同的波特率,以确保数据的准确传输。

2. 数据格式的规定:包括数据位、校验位和停止位等,通讯双方需要设置相同的数据格式。

3. 通信控制的实现:通过编程控制单片机的串口发送和接收功能,实现数据的传输。

二、I2C通信I2C(Inter-Integrated Circuit)是一种串行总线协议,它可实现多个单片机的通信和协同工作。

I2C通信需要引入一个主设备和多个从设备的概念,主设备控制通信的起止和数据的传输,从设备用于接收和发送数据。

I2C通信需要注意以下几个方面:1. I2C地址的分配:每个从设备通过唯一的地址与主设备进行通信,地址的分配需要事先规划好。

2. 数据的读写操作:通过发送特定的控制信号,主设备可以向从设备发送读或写的命令,并接收从设备返回的数据。

3. 时序的控制:I2C通信依赖于时钟信号和数据信号的同步,通信双方需要根据协议规定好时序的控制。

三、SPI通信SPI(Serial Peripheral Interface)通信是一种全双工、同步的通信协议。

它通过4根线进行通信,包括时钟、数据输入、数据输出和片选信号。

SPI通信适用于多个主设备与多个从设备之间的通信,可以实现数据的传输和设备的控制。

SPI通信需要注意以下几个方面:1. 主从设备的选定:SPI通信中,每次只有一个主设备能够与从设备进行通信,其他设备通过片选信号进行选择。

avr单片机SPI双机通信

avr单片机SPI双机通信
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
spi_init();
sei();//开全局中断
}
//主函数
int main(void)
{
init_devices();
SPCR = 0xF1;
SPSR = 0x01;
}
SIGNAL(SIG_SPI) //一个字节发送或接收完成中断
{
PORTD=SPDR;
}
void spi_write(uchar sData)//功能:使用SPI发送一个字节
{
SPDR = sData;
{
DDRA=0XFF;
PORTA=spi_read();
}
//功能:使用SPI发送一个字节
void spi_write(uchar sData)
{
SPDR = sData;
while(!(SPSR & BIT(SPIF)));
//sData=SPDR;//读从机发回来的数据
}
//主函数
int main(void)
{
init_devices();
spi_write(0X09);
while(1)
{
NOP();
}
return 0;
}
从机:
//SPI双机通信 从机
//发送0x06,PA0~3接收
//SPI双机通信 主机
//发送0x09,接收方PD0~3,对应点小灯
//包含所需头文件

AVR复习笔记--AVR单片机SPI多机通讯

AVR复习笔记--AVR单片机SPI多机通讯

AVR复习笔记--AVR单片机SPI多机通讯
最近决定复习下AVR 单片机,其实也是为了借此复习下几种简单的通
信协议,包括串口,SPI,I2­C 等。

本来以为一两个晚上就能搞定的事儿,
没想到竟耗费了一周晚上空余的时间。

当然主要是这次的要求要提高点,实现SPI 的多机通信,
不但要发数据还要回传数据。

实际中还是遇到了比我想象中要大的多的困难。

即使是现在的实现方式也不是很理想。

下面是spi 部分的代码,由于spi 接收发送用的同一终端,感觉使用起来形式
不怎么样,还是采用了轮询标志位的方式
Code#include”spi.h”staticcharmode=1;voidspi_init(charflag){chartmp=0;mode=flag; if(mode==1){DDR_SPI=(1 在我的例子中有一个主机,两个从机
进行如下通信
发送至1 号从机1 ,2
发送至2 号从机3 ,4
发送至1 号从机5 ,6
发送至2 号从机7 ,8
从机1 收到数据后回传1
从机2 收到数据后回传2
下面还是看代码
Code#include”basic.h”//自己写的常用函式#include”usart.h”//usart初始化函式
#include”spi.h”intmain(void){chartmp;usart_init(9600);spi_init(1);PORTB|=(1。

AVR单片机USART双机通讯

AVR单片机USART双机通讯

第 13 卷
本文所给出的主机的示例程序和从机的示例程序 , 已在 AVR 系列的 ATMEGA16 单片机上进行实 验并通过. 参考文献:
1] 沈文. AVR 单片机 C 语言开发入门指导[ M] . 北京: 清华大学出版社, 2003. [ [ 2] 金春林. AVR 系列单片机 C 语言编程与应用实例[ M] . 北京: 清华大学出版社, 2003. [ 3] 张军. AVR 单片机应用系统开发典型实例[ M] . 北京: 中国电力出版社, 2005. [ 4] 郝云鹏. AVR 单片机 SPI 双机通讯[ J] . 鞍山师范学院学报, 2010 , ( 4 ) : 52-53. [ 5] 郝云鹏. AVR 单片机 C 语言总纲[ J] . 鞍山师范学院学报, 2008 , ( 4 ) : 59-62. [ 6] ATMEL Corporation. AVR 单片机 ATmega16 中文说明书[ M] . 美国: ATMEL Corporation, 2001.
Abstract: This paper introduces the port connection by AVR Microcontroller USART Communication between two AVR Microcontroller, installation of UCSRB of control Register, and provides practical two programs. Key words: AVR Microcontroller; USART Communication; ATMEGA16 ( 责任编辑: 张冬冬)
AVR Microcontroller USART Communication between Two AVR Microcontroller

基于AVR单片机的串口通信

基于AVR单片机的串口通信

囝2
主从机软件部分如下: 下面为主机的初始化和中断服务程序
.include“8535def.inc”
Ij。砷reset
.clef SPldrd=r2
.clef .def .clef
tempi=r16 temp2=r17 ent=r18
.equ block0=¥0060
.dqu k啦;dI=50
·eseg
参考文献 1李勋,耿德根.AVR单片机应用技术.北京:北京航空航天
大学出版社,2000 2丁化成,耿德根,李君凯.A'VR单片机应用设计.北京:北京
航空航天大学出敝社,2002 3宋建国AVR单片机原理及应用.北京:北京航空航天大学
出舨社,2000 4耿德根,宋建国,马潮,叶勇建.AVR高速嵌人式单片机原理
本文研究的血红细胞沉降率测量仪与传统血红细胞沉降率测量仪相比较,具有以下创新点: 1)提出新的快速血红细胞沉降率测量方法,提高了血红细胞沉降率的测量速度; 2)采用CPLD和AVR单片机相结合,实现电动机的高精度、高稳定性控制,从而提高了血红细胞沉降率的测量精度; 3)在医疗设备中应用红外测量技术。 最后对设计制作的血红细胞沉降率测量仪进行了实验验证,分析了误差来源以及改进方法。实验结果表明,本文设计的ESR测量仪的测量精度高,稳 定性好,达到了设计要求。
ATMEL公司研发的AVR单片机提供一个同步串行通信接口SPI(Serial Peripheral Interface),用户能够通过计算机的并行接口或串行接口对其内部程 序存储器编程.实际上,利用串口实现AVR单片机ISP(In Sys-tern Programmable)功能就是使用计算机的串口来驱动AVR单片机ISP串行编程所需的信号波 形,从而实现计算机对AVR单片机的编程.首先介绍AVR单片机ISP功能的原理,然后讨论利用串口实现AVR单片机ISP功能的一种方法,给出编程电缆原理图、 编程电缆监控程序通信协议和编程工具软件.

基于AVR单片机的双机通信三种实现方式

基于AVR单片机的双机通信三种实现方式

基于A VR单片机的双机通信三种实现方式原理分析及应用比较施柏鑫北京邮电大学信息工程学院(100876)E-mail:boxin.shi@摘要:本文基于AVR单片机ATmega16的三种硬件通信方式——SPI、USART、TWI,实现两片单片机的通信。

通过分析这三种方式的硬件内部结构、寄存器的使用方法、数据传输过程及其各自的特点和扩展应用,比较他们的异同,为合理选择适当的通信方式提供了理论依据。

关键词:AVR单片机、通信、SPI、USART、TWI0.引言在很多工程应用中,一片单片机往往不能达到预期的要求。

这就需要两片或者两片以上的单片机协同工作。

实现这一问题的核心技术是单片机之间的相互通信。

Atmel公司的A VR 系列单片机支持多种硬件通信方式,根据相应的通信协议,我们可以实现单片机之间高速、可靠的数据传输。

本文以A VR单片机ATmega16为例,充分利用该芯片的硬件资源,不外接任何芯片,用三种方式——SPI、USART、TWI实现双机通信,并对三种通信方式的原理和应用进行分析和比较。

1.串行外设接口SPI串行外设接口SPI(Serial Peripheral Interface)是由Motorola公司推出的工业标准的同步串行接口,是一种全双工、四线通信的系统。

它可以用于单片机之间的互联,也可以外接支持该通信方式的外设。

ATmega16 的SPI接口支持7种可编程的比特率,可以设置传输结束中断标志、写碰撞标志检测,支持主机倍速模式和闲置模式唤醒[1]。

两片用SPI互连的单片机有主从之分,为串行传输提供时钟信号SCK的一方是主机,接受时钟的另一方为从机。

双机通信的方法是将主机和从机的四根信号线SS、SCK、MOSI、MISO直接对应相连。

ATmega16的SPI内部结构框图如图1.1所示[3]。

- 1 -图1.1 SPI内部结构框图从图中我们可以看出,ATmega16的SPI寄存器有三个:SPDR(数据寄存器),SPCR (控制寄存器)和SPSR(状态寄存器)。

单片机多机通信程序

单片机多机通信程序

单片机多机通信主机程序:#include <reg52.h> /*52系列单片机头文件*/#define uchar unsigned char /*宏定义*/#define uint unsigned int#define BN 6uchar rbuf[6]; /*接收数据存储数组*/uchar SLA VE; /*从机地址*/uchar code tbuf[6]={0x12,0x23,0x34,0x45,0x46,0x47}; /*待发送的数据*/ void err(void) /*地址错,发复位信号*/{SBUF=0xff;while(TI!=1);TI=0;}uchar master(uchar addr,uchar command) /*发送与接收功能函数*/{uchar aa,i,p;while(1){SBUF=SLA VE; /* 发呼叫地址*/while(TI!=1);TI=0;while(RI!=1);RI=0; /* 等待从机回答*/if(SBUF!=addr)err(); /* 若地址错,发复位信号*/else{ /* 地址相符*/TB8=0; /* 清地址标志*/SBUF=command; /* 发命令*/while(TI!=1);TI=0;while(RI!=1);RI=0;aa=SBUF; /* 接收状态*/if((aa&0x08)==0x08) /* 若命令未被接收,发复位信号*/{TB8=1;err();}else{if(command==0x01) /* 是发送命令*/{if((aa&0x01)==0x01) /* 从机准备好接收*/{do{p=0; /* 清校验和*/for(i=0;i<BN;i++){SBUF=tbuf[i]; /* 发送一数据*/p+=tbuf[i];while(TI!=1);TI=0;}SBUF=p; /* 发送校验和*/while(TI!=1);TI=0;while(RI!=1);RI=0;}while(SBUF!=0); /* 接收不正确,重新发送*/TB8=1; /* 置地址标志*/return(0);}else{if((aa&0x02)==0x02) /* 是接收命令,从机准备好发送*/{while(1){p=0; /* 清校验和*/for(i=0;i<BN;i++){while(RI!=1);RI=0;rbuf[i]=SBUF; /* 接收一数据*/p+=rbuf[i];}while(RI!=1);RI=0;if(SBUF==p){SBUF=0X00; /* 校验和相同发"00" */while(TI!=1);TI=0;break;}else{SBUF=0xff; /* 校验和不同发"0FF",重新接收*/while(TI!=1);TI=0;}}TB8=1; /* 置地址标志*/P2=rbuf[1];return(0);}}}}}}}void main(){TMOD=0x20; /* T/C1定义为方式2 */TL1=0xfd;TH1=0xfd; /* 置初值,波特率9600,晶振11.0592MHz */PCON=0x00; /*不倍频*/TR1=1; /*启动定时器*/SCON=0xf8; /* 串行口为方式3 */SLAVE=0x01; /*1号从机地址*/master(SLAVE,0x01);master(SLAVE,0x02);SLAVE=0x02; /*2号从机地址*/master(SLAVE,0x01);master(SLAVE,0x02);SLAVE=0x03; /*3号从机地址*/master(SLAVE,0x01);master(SLAVE,0x02);while(1);}单片机多机通信从机程序(以01H从机为例):#include <reg52.h> /*52系列单片机头文件*/#define uchar unsigned char /*宏定义*/#define SLA VE 0x01 /*1号从机地址*/#define BN 6uchar trbuf[6]={0x12,0x13,0x14,0x15,0x16,0x17}; /*发送数据存储数组*/ uchar rebuf[6]; /*接收数据存储数组*/bit tready;bit rready;void str(void); /* 发数据块函数声明*/void sre(void); /* 收数据块函数声明*/void main(void){TMOD=0x20; /*T/C1定义为方式2*/TL1=0xfd;TH1=0xfd; /* 置初值,波特率9600,晶振11.0592MHz */PCON=0x00; /*不倍频*/TR1=1; /*启动定时器*/SCON=0xf0; /*串行口为方式3*/ES=1; /*开串口中断*/EA=1; /*开串行口中断*/while(1){tready=1;rready=1;} /*假定准备好发送和接收*/}void ssio(void) interrupt 4 /*串行口中断*/{uchar a;RI=0;ES=0; /*关串行口中断*/if(SBUF!=SLAVE){ES=1;goto reti;} /*非本机地址,继续监听*/SM2=0; /* 取消监听状态*/SBUF=SLAVE; /* 从本地址发回*/while(TI!=1);TI=0;while(RI!=1);RI =0;if(RB8==1){SM2=1;ES=1;goto reti;}/* 是复位信号,恢复监听*/a=SBUF; /* 接收命令*/if(a==0x01)/* 从主机接收的数据*/{if(rready==1)SBUF=0x01;/* 接收准备好发状态*/ elseSBUF=0x00;while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8==1){SM2=1;ES=1;goto reti;}sre(); /* 接收数据*/}else{if(a==0x02) /* 从机向主机发送数据*/{if(tready==1)SBUF=0x02; /* 发送准备好发状态*/ elseSBUF=0x00;while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8==1){SM2=1;ES=1;goto reti;}str();/* 发送数据*/}else{SBUF=0x80; /* 命令非法,发状态*/while(TI!=1);TI=0;SM2=1;ES=1; /* 恢复监听*/}}reti:;}void str(void) /* 发数据块*/{uchar p,i;tready=0 ;do{p=0;/* 清校验和*/for(i=0;i<BN;i++){SBUF=trbuf[i]; /* 发送一数据*/p+=trbuf[i];while(TI!=1);TI=0;}SBUF=p; /* 发送校验和*/while(TI!=1);TI=0;while(RI!=1);RI=0;}while(SBUF!=0);/* 主机接收不正确,重新发送*/SM2=1;ES=1;}void sre(void) /* 接收数据块*/{uchar p,i;rready=0 ;while(1){p=0; /* 清校验和*/for(i=0;i<BN;i++){while(RI!=1);RI=0;rebuf[i]=SBUF; /* 接收数据*/p+=rebuf[i];}while(RI!=1);RI=0;if(SBUF==p){SBUF=0x00;break;} /* 校验和相同发"00"*/else{SBUF=0xff; /* 校验和不同发"0FF",重新接收*/while(TI==0);TI=0;}}P1=rebuf[1];SM2=1;ES=1;}。

AVR程序范例(USART串口通讯)

AVR程序范例(USART串口通讯)
RsBytes = 0; //将数组下标数RsBytes清零,以便下次使用
}
}
interrupt[USART0_RXC] void usart0_rx(void)//USART接收中断处理程序
{
temp=UDR0;
usart_char_send(temp);
//-------------------------------//利用数组RsBuf来装接收到的字符串
UBRR0H = 0x00; //波特率寄存器H:
SREG = 0x80; //开总中断
}
//*********************************// ADC模块
void adc_init(void) //ADC初始化
{
ADCSRA=0xe3;//自动转换方式:ADC使能,ADC开始转换,自动触发使能,ADC预频:8分频
RsBuf[RsBytes]=temp;
RsBytes++;
if(RsBytes>10)//如果超过10个,则清零
{
for(clear=0;clear<=10;clear++)
{
RsBuf[clear]=0;
}
//flag=0;
RsBytes=0;
}
//------------------------------//
欢迎一起交流单片机,QQ:669892537
#include "mega64.h"
#include "string.h"
#define uint unsigned int
#define uchar unsigned char
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A VR单片机串口多机通讯程序[日期:2010-09-01 ] [来源:本站原创作者:admin] [字体:大中小] (投递新闻)在多机通信过程中,所有设备的RS232接口是并在通信线上的,其中只能有一个设备为主机,其他为从机,通信由主机发起。

数据帧一般采用1位起始位、9位数据位,其中第9位(RXB8)被用作为表征该帧是地址帧还是数据帧。

当帧类型表征位为“1”时,表示该帧数据为一个地址帧;当帧类型表征位为“0”时,表示这个帧为一个数据帧。

在A VR中,通过设置从机的UCSRA寄存器中标志位MPCM,可以使能USART接收器对接收的数据帧进行过滤的功能。

如果使能了过滤功能,从机接收器对接收到的那些不是地址信息帧的数据帧将进行过滤,不将其放入接收缓冲器中,这在多机通信中有效的方便了从机MCU处理数据帧程序的编写(同标准51 结构相比)。

而发送器则不受MPCM位设置的影响。

多机通信模式允许多个从机并在通信线路上,接收一个主机发出的数据。

通过对接收到的地址帧中的地址进行解码,确定哪个从机被主机寻址。

如果某个从机被主机寻址,它将接收接下来主机发出的数据帧,而其它的从机将忽略数据帧,直到再次接收到一个地址帧。

(从机地址是由各个从机自己的软件决定的)。

对于在多机通信系统中的主机MCU,可以设置使用9位数据帧结构(UCSZ=7)。

当发送地址帧时,置第9位为“1”;发送数据帧时,置第9位为“0”。

在这种情况下,从机也必须设置成接收9位数据帧结构。

多机通信方式的数据交换过程如下:1)设置所有从机工作在多机通信模式(MPCM=1)。

2) 通信开始是由主机先发送一个地址帧,如8位数据为0X01(1号从机地址),第9位=“1”,呼叫1号从机。

3)所有从机都接收和读取该主机发出的地址帧。

在所有从机的MCU中,RXC标志位被置位,表示接收到地址帧。

4)每一个从机MCU读UDR寄存器,并判断自己是否被主机寻址。

如果被寻址,清UCSAR寄存器中的MPCM位,等待接收数据;否则保持MPCM为“1”,等待下一个地址帧的接收(该步应由用户软件处理实现):A)作为1号从机的MCU处理过程为:收到地址帧后,判定读取UDR数据0X01为自己的地址,将MPCM位置“0”,接收之后所有主机下发的数据帧,直到下一个地址帧为止。

B)其它从机MCU的处理过程:收到地址帧后,判定读取UDR数据0X01不是自己的地址,将MPCM位置“1”,这样他们将忽略主机随后发送的数据帧,直到主机再次发送地址帧。

5)当被寻址的从机MCU接收完最后一个数据帧后,将MPCM位置位,等待下一个地址帧的出现(该步也应由用户软件处理实现),然后从步骤2开始重复。

[转]例子;通讯规则:1:时钟7.3728 MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/ 2:通讯连接采用硬件MAX485,双向单工3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量)4:每个上行/下行的数据包都采用CRC8校验5:数据接收采用中断+查询的方式6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收8:从机之间不能相互通讯,必须通过主机才能交换数据9:无效地址是0,主机地址是1,从机地址是2.3.4......广播地址是255*/#include <mega8.h>#include <delay.h>#include <usart.h>#include <crc8.h> //CRC校验函数就在这个文件里面#define amount 10 //设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧)unsigned char send[amount]; //发件箱unsigned char inbox[amount]; //收件箱unsigned char n=0; //记忆中断次数//--------------------------------------------------------------------interrupt[12] Rxd_isr(void) //接收中断{unsigned char ERROR=0;if( UCSRA&4 || UCSRA&16 ) ERROR=1; //奇偶效验错误或者帧错误就记录下来inbox[n]=UDR; //保存到收件箱n++; //记忆中断次数if(ERROR) inbox[0]=0; //如果通讯有错,收件箱的地址帧就标记成无效地址0}//---------------------------------------------------------------------void main(void){usart_init(); //串口初始化UCSRA=0; //主机关闭地址筛选功能(多机通讯功能) #asm("sei") //打开全局中断while(1){//-------------与从机2对话,与其他从机对话与下面的程序类似-------------------n=0; //中断次数清0inbox[0]=0; //收件箱地址清0//请更新准备发送的数据//send[1]=?//......//send[n]=?send[0]=2; //改变这个地址就可以实现与某个从机对话send[amount-1]=crc8(send,amount-1); //计算发件箱的crc8校验码usart_out(send,amount); //将发件箱的数据send[]发送出去;//等待,从机接收到数据后会回复数据的,如果是10个字节数据量,不能少于13ms!!!//这个时间由人工计算,要考虑从机由于各种中断延长回复时间的可能delay_ms(15);//if(n<3) 如果接收到的数据还不到3个,那么就是通讯线路故障//如果收件箱已经收到amount个数据,并且crc8校验成功就...if(n==amount && inbox[amount-1]==crc8(inbox,amount-1)){if(inbox[0]==1) //如果收件箱地址帧属于本机就运行下面的测试代码{DDRD.3=1;PORTD.3=1; delay_ms(10);PORTD.3=0; delay_ms(990);}if(inbox[0]==255){//请在这里添加收到广播数据的处理程序}}}} //end------------------------------------------------------------从机------------------------------------------------------------#include <mega8.h>#include <usart.h>#include <crc8.h>#define amount 10 //设定通讯数据量(包括1个地址帧,n个数据帧,1个校验帧)#define address 2 //请在这里设定本机地址unsigned char send[amount]; //发件箱unsigned char inbox[amount]; //收件箱unsigned char n=0; //记忆中断次数interrupt[12] Rxd_isr(void) //接收中断{unsigned char ERROR=0;if( UCSRA&4 || UCSRA&16 ) ERROR=1; //记录奇偶效验错误或者帧错误inbox[n]=UDR; //把接收到的数据保存到收件箱n++; //记忆接收的次数if(ERROR) //如果通讯有错....{n=0; //接收计数清0inbox[0]=0; //把地址改为无效地址0UCSRA|=0x01; //重新打开接收器的地址帧筛选功能}//如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能if(inbox[0]==address ||inbox[0]==255) UCSRA&=254;if(n==amount) //接收到amount个数据以后...{n=0; //接收计数清0UCSRA|=0x01; //重新打开接收器的地址帧筛选功能if(inbox[amount-1]==crc8(inbox,amount-1)) //如果crc8校验正确就...{if(inbox[0]==address) //如果地址匹配本机就回复数据{send[0]=1; //发件箱地址指向主机send[amount-1]=crc8(send,amount-1);//产生发件箱的crc8校验码usart_out(send,amount); //发送发件箱的数据包send[]//请在这里备份你的收件箱信息}if(inbox[0]==255) //如果是广播地址就...{//请在这里添加你的代码//收到广播数据请不要回复}}}}void main(void){usart_init();#asm("sei")while (1){//send[1]=?//......//send[n]=?};}---------------------------------------------------------------------------------usart.h文件---------------------------------------------------------------------------------//波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断void usart_init(void){UCSRA=0x01;UCSRB=0x9C;UCSRC=../../0xB6;UBRRH=0x00;UBRRL=47;PORTD.4=0; //MAX485平时工作在接收状态DDRD.4=1;}//-----------------------------------------------------------//从数组datas[]的首地址开始发送amount个数据,其中第0个数据是地址帧,其他是数据帧void usart_out(unsigned char *datas,unsigned char n){unsigned char i=0;PORTD.4=1; //使MAX485处于发送状态while(i<n) //一共发送amount个数据{if(i==0) UCSRB|=1; else UCSRB&=254;UDR=*(datas+i); //装载数据开始发送while((UCSRA&64)==0); //等待发送结束UCSRA|=64; //清除发送结束标志i++; //发送次数统计}PORTD.4=0; //使MAX485处于接收状态}---------------------------------------------------------------------------------crc8校验程序---------------------------------------------------------------------------------unsigned char crc8(unsigned char *ptr, unsigned char len){unsigned char i;unsigned char crc=0;while(len--!=0){for(i=1; i!=0; i*=2){if((crc&1)!=0) {crc/=2; crc^=0x8C;}else crc/=2;if((*ptr&i)!=0) crc^=0x8C;}ptr++;}return(crc);}参考链接:/news/2010-09/2299.htm。

相关文档
最新文档