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

📄 misc.c

📁 超声波测距仪套件 电路图、GCC源代码资料
💻 C
字号:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include "MAIN.h"
#include "3310LCD.h"
#include "MISC.h"
#include "UltraDelay.h"

#define WONS    10
#define WOFFS  (25-1-WONS)
#define WONM    13
#define WOFFM  (25-1-WONM)


void msDelay(unsigned int T)
{
    while(T--)
        _delay_loop_2(1000*FREQ/4);
}

void HEX2toASC5(unsigned int Ldata, char *ptr,unsigned char len,unsigned char nHIDE)
{
    unsigned char k;
    unsigned char S[]="XXXXX";
    unsigned char *Ptr=S;
    k=0;
    while (Ldata>=10000)  	//5
    {
        Ldata-=10000;
        k++;
    }
    if (k)
    {
        k+=0x30;
        nHIDE=1;
    }
    else if(nHIDE)
        k='0';
    else
        k=' ';    			//hide
    *Ptr++=k;

    k=0;
    while (Ldata>=1000) 	//4
    {
        Ldata-=1000;
        k++;
    }
    if (k)
    {
        k+=0x30;
        nHIDE=1;
    }
    else if(nHIDE)
        k='0';
    else
        k=' ';   		 	//hide
    *Ptr++=k;

    k=0;
    while (Ldata>=100)  	//3
    {
        Ldata-=100;
        k++;
    }
    if (k)
    {
        k+=0x30;
        nHIDE=1;
    }
    else if(nHIDE)
        k='0';
    else
        k=' ';    			//hide
    *Ptr++=k;

    k=0;
    while (Ldata>=10)  		//2
    {
        Ldata-=10;
        k++;
    }
    if (k)
        k+=0x30;
    else if(nHIDE)
        k='0';
    else
        k=' ';    			//hide
    *Ptr++=k;

    k=(unsigned char)Ldata;
    if (k)
    {
        k+=0x30;
    }
    else
        k='0';
    *Ptr++=k;

    Ptr-=len;
    while (len--)
        *ptr++=*Ptr++;
}

unsigned int read_adc(unsigned char adc_input)
{//AD转换设置:ADCSR=0x86;(DIV=64 )ADMUX=0xc0;
    ADMUX=(0xc0|adc_input);		//adc_input:选择通道; 0xc0:选择内部2.56V参考电压
    msDelay(1);
    ADCSRA|=0x40;				//启动AD转换
    while ((ADCSRA&0x10)==0);	//等待AD转换结束
    ADCSRA|=0x10;				//clear
    return ADC;					//ADC=ADCH & ADCL
}


//从RS232发送一个字节
void uart_putchar(char c)
{
    while(!(UCSRA & 0x20));
    UDR = c;
}

void uart_puts(char *ptr)
{
    while (*ptr)
        uart_putchar(*ptr++);
}

void OUT_40KHz(void)
//T0 prescale=1,WGM=CTC 12.5uS+12.5uS
{
    unsigned char pulsecnt;
    asm volatile("cli"::);
    PORTB|= (1<<TX_nOC0);
    OCR0  = 0x63;
    TCNT0 = 0x00; //clear
    TCCR0 = (1<<WGM01)|(1<<CS00)|(1<<COM00);
    for (pulsecnt=0;pulsecnt<4;pulsecnt++)
    {
        while (PINB&(1<<TX_nOC0));    //1
        while (!(PINB&(1<<TX_nOC0))); //0
    }
    TCCR0 = 0x00; //stop
    PORTB|= (1<<TX_nOC0);
    asm volatile("sei"::);
}

void DP_DEC(unsigned char step)
{
    PORTB&=~(1<<DP_UnD);	//DOWN
    PORTD&=~(1<<DP_nCS);
    while (step--)
    {
        PORTB&=~(1<<DP_nINC);
        PORTB|= (1<<DP_nINC);
    }
    PORTD|= (1<<DP_nCS);
}

void DP_INC(unsigned char step)
{
    PORTB|= (1<<DP_UnD);	//UP
    PORTD&=~(1<<DP_nCS);
    while (step--)
    {
        PORTB&=~(1<<DP_nINC);
        PORTB|= (1<<DP_nINC);
    }
    PORTD|= (1<<DP_nCS);
}


unsigned int Calc_Distance(void)
{
    //Speed =33150+(temp*607/10)
    //Dist= Speed*T/(100000*2))
    unsigned long speed;
    unsigned long Distance_mm;
    unsigned long XMM;
    speed =(TEMP[0]<<4)+(TEMP[1]>>4); //12bit
    speed =speed*607;
    speed =speed/160;
    speed+=33150;
    Distance_mm=speed*CAPTIME;
    XMM=(Distance_mm/200000);
    return (unsigned int)XMM;
}

void setOverTime(void)
{
    TCNT1 = 0;
    TCCR1B= (1<<ICNC1)|(0<<ICES1)|(1<<CS12)|(1<<CS10);  //8S stanby
    TIFR  = 0xFF;
    TIMSK = (1<<TOIE1); //T1OVF
    RUN_ST= 0x00;
    PORTD&=~(1<<SIG_ICP);
    DDRD |= (1<<SIG_ICP);
    _delay_loop_2(10*FREQ/4);
    DDRD &=~(1<<SIG_ICP);  //FORCE ICP to low
}
void OUT_D_40KHz(void)
{
    asm volatile("cli"::);
    PORTB&=~(1<<TX_nOC0);
    _delay_loop_2(WONS*FREQ/4);
    PORTB|= (1<<TX_nOC0);
    _delay_loop_2(WOFFS*FREQ/4);
    asm volatile("nop"::);
    asm volatile("nop"::);

    PORTB&=~(1<<TX_nOC0);
    _delay_loop_2(WONM*FREQ/4);
    PORTB|= (1<<TX_nOC0);
    _delay_loop_2(WOFFM*FREQ/4);
    asm volatile("nop"::);
    asm volatile("nop"::);
    PORTB&=~(1<<TX_nOC0);
    _delay_loop_2(WONM*FREQ/4);
    PORTB|= (1<<TX_nOC0);
    _delay_loop_2(WOFFM*FREQ/4);
    asm volatile("nop"::);
    asm volatile("nop"::);
    PORTB&=~(1<<TX_nOC0);
    _delay_loop_2(WONM*FREQ/4);
    PORTB|= (1<<TX_nOC0);
    _delay_loop_2(WOFFM*FREQ/4);
    asm volatile("nop"::);
    asm volatile("nop"::);
    PORTB&=~(1<<TX_nOC0);
    _delay_loop_2(WONM*FREQ/4);
    PORTB|= (1<<TX_nOC0);
    _delay_loop_2(WOFFM*FREQ/4);
    asm volatile("nop"::);
    asm volatile("nop"::);
    PORTB&=~(1<<TX_nOC0);
    _delay_loop_2(WONM*FREQ/4);
    PORTB|= (1<<TX_nOC0);
    _delay_loop_2(WOFFM*FREQ/4);
    asm volatile("nop"::);
    asm volatile("nop"::);

    asm volatile("sei"::);
}
void get_DT(void)
{
    unsigned char gaincnt=0;
    unsigned int  gaindelay;
    SPCR &=~(1<<SPE); 		//Disenable SPI
    DP_DEC(255);
    DP_DEC(1);	//min GAIN
    CAP_ST =START;
    CAPTIME=0;
    CAPCNT =0;
    TCNT1  =0;
    OUT_D_40KHz();			//TX 4puls
    TCCR1B =(1<<ICNC1)|(0<<ICES1)|(1<<CS11);  //1uS,Fail,4Sample
    _delay_loop_2(200*FREQ/4);
    TIFR=0xFF;
    TIMSK = (1<<TOIE1)|(1<<TICIE1);	//T1OVF+ICP
    while (CAP_ST==START)			//waitting Overflow
    {
        gaindelay=pgm_read_word(&Udelay[gaincnt++]);
        _delay_loop_2(gaindelay);
        DP_INC(1);
    }
    TIMSK &=~(1<<TICIE1); 		//disenable ICP
    while (CAP_ST!=OVER)
        ;	//waitting Overflow
    setOverTime();
    DP_DEC(255);
    DP_DEC(1);	//min GAIN
    SPCR |=(1<<SPE);			//Enable SPI
    AGAIN=gaincnt;
}

void get_FIX(void)
{
    SPCR &=~(1<<SPE);			//Enable SPI
    DP_DEC(255);
    DP_DEC(1);	//min GAIN
    DP_INC(GAIN);
    CAP_ST =START;
    CAPTIME=0;
    CAPCNT =0;
    TCNT1  =0;
    OUT_D_40KHz();					//TX 4puls
    TCCR1B =(1<<ICNC1)|(0<<ICES1)|(1<<CS11);  //1uS,Fail,4Sample
    msDelay(BLANK);
    TIFR=0xFF;
    TIMSK  =(1<<TOIE1)|(1<<TICIE1);	//T1OVF+ICP
    while (CAP_ST==START);			//waitting Overflow
    TIMSK &=~(1<<TICIE1); 			//disenable ICP
    while (CAP_ST!=OVER);			//waitting Overflow
    setOverTime();
    DP_DEC(255);
    DP_DEC(1);						//min GAIN
    SPCR |=(1<<SPE);				//Enable SPI
}

⌨️ 快捷键说明

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