(完整word版)ATmega16单片机实现串口收发数据.doc
上传人:猫巷****觅蓉 上传时间:2024-09-10 格式:DOC 页数:2 大小:15KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

(完整word版)ATmega16单片机实现串口收发数据.doc

(完整word版)ATmega16单片机实现串口收发数据.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

1、编译环境:CodeVisionAVR2、功能:实现以5AH开头的6个字节数据帧的接收及发送3、接收及发送方式:中断接收,查询发送4、校验方式:所有字节相加模除256等于0则接收正确,否则不予接收程序如下所示:#include"mega16.h"#defineucharunsignedchar#defineuintunsignedint#defineBAUD9600#defineF_CLK4000000#defineMATCH_OK1;#defineMATCH_ERROR0;#defineUDRE5volatileuchari=0;volatileucharrecc_flag=0;//命令字节接收标志(recievecommand简写成recc)volatileucharcomm_flag=0;//命令帧接收完毕标志(command简写成comm)volatileucharcomm;//定义变量,用于传递UDR0中接收到的命令字volatileucharcommand[6]={0x00,0x00,0x00,0x00,0x00,0x00};//定义长度为6的数组用于接收长度为6字节的命令帧,并将所有元素初始化为0x00/*延时*/voiddelay(uintt){while(t--);}/*****//*******帧头校验******/ucharcheck_comm(void){uchari;uintresult=0;for(i=0;i<6;i++){result+=command[i];}if((result%256)==0){returnMATCH_OK;}else{returnMATCH_ERROR;}}/*********************/voiduart_init(void){UCSRA=0x00;UCSRB=0x98;//接收结束中断使能;数据接收使能;数据发送使能UCSRC=0x06;//工作在异步模式;无校验;1位停止位;字符长度为8位UBRRH=(F_CLK/BAUD/16-1)/256;UBRRL=(F_CLK/BAUD/16-1)%256;//系统时钟为4MHz,波特率为9600bps}voidinit_device(void){#asm("cli")//关中断PORTA=0x04;DDRA=0x04;PORTB=0xFE;DDRB=0xFF;PORTD=0xFF;DDRD=0x02;MCUCR=0x00;TIMSK=0x00;uart_init();//串口初始化#asm("sei")//重开中断}interrupt[USART_RXC]voidusart_rec(void){comm=UDR;recc_flag=1;}/*****USART0口发送命令字节程序*****/voidusart0_transcomm(ucharx){while(!(UCSRA&(1<<UDRE)));//数据寄存器空时才能发送数据UDR=command[x];}/**********************************//*****命令帧的单个字节存储程序******/voidsave_single_byte(uchary){if(y<6){command[y]=comm;}recc_flag=0;}/***********************************//********命令帧保存程序********/voidsave_comm(void){ucharmount=5;if(recc_flag==1)//接收标志置位,说明接收到命令字,则存储{save_single_byte(i);i++;//指向下一个数组元素if(command[0]!=0x5A){i=0;#asm("cli")delay(1000000);#asm("sei")}if(i==6)//若数组存满6个字节{comm_flag=1;//命令帧接收完毕,将接收完毕标志置位}}}/*****************************//******USART0发送命令帧程序******/voidsend_comm(void){ucharj;if(comm_flag==1)//命令帧接收完毕后才允许发送,////应在发送前进行校验,在此不予考虑////{#asm("cli")if(check_comm()){for(j=0;j<6;j++){usart0_transcomm(j);//调用单字节发送程序}}#asm("sei")i=0;}comm_flag=0;//命令帧发送完毕