作品采用ATMEL公司的ATMGEA88 作为MCU,内部有8K FLASH,1kram。工作在内部8M RC振荡下,耗电仅为2MA左右。采用RISC指令集的AVR核心,运算速度大大超过传统的51单片机。内部带有3个定时器,8路AD(模数转换器),串口,硬件SPI,方便使用。大批量采购价格为6.5RMB,省钱,省电。(具体问题可以搜索下,网上吹捧得很多)推荐你看一下中文的PDF,到处都有下载的。采用这块芯片主要来说就有一点,比51先进,而且带内部AD,集成度高。
使用一块LCD5110手机屏作为显示设备,可以显示输出电压以及当前状态。液晶屏参数为84*,点阵式,使用一个驱动库作为支持,方便开发,工作在3.3V电压下。耗电极低,小于1MA,背光耗电为20MA。单片机和屏幕均工作在3.3v电压下
使用一片LDO(低压差线性稳压源)作为系统电源,LM1117-3.3V,输出电压为3.3V,最大电流500MA
使用2个继电器控制不同的LED来指示处于加热状态还是研磨状态。继电器利用三极管的电流放大特性来控制。当IO口置高时,三极管B级有电流流过,三极管放大后,CE级可以流过大的电流,因此可以控制继电器的吸和和开闭。
采用一个3级管控制蜂鸣器和报警灯的闪烁,原理与上面的一致。总体的来说,是采用3级管的开关工作模式。这时3级管等效于一个可控的开关。
采用美信公司的DS18B20温度探测器做温度探测。温度探测范围从-40度到正125度,满足使用要求。内部可以高达12位精度。目前采用9位精度模式,已经足够豆浆机使用。器件与单片机只需要用一根信号线连接,是典型的1-WIRE器件。为了测试方便,目前只要测量温度超过30度就算预热完成。
以下为单片机的复位电路和烧录接口。
以下为测试用接口
当PC0被拉低时,表明注水完毕,可以开始工作,当PC1被拉低的时候,代表沸腾,此时停止加热。
软件流程图
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
?Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 2010/5/20
Author : NeVaDa
Company : Lenovo
Comments:
Chip type : ATmega88V
Program type : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include #include "lcd5110.h" #include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long uint t; unsigned char yichu,youshui,run,hot,crush; uchar ds1820_reset(void) { uchar i; DDRD.3=1; PORTD.3=0; delay_us(500); /*延时500uS(480-960)*/ PORTD.3=1; DDRD.3=0; delay_us(80); /*延时80uS*/ i =PIND.3; delay_us(500); /*延时500uS(保持>480uS)*/ if (i) { return 0x00; } else { return 0x01; } } uchar ds1820_read_byte(void) { uchar i; uchar value = 0; for (i = 8; i != 0; i--) { value >>= 1; DDRD.3=1; PORTD.3=0; PORTD.3=1; DDRD.3=0; if (PIND.3) value|=0x80; delay_us(60); /*延时60uS*/ } return(value); } void ds1820_write_byte(uchar value) { uchar i; for (i = 8; i != 0; i--) { DDRD.3=1; PORTD.3=0; delay_us(4); if (value & 0x01) { PORTD.3=1; } delay_us(80); /*延时80uS*/ PORTD.3=1; /*位结束*/ value >>= 1; } } void ds1820_start(void) { ds1820_reset(); ds1820_write_byte(0xCC); /*勿略地址*/ ds1820_write_byte(0x44); /*启动转换*/ } unsigned int ds1820_read_temp(void) { unsigned int i; uchar buf[9]; ds1820_reset(); ds1820_write_byte(0xCC); /*勿略地址*/ ds1820_write_byte(0xBE); /*读取温度*/ for (i = 0; i < 9; i++) { buf[i] = ds1820_read_byte(); } i = buf[1]; i <<= 8; i |= buf[0]; i=i*0.625*100; return i; } interrupt [PC_INT1] void pin_change_isr1(void) //按键中断,检测按键变化 { #asm("cli") if(PINC.0==0) {youshui=1;} else {youshui=0;} if(PINC.1==0) {yichu=1;} else {yichu=0;} #asm("sei") // Place your code here } interrupt [TIM1_OVF] void timer1_ovf_isr(void) //定时器中断,刷新温度显示,检查状态之间的切换 { #asm("cli") ds1820_start(); delay_us(210); t=ds1820_read_temp(); LCD_write_number(24,2,t); if(hot==1&&yichu==0) {PORTD.0=1;} else {PORTD.0=0;} if(crush==1) {PORTD.1=1;} else {PORTD.1=0;} if(yichu==1) {LCD_write_6_8string(0,0," Boiling ");} else {LCD_write_6_8string(0,0," ");} #asm("sei") // Place your code here } // Declare your global variables here void main(void) //系统初始化 { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // 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=0xff; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=P State1=P State0=P PORTC=0x07; DDRC=0x00; // Port D initialization // 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=0x00; DDRD=0xff; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock w // Clock value: 125.000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x03; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x00; TCCR2A=0x00; TCCR2B=0x00; TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: On // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x00; PCICR=0x02; PCMSK1=0x07; PCIFR=0x02; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x01; // Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; LCD_init(); //液晶屏初始化 PORTB.5=1; //打开背光 #asm("sei") while (1) {uchar i; LCD_write_6_8string(0,3," Please "); //提示加水 LCD_write_6_8string(0,4," add water "); while(youshui==0) {;} hot=1; LCD_write_6_8string(0,3," Heating "); //第一次加热 LCD_write_6_8string(0,4," "); while(t<30000) //检测超过30度 {;} hot=0; delay_ms(1000); for(run=5;run>0;run--) //4次循环,每次先研磨17秒,然后煮17秒 { crush=1; LCD_write_6_8string(0,3," Crush "); for(i=18;i>0;i--) {LCD_write_6_8string(0,4," s "); LCD_write_number(24,4,i); delay_ms(1000); } crush=0; delay_ms(1000); hot=1; LCD_write_6_8string(0,3," Heating "); for(i=18;i>0;i--) {LCD_write_6_8string(0,4," s "); LCD_write_number(24,4,i); delay_ms(1000); } hot=0; delay_ms(1000); } hot=1; LCD_write_6_8string(0,3," Cooking "); //延煮3分钟,180秒 for(i=181;i>0;i--) {LCD_write_6_8string(0,4," s "); LCD_write_number(24,4,i); delay_ms(1000); } hot=0; delay_ms(1000); LCD_write_6_8string(0,3," All OK "); //所有完成,蜂鸣器鸣响3秒 LCD_write_6_8string(0,4," "); PORTD.2=1; delay_ms(3000); PORTD.2=0; // Place your code here while (1) {;} }; }