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

📄 demo_11_3__.c

📁 基于AVR单片机捕捉功能实现高精度的周期测量.原理就是将被测信号作为ICP1的输入,被测信号的上升(下降)沿作为输入捕捉的触发信号.捕捉事件发生的时间印记由硬件自动 同步复制到ICR1中,因此所得到
💻 C
字号:
/*********************************************
File name	        : demo_11_4.c
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 1.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/

#include <mega16.h>
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x40
	.EQU __sm_mask=0xB0
	.EQU __sm_powerdown=0x20
	.EQU __sm_powersave=0x30
	.EQU __sm_standby=0xA0
	.EQU __sm_ext_standby=0xB0
	.EQU __sm_adc_noise_red=0x10
	.SET power_ctrl_reg=mcucr
	#endif

sfrw ICR1=0x26;

flash char led_7[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
flash char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

char dis_buff[6];					// 显示缓冲区,存放要显示的6个字符的段码值
unsigned int icp_v1,icp_v2;
char icp_state;
char int_n;
bit m;

void display(void)					// 6位LED数管动态扫描函数
{
    static char posit=0;
	PORTC = 0xff;
	PORTA = led_7[dis_buff[posit]];
	PORTC = position[posit];
	if (++posit >=6 ) posit = 0;
}

// Timer 2 比较匹配中断服务,2ms定时
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
 	#asm("sei")			// 开放全局中断
    display();
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
    if (int_n)
    {
        icp_v2 = ICR1;
        if (m == 1)
        {
            if (int_n == 101)  icp_v1=icp_v2;
        }
        else
        {
            if (int_n == 2)   icp_v1=icp_v2;
        }
        --int_n;
    }
}

void time_to_disbuffer(long v)				// 时钟时间送显示缓冲区函数
{
	char i;
	for (i=0;i<=4;i++)
	{
        dis_buff[i] = v%10;
        v /= 10;
	}
	dis_buff[5] = v;
	for (i=5;i>0;i--)
	{
	    if (dis_buff[i] == 0)
	        dis_buff[i] = 10;
	    else
	        break;
	}
}

void main(void)
{
    unsigned int icp_1,icp_2,icp_tmp;
    long vv;

	DDRA=0xFF;          // LED段码输出
	PORTC=0xFF;
	DDRC=0x3F;          // LED位控输出

    DDRB = 0x08;
    PORTB = 0x01;

	PORTD=0x40;          // PD6音乐播放输出

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 62.500 kHz
    // Mode: CTC top=OCR2
    // OC2 output: Disconnected
    TCCR2=0x0C;         // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
    OCR2=0xf9;//7c;          // OCR0 = 0x7c(124),(124+1)/62.5=2ms
 	// T/C1初始化
    TCCR1B = 0x41;
	TIMSK = 0xA0;		// 允许T/C1比较匹配A中断,允许T/C0比较匹配中断

    m = 0;
    int_n = 2;

	#asm("sei")			// 开放全局中断

	while (1)
	{
	    if (int_n == 0)
	    {
	        if (icp_v2 >= icp_v1)
	            icp_2 = icp_v2 - icp_v1;
	        else
	            icp_2 = 65536 - icp_v1 + icp_v2;

            if (icp_2 < icp_1)
                icp_tmp = icp_1 - icp_2;
            else
                icp_tmp = icp_2 - icp_1;
	        if (icp_tmp <= 2)
	        {
                vv = 4000000/icp_2;
                time_to_disbuffer(vv);
	        }

	        #asm("cli")
	        if (icp_2 < 599)
	        {
	            int_n = 101;
	            m = 1;
	        }
	        else
	        {
	           int_n = 2;
	           m = 0;
	        }
	        TIFR = 0xff;

	        #asm("sei")
	        icp_1 = icp_2;
	        icp_state = 0;
	    }
    }
}

⌨️ 快捷键说明

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