收藏 分销(赏)

ATmega16单片机实现串口收发数据.doc

上传人:天**** 文档编号:10820386 上传时间:2025-06-18 格式:DOC 页数:2 大小:16KB 下载积分:5 金币
下载 相关 举报
ATmega16单片机实现串口收发数据.doc_第1页
第1页 / 共2页
ATmega16单片机实现串口收发数据.doc_第2页
第2页 / 共2页
本文档共2页,全文阅读请下载到手机保存,查看更方便
资源描述
1、编译环境:CodeVisionAVR  2、功能:实现以5AH开头的6个字节数据帧的接收及发送 3、接收及发送方式:中断接收,查询发送  4、校验方式:所有字节相加模除256等于0则接收正确,否则不予接收 程序如下所示:  #include "mega16.h"   #define uchar unsigned char #define uint unsigned int #define BAUD 9600 #define F_CLK 4000000   #define MATCH_OK 1; #define MATCH_ERROR 0; #define UDRE 5   volatile uchar i=0;  volatile uchar recc_flag=0;  //命令字节接收标志(recieve command 简写成 recc) volatile uchar comm_flag=0;  //命令帧接收完毕标志(command 简写成 comm)   volatile uchar comm;         //定义变量,用于传递UDR0中接收到的命令字  volatile uchar command[6]={0x00,0x00,0x00,0x00,0x00,0x00};   //定义长度为6的数组用于接收长度为6字节的命令帧,并将所有元素初始化为0x00   /*延时*/  void delay(uint t) {    while(t--); }  /*****/   /*******帧头校验******/ uchar check_comm(void) {    uchar i;    uint result=0;   for(i=0;i<6;i++)      {        result+=command[i];      }    if((result%256)==0)     {       return MATCH_OK;     }   else     {       return MATCH_ERROR;     } }  /*********************/    void uart_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  }     void init_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] void usart_rec(void)  {     comm=UDR;    recc_flag=1;  }    /*****USART0口发送命令字节程序*****/ void usart0_transcomm(uchar x)  {      while(!(UCSRA&(1<<UDRE))); //数据寄存器空时才能发送数据     UDR=command[x];  }  /**********************************/    /*****命令帧的单个字节存储程序******/  void save_single_byte(uchar y)   {       if(y<6)         {command[y]=comm;}      recc_flag=0;   }  /***********************************/    /********命令帧保存程序********/ void save_comm(void)   {      uchar mount=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发送命令帧程序******/ void send_comm(void)   {     uchar j;     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;                      //命令帧发送完毕后,接收完毕标志清零   }  /*******************************/    /****主程序****/ void main(void)  {     init_device();     while(1)    {       save_comm();      send_comm();     } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服