原创 带有8路12位ADC采集的can总线程序,sja1000,can\232\422\485

2008-4-23 19:22 3584 2 2 分类: MCU/ 嵌入式

点击开大图


大家需要的话联系我:;13671387011()
       QQ: 531706356


同时提供can实验开发板给初学者,参加本网站的can助学活动,可以得到完美的源程序和电路图;

http://auction1.taobao.com/auction/item_detail-0db2-84528f10e90fcdcc97b99194d14201b3.jhtml

上面的网址是我的淘宝店,那里有详细介绍can总线开发板。

1USBDC5V供电;

2Aduc812sja1000tja1050tja1040)(p82c250);


3、支持RS232/422/485总线与CAN总线相互转换;


4CAN总线波特率可调:204050801001252002504005006668001000Kbit/s


5DC-DC隔离;


6、提供电路图;


7、提供源程序:basicanpelican模式(CAN2.0ACAN2.0B),c语言和汇编语言,程序注释详尽;


8812位精度的ADC采集功能,把采集的数据通过CAN总线发送;


9、成对购买开发板可以实现:A开发板发送数据,B开发板接收数据,并把接收到的数据通过串口上传到计算机显示;


10、提供技术支持,接受CAN开发项目;


以下为例程:


#include<ADuC812.h>
#include<SJA_nnyt.H>
#include<SJA_nnyt.C>

void adc_init(void);
void T1_init(void);
void Sja_1000_Init(void);


/
void adc_int(void) interrupt 6   using 2
{
 send_data[k]=ADCDATAH; 
 send_data[k+1]=ADCDATAL;    
 k=k+2;
 if(k==10)                     //采集完一组数据


{
   k=2;             
   ADCCON1=0x66;
   ADCCON2=0x00;              //初始选择adc通道0
   send_flag=1;               //置位发送标志
  }
 else
  {
   ADCCON2&=0xf0;
   ADCCON2|=CHANAL[k/2-1];       //选择adc通道0123
  }   
}
//
void UART_int(void) interrupt 4  using 3
{   
 send_data[j]=SBUF;          //写串口数据到发送数组
 RI=0;                       //接收中断清零
 j++;              
 if(j==10)                   //接收到8组数据
  {j=2;             
   send_flag=1;              //置位发送标志
  }
}
void T1_init(void)
{
 TMOD=0x20;                //定时器1设为方式2
 TL1=0xFD;                 //定时器初值

TH1=0xFD;
 SCON=0x50;                //串口设为方式1,REN=1允许接收
    //PCON=0x80;              //波特率提高一倍,19.2k
   }


//*************************************************************
void adc_init(void)
{
ADCCON1=0x66;                //启动 ADC,ADC时钟4分频,使用定时器2触发模式,注意ADC时钟必须在400k到4M之间
RCAP2L=0x0D2;                // 设置采样频率为10K = 2 * T2 reload prd
RCAP2H=0x0FF ;               //  = 2*(10000h-FFD2h)*1.085us
TL2=0xD2;                    //  = 2*46*1.085us
TH2=0xFF;                    // = 99.8us
}


//***********************************************************
void Sja_1000_Init(void)
{
 BCAN_ENTER_RETMODEL();        //进入复位
 BCAN_SET_BANDRATE(0x0b);      //800K
 BCAN_SET_OBJECT(0x05,0x00);   //设置自己的地址ID:#028;(0x01,0x00)~#008;(0x02,0x00)~#010;(0x03,0x00)~#018;(0x04,0x00)~#020;(0x05,0x00)~#028
 BCAN_SET_OUTCLK(0xaa,0x48);   //设置输出方式,禁止COLOCKOUT输出
 BCAN_QUIT_RETMODEL();         //退出复位模式
 SJA_BCANAdr=REG_CONTROL;      //地址指针指向控制寄存器
 *SJA_BCANAdr|=0x1E;           //开放错误\接收\发送中断
}


//*******************************************************************
void main(void)
{
    SJA_RESET_OUT=0;              //SJA1000退出硬件复位模式
 Sja_1000_Init();     //initialize Sja100
 flag_init=0x00;
 
 PX0=1;                        //外部中断0高优先级
 EX0=1;                        //外部中断0开放
    EA="1";                         //开放全局中断
while(1)
 {
   if(rcv_flag)        
   { 
       rcv_flag=0;
   BCAN_DATA_RECEIVE(rcv_data);
   BCAN_CMD_PRG(RRB_CMD);                     //释放接收缓冲区
      l="rcv"_data[2];m=rcv_data[3];n=rcv_data[4];
      if(l==m)                                   //接收的数据前两个相等开始采集
             {
     //send_data[0]=rcv_data[5];         //接收到的"发送方ID10~ID3"        
        //send_data[1]=rcv_data[6];                    //接收到的"发送方ID2~ID0"和要求的数据长度
           if(RS422_ADC_SELECT==0)                //如果为零,实现


rs422_can转换功能
              {
                 T1_init();                      //初始化T1
                 TR1=1;                          //启动定时器1
                 TR2=0;                          //关闭t2停止ad采集
              }
                    else
              {
                  adc_init();                     //初始化adc
                           EADC="1";                         //打开ADC中断
            TR2=1;                          //启动t2开始ad采集
                  ES="0";                           //串口中断关闭
                  TR1=0;                          //关闭定时器1
           }
     }                              
             if(m==n)                                       //接收到的数据2,3相等停止采集
             {
     TR2=0;                                        //关闭t2停止ad采集
                 ADCCON1=0x16;                                 //ADC掉电
        ES="0";                                         //串口中断关闭
     TR1=0;                                        //关闭定时器1
}                                      
            }
  if(send_flag)       
   { send_flag=0;                                    //发送标志清零        
   send_data[0]=0x06;        
   send_data[1]=0x08;                      //发送到ID:030,8字节长度
      BCAN_DATA_WRITE(send_data);
   BCAN_CMD_PRG(0x01);
      if(RS422_ADC_SELECT!=0)  
    {TR2=1; }                                      // 发送完毕后,启动t2开始ad采集 
   }
  if(err_flag)
   {  err_flag=0;
   Sja_1000_Init();
   }
 }
}


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /1 下一条