⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main._c

📁 本文提出了基于MCU和RS485总线的嵌入式系统的常用设计方法
💻 _C
字号:
//从机11
#include<iom16v.h>
#include <macros.h>
#include "delay.h"
#include "1602.h"

#define  amount  10                                        //设定通讯数据量
#define  address 11                                        //请在这里设定本机地址  
#define  max485_out   PORTD |=(1<<PD4)   
#define  max485_in    PORTD &=~(1<<PD4)
#define  max485_RW_ok DDRD|=(1<<PD4)

unsigned char  send[amount];                               //发件箱 
unsigned char inbox[amount];                               //收件箱 
unsigned char n=0;                                         //记忆中断次数 

//波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断/地址过滤 
void usart_init(void) 
{   
  UCSRA=0x01; 
  UCSRB=0x9C; 
  UCSRC=0xB6; 
  UBRRH=0x00; 
  UBRRL=47;  
}

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);  
}



//**************************************************************************************

void usart_out(unsigned char *datas,unsigned char n) 
{ 
  unsigned char i=0;   
  max485_out;                                              //使MAX485处于发送状态 
  while(i<n)                                               //一共发送n个数据 
  {   
    if(i==0) UCSRB|=1; else UCSRB&=254;    
    UDR=*(datas+i);                                        //装载数据开始发送  
    while((UCSRA&64)==0);                                  //等待发送结束 
    UCSRA|=64;                                             //清除发送结束标志 
    i++;                                                   //发送次数统计 
  }  
  max485_in;                                               //使MAX485处于接收状态 
}  

//**************************************************************************************
#pragma interrupt_handler RXC_Int: 12
void RXC_Int(void)                              //接收中断 
{   
  if( UCSRA&28 ){ n=UDR; n=0; UCSRA|=0x01; } else          //接收出错就重新打开地址帧筛选功能 
  {
    if( UCSRB&2  ) n=0;                                    //检测到地址信息时计数清零
    inbox[n]=UDR;  n++;                                    //把接收到的数据保存到收件箱   
    if( inbox[0]==address ) UCSRA&=254; else UCSRA|=0x01;  //地址筛选  
    if( n==amount )                                        //如果接收到完整的数据包
    {
      if( inbox[amount-1]==crc8(inbox,amount-1) )          //如果crc8校验正确就... 
      {  
        send[0]=1;                                         //发件箱地址指向主机    
        //send[1]=?                                        //请更新发件箱的数据
        //send[n]=? 
        send[amount-1]=crc8(send,amount-1);                //产生发件箱的crc8校验码  
        usart_out(send,amount);                            //发送发件箱的数据包/查询方式比较耗时
        OCR1A=inbox[3];                                    //收件箱测试(控制T/C1的PWM驱动LED)  
      }
    } 
  } 
}

//**************************************************************************************

void main(void) 
{ 
  usart_init();  
   LCD_init(); 
  max485_in; 
  max485_RW_ok;  
  TCCR1A   =0B10000001;                                    //OCR1A/PD5/8位快速PWM
  TCCR1B   =0B00001001;                                    //时钟1分频
  DDRD    |=0b00100000;                                    //输出使能
  OCR1A    =255;                                           //初始化PWM输出100%占空比     
 SEI();        //打开全局中断,需要macros.h支持
 LCD_write_string(0,0,"Send:");
 LCD_write_string(0,1,"Rev:");

  while (1) 
  { 
  
  }; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -