您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机AVR单片机串口多机通讯程序 正文
AVR单片机串口多机通讯程序

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

点击数:7186 次   录入时间:03-04 11:52:58   整理:http://www.55dianzi.com   AVR单片机
     
     //如果收件箱已经收到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;                                        //接收计数清0 
       inbox[0]=0;                                 //把地址改为无效地址0 
       UCSRA|=0x01;                                //重新打开接收器的地址帧筛选功能 
     } 
   
   //如果地址匹配本机或者是广播地址就关闭地址筛选(多机通讯)功能   
   if(inbox[0]==address ||inbox[0]==255) UCSRA&=254; 
   
   if(n==amount)                                   //接收到amount个数据以后... 
     {   
       n=0;                                        //接收计数清0 
       UCSRA|=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)                       //如果是广播地址就... 

上一页  [1] [2] [3]  下一页


本文关键字:单片机  程序  AVR单片机单片机-工控设备 - AVR单片机