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

📄 text1

📁 在c8051平台上实现的FFT运算
💻
字号:
/*-------------------------------------------------------------------------------------------------
文件名称:canbus.c
创建日期:07.01.15
修改日期:07.06.18
           -将调试用代码标志出来,在最终应用时,调试代码应注释掉。
文件说明:功能:
           -rs232与can总线双向数据转换。可以与工程aa进行通讯,组成PC对PC的CAN通讯。
         参数:
		   -通道0的IDT:0x00000100
           -通道0的MSK:0x1FFFFFFF(通道0只能接受IDT为0x00000101的消息)
		   -通道1的IDT:0x00000101
		   -通道1的MSK:0x1FFFFFFF(通道1只能发送IDT为0x00000100的消息)
		   -UartBuffer大小为16字节
		   -CanBuffer 大小为16字节
创建人:  李大伟
-------------------------------------------------------------------------------------------------*/
#include "reg51cc01.h"


//Can波特率:500k@12Mhz
#define BRP_500K    0x0
#define SJW_500K    0x0
#define PRS_500K    0x2
#define PHS2_500K   0x3
#define PHS1_500K   0x3

//Can使能
#define CAN_CONTROLLER_RESET            {CANGCON|=0x01;}
#define CAN_CONTROLLER_ENABLE           {CANGCON|=0x02;}

//Can发送接受使能
#define CAN_RX_IT_ENABLE                {CANGIE|=0x10;}
#define CAN_TX_IT_ENABLE                {CANGIE|=0x20;}

//Can通道设置
#define CAN_SET_CHANNEL(channel)        (CANPAGE=(channel<<4))

//Can中断使能
#define CAN_CHANNEL_IT_ENABLE(channel)  {(channel<8)?(CANIE2|=(1<<channel)):(CANIE1|=(1<<(channel-8)));}

//Can标识符定义
#define CanID29(v)                      (((unsigned long)(v))<<3)

#define ID0                             (CanID29(0x00000101))
#define ID0MSK                          (CanID29(0x1FFFFFFF)|0x01)
#define ID0TYP                          (0x80|0x10|0x01)
 
#define ID1                             (CanID29(0x00000100))
#define ID1MSK                          (CanID29(0x1FFFFFFF)|0x01)
#define ID1TYP                          (0x40|0x10|0x01)               

#define CanSetIDT(v)                    CANIDT1=((unsigned char)((v)>>24));  \
                                        CANIDT2=((unsigned char)((v)>>16));  \
                                        CANIDT3=((unsigned char)((v)>> 8));  \
                                        CANIDT4=((unsigned char)(v))      ;

#define CanSetIDM(v)                    CANIDM1=((unsigned char)((v)>>24));  \
                                        CANIDM2=((unsigned char)((v)>>16));  \
                                        CANIDM3=((unsigned char)((v)>> 8));  \
                                        CANIDM4=((unsigned char)(v));
//全局变量定义
unsigned char AA=1;
//调-----------------------------------
unsigned char BB=0;
//调-----------------------------------
unsigned char UartAddrBuf[50]; //uart buffer
unsigned char CanAddrBuf[50]; //can buffer
unsigned char *UartRecPntr;  //pointer to uart buffer
unsigned char *CanRecPntr;  //pointer to can  buffer
/*=================================================================================================
01.名称:RazAllMailbox
   入口:无
   出口:无
   功能:将mailbox清零复位
=================================================================================================*/
void RazAllMailbox(void)
{
  unsigned char num_channel, num_data;

  for(num_channel=0;num_channel<15;num_channel++)
  {
    CANPAGE = num_channel<<4;
    CANCONCH= 0;
    CANSTCH = 0;
    CANIDT1 = 0;
    CANIDT2 = 0;
    CANIDT3 = 0;
    CANIDT4 = 0;
    CANIDM1 = 0;
    CANIDM2 = 0;
    CANIDM3 = 0;
    CANIDM4 = 0;
    for(num_data=0;num_data<8;num_data++)
    {
      CANMSG = 0;
    }
  }
}
/*=================================================================================================
02.名称:CanSetBRP
   入口:无
   出口:无
   功能:设置BRP
=================================================================================================*/
void CanSetBRP(unsigned char prescaler)
{
  CANBT1=prescaler<<1;
}

