📄 cap.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 + -