📄 main.c
字号:
/*
文件:main.c
描述:AD592温度探测程序
编写:黄曦
*/
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
static uint AdConvertBuff[8];
void delayms(uint t)
{
uint i;
for(i=0;i<t;i++)
_delay_loop_2(1000);
}
//////////////////////////
/////////串口部分/////////
/////////////////////////
int usart_putchar(char ch)
{
if(ch=='\n')
usart_putchar('\r');
loop_until_bit_is_set(UCSRA,UDRE);
UDR=ch;
return 0;
}
int usart_getchar(void)
{
loop_until_bit_is_set(UCSRA,RXC);
return UDR;
}
////
void IoInit(void)
{
PORTC=0x00;
DDRC=0x00;
//uart初始化
UCSRB=_BV(RXEN)|_BV(TXEN);
UBRRL=25; //9600bps
//IO流UART连接
fdevopen(usart_putchar,usart_getchar,0);
}
int GetAdc()
{
uchar i;
uint ret;
uchar max_id,min_id,max_value,min_value;
ADMUX=0XC2; //内部2.56V参考电压
ADCSRA=_BV(ADEN);
for (i=0;i<8;i++)
{
ADCSRA|=_BV(ADSC);
_delay_loop_1(60);
while(ADCSRA&_BV(ADSC))
_delay_loop_1(60);
ret=ADCL;
ret|=(uint)(ADCH<<8);
AdConvertBuff[i]=ret; //暂存数据
}
ret=0;
for(i=1;i<8;i++)
{
ret+=AdConvertBuff[i];
}
ret/=7; //取后7个数据平均数
max_id=min_id=1;
max_value=min_value=0;
for(i=1;i<8;i++)
{
if(AdConvertBuff[i]>ret) //寻找最大值
{
if(AdConvertBuff[i]-ret>max_value)
{
max_value=AdConvertBuff[i]-ret;
max_id=i;
}
}
else //寻找最小值
{
if(ret-AdConvertBuff[i]>min_value)
{
min_value=ret-AdConvertBuff[i];
min_id=i;
}
}
}
//抛弃第一个不可靠数据、以及上面找到的最大最小值,计算其余数据的平均值
ret=0;
for(i=1;i<8;i++)
{
if((i!=max_id)&&(i!=min_id))
{
ret+=AdConvertBuff[i];
}
}
//考虑到可能最大最小值为同一数据
if(max_id!=min_id)
{
ret/=5;
}
else
{
ret/=6;
}
return ret;
}
void main()
{
uchar i;
int ret;
IoInit();
delayms(10);
while(1)
{
ret=GetAdc();
if(ret%2)
printf_P(PSTR("Current Temperature: %d.5 degrees.\r\n"),ret/2-273);
else
printf_P(PSTR("Current Temperature: %d degrees.\r\n"),ret/2-273);
delayms(1000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -