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

📄 test1.c

📁 用DSPtms2407实现电力系统数据采集的程序
💻 C
字号:
#include   "lf2407regs.h" 
/*------------------------------------------------------------*/
unsigned int receive[10];     
int rev_num=0;
unsigned int send[10];     
int send_num=0;       

unsigned int period; 

int i;  
int j=0;

unsigned int kai_ru;   

unsigned int eeprom[32];

/**************************************************************/
/**************************************************************/
/**************************************************************/
/*------------------------------------------------------------*/
void inline DISABLE()
{
   asm(" setc INTM ");
}
void inline ENABLE()
{
   asm(" clrc INTM ");
}
/*------------------------------------------------------------*/
void interrupt nothing()
{
 	return;
}               
/*------------------------------------------------------------*/
void DELAY(unsigned int time)
{
unsigned a,b;
	b=0;
	for(a=0;a<=time;a++) b+=1; 
}
/*----------------------------SCI程序-------------------------*/ 
void  UARTSENT(int N)          	//发送服务程序
{   
    if(send_num>N-1) 
    {send_num=0;  return;}  //如果需要发送的字符都已经发送完,则中断直接返回 */
   	 *SCITXBUF=send[send_num];	          //依次发送定义的字符串中的各个字符
     send_num++;
}   
/*------------------------------------------------------------*/
void KAI_RU()
{
   ;
}
/*------------------------------------------------------------*/
void KAI_CHU()
{
   ;
}
/*------------------------------------------------------------*/
void CE_PIN()
{
   ;
}
/*------------------------------------------------------------*/
void YAO_CE()
{
   ;
}
/*------------------------------------------------------------*/
void DU_E2()
{
   ;
}
/*------------------------------------------------------------*/
void XIE_E2()
{
   ;
}
/*------------------------------------------------------------*/
void CAN_SHOU()
{
   ;
}
/*------------------------------------------------------------*/
void CAN_FA()
{
   ;
}
/*------------------------------------------------------------*/
void  UARTREC()          	    //接收服务程序
{                        
unsigned int SUM,N,L;
   receive[rev_num]=*SCIRXBUF;  //依次接收字符 
   rev_num++;    
   if (receive[0]!=0x68) { rev_num=0; return; }                
   if (rev_num>2 && receive[1]!=receive[2]) { rev_num=0; return; } 
   if (rev_num>3 && receive[3]!=0x68) { rev_num=0; return; }  
   if (rev_num>4 && receive[4]!=0x00) { rev_num=0; return; }  
   L=receive[1];
   if (rev_num==L+6) 
   {   
      SUM=0;
      for(N=4;N<L+4;N++) SUM+=receive[N]; 
      if ((SUM & 0xff)!=receive[L+4] || receive[L+5]!=0x16) { rev_num=0; return; }  
      rev_num=0;
      if (receive[5]==0x01) KAI_RU();    
      else if (receive[5]==0x02) KAI_CHU();
      else if (receive[5]==0x03) CE_PIN();
      else if (receive[5]==0x04) YAO_CE();
      else if (receive[5]==0x05) DU_E2();
      else if (receive[5]==0x06) XIE_E2();
      else if (receive[5]==0x07) CAN_SHOU();
      else if (receive[5]==0x08) CAN_FA();
   }
}
/*----------------------------通讯中断服务程序-------------------------*/ 
interrupt void CAN_SCI() 
{  
   unsigned char ch;
   ch=*PIVR;	                //保存现场中断向量 
   *EVAIMRA=*EVAIMRA | 0x80;	// 允许定时器1的周期中断
   ENABLE();
   switch(ch)
	{   case 6:                 //如果PIVR=6,则发生了接收中断,执行接收服务程序
	      { 
	        UARTREC(); 
	        *IFR=*IFR | 0x10;	    //清除IFR中相应的中断标志 
	        break;
	      }  
		case 7:                     //如果PIVR=7,则发生了发送中断,执行发送服务程序 
		  { 
		    UARTSENT(8); 
		    *IFR=*IFR | 0x10;	    //清除IFR中相应的中断标志 
		    break;
		  } 
/*	   	case 64: 
		  {
			  fg=*MBX0A;
			  *RCR=0x10;  
              *CAN_IFR=0xffff;
              *CAN_IMR=0x8180;
    		  break;
    	   } */
    	 default:  break;
    } 
   ENABLE();
} 
/*---------------------捕捉中断服务程序----------------------*/
interrupt void CAPINT()
{ 
static unsigned int result1,result2; 
static int flag2=0;  
   if (*PIVR==0x34)       //如果PIVR=0x34,则发生了CAP2中断
	{ 
       if(flag2==0)
       {   
          result1=*CAP2FIFO;  // 读取捕捉值1
	      flag2=1;
       }   
       else
       {   
          result2=*CAP2FIFO;  // 读取捕捉值2
          flag2=0;
          period=result2-result1;  
          result2=*CAP2FIFO;  //  清空FIFO
          *T2CNT=0x00;		  // 计数器清0
       }   
       *EVAIFRC=*EVAIFRC | 0x02; 
	}
	ENABLE();                      
} 
/*----------------------采样程序--------------------------------*/
void AD_CONV(unsigned int channel,unsigned int * addr)
{
static int i=0;
    *SPICCR=0x0B;      //复位SPI,12位数据,上升沿发送
    *SPIBRR=5;         //波特率3.3MHz
	*SPICTL=0x06;      //无延时,主模式,允许发送,禁止中断 
	*SPICCR=0x8B;      //脱离复位
    *PCDATDIR=*PCDATDIR | 0x0001;     //IOPC0=1 使能AD 
    DELAY(1);
	*SPIDAT=channel<<12;		//发命令字,选择通道
   	while(((*SPISTS)&0x40)==0);	//判断发送是否完成
   	*(addr+i)=*SPIRXBUF;	        //虚读数据,清标志位    
   	DELAY(5);                   //10us延时,等待转换完成
	*SPIDAT=0xB000;			    //虚发送  
   	while(((*SPISTS)&0x40)==0);	//判断发送是否完成
    *(addr+i)=*SPIRXBUF;            //读取转换结果
    i++; 
    if (i>31)
    {i=0;}
    *PCDATDIR=*PCDATDIR & 0xFFFE;     //IOPC0=0 禁止AD   
}
/*-----------------定时器1周期中断服务程序--------------------- */
interrupt void  T1INT()
{  
	if(*PIVR==0x27)   
	{ 
       AD_CONV(0,(unsigned int *)0x0200); 
       *EVAIFRA=*EVAIFRA | 0x80;	// 清除定时器1周期中断标志,否则以后的中断将被忽略
	}  
	ENABLE();		// 允许总中断,因一进中断服务程序后总中断就自动关闭了
} 
/*------------------读取开关量输入程序-----------------------------*/
unsigned int READ_DIN()
{  
unsigned int R_ESULT=0;
int i;
volatile unsigned int *j;
   *PCDATDIR=*PCDATDIR & 0xFFFD;  //IOPC1=0使能DI
   *ADCTRL2=0x4200;    //复位SEQ1,清楚中断标志

⌨️ 快捷键说明

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