




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江西科技师范大学大学生科研、创新性实验项目设计方案第一稿 项目 名称: 微波炉控制系统的设计与制作 项目负责人: 曾光辉 专 业: 电子信息工程 所在 学院: 通信与电子学院 指导 教师: 占华林 2012年 5 月 20 日江西科技师范大学教务处1 总体方案本系统由核心元件AT89C51单片机、LCD1602、独立按键、蜂鸣器构成、电机,用来实现数字电子钟、做饭提醒、模拟定时加热功能。主控部分是由单片机和独立按键两部分构成,显示部分是LCD1602显示模块构成,闹铃部分是外接蜂鸣器构成,模拟加热部分是直流电机构成。实现了秒表和数字电子时钟的功能。工作过程中有各种工作状,显示 时 分 秒以及上午和下午的做饭时刻,这些参数都可以校正。 图 1微波炉控制系统的整个电路2.基于单片机的数字电子钟系统硬件设计该数字钟工作原理是用一片AT89C51单片机通过编程去控制LCD1602实现的。通过2个开关控制来进行时间的调节以及秒表功能,P2.0(key1)口控制按键,当系统处于正常时间显示并且按下此键时,可以进入秒表功能和时间功能的切换,此键还可以作为时间和日期以及闹铃的调整位选中键,当系统处于时间显示模式时,按此键可以选中相应的需要调整的位。当系统处于时间显示模式时,P2.1(key2)口控制按键,按此键对相应的选中位进行加,当系统处于处于秒表工作模式时按此键可以控制秒表计时的启动和暂停。其工作流程:1.年月日时分秒显示。通电后LCD自动显示C语言程序设置好的默认时间2.闹钟显示和设定。通电后,A的右边显示的是默认的闹钟时间,通过key1和key2可以设置闹铃时间。3.秒表显示以及启动和暂停以及清零。处于正常显示时间模式下时按下key1释放后可以进入秒表模式,前3次按下key2的功能依次为启动停止清零,每按3次key2为一个轮回。2.1时钟电路模块下图2-1所示为时钟电路原理图,在AT89C51芯片内部有一个高增益反相放大器,其输出端为引脚XTAL2,输入为芯片引脚XTAL1。而在芯片外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,构成一个稳定的自激振荡电路,电路产生的振荡脉冲经过触发器进行十二分频之后,便成为单片机的时钟信号。图2-1时钟电路原理图2.2复位电路模块下图2-2所示为复位电路原理图,在单片机的实际应用系统中,除单片机本身需复位以外,外部扩展的I/O接口电路等也需要一个复位,因此需要一个系统的同步复位信号,即单片机复位后,CPU开始工作,外部的电路一定要复位好,以保证CPU有效地对外部电路进行初始化编程。单片机复位的条件是:必须使RST/VPD 或RST引脚加上持续两个机器周期(即24个振荡周期)的高电平。电路为上电复位电路,它是利用电容充电来实现的。在接电瞬间,RST端的电位与VCC相同,随着充电电流的减少,RST的电位逐渐降低。只要保证RST为高电平时间大于两个机器周期,就能正常复位。图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所示为闹铃模块电路原理图,闹铃模式时,设定好闹铃时间,闹铃时间有时和分,当设定好的闹铃时间跟系统的当前时间的时和分相等时,系统给P2.2端口送低交替的高低电平,蜂鸣器发出一定频率报警声,一分钟后报警声停止,如果这一分钟内有按键按下则报警声也停止。图2-5闹铃模块电路原理图2.6电机驱动模块下图2-6所示为电机驱动电路原理图,当系统设定好加热的时长之后启动加热责电机转动,剩余的加热时间变为零之后电机停止转动。图2-6 电机驱动电路原理图3软件模块设计介绍AT89C51软件开发环境Keil uVision2,怎样新建一个工程以完成自己的设计和调试。这里不是 Keil开发环境的详细使用手册,关于 Keil 的详细说明文档请浏览 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 “Source Group 1”。图11 向工程中添加源文件新建一个 微波炉控制 文件夹,将文件名改为 微波炉控制.c 后保存到 微波炉控制 文件夹下。按照前面添加文件的方法将 微波炉控制.c 添加到当前工程里。完成的结果如下图图12 添加程序文件后的工程4 系统调试4.1 硬件调试用万用表检测电路板各线路是否导通,用示波器检测信号是否正常。4.2 软件调试4.2.1进入软件调试打开用Protues7.8画好的仿真图图13 画好仿真图4.2.2 加载HEX文件在Protues中双击AT89C51出现下面的对话框,找到HEX文件路径选中文件之后点击OK键回到之前的界面。图14 加载HEX文件点击左下方的按钮则启动仿真图15 启动仿真默认做饭提醒时间为上午11点整和下午6点整,默认时间为12点整图16 启动仿真后按下工作模式键(key1)后显示要加热的时间长短,可以通过模式辅助键(key2)来调整,最长可以调整到60分钟图17 默认的加热时间通过按模式辅助键(key2)后调整为1分钟加热时间图18 调整后的加热时间再次按工作模式按键后显示当前剩余的加热时间,此时并未倒计时,也没有启动加热图19 显示启动加热前剩余的加热时间按下模式辅助键之后启动加热,电机转动,开始到计时,若在加热过程中按下模式辅助键则可以停止加热。图20 启动加热后的当前剩余加热时间4.2 系统联调对整个系统联调时,将每一部分代码与相关实现的硬件联合到一起进行调试,对于哪一部分出了问题就修改哪一部分。这样保证在综合调试的时候,顺利查找错误,找到问题点。5. 系统性能测试一个工作的开发系统下图所示:在此处添加实物调试图附录:源代码:/*项目:基于单片机微波炉控制系统 =描述:系统采用12MHz晶振,以STC89C52为核心外接lcd1602显示和两个独立按键以及蜂鸣器响铃、电机驱动。实现时钟功能以做饭提醒功能(系统时钟采用24小时制),系统上电后显示默认的时分秒以及做饭时间设置(上午11点和下午6点,闹铃的响铃时间为1分钟),通过key1和key2可以对万年历以及闹铃设置进行调整以及秒表的启动暂停以及清零,在没有光标显示时间的模式下前6每次按下key2依次会选中(光标闪烁)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 /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; /模式转换标志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 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 个机器周期 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数据/指令函数 =说明:向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再次检测是否按键还是按下还是按下则有效,读取键值,判断按键是否释放,若释放则对键值处理,返回的键值是处理后的键值,否则不处理,返回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) != 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_process(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(0xCF,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_change_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;if(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);write_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,WDATA);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,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_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;+time.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_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.second59)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);write_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_lcd(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;-time.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_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);/清屏write_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%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);write_lcd(0xC7,WCMD);write_lcd(time.am_alarm_minute%10+0,WDATA);write_lcd(0xC6,WCMD);write_lcd(time.am_alarm_minute+0,WDATA);write_lcd(0xC5,WCMD);write_lcd(:,WDATA);write_lcd(0xC4,WCMD);write_lcd(time.am_alarm_hour%10+0,WDATA);write_lcd(0xC3,WCMD);write_lcd(time.am_alarm_hour/10+0,WDATA);write_lcd(0xC1,WCMD);write_lcd(T,WDATA);write_lcd(0xC0,WCMD);write_lcd(C,WDATA);while(0);if(model_flag = 1&shift_flag =1 )shift_flag =0;start_t1 = 0;dowrite_lcd(0x01,WCMD);/清屏write_lcd(0x8C,WCMD);write_lcd(P,WDATA);write_lcd(0x8C,WCMD);write_lcd(P,WDATA);write_lcd(0x8B,WCMD);write_lcd(U,WDATA);write_lcd(0x8A,WCMD);write_lcd(T,WDATA);write_lcd(0x89,WCMD);write_lcd(E,WDATA);write_lcd(0x88,WCMD);write_lcd(S,WDATA);write_lcd(0x86,WCMD);write_lcd(E,WDATA);write_lcd(0x85,WCMD);write_lcd(M,WDATA);write_lcd(0x84,WCMD);write_lcd(I,WDATA);write_lcd(0x83,WCMD);write_lcd(T,WDATA);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);while(0);if(model_flag = 2& shift_flag = 0)shift_flag =1;start_t1 = 0;dowrite_lcd(0x01,WCMD);/清屏write_lcd(0x8D,WCMD);write_lcd(N,WDATA);write_lcd(0x8D,WCMD);write_lcd(N,WDATA);write_lcd(0x8C,WCMD);write_lcd(I,WDATA);write_lcd(0x8B,WCMD);write_lcd(A,WDATA);write_lcd(0x8A,WCMD);write_lcd(M,WDATA);write_lcd(0x89,WCMD);write_lcd(E,WDATA);write_lcd(0x88,WCMD);write_lcd(R,WDATA);write_lcd(0x86,WCMD);write_lcd(E,WDATA);write_lcd(0x85,WCMD);write_lcd(M,WDATA);write_lcd(0x84,WCMD);write_lcd(I,WDATA);write_lcd(0x83,WCMD);write_lcd(T,WDATA);write_lcd(0xC6,WCMD);write_lcd(time.cooking_time_minute/10+0,WDATA);write_lcd(0xC7,WCMD);write_lcd(time.cooking_time_minute%10+0,WDATA);write_lcd(0xC8,WCMD);wr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 原发性骨髓纤维化护理查房
- 妊娠剧吐护理病历讨论
- 小儿白血病的护理
- 神经性膀胱的护理查房
- 企业综合部月度工作总结
- 护理工作检查反馈
- 公关行业半年工作总结
- 精神科病人输液的护理
- 管理沟通中的冲突管理
- 体温不降反升护理
- python程序设计-说课
- 虫害防治工作总结
- 【自考复习资料】05175税收筹划(重点知识汇总)
- 肺结核的临床诊断和治疗管理指南
- 大学美育(第二版) 课件 第五单元:书法艺术
- 计算机应用基础(Windows10+Office2016)(第3版) 课件 项目3、4 Windows10操作系统、管理计算机中的资源
- 《种子包衣技术》课件
- 《矿区水文地质工程地质勘探规范》水文地质单元及侵蚀基准面划分的探讨
- 高等计算机系统结构课件
- 海南自贸港测试题库(195道)
- 我的家乡威海荣成宣传介绍课件
评论
0/150
提交评论