📄 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); //允许发送和接收
/* 设置帧格式: 8 个数据位, 1 个停止位 */
UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);
UBRR0L = (fosc/baud/16 - 1) % 256;
UBRR0H = (fosc/baud/16 - 1) / 256;
}
/*************** 字符输出函数 ****************************/
void putchar(unsigned char c)
{
while (!(UCSR0A&(1<<UDRE0)));
UDR0=c;
}
/**************** 字符输入函数 ***************************/
unsigned char getchar(void)
{
while(!(UCSR0A& (1<<RXC0)));
return UDR0;
}
/*************** 字符串输出函数 *************************/
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...");
}
}
/********************* 显示整数 ***********************/
void putnum(unsigned char x)
{
if(x>10)
putnum(x/10); //判断是否大于10,大于10则继续调用函数本身,直到x<10,这里用了递归
putchar(x%10 + '0'); //否则小于10,或已执行上一步部,对十求余得个位数,然后通过字符"0"内码加一得各个位数字的内码
}
/********************* 读取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); //启动单次转化
_delay_us(50);
while(!(ADCSRA & (1<<ADIF))); //等待转化结束
ADCSRA |= (1<<ADIF); //清除中断标志
ADC_value = ADCH; //只读高字节,当作8位AD使用
ADCSRA = 0; //关闭ADC
return(ADC_value);
}
/********************* 主函数 ******************************/
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -