?? main.c
字號:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define fosc 12000000 //晶振12MHZ
#define baud 9600 //波特率
unsigned char adcdata_temp[32];
unsigned char currenp;
unsigned char flag_start;
/********************* UART 初始化 ******************************/
void uart_Init(void)
{
UCSR0A = 0x00;
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //允許發(fā)送和接收
/* 設(shè)置幀格式: 8 個(gè)數(shù)據(jù)位, 1 個(gè)停止位 */
UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);
UBRR0L = (fosc/baud/16 - 1) % 256;
UBRR0H = (fosc/baud/16 - 1) / 256;
}
/*************** 字符輸出函數(shù) ****************************/
void putchar(unsigned char c)
{
while (!(UCSR0A&(1<<UDRE0)));
UDR0=c;
}
/**************** 字符輸入函數(shù) ***************************/
unsigned char getchar(void)
{
while(!(UCSR0A& (1<<RXC0)));
return UDR0;
}
/*************** 字符串輸出函數(shù) *************************/
int puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0a);//回車換行
putchar(0x0d);
return 1;
}
/*************** 串口接收中斷 *************************/
SIGNAL(SIG_USART_RECV)
{
if(getchar()=='s')
{
flag_start = 1;
puts("ADC Start!");
}
if(getchar()=='q')
{
flag_start = 0;
puts("ADC Stop...");
}
}
/********************* 顯示整數(shù) ***********************/
void putnum(unsigned char x)
{
if(x>10)
putnum(x/10); //判斷是否大于10,大于10則繼續(xù)調(diào)用函數(shù)本身,直到x<10,這里用了遞歸
putchar(x%10 + '0'); //否則小于10,或已執(zhí)行上一步部,對十求余得個(gè)位數(shù),然后通過字符"0"內(nèi)碼加一得各個(gè)位數(shù)字的內(nèi)碼
}
/********************* 讀取AD值 ******************************/
unsigned char ReadADC(void)
{
unsigned int ADC_value;
ADCSRA |= (1<<ADEN); //使能ADC
ADCSRA |= 0x06; //64分頻,6M/64=93.75K
ADMUX = 0x41; //AVCC, AREF 引腳外加濾波電容,左對齊,通道1
ADMUX |= (1<<ADLAR); //左對齊,將讀取ADCH(高8位),ADCL(最低2位)將拋棄
ADCSRA |= (1<<ADSC); //啟動(dòng)單次轉(zhuǎn)化
_delay_us(50);
while(!(ADCSRA & (1<<ADIF))); //等待轉(zhuǎn)化結(jié)束
ADCSRA |= (1<<ADIF); //清除中斷標(biāo)志
ADC_value = ADCH; //只讀高字節(jié),當(dāng)作8位AD使用
ADCSRA = 0; //關(guān)閉ADC
return(ADC_value);
}
/********************* 主函數(shù) ******************************/
int main(void)
{
unsigned char i;
unsigned int adc_average, adc_temp;
DDRC = 0x01;
PORTC = 0x01;
DDRD = 0xFE;
PORTD = 0xFE;
sei();
uart_Init();
while(1)
{
if(flag_start==1)
{
adc_temp = ReadADC();
adcdata_temp[currenp] = adc_temp;
currenp++;
if(currenp>=32)
{
currenp = 0;
adc_average = 0;
for(i=0;i<32;i++)
{
adc_average = adc_average + (unsigned int)adcdata_temp[i];
}
adc_average = adc_average>>5;
putnum(adc_average);
putchar(0x0a); //回車換行
putchar(0x0d);
}
}
_delay_ms(2);
PORTC ^= 0x01;
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -