《基于单片机的微波炉控制系统.doc》由会员分享,可在线阅读,更多相关《基于单片机的微波炉控制系统.doc(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、江西科技师范大学大学生科研、创新性实验项目设计方案第一稿 项目 名称: 微波炉控制系统的设计与制作 项目负责人: 曾光芒 专 业: 电子信息工程 所在 学院: 通信与电子学院 指导 教师: 占华林 2012年 5 月 20 日江西科技师范大学教务处1 总体方案本系统由核心元件AT89C51单片机、LCD1602、独立按键、蜂鸣器构成、电机,用来实现数字电子钟、做饭提醒、模拟定时加热功能。主控部分是由单片机和独立按键两部分构成,显示部分是LCD1602显示模块构成,闹铃部分是外接蜂鸣器构成,模拟加热部分是直流电机构成。实现了秒表和数字电子时钟的功能。工作过程中有各种工作状,显示 时 分 秒以及上
2、午和下午的做饭时刻,这些参数都可以校正。 图 1微波炉控制系统的整个电路该数字钟工作原理是用一片AT89C51单片机通过编程去控制LCD1602实现的。通过2个开关控制来进行时间的调节以及秒表功能,P2.0key1口控制按键,当系统处于正常时间显示并且按下此键时,可以进入秒表功能和时间功能的切换,此键还可以作为时间和日期以及闹铃的调整位选中键,当系统处于时间显示模式时,按此键可以选中相应的需要调整的位。当系统处于时间显示模式时,P2.1key2口控制按键,按此键对相应的选中位进行加,当系统处于处于秒表工作模式时按此键可以控制秒表计时的启动和暂停。其工作流程:1.年月日时分秒显示。通电后LCD自
3、动显示C语言程序设置好的默认时间2.闹钟显示和设定。通电后,A的右边显示的是默认的闹钟时间,通过key1和key2可以设置闹铃时间。3.秒表显示以及启动和暂停以及清零。处于正常显示时间模式下时按下key1释放后可以进入秒表模式,前3次按下key2的功能依次为启动停止清零,每按3次key2为一个轮回。2.1时钟电路模块下列图2-1所示为时钟电路原理图,在AT89C51芯片内部有一个高增益反相放大器,其输出端为引脚XTAL2,输入为芯片引脚XTAL1。而在芯片外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,构成一个稳定的自激振荡电路,电路产生的振荡脉冲经过触发器进行十二分频之后,便成为单
4、片机的时钟信号。图2-1时钟电路原理图2.2复位电路模块下列图2-2所示为复位电路原理图,在单片机的实际应用系统中,除单片机本身需复位以外,外部扩展的I/O接口电路等也需要一个复位,因此需要一个系统的同步复位信号,即单片机复位后,CPU开始工作,外部的电路一定要复位好,以保证CPU有效地对外部电路进行初始化编程。单片机复位的条件是:必须使RST/VPD 或RST引脚加上持续两个机器周期即24个振荡周期的高电平。电路为上电复位电路,它是利用电容充电来实现的。在接电瞬间,RST端的电位与VCC相同,随着充电电流的减少,RST的电位逐渐降低。只要保证RST为高电平时间大于两个机器周期,就能正常复位。
5、图2-2复位电路原理图2.3 LCD1602显示电路模块下列图2-3所示为LCD1602显示模块电路原理图图4-3显示模块电路原理图2.4按键电路模块下列图4-4所示为独立按键模块电路原理图,根据此电子时钟功能要求,需要设置以下两个功能键:工作模式键(key1),模式辅助键(key2)。按照键盘与CPU的连接方式可分为独立键盘和矩阵键盘。独立式键盘是各个按键相互独立,每个按键占用一个I/O口,外加上拉电阻,每个I/O口上的按键不会影响到其他I/O口的按键工作状态。独立式键盘电路配置灵活,软件结构简单,所以本设计采用独立式键盘。图2-4独立按键模块电路原理图2.5闹铃模块下列图4-5所示为闹铃模
6、块电路原理图,闹铃模式时,设定好闹铃时间,闹铃时间有时和分,当设定好的闹铃时间跟系统的当前时间的时和分相等时,系统给P2.2端口送低交替的高低电平,蜂鸣器发出一定频率报警声,一分钟后报警声停止,如果这一分钟内有按键按下则报警声也停止。图2-5闹铃模块电路原理图2.6电机驱动模块下列图2-6所示为电机驱动电路原理图,当系统设定好加热的时长之后启动加热责电机转动,剩余的加热时间变为零之后电机停止转动。图2-6 电机驱动电路原理图3软件模块设计介绍AT89C51软件开发环境Keil uVision2,怎样新建一个工程以完成自己的设计和调试。这里不是 Keil开发环境的详细使用手册,关于 Keil 的
7、详细说明文档请浏览 Keil 软件的帮助文档。3.1 建立一个新工程点击 Project 菜单,选择 Greate New Project . 如图 11图5 建立一个新工程弹出图12建立新工程对话框,文件名框中输入工程名字,保存类型选择.uv2,点击保存。图6 选择工程类型点击保存之后便出现芯片的选择框。图7 选择芯片型号点击确定之后出现下面的对话框。图8 汇编启动代码本系统采用C语言编程,所以选择否,出现窗口中的工程。图8 工作区窗口中的工程图9 保存工作区3.2 添加文件或新建程序文件选中Source Group1后出现下面选项。图10 添加源文件点击Add Files to Group
8、 “Source Group 1”。图11 向工程中添加源文件新建一个 微波炉控制 文件夹,将文件名改为 微波炉控制.c 后保存到 微波炉控制 文件夹下。按照前面添加文件的方法将 微波炉控制.c 添加到当前工程里。完成的结果如下列图图12 添加程序文件后的工程4 系统调试4.1 硬件调试用万用表检测电路板各线路是否导通,用示波器检测信号是否正常。4.2 软件调试进入软件调试打开用画好的仿真图图13 画好仿真图4.2.2 加载HEX文件在Protues中双击AT89C51出现下面的对话框,找到HEX文件路径选中文件之后点击OK键回到之前的界面。图14 加载HEX文件点击左下方的按钮则启动仿真图1
9、5 启动仿真默认做饭提醒时间为上午11点整和下午6点整,默认时间为12点整图16 启动仿真后按下工作模式键key1后显示要加热的时间长短,可以通过模式辅助键key2来调整,最长可以调整到60分钟图17 默认的加热时间通过按模式辅助键key2后调整为1分钟加热时间图18 调整后的加热时间再次按工作模式按键后显示当前剩余的加热时间,此时并未倒计时,也没有启动加热图19 显示启动加热前剩余的加热时间按下模式辅助键之后启动加热,电机转动,开始到计时,假设在加热过程中按下模式辅助键则可以停止加热。图20 启动加热后的当前剩余加热时间 系统联调对整个系统联调时,将每一部分代码与相关实现的硬件联合到一起进行
10、调试,对于哪一部分出了问题就修改哪一部分。这样保证在综合调试的时候,顺利查找错误,找到问题点。5. 系统性能测试一个工作的开发系统下列图所示:在此处添加实物调试图附录:源代码:/*项目:基于单片机微波炉控制系统 =描述:系统采用12MHz晶振,以STC89C52为核心外接lcd1602显示和两个独立按键以及蜂鸣器响铃、电机驱动。实现时钟功能以做饭提醒功能(系统时钟采用24小时制),系统上电后显示默认的时分秒以及做饭时间设置(上午11点和下午6点,闹铃的响铃时间为1分钟),通过key1和key2可以对万年历以及闹铃设置进行调整以及秒表的启动暂停以及清零,在没有光标显示时间的模式下前6每次按下ke
11、y2依次会选中(光标闪烁)pm_alarm_minute,pm_alarm_hour,amm_alarm_minute,amm_alarm_hour,hour,minute,在光标闪烁的时候每次按下key2可以对相应选中位进行校正。按下key1在设置微波炉加热时间的模式下,前60次按下key2加1,60次之微波炉加热时间清零按下key1后系统显示当前定好的时间,再按下key2则启动加热作者:曾光芒日期:2012年5月7号*/#include/系统头文件#define data_busP0/lcd数据总线#define WDATA 1 /rs=WDATA时写入数据#define WCMD 0 /
12、rs=WCMD时写入命令#define KEYP2/按键端口#define key_shake_time 2/键盘消抖时间sbit rs=P25; /lcd数据指令选择端,高data低cmdsbit rw=P26; /lcd读写选择端,高读低写sbit en=P27; /lcd信号加载端,下降沿有效sbit key1=P20; /被拉低说明有键按下sbit key2=P21; /被拉低说明有键按下sbit fm=P22; /蜂鸣器sbit motor= P23;/电机端口unsigned char shift_flag;/切换显示标志unsigned char model_flag; /模式转
13、换标志unsigned char start_flag;/做饭启停标志unsigned char time_change_flag; /时间调整标志位unsigned char key_value;/键值unsigned char t0,t1;/系统时间计时变量和键盘消痘时间计时变量unsigned char start_t1;/做饭启动后倒计时计数变量struct TIMunsigned char hour;/时unsigned char minute;/分unsigned char second;/秒unsigned char am_alarm_hour;/上午做饭闹铃时unsigned
14、char am_alarm_minute;/上午做饭闹铃分unsigned char pm_alarm_hour;/下午做饭闹铃时unsigned char pm_alarm_minute;/下午做饭闹铃分unsigned char setup_cooking_time;/设定做饭实际那unsigned char cooking_time_minute;/微波炉定时时间分unsigned char cooking_time_second;/微波炉定时时间秒time=/初始化日期时间和闹钟以及秒表12,0,0,11,0,6,0,0,0,0,;/*us级延时程序 =说明:延时 2*i+1+2 个机
15、器周期 12MHz时,延时 2*i us*/void delay_us(unsigned char i) while(-i);/*读lcd函数=说明:读取lcd1602内的内容 主要是读忙标志位*/unsigned char read_lcd(void) unsigned char read_value=0x00;/置为输入data_bus=0x00;rs=1; /数据指令选择,rs只能为1,rw=1; /读使能en=1;read_value=data_bus;/读取数据delay_us(15);/延时1us左右en=0;return(read_value); /返回读到的数据/*写lcd数据
16、/指令函数 =说明:向lcd1602中写入数据或者指令*/void write_lcd(unsigned char value,bit data_cmd )/value表示要写入的内容,data/cmd表示数据指令选择/data_bus=0xff;/置为输出delay_us(100);rs=data_cmd;/数据指令选择rw=0;/写使能en=1;data_bus=value;delay_us(100);en=0;delay_us(100);/*键盘扫描函数=说明:MCU检测到有按键按下后TIMER1延时key_shake_time*10ms再次检测是否按键还是按下还是按下则有效,读取键值,
17、判断按键是否释放,假设释放则对键值处理,返回的键值是处理后的键值,否则不处理,返回0 */unsigned char key_scan(void)static unsigned char value;/键值static unsigned char do_key;/执行相应命令标识static unsigned char key_scan_step;/键盘扫描步骤if(key_scan_step=0)key_value = 0;if(do_key=0)if(KEY & 0x03 != 0x03)t1=0;do_key=1;if(t1=key_shake_time)&(KEY & 0x03) !=
18、 0x03)value = KEY & 0x03;do_key = 0;key_scan_step = 1;if(key_scan_step=1)&(KEY & 0x03) = 0x03)key_scan_step = 0;switch(value)case 0x02 :value = 1;break;case 0x01 :value = 2;break;case 0x03 :value = 0;break;default :value = 0;break;return(value);elsereturn(0);/*按键处理函数=说明:根据系统的要求对返回的键值做处理*/void key_pr
19、ocess(void)if(key_value = 1)key_value=0;if(time_change_flag !=0)if(time_change_flag = 1)+time.pm_alarm_minute;if(time.pm_alarm_minute59)time.pm_alarm_minute = 0;write_lcd(0xCE,WCMD);write_lcd(time.pm_alarm_minute/10+0,WDATA);write_lcd(0xCF,WCMD);write_lcd(time.pm_alarm_minute%10+0,WDATA);write_lcd(0
20、xCF,WCMD);write_lcd(0x0F,WCMD);if(time_change_flag = 2)+time.pm_alarm_hour;if(time.pm_alarm_hour23)time.pm_alarm_hour = 0;write_lcd(0xCB,WCMD);write_lcd(time.pm_alarm_hour/10+0,WDATA);write_lcd(0xCC,WCMD);write_lcd(time.pm_alarm_hour%10+0,WDATA);write_lcd(0xCC,WCMD);write_lcd(0x0F,WCMD);if(time_chan
21、ge_flag = 3)+time.am_alarm_minute;if(time.am_alarm_minute59)time.am_alarm_minute = 0;write_lcd(0xC6,WCMD);write_lcd(time.am_alarm_minute/10+0,WDATA);write_lcd(0xC7,WCMD);write_lcd(time.am_alarm_minute%10+0,WDATA);write_lcd(0xC7,WCMD);write_lcd(0x0F,WCMD);if(time_change_flag = 4)+time.am_alarm_hour;i
22、f(time.am_alarm_hour23)time.am_alarm_hour = 0;write_lcd(0xC3,WCMD);write_lcd(time.am_alarm_hour/10+0,WDATA);write_lcd(0xC4,WCMD);write_lcd(time.am_alarm_hour%10+0,WDATA);write_lcd(0xC4,WCMD);write_lcd(0x0F,WCMD);if(time_change_flag = 5)+time.hour;if(time.hour23)time.hour = 0;write_lcd(0x85,WCMD);wri
23、te_lcd(time.hour/10+0,WDATA);write_lcd(0x86,WCMD);write_lcd(time.hour%10+0,WDATA);write_lcd(0x86,WCMD);write_lcd(0x0F,WCMD);if(time_change_flag = 6)+time.minute;if(time.minute59)time.minute = 0;write_lcd(0x88,WCMD);write_lcd(time.minute/10+0,WDATA);write_lcd(0x89,WCMD);write_lcd(time.minute%10+0,WDA
24、TA);write_lcd(0x89,WCMD);write_lcd(0x0F,WCMD);if(time_change_flag = 0)+model_flag;if(model_flag = 2)start_flag = 0;time.cooking_time_minute=time.setup_cooking_time;time.cooking_time_second=0;if(model_flag 2)time.setup_cooking_time = 0;shift_flag = 0;model_flag = 0;time_change_flag = 0;write_lcd(0x01
25、,WCMD);/清屏if(key_value = 2)key_value=0;if(model_flag = 0)TR0 = 0;+time_change_flag; if(time_change_flag = 1)write_lcd(0xCF,WCMD);write_lcd(0x0F,WCMD); if(time_change_flag = 2)write_lcd(0xCC,WCMD);write_lcd(0x0F,WCMD); if(time_change_flag = 3)write_lcd(0xC7,WCMD);write_lcd(0x0F,WCMD); if(time_change_
26、flag = 4)write_lcd(0xC4,WCMD);write_lcd(0x0F,WCMD); if(time_change_flag = 5)write_lcd(0x86,WCMD);write_lcd(0x0F,WCMD); if(time_change_flag = 6)write_lcd(0x89,WCMD);write_lcd(0x0F,WCMD);if(time_change_flag 6)TR0 = 1;write_lcd(0x0C,WCMD);time_change_flag = 0;if(model_flag = 1)time_change_flag = 0;+tim
27、e.setup_cooking_time;if(time.setup_cooking_time 60)time.setup_cooking_time = 0;write_lcd(0xC7,WCMD);write_lcd(time.setup_cooking_time%100/10+0,WDATA);write_lcd(0xC8,WCMD);write_lcd(time.setup_cooking_time%10+0,WDATA);if(model_flag = 2)/time_change_flag = 0;+start_flag ;if(start_flag = 1&time.cooking
28、_time_minute!=0)motor = 0;/启动加热if(start_flag 1)motor = 1;start_flag = 0;time.setup_cooking_time = 0;time.cooking_time_minute = 0;time.cooking_time_second = 0;if(start_flag = 0)motor = 1;/关闭加热/*更新日期和时间函数=说明:对TIMER0得到的系统时钟进行处理 从而得到时分秒年月日*/void update_time(void)if(t0=20)t0=0;time.second+;if(time.second
29、59)time.second=0;time.minute+;if(time.minute59)time.minute=0;time.hour+;if(time.hour23)time.hour=0;if(model_flag = 0)write_lcd(0x85,WCMD);write_lcd(time.hour/10+0,WDATA);write_lcd(0x86,WCMD);write_lcd(time.hour%10+0,WDATA);if(model_flag = 0)write_lcd(0x88,WCMD);write_lcd(time.minute/10+0,WDATA);writ
30、e_lcd(0x89,WCMD);write_lcd(time.minute%10+0,WDATA);if(model_flag = 0)write_lcd(0x8B,WCMD);write_lcd(time.second/10+0,WDATA);write_lcd(0x8C,WCMD);write_lcd(time.second%10+0,WDATA);/*秒表更新时间函数=说明:对TIMER1得到的秒表计数进行处理 从而得到时分秒和毫秒*/void update_stop_watch(void)/*if(model_flag = 1)write_lcd(0xC7,WCMD);write_l
31、cd(time.setup_cooking_time%100/10+0,WDATA);write_lcd(0xC8,WCMD);write_lcd(time.setup_cooking_time%10+0,WDATA);*/if(start_t1 = 100 & start_flag = 1&model_flag = 2&time.setup_cooking_time!=0)motor = 0;start_t1=0;-time.cooking_time_second;if(time.cooking_time_second=255)time.cooking_time_second=59;-tim
32、e.cooking_time_minute;if(model_flag = 2)write_lcd(0xC6,WCMD);write_lcd(time.cooking_time_minute%100/10+0,WDATA);write_lcd(0xC7,WCMD);write_lcd(time.cooking_time_minute%10+0,WDATA);if(time.cooking_time_minute = 0&time.cooking_time_second=0)time.setup_cooking_time = 0;motor = 1;start_flag = 0;if(model
33、_flag = 2)write_lcd(0xC9,WCMD);write_lcd(time.cooking_time_second/10+0,WDATA);write_lcd(0xCA,WCMD);write_lcd(time.cooking_time_second%10+0,WDATA);/*切换显示函数=说明:在时间显示和秒表显示之间进行切换*/void shift_display(void)if(model_flag = 0 & time_change_flag = 0 & shift_flag =0)shift_flag = 1;dowrite_lcd(0x01,WCMD);/清屏wr
34、ite_lcd(0x8B,WCMD);write_lcd(time.second/10+0,WDATA);write_lcd(0x8B,WCMD);write_lcd(time.second/10+0,WDATA);write_lcd(0x8C,WCMD);write_lcd(time.second%10+0,WDATA);write_lcd(0x8A,WCMD);write_lcd(:,WDATA);write_lcd(0x88,WCMD);write_lcd(time.minute/10+0,WDATA);write_lcd(0x89,WCMD);write_lcd(time.minute
35、%10+0,WDATA);write_lcd(0x87,WCMD);write_lcd(:,WDATA);write_lcd(0x85,WCMD);write_lcd(time.hour/10+0,WDATA);write_lcd(0x86,WCMD);write_lcd(time.hour%10+0,WDATA);write_lcd(0xCF,WCMD);write_lcd(time.pm_alarm_minute%10+0,WDATA);write_lcd(0xCE,WCMD);write_lcd(time.pm_alarm_minute/10+0,WDATA);write_lcd(0xCD,WCMD);write_lcd(:,WDATA);write_lcd(0xCC,WCMD);write_lcd(time.pm_alarm_hour%10+0,WDATA);write_lcd(0xCB,WCMD);write_lcd(time.pm_alarm_hour/10+0,WDATA);write_lcd(0xC9,WCMD);write_lcd(&,WDATA
限制150内