摘要: AVR单片机功能强大,用AVR单片机开发各种控制系统只需很少的外部器件就可以实现强大的功能。本文介绍的就是利用Atmega16、CodeVisionAVR C开发环境、Proteus仿真软件开发汽车空调自动控制系统。
关键字:AVR单片机、空调自动控制、CodeVisionAVR C、Proteus仿真
- 前言
Atmega16是美国ATMEL公司的高档8位单片机,采用Flash存储器,可以擦写10000次以上、内部集成、四通道PWM、集成8路10位精度ADC、片内经过标定的RC振荡器、采用精简指令集,具有32个通用工作寄存器,具有只需两个时钟周期的硬件乘法器,运算速度快等。由于其集成度高、处理速度快,使得利用AVR单片机进行系统开发只需很少(甚至没有)的外部器件即可实现强大的功能,逐渐在各种场合得到广泛应用,取代其它8位单片机。利用它来开发汽车空调控制系统,只需热电阻、液晶显示模块和一些继电器及其驱动芯片即可实现。
- 工作原理
本系统可以分为五大部分:热电阻温度采集、运行状态显示、继电器控制、键盘输入、风向步进电机控制。
uchar ventilator_state;
uchar fan;
uchar blow;
uchar run_mode;
uchar temp;
uchar setting_value;
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
//产生PWM,控制步进电机
if (fan==1)
{
OCR2=64;
}
else if(fan==2)
{
OCR2=128;
}
}
#define FIRST_ADC_INPUT 0 //第一通道
#define LAST_ADC_INPUT 1 //最后一通道 ,最大值为7,共8个通道
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x40
// ADC中断服务程序
// 自动扫描模拟量输入端口,
interrupt [ADC_INT] void adc_isr(void)
{
register static unsigned char input_index=0;
// 读取转换结果
adc_data[input_index]=ADCW;
// 选择转换通道
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
//启动AD转换
ADCSRA|=0x40;
}
void main(void)
{
float current_temp;//保存当前温度
// Port A 初始化
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B 初始化
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C 初始化
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x38;
DDRC=0x38;
// Port D 初始化
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x1f;
DDRD=0xF8;
//用T2产生PWM,控制风向步进电机
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x64;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
ADMUX=FIRST_ADC_INPUT|ADC_VREF_TYPE;
ADCSRA=0xEE;
SFIOR&=0x1F;