/*=================================================================================================
03.名称:CanSetSJW
   入口:无
   出口:无
   功能:设置SJW
=================================================================================================*/
void CanSetSJW(unsigned char sjw)
{
  CANBT2&=~0x60;
  CANBT2|=(sjw<<5);
}
/*=================================================================================================
04.名称:CanSetPRS
   入口:无
   出口:无
   功能:设置PRS
=================================================================================================*/
void CanSetPRS(unsigned char prs)
{
  CANBT2&=~0x0E;
  CANBT2|=(prs<<1);
}
/*=================================================================================================
05.名称:CanSetPHS2
   入口:无
   出口:无
   功能:设置PHS2
=================================================================================================*/
void CanSetPHS2 (unsigned char phs2)
{
  CANBT3&=~0x70;
  CANBT3|=(phs2<<4);
}
/*=================================================================================================
06.名称:CanSetPHS1
   入口:无
   出口:无
   功能:设置PHS1
=================================================================================================*/
void CanSetPHS1 (unsigned char phs1)
{
  CANBT3&=~0x0E;
  CANBT3|=(phs1<<1);
}
/*=================================================================================================
07.名称:SysInit
   入口:无
   出口:无
   功能:全局变量和标志初始化
=================================================================================================*/
void SysInit(void)
{
  UartRecPntr=UartAddrBuf;
  CanRecPntr=CanAddrBuf;
}
/*=================================================================================================
08.名称:UartInit
   入口:无
   出口:无
   功能:UART初始化
=================================================================================================*/
void UartInit(void)
{
  SCON=0x50;				   //uart工作于模式1 (8 bit), REN=1
  T2CON&=0xF0;                 //EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0
  T2CON|=0x30;                 //RCLK = 1; TCLK=1;
  TH2=0xFe;                    //高位初始值
  TL2=0xc8;                    //低位初始值 
  RCAP2H=0xFe;                 //重装值,1200 Bds at 12MHz
  RCAP2L=0xc8;                 //重装值,1200 Bds at 12MHz
  ES=1; 					   //串口中断使能
  TR2=1;                       //打开T2    
}
/*=================================================================================================
09.名称:CanInit
   入口:无
   出口:无
   功能:CAN初始化
=================================================================================================*/
void CanInit(void)
{
  CANGCON|=0x01;;              //CAN控制器复位
  ECAN=0;                      //CAN 中断禁能
  RazAllMailbox();             //CANRAM清零
  CanSetBRP(BRP_500K);         //设置BPR
  CanSetSJW(SJW_500K);         //设置SJW
  CanSetPRS(PRS_500K);         //设置PRS
  CanSetPHS2(PHS2_500K);       //设置PHS2
  CanSetPHS1(PHS1_500K);       //设置PHS1
  CANGCON|=0x02;;              //CAN控制器使能

  CANPAGE=0<<4;                //设置通道:通道0  接收
  CANSTCH=0;
  CANCONCH=0;
  CanSetIDT(ID0);  
  CanSetIDM(ID0MSK);
  CANCONCH=0x90;               //Object waits for data
  CANCONCH|=0x01;
  CANIE2|=(1<<0);		       //通道中断允许


/*  CANPAGE=1<<4;              //通道选择:通道1  发送
  CanSetIDT(ID1);  
  CanSetIDM(ID1MSK);
  CANCONCH = 0;                //mark no information for transmit objects
  CANSTCH  = 0;	 */

  ETIM=0; 					   //CAN 定时器溢出中断禁能
  CANGIE|=0x20;;               //发送中断允许
  CANGIE|=0x10;;               //接收中断允许
  ECAN=1;                      //CAN中断允许
}
/*=================================================================================================
10.名称:CanTran
   入口:无
   出口:无
   功能:CAN发送函数
=================================================================================================*/
void CanTran(void)
{
  unsigned char channel;
  unsigned char *p;
  
  p=UartRecPntr;
  p--;
  channel=CANPAGE;

  CANPAGE=1<<4;
  CANSTCH =0; 
  CANCONCH=0x11;
  CanSetIDT(ID1);  
  CanSetIDM(ID1MSK);
  CANMSG=*p;
  CANCONCH|=0x40;
  CANEN2 |= (1 << 1);
  CANSTCH=0x00;
  CANPAGE=channel;
/*调-------------------------------------
  for(channel=0;channel<255;channel++);
  SBUF=BB;
  while(!AA);
  AA=0;
//调-------------------------------------*/
}
/*=================================================================================================
11.名称:UartTran
   入口:无
   出口:无
   功能:UART发送函数
=================================================================================================*/
void UartTran(void)
{
  unsigned char *p;  

  BB=1;
  if(AA==1)
  {
    p=CanRecPntr;
    p--;
    SBUF=*p;
	AA=0;
	BB=0;
  }
}
/*=================================================================================================
12.名称:main
   入口:无
   出口:无
   功能:系统主函数
		检查UartBuffer和CanBuffer中是否有等待发送的数,有发送之。
		UartBuffer和CanBuffer 大小都为16个字节,若待发数据过大,
		可定义更大的Buffer。
=================================================================================================*/
void main(void)
{ 
  SysInit();
  UartInit();
  CanInit();
  EA=1;
  while(1)
  {
    if(UartRecPntr!=UartAddrBuf)
    {CanTran(); if(BB==0) UartRecPntr--;}

    if(CanRecPntr!=CanAddrBuf)
    {UartTran(); CanRecPntr--;}
  }
}
/*=================================================================================================
13.名称:uart_IT
   入口:无
   出口:无
   功能:UART中断函数
=================================================================================================*/
void uart_IT(void) interrupt 4 
{
  if(1==RI)
  {
    RI=0;
    *UartRecPntr=SBUF;
	UartRecPntr++;
/*调----------------------
	BB++;
//调----------------------*/
  }
  else if(1==TI)
  {
    TI=0;
	AA=1;
  }
}

/*=================================================================================================
14.名称:can_IT
   入口:无
   出口:无
   功能:can_IT中断函数
=================================================================================================*/
void can_IT(void) interrupt 7
{
  unsigned char channel;

  channel=CANPAGE;
  if(0x01==(CANSIT2&0x01))
  {
	CANPAGE=0<<4;
	if(0x20==(CANSTCH&0x20))
	{
      CANSTCH&=0;              //清接收中断标志
	  *CanRecPntr++=CANMSG;
	  CANCONCH=ID0TYP;
	  CANEN2|=(1<<0);
	}
	CANSIT2&=~0x01;            //清通道中断标
  }
  CANSTCH=0x00;
  CANPAGE=channel;
  CANGIT=0x00;
}
/*-----------------------------------------------------------------------------------------------*/
//End-canbus.c

⌨️ 快捷键说明

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