电饭煲课程设计程序.docx
《电饭煲课程设计程序.docx》由会员分享,可在线阅读,更多相关《电饭煲课程设计程序.docx(31页珍藏版)》请在冰豆网上搜索。
![电饭煲课程设计程序.docx](https://file1.bdocx.com/fileroot1/2022-12/8/5dd77adc-7c5a-4f42-a988-20ddbc02a3f9/5dd77adc-7c5a-4f42-a988-20ddbc02a3f91.gif)
电饭煲课程设计程序
课程设计任务书
专业年级班
一、设计题目
电饭煲控制器
二、主要内容
电饭煲控制器有预约功能,有烹饪大米饭、粥、保温、冷饭加热等功能
三、具体要求
1.具体功能
大米饭:
当达到105°时,停止加热,并在15分钟后通过蜂鸣器提示用户。
粥:
开始加热后,通过测温元件监视锅底温度,使锅底温度保持在99°~100.5°之间(100°时停止加热、99°时开始加热),此种状态持续20分钟,之后通过蜂鸣器提示用户过程结束。
保温:
使锅底温度维持在50°~60°之间。
冷饭加热:
锅底加热至100°,使锅底温度保持在99°~100.5°之间(100°时停止加热、99°时开始加热),此种状态持续5分钟,之后通过蜂鸣器提示用户过程结束。
2.定时
用户可以是电饭煲在预约时间(倒计时方式)开始工作,最长预约时长为12小时。
3.控制面板
四个发光管分别与大米饭、粥、保温、冷饭加热相对应,另一发光管用于区分工作与预约,两位数码管用于预约时间及倒计时。
按键有:
开始键、功能键、加键、减键。
四、进度安排
1、了解任务要求,确定具体方案
2、lcd12864液晶屏子程序设计
3、DS18B20温度传子程序感器设计
4、设计单片机按键功能程序
5、根据任务要求编写程序,设计按键电路
6、检验设计效果,完善功能
五、完成后应上交的材料
电饭煲控制器论文
六、总评成绩
指导教师签名日期年月日
系主任审核日期年月日
摘要
电饭煲控制器有预约功能,有烹饪大米饭、粥、保温、冷饭加热等功能.。
基于stc89c52单片机控制的电饭煲控制器,有lcd液晶屏显示和ds18b20温度检测功能,还有定时工作选择功能。
关键字:
电饭煲温度控制DS18B20LCD12864键盘按键
一、任务分析与设计电路1
1、总体方案设计1
1.1、控制方案选择1
1.2、测温模块控制选择1
1.3、键盘按键方案选择2
1.4、显示方案选择2
1.5、声音模块方案选择3
1.6、功率元件模块方案选择3
2、电路设计3
2.1、控制模块3
2.2、测温模块6
2.3、键盘模块10
2.4、显示模块11
2.5、声音模块13
2.6、功率模块14
二、软件设计15
1、程序流程图15
1.1、主流程图15
1.2、子流程图17
1.3、功率元件控制流程图17
1.4、定时预约工作流程图18
三、系统调试分析20
1、系统硬件调试20
2、系统软件调试20
四、心得体会20
一、任务分析与设计电路
1、总体方案设计
1.1、控制方案选择
方案:
采用STC公司的STC89C52RC。
此单片机价格低,资源多,高性价比,应用广泛,无论是从内部构造,还是编程方面,51系列单片机都相对简单容易掌握和使用。
对于本题目而言,由于电饭煲需要实现的功能少,对处理器的要求不高,使用STC89C52RC不仅可以完全实现对电饭煲的控制,还节约了成本。
综合考虑,电饭煲控制器采用STC89C52RC单片机。
1.2、测温模块控制选择
测温模块采用数字温度传感器DS1820。
DS1820是美国DALLAS半导体公司生产的可组网数字式温度传感器,其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
与其它温度传感器相比,DS1820具有以下特性:
?
1.独特的单线界面方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。
2.?
DS1820支持多点组网功能,多个DS1820可以并联在唯一的三在线,实现多点测温。
?
?
3.?
DS1820在使用中不需任何外围元键。
?
?
4.测温范围-55℃~+125℃,固有测温分辨率0.5℃。
?
?
5.?
测量结果以9位数字量方式串行传送。
由于在本课程设计中,电饭煲的期望温度最高值在数字温度传感器DS1820的量程内,同时,DS1820具有测温系统简单、测温精度高、连接方便、占用口线少等优点。
所以,我选用DS18B20温度传感器。
1.3、键盘按键方案选择
由于在该课程设计中,需要的按键只要四个:
开始键、功能键、加键、减键,键盘个数较少,可以用独立式按键电路。
所以我选用独立按键电路。
1.4、显示方案选择
方案一、使用数码管显示。
数码管能显示数字,使用方法简单方便,可是显示过于单调。
方案二、使用lcd12864液晶屏。
lcd12864能清晰显示字符和数字,显示的信息更多。
因为数码管只能显示数字,过于单调,而lcd12864能显示汉字和数字,还有各种图案,能更好地进行人机沟通,达到更好的显示效果。
综上所述,我选用lcd1286液晶屏。
1.5、声音模块方案选择
由于在该课程设计中,只需要对工作状态和工作方式的提示,用蜂鸣器产生的beebee声音即可。
1.6、功率元件模块方案选择
功率元件的控制通过固态继电器来完成。
固态继电器也称作固态开关。
是一种由固态电子组成的新型电子开关器件,集光电藕合,大功率双向晶闸管,及触发电路,阻容吸收回路于一体.用来代替传统的电磁式继电器。
实现对单相或者三相电动机的正反转控制,或者其他控制无触点无动作噪音。
开关速度快无火花干扰和可靠性高等特性。
由于单片机学习板配有固态继电器,所以直接选用单片机学习板的继电器作为功率元件模块。
2、电路设计
2.1、控制模块
STC89C52是一个低电压,高性能CMOS?
8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,STC89C52单片机在电子行业中有着广泛的应用。
特点:
1、兼容MCS51指令系统
2、8kB可反复擦写(大于1000次)FlashROM;
3、32个双向I/O口;
4、256x8bit内部RAM;
5、3个16位可编程定时/计数器中断;
6、时钟频率0-24MHz;
7、2个串行中断,可编程UART串行通道;
8、2个外部中断源,共8个中断源;
9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
工作原理:
STC89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部界面等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收译码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,如图1-1、1-2所示。
图1-1AT89C52的DIP封装引脚图
图1-2最小系统图
2.2、测温模块
测温模块采用数字温度传感器DS1820。
DS1820是美国DALLAS半导体公司生产的可组网数字式温度传感器,其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
与其它温度传感器相比,DS1820具有以下特性:
?
独特的单线界面方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。
2.?
DS1820支持多点组网功能,多个DS1820可以并联在唯一的三在线,实现多点测温。
?
?
3.?
DS1820在使用中不需任何外围元件。
?
?
4.测温范围-55℃~+125℃,固有测温分辨率0.5℃。
?
?
5.?
测量结果以9位数字量方式串行传送。
DS18B20有两种封装形式,即TO-92封装和8-pinSOIC封装。
每种封装的样式及引脚排列见图1-3,其引脚功能描述见表1。
图1-3DS18B20的引脚排列
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线界面引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
表1DS18B20详细引脚功能描述
下图是温度检测模块原理如图1-4所示:
图1-4温度检测模块原理图
2.3、键盘模块
在键盘模块中,我采用独立式按键电路。
特点:
1)每个键独立地接入一根数据输入线。
2)平时所有的数据输入线都连接成高电平;
3)当任何一个按键压下时,与之相连的数据输入线被拉成低电平。
4)要判断是否有键按下,只要位处理指令即可。
独立连接式键盘优点是结构简单、使用方便,但随着键数的增多,所占用的IO口线也增加。
该系统的键盘由4个独立键盘构成。
键盘的一脚接在单片机的P1.0至P1.4脚上,另外一脚接在电源地上,当有键盘按下时对应的键盘就会有一低电平送到单片机内部。
为消除触点式按键开关的机械抖动,单片机内部有程序进行消抖处理,然后确定那一个键盘被按下后来执行程序完成该系统的指定工作。
按键键盘原理图如图1-5所示:
图1-5按键图
2.4、显示模块
显示模块我使用了lcd12864液晶屏。
带中文字库的12864是一种具有4位/8位并行、2线或3线串行多种界面方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,?
内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的界面方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字.?
也可完成图形显示.低电压低功耗是其又一显着特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
其控制方法如图1-7、1-8所示。
12864显示电路如图1-6所示:
图1-612864电路图
图1-7
图1-8
2.5、声音模块
该模块使用蜂鸣器。
蜂鸣器需要的驱动电流较大(50~100mA),由于单片机输出低电平时的驱动电流只有十几毫安,因此要外接一个PNP三极管作为功率驱动器件。
当P3^7口输出低电平时,PNP导通,蜂鸣器正常工作,当当P3^7口输出高电平时,PNP截止,蜂鸣器暂停工作。
原理如图1-9:
图1-9蜂鸣器
2.6、功率模块
功率模块我选用单片机学习板上的固态继电器。
如图1-10所示。
图1-10继电器电路图
当单片机P3^6口输出低电平时,BJT管导通,LED9指示灯亮,继电器工作。
二、软件设计
1、程序流程图
系统的软件设计采用结构化和模块化设计的方法,便于程序的编写、调试和排除错误,同时也便于检验和维护。
单片机系统的软件程序主要由以下模块组成:
初始化主程序、输入及显示、温度采集、功率元件控制。
1.1、主流程图
如图2-1所示:
图2-1系统主流程图
1.2、子流程图
如图2-2:
图2-2系统子程序流程图
1.3、功率元件控制流程图
图2-2子流程图
电饭煲控制系统对电饭煲加热与否需要根据当前锅内温度以及所处的工作模式做出选择。
其软件控制流程如下图所示。
控制器先通过温度传感器获得当前锅内温度,根据所处的工作模式,得到需要到达的目标温度。
若当前锅内温度小于目标温度,则控制器接通加热盘加热,否则断开加热盘,停止加热。
功率元件控制流程如图2-3所示。
图2-3功率元件控制流程图
1.4、定时预约工作流程图
系统运行后,若按下“开始”按键,系统即可进入定时预约功能状态,表示“时”位的个位数值处于可设定状态,高位默认显示“0”。
此时按下“加”键,预定时间的小时数的个位将累加1,如果累加后的数值大于9,高位的数值将自动变为1;若按下“减”键,预定时间的小时数的个位将减去1。
由于本控制系统支持最大定时12小时,当小时数超出12后会溢出为0。
即置定时数值时,若当前示数为12,且按下“加”键,则lcd显示的数值由12变为00。
预约小时数设定完成后,按下“开始”键,系统则保存用户设定的定时时间并退出定时时间设定状态。
随如图2-4所示:
图
2-4定时工作流程图
三、系统调试分析
1、系统硬件调试
按照画好的电路图把外围电路接好,主要的自己做了一个独立按键小键盘。
而ds18b20温度传感器的接线比较简单,只需3跟线就完成了。
2、系统软件调试
12864液晶屏的原理比较好理解,不要多长时间就看懂。
而ds18b20温度传感器的原理就有点难懂,看了比较久才看懂。
但在自己编译过程中,却出现很多错误。
比如,系统无法读取ds18b20里面的温度,仔细检查程序后发现在ds18b20读取数据时间那里有错误,时间太短,导致无法读取。
在编写主程序时,发现无法返回温度值给单片机,搞了很久都搞不定。
后来发现是忘记了在ds18b20子程序那里加入返回函数return,加上return后,终于完成。
四、心得体会
在看到课程设计的题目后,我就感觉应该是挺好玩的。
果然我看到了电饭煲控制器这个题目!
以前在家里就修过坏了的电饭煲,可惜没能修好...
经过这次的课程设计后,我想我应该能修坏了的电饭煲了!
这次课程设计获益良多,既加深了我c语言的知识,又让我学会了lcd12864和ds18b20的使用。
而在编程过程中,一个小小的语句错误就会到致程序无法运行,更让我明白谨慎小心的重要性。
在最后系统能正常运作时,整个人都有一种成功的飘然...
附录程序:
主程序
#include
#include
#include<12864.c>
#include
//#include
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P3^2;//功能按键
sbitk2=P3^3;
sbitk3=P3^4;
sbitk4=P3^5;
sbita1=P1^0;//按键指示灯
sbitb1=P1^1;
sbitc1=P1^2;
sbitc2=P1^3;
ucharcodem1[]="煮饭";
ucharcodem2[]="煮粥";
ucharcodem3[]="保温";
ucharcodem4[]="冷饭加热";
ucharcodem5[]="工作状态";
ucharcodem6[]="定时状态";
ucharcodem7[]="预定时间:
";
ucharcodem8[]="H";
ucharcodem10[]="定时时间:
";
voidzhufan();//煮饭函数声明
voidzhuzhou();//煲粥函数声明
voidbaowen();//保温函数声明
voidjiare();//冷饭加热函数声明
voidtiming();//定时预约函数
voidselect();
sbity1=P3^6;//继电器
sbity2=P3^7;//蜂鸣器
uints1=0,s=0,m=0,h=0;//秒,分,时计数
/************延时********************/
voiddelay2(uintx)
{while(x--)
{uinty;
for(y=125;y>0;y--);}
}
/******************定时器***********************/
voidtime0()//定时器0
{
TMOD=0x01;
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
voidt0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
s1++;
if(s1==20){s++;s1=0;}//1s
if(s==60){m++;s=0;}//1min
if(m==60){h++;m=0;}//1hour
if(h==12){h=0;}//12hour
}
/******************************按键功能********************/
voidkey()
{
if(k1==0)//工作状态按键
{
delay2(10);
if(k1==0)
{
lcd_init();//lcd初始化
a1=0;b1=1;c1=1;c2=1;
lcd_pos(0,0);//显示菜单
print(m1);
lcd_pos(0,3);
print(m2);
lcd_pos(0,6);
print(m3);
lcd_pos(2,2);
print(m4);
}while(!
k1);//等待松开按键
while(k1&k2&k3&k4);//等待选择菜单功能
delay2(10);
select();
}
if(k2==0)//预定功能按键
{
delay2(10);
if(k2==0)
{
lcd_init();
a1=0x02;
lcd_pos(0,0);
print(m7);
timing();
}
}
}
voidselect()//选择4种功能
{
if(k1==0)//煮饭
{
delay2(10);
if(k1==0)
{
a1=0;b1=1;c1=1;c2=1;//工作指示灯
lcd_init();
lcd_pos(0,3);
print(m1);
//while(!
k1);
//lcd_pos(0,3);
//print(m2);
zhufan();
}
}
if(k2==0)//煮粥
{
delay2(10);
if(k2==0)
{
a1=1;b1=0;c1=1;c2=1;
lcd_init();
lcd_pos(0,3);
print(m2);
zhuzhou();
}
}
if(k3==0)//保温
{
delay2(10);
if(k3==0)
{
a1=1;b1=1;c1=0;c2=1;
lcd_init();
lcd_pos(0,3);
print(m3);
baowen();
}
}
if(k4==0)//冷饭加热
{
delay2(10);
if(k4==0)
{
a1=1;b1=1;c1=1;c2=0;
lcd_init();
lcd_pos(0,2);
print(m4);
jiare();
}
}
}
//*************************煮饭*************************/
voidzhufan()
{
ucharw1,w4;
lcd_init();
lcd_pos(0,3);
print(m1);
y1=1;//打开继电器,开始加热
//get_temp();
//delay(100);
//w4=get_temp();
while(get_temp()<200)
{
c2=0;
delay2(10);
get_temp();
lcd_pos(2,0);
dis_temp();
delay2(100);
}
//while
(1)
//{
//
//get_temp();
//////delay(70);
//////delay(70);
////
////if(w4>26)break;
//}
//while
(1)
//{lcd_pos(3,0);print(m1);}
//while(temp<105);
while(w4>25)//温度大于105°C时
{
//get_temp();
//lcd_pos(2,0);
//dis_temp();
EA=1;
while(s<=15);//定时15min
EA=0;
s1=0;s=0;m=0;h=0;
y1=0;
for(w1=5;w1>0;w1--)//煮饭完成,鸣笛5次
{
y2=0;
delay2(100);
delay2(100);
y2=1;
delay2(100);
delay2(100);
}
if(y2=1)break;
}
baowen();
}
/******************************煮粥*************************/
voidzhuzhou()
{ucharw1;
lcd_init();
lcd_pos(0,3);
print(m2);
y1=1;//打开继电器,开始加热
get_temp();//获取温度数值
while(temp<100);
EA=1;
while(m<=20)
{
get_temp();
delay2(10);
if(temp>100)
{
y1=0;//温度大于100,停止加热
}
if(temp<=99)//温度在99到100度之间
{//保持温度稳定
y1=1;
}
}
EA=0;
s1=0;s=0;m-0;h=0;
for(w1=5;w1>0;w1--)
{
y2=0;
delay2(100);
delay2(100);
y2=1;//煲粥完成,鸣笛5次
delay2(100);
delay2(100);
}
baowen();