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

📄 cap.c

📁 该程序在DSP2407芯片上实现捕获中断
💻 C
字号:
/*===========================================================================*
* File name : cap.c *
* Author: Davidlee *
* Data: 2007.05.18*
* Version: 2.0 *
* Organization: Tianhuang Technology Co.ltd
* Description : The square wave signals through two pins (CAP6 and GND) into
* DSP and the DSP measure the square wave's frequency show by four nixietubes.
;============================================================================*
*/
#include "F2407_c.H" 	         //;the header file  

#define led_0  port2000          //对应发光二极管外部存储单元地址       
#define led_en port6000          //对应数码管使能脚外部存储单元地址
#define led_da port8000          //对应送数码管数据脚外部存储单元地址

ioport  unsigned   port2000;
ioport  unsigned   port6000;
ioport  unsigned   port8000;

unsigned int freq,timer_count,a[16];
unsigned int  temp1,n;
unsigned int data1,data2,data3,data4;
unsigned int led_en1,led_en2,led_en3,led_en4;
	       
 	     asm(" .word   #0ffffh ");    //密码位
	     asm(" .word   #0ffffh ");
	     asm(" .word   #0ffffh ");
	     asm(" .word   #0ffffh ");
//=======================================================
//子程序声明
//=======================================================
void interrupt nothing();                            /*空指令,直接返回*/
void interrupt timer3_isr();                         /*定时器3定时中断处理子程序*/
void interrupt cap_isr();                            /*捕获中断处理子程序*/
void Delay();                                        /*延时子程序*/
void KICK_DOG();                                     /*看门狗子程序*/
void system_init();                                  /*系统初始化子程序*/
void EVB_init();                                     /*初始化EVB子程序 */
void conversion();                                   /*将捕获结果转数码管显示子程序*/ 
void Led_show(unsigned int led_en,unsigned int data);/*数码管显示相应数码值子程序*/

//=======================================================
//定义数组,对应数码管显示数字的代码.代表从0~f共16个数
//=======================================================
  unsigned int data_table[]={0x03F,0x006,0x05B,0x04F,0x066,0x06D,0x07D,0x007,
                             0x07F,0x06F,0x077,0x07C,0x039,0x05E,0x079,0x071};
//=======================================================
main()                                /*主程序*/
{ 
      system_init();                  /*系统初始化*/
      EVB_init();                     /*EVB初始化*/ 
      data1=0;           //显示初始值均为0
	  data2=0;
	  data3=0;
	  data4=0;
	  
	  n=0;
	  
	  timer_count=0;
	  
	  led_en1=0x0E0;     //使能LED1
	  led_en2=0x0D0;     //使能LED2
	  led_en3=0x0B0;     //使能LED3
	  led_en4=0x070;     //使能LED4
      
      asm(" CLRC INTM");
      
      while(1)
     {
         ;
     }
}
//=======================================================
//该中断服务程序主要是为了防止干扰,不作任何其他操作
//=======================================================
void  interrupt nothing()
{
         asm(" CLRC INTM");
         return;                 /*中断直接返回*/
}
//=======================================================
//Time3定时中断处理子程序
//=======================================================
void  interrupt timer3_isr()
{
    unsigned int j;
  	freq=40000000/(2*64*timer_count);//f=fT4/T4CNT=(SYSCLK/2/64)/T4CNT
 	conversion(freq); //将频率值转换为十进制以便显示
    for(j=0;j<100;j++)
    {
		Led_show(led_en1,(data_table[data1])|0x80);//小数点
		Led_show(led_en2,data_table[data2]);
		Led_show(led_en3,data_table[data3]);
		Led_show(led_en4,data_table[data4]);
	}
	data1=0;
	data2=0;
	data3=0;
	data4=0;
    
    led_en=0xFFFF;             //关闭数码管显示	
	Delay(3);                  //延时
    
    EVBIFRA=0xFFFF;
    asm(" CLRC INTM"); 
}
//=======================================================
//CAP6捕获中断子程序
//=======================================================
void  interrupt cap_isr()
{   unsigned int increment,count_new,count_old,m;
	unsigned long sum;
	
	count_old=CAP6FIFO;
	count_new=CAP6FIFO;        //两级深度FIFO
   
	if(count_new>count_old)
		increment=count_new-count_old;
	else
		increment=count_new+(0xFFFF-count_old);
	if(n<16)
		{
			a[n]=increment;
			n++;
		}	    
	else
		{
			for(m=0;m<16;m++)
			{
				sum=sum+a[m];
				timer_count=sum>>4; //16次T4计数器值的平均
			}
			n=0;
			sum=0;
		}
    EVBIFRC=0x4;
    asm(" CLRC INTM");  
}

void  Delay(unsigned int delay)  /*延时子程序*/
{
   while(delay>0) delay--;
}

void  KICK_DOG()                 /*复位看门狗密钥*/
{ 
     WDKEY=0x5555;
     WDKEY=0xAAAA;
}
//=======================================================
//系统初始化子程序
//=======================================================
void   system_init()
{    
     asm(" SETC INTM " );       //关中断
     asm(" CLRC  SXM " );       //符号位不作扩展    
     asm(" SETC  OVM " );       //遇到溢出,累加器被设置为它的最大正值或负值
     asm(" CLRC  CNF " );       //B0设置为数据存储区
     
     IFR=0xFFFF;                //清除全部中断标志,"写1清0"
        
     WDCR=0x6F;
     KICK_DOG();                //看门狗不使能
        
     temp1=0x0;
     asm(" OUT _temp1,0ffffh"); //设置外部等待为0
     
     IMR=0xA;                   //开INT2,INT4中断
     
     MCRA=0xFFFF;
     MCRB=0xFFFD;               //设置仿真端口

     led_0=0xFF;                //关闭发光二极管的显示 led_0为设定的扩充I/O
}
//=======================================================
//EVB初始化子程序
//=======================================================
void   EVB_init()             /*A/D转换初始化子程序*/
{        
         SCSR1=0x00FC;          //使能ADC,SCI,SPI,CAN,EVB,EVA模块
         
         EVBIMRA=0x80;          //使能T3周期中断
         EVBIMRC=0x4;           //使能CAP6捕获中断
         
         EVBIFRA=0xFFFF;
         EVBIFRC=0xFFFF;
         
         CAPCONB=0x1208;        //下降沿检测,使用timer4
         CAPFIFOB=0x0;          //所有捕获单元的栈均为空
         
         GPTCONB=0x41;
         T3CON=0x164C;          //连续增计数,时钟=x/64(x=HSPCLK=SYSCLK/2)
         T4CON=0x174C;          //连续增计数,时钟=x/128(x=HSPCLK=SYSCLK/2)
         
         T3PR=0xFF;
         T4PR=0xFFFF;
         T3CNT=0x0;
         T4CNT=0x0;
}

void conversion(int temp)       /*A/D转换结果转数码管显示子程序*/  
{   
	while((temp-1000)>=0)
	{
		data1=data1+1;
		temp=temp-1000;
	}
	while((temp-100)>=0)
	{
		data2=data2+1;
		temp=temp-100;
	}
	while((temp-10)>=0)
	{
		data3=data3+1;
		temp=temp-10;
	}	
	data4=temp;
}

void Led_show(unsigned int _led_en,unsigned int data)
{
    led_en = _led_en;           
    led_da = data;             
    Delay(100);             
    led_da = 0x0;            
                              
}





⌨️ 快捷键说明

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