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