?? 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 + -