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

📄 hawaii_main.c

📁 CAN转232总线的单片机程序(AVR实现)
💻 C
字号:
//2009-03-24日调试通过
#include<iom64.h>
#include<ioavr.h>
#include<comp_a90.h>
#include"hawaii_include.h"
#include  "sja_bcanFunc.c"
uint  i=0,j=0;
uchar key_final,usart_timer1;
uchar usart_buff[12];
uchar usart_dpr,usart_length,usart_cs,usart_sign;
uchar   BandRateBuf;                     //设置总线波特率值缓冲区 
uchar   send_data[10],rcv_data[10];      //发送和接收数组
uchar   CanBusFlag=0;                    //can标志
uchar   status,flg_send,flg_rcv;            	//状态字

// 外部中断3处理程序     
#pragma vector=INT0_vect
__interrupt void can_int(void)
   { 
    CLI;
    SJA_BCANAdr=REG_INTERRUPT;         //SJA_BCANAdr定义的指针
    CanBusFlag=*SJA_BCANAdr;	      //保存sja1000中断标志
    SEI;
   }

void main(void)
   {
    delay_nms(100);
    init_devices();
    CLEARBIT(DDRCANINT,CAN_INT);
    CLEARBIT(DDRB,4);
    do
       {
        status=Config_SJA();      //配置sja1000
       }
    while(status!=0);           //争取配置sja1000反馈0,否则反馈1
    CLEARBIT(PORTLED,LED3);      //开机闪灯
    CLEARBIT(PORTLED,LED2);
    CLEARBIT(PORTLED,LED1);
    CLEARBIT(PORTLED,LED4);
    delay_nms(80);
    SETBIT(PORTLED,LED3);
    SETBIT(PORTLED,LED2);
    SETBIT(PORTLED,LED1);
    SETBIT(PORTLED,LED4);
    delay_nms(80);
    CLEARBIT(PORTLED,LED3);
    CLEARBIT(PORTLED,LED2);
    CLEARBIT(PORTLED,LED1);
    CLEARBIT(PORTLED,LED4);
    delay_nms(80);
    SETBIT(PORTLED,LED3);
    SETBIT(PORTLED,LED2);
    SETBIT(PORTLED,LED4);
    SETBIT(PORTLED,LED1);
    while(1)
       {
        if(CanBusFlag&0x01) 
          {
           CLI;  
           CanBusFlag&=0xFE;                     //接收标志位清零
           BCAN_DATA_RECEIVE(rcv_data);          //接收数据
           BCAN_CMD_PRG(RRB_CMD);                //释放接收缓冲区
           flg_send=1;
           SEI;      
          }
        if(flg_send==1)
          {
           for(i=0;i<=(rcv_data[1]+1);i++)
             {
              usart_buff[i]=rcv_data[i];
             }
          send_buff(rcv_data[1]+2); 
          flg_send=0;
         }
       if(flg_rcv==1)
         {
          BCAN_DATA_WRITE(send_data);          //发送数据
          BCAN_CMD_PRG(TR_CMD);                //置位发送请求位
          flg_rcv=0;
         }
       if (CanBusFlag&0x04)                    //错误中断
         {   
          CLEARBIT(PORTLED,LED3);              //开机闪灯
          CLEARBIT(PORTLED,LED2);
          delay_nms(80);
          SETBIT(PORTLED,LED3);
          SETBIT(PORTLED,LED2);
          delay_nms(80);
          CLEARBIT(PORTLED,LED1);
          CLEARBIT(PORTLED,LED4);
          delay_nms(80);
          SETBIT(PORTLED,LED4);
          SETBIT(PORTLED,LED1);
          CanBusFlag&=0xfB;                     //错误标志位清零
          Config_SJA();                         //初始化SJA
         }
      }
   }

uchar key_scan_first(void)
   {
    return(0);
   }

uchar key_scan(void)
   {
    uchar key_code=0,key_error=0;
    if(key_error>1)key_code=0;
        return(key_code);
   }

void  send_buff(uchar send_num)
   {
    uchar num;//usart_cs=0;
    send_num--;
    for(num=0;num<(send_num+1);num++)
      {
       UDR0=usart_buff[num];
       while(!(UCSR0A & (1<<UDRE0)));
       usart_buff[num]=0;
      }
     delay_nus(250);
   }

uchar  Config_SJA(void)
   { 
    uchar    status=0;
    SETBIT(DDRCANCS,CS);
    CLEARBIT(PORTCANCS,CS);
    SETBIT(DDRCANRST,RST);
    CLEARBIT(PORTCANRST,RST);
    delay_nus(5000);
    SETBIT(DDRCANRST,RST);
    SETBIT(PORTCANRST,RST);
    delay_nus(50);
    BandRateBuf = ByteRate_200k;
    BCAN_ENTER_RETMODEL();
    if(BCAN_CREATE_COMMUNATION())//
       {
        status = CAN_INTERFACE_ERR;
        return(status);
       }
    if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率200kbps
      {
       status = CAN_INITBTR_ERR ;
       return(status);
      }
    if(BCAN_SET_OBJECT(0x00,0x00))
      {
       status =CAN_INITOBJECT_ERR;
       return(status);
      }
    if(BCAN_SET_OUTCLK(0xfa,0x40))
      {
       status =CAN_INITOUTCTL_ERR;
       return(status);
      }
    if(BCAN_QUIT_RETMODEL())
      {
       status = CAN_QUITRESET_ERR;
       return(status);
      }
    SJA_BCANAdr=REG_CONTROL;
    *SJA_BCANAdr=0X1E;//进入工作模式
    return  status; 
   }


void   CanSend_Prg(void)         		 //can发送数据
   {
   }
void   CanErr_Prg(void) 	                 //发现错误后处理
   {
    Config_SJA();			        //
   }
void   CanDtOver_Prg(void)                      //超载处理
  {
   //  BCAN_CMD_PRG(COS_CMD);
  }
void   CanWui_Prg(void)                     	//唤醒中断处理
   {
   }

⌨️ 快捷键说明

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