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

📄 li.c

📁 通过MEGA128的AD转换模块对加速度传感器进行数据采集并作出判断
💻 C
字号:
#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#define uchar unsigned char
#define uint unsigned int
#define PORT_SWITCH_IP  PORTB
#define DDR_SWITCH_IP   DDRB
#define PIN_SWITCH_IP   PINB
#define BIT_SWITCH_IP   5

// Output Port pin LED_O
#define PORT_LED_O      PORTB
#define DDR_LED_O       DDRB
#define BIT_LED_O       6

// Macro to send strings stored in program memory space
#define PRINTF(format, ...) printf_P(PSTR(format), ## __VA_ARGS__)

// Define baud rate
#define USART0_BAUD         115200ul
#define USART0_UBBR_VALUE   ((F_CPU/(USART0_BAUD<<4))-1)

void USART0_vInit(void)
{
    // Set baud rate
    UBRR0H = (uint8_t)(USART0_UBBR_VALUE>>8);
    UBRR0L = (uint8_t)USART0_UBBR_VALUE;

    // Set frame format to 8 data bits, no parity, 1 stop bit
    UCSR0C = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);

    // Enable receiver and transmitter
    UCSR0B = (1<<RXEN)|(1<<TXEN);   
}

int USART0_iPutChar(char cData, FILE* pxStream)
{
    // Recursive function to prepend a carriage return before a new line
    if(cData == '\n')
    {
        USART0_iPutChar('\r',pxStream);
    }

    // Wait if a byte is being transmitted
    while((UCSR0A&(1<<UDRE0)) == 0)
    {
        
    }

    // Transmit data
    UDR0 = cData;

    return 0;
}

// Create PRINTF Stream structure
FILE PRINTF_xStream = FDEV_SETUP_STREAM(USART0_iPutChar, NULL, _FDEV_SETUP_WRITE);

void TMR_vInit(void)
{
    /* Start timer 1 with clock prescaler CLK/1024 */
    /* Resolution is 139 us */
    /* Maximum time is 9.1 s */
    TCCR1A =  (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)
             |(0<<COM1C1)|(0<<COM1C0)|(0<<WGM11) |(0<<WGM10);

    TCCR1B =  (0<<ICNC1) |(0<<ICES1) |(0<<WGM13) |(0<<WGM12)
             |(1<<CS12)  |(0<<CS11)  |(1<<CS10);
}

void TMR_vDelay(uint16_t u16DelayMs)
{
    // Calculate and set delay
    TCNT1  = (uint16_t) (0x10000 - ((F_CPU/1024)*u16DelayMs)/1000);

    // Clear timer overflow flag
    TIFR = (1<<TOV1);

    // Wait until timer overflow flag is set
    while((TIFR&(1<<TOV1)) == 0)
    {
        ;
    }
}

void ADC_vInit(void)
{
    /* 
       Select AVCC as reference with external capacitor at AREF pin
       ADC1 as the single-ended input channel with 1x gain
    */
    ADMUX =  (1<<REFS1)|(1<<REFS0)|(0<<ADLAR)
            |(0<<MUX4) |(0<<MUX3) |(0<<MUX2) |(0<<MUX1)|(0<<MUX0);

    /*
       Enable ADC; Select Prescaler of 128 (clock frequency of 57.6 kHz)
    */
    ADCSRA =  (1<<ADEN)|(0<<ADSC) |(0<<ADFR) |(0<<ADIF)
             |(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
 void ADC_vSelectChannel( uchar Channel)
{
    // Select new ADC channel in one atomic operation
    uchar Admux = ADMUX;

    Admux &= ~((1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));
    Admux |= (Channel<<MUX0);

    ADMUX = Admux;
}



uint16_t ADC_u16GetSample(void)
{
    // Start conversion
    ADCSRA |= (1<<ADSC);

    // Wait until conversion is finished... 13 ADC clock cycles
    // 4.43 kSPS
    while(ADCSRA&(1<<ADSC))
    {
        ;
    }

    // Return sampled value
    return ADC;
}

int main(void)
{
    uint16_t u16AdcValue1;
	uint16_t u16AdcValue2;
	uint16_t u16AdcValue3;

	 DDR_LED_O |= (1<<BIT_LED_O);

    DDR_SWITCH_IP &= ~(1<<BIT_SWITCH_IP);

    PORT_SWITCH_IP |= (1<<BIT_SWITCH_IP);
		DDRE |= (1<<3);
	PORTE &= ~(1<<3);

   
  
       
        
    


	

 
    USART0_vInit();
    stdout = &PRINTF_xStream;
    TMR_vInit();
    ADC_vInit();
    for(;;)
    {
        // Retrieve a sample
		ADC_vSelectChannel(0);
        u16AdcValue1 = ADC_u16GetSample();
	

        if((PIN_SWITCH_IP&(1<<BIT_SWITCH_IP)) == 0)
        {	TMR_vDelay(1000);
			if((PIN_SWITCH_IP&(1<<BIT_SWITCH_IP)) == 0)
					{	
						PORT_LED_O |= (1<<BIT_LED_O);
						u16AdcValue2=u16AdcValue1;
							
						
					}
			while((PIN_SWITCH_IP&(1<<BIT_SWITCH_IP)) == 0)
			{				PORT_LED_O |= (1<<BIT_LED_O);
						u16AdcValue3 = ADC_u16GetSample();
						u16AdcValue2=(u16AdcValue2+u16AdcValue3)/2;
							
			}

			PORT_LED_O&=~(1<<BIT_LED_O);
			 
				
		  }
		
       
	
	
		
	
		PRINTF("ADC Value2 is %d\n",u16AdcValue2);
		PRINTF("ADC Value1 is %d\n",u16AdcValue1);
		if((u16AdcValue1>(u16AdcValue2+15))|(u16AdcValue1<(u16AdcValue2-15)))
		{	TMR_vDelay(1000);
			PRINTF("qingxie\n");
		//	PORT_LED_O |= (1<<BIT_LED_O);
				PORTE &= ~(1<<3);
		
			
			
		}
		else
		{	
		//	PORT_LED_O&=~(1<<BIT_LED_O);
			PORTE |= (1<<3);
		
		}



        TMR_vDelay(50);
   	}
}

⌨️ 快捷键说明

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