单片机实验报告-小型定时开关控制系统设计.docx_第1页
单片机实验报告-小型定时开关控制系统设计.docx_第2页
单片机实验报告-小型定时开关控制系统设计.docx_第3页
单片机实验报告-小型定时开关控制系统设计.docx_第4页
单片机实验报告-小型定时开关控制系统设计.docx_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实 验 报 告( 2017 / 2018 学年 第 学期)课程名称单片机原理及应用实验名称小型定时开关控制系统设计实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业实 验 报 告实验名称小型定时开关控制系统设计指导教师实验类型课内实验实验学时2实验时间一、 实验目的和要求1. 掌握行列式键盘、LED、数码管、蜂鸣器、继电器等人机接口和机电设备的工作原理,以及使用单片机C语言对其进行控制的方法;2. 掌握基于状态转移及定时调度的系统分析方法,并使用此方法对系统软件结构进行分析和设计,实现所要求的功能;3. 掌握使用集成开发环境Keil进行单片机程序的设计、开发及调试的方法和过程。二、 实验要求1. 通过单片机的IO端口控制人机接口及机电设备,完成一个定时开关的设计;2. 定时开关的工作方式可设置为定时开或定时关;3. 系统通过行列式键盘接受用户的按键输入,设置工作方式和定时时长;4. 系统通过控制LED、数码管及蜂鸣器对用户的操作提供反馈和提示;5. 当用户控制计时启动时,系统对用户设定的时长进行倒计时;6. 如用户设置系统工作在定时开方式,则倒计时结束(计数到0)时控制继电器吸合;7. 如用户设置系统工作在定时关方式,则倒计时开始时继电器吸合,倒计时结束(计数到0)时继电器断开。三、 实验环境(实验设备)PC机、Keil C51集成开发环境、STC增强型51单片机,继电器。图3.1 硬件实物图四、 实验原理及内容4.1 程序主体流程分析l 程序分析程序可以分为两个大循环,一个是main函数的循环,一个是定时器1的定时中断任务(T0ISR函数)。Main函数的任务主要有3个:1、完成系统初始化。2、处理定时中断传来的按键任务。3、处理定时结束的事件(开关继电器、蜂鸣器)。定时中断任务主要有5个(1ms的定时时长):1、根据任务减小当前剩余时间。2、刷新键盘。3、刷新数码管。4、响蜂鸣器. 5、刷新led灯main函数和定时中断的流程如下:图4.1.1 主函数和定时中断函数流程图 l 代码设计Main函数代码:void main()/1、初始化 2、处理按键 3、处理定时结束事件 Init();while(1)if(keysolved=0) /有按键要处理solveKey();keysolved=1; /已处理if(TimeOut=1) /定时事件结束if(Timetype=0) /定时开Open();else if(Timetype=1) /定时关Close();TimeOut=0;Laststate=0;定时中断服务程序代码如下,其中XXTH通过宏定义为0xFC,XXTL通过宏定义为0X18:void T0ISR() interrupt 1 /1ms一次/1、根据任务减当前剩余时间 2、刷新键盘 3、刷新显示器 4、蜂鸣器TH0=XXTH;TL0=XXTL;cnt+;if(beepOn=1) /如果蜂鸣器开,响蜂鸣器beep=beep;if(cnt=1000)cnt=0;if(state=2 | state=3)second-;if(second0)minite-;second+=60;if(minite0)hour-;minite+=60;if(hour=60)second-=60;minite+;if(minite=60)minite-=60;hour+;if(hour=99)hour=99;beepcnt=BEEPLEN; /操作错误,蜂鸣器提示else /操作错误,响蜂鸣器提示beepcnt=BEEPLEN;else if(keycode=0x12) /减1sif(state=1) /只有设置状态才可以-1ssecond-;if(second0)second+=60;minite-;if(minite0)minite+=60;hour-;if(hour=60)minite-=60;hour+;if(hour=99)hour=99;beepcnt=BEEPLEN; /操作错误,蜂鸣器提示elsebeepcnt=BEEPLEN;else if(keycode=0x22) /-1分钟if(state=1) /只有设置状态才可以-1分钟minite-;if(minite0)minite+=60;hour-;if(hour=99)hour=99;beepcnt=BEEPLEN; /操作错误,蜂鸣器提示else if(keycode=0x32) /-1小时hour-;if(hour0) /错误的按键按下时,响固定时长的蜂鸣器,提高用户体验beep=beep;beepcnt-;.在需要响蜂鸣器的地方添加一句即可响一下蜂鸣器:beepcnt=BEEPLEN;4.6 数码管显示l 显示格式数码管一共8位,在空闲状态显示全0。在设置状态和定时状态显示当前的时-分-秒。设置和定时状态下显示格式如下:图4.6.1 设置和定时状态下的数码管显示上图中,从左向右依次为时分秒。在空闲状态下显示全0,如下图所示:图4.6.2 空闲状态数码管显示l 硬件电路数码管的段选接在P0端口(中间接入74HC245总线收发器进行驱动),位选通过3-8译码器接在P2口的2-4位。电路图如下图所示:图4.6.3 数码管电路图上图中的LED1LED8的位选信号接入74138译码器,74138译码器的输入端为P2.2到P2.4。138译码器电路如下图所示:图4.6.4 与位选信号相连接的138译码器数码管采用动态显示。刷新操作放在了定时中断服务程序中。定时中断程序通过调用RefreshBoard()函数实现数码管刷新显示。因为定时中断程序每1ms执行一次,数码管有8位,所以刷新率为 。数码管为共阴极数码管,输出1驱动某一段的显示。定义的全局变量段码如下:unsigned char code seg=0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; l 程序设计思路 段码的确定进入RefreshBoard()函数后,首先判断当前系统状态:1、 如果是空闲状态,则显示全0。即向P0口输出“0”的段码。2、 如果是设置状态或者计时状态,则按照图4.6.1的格式输出时、分、秒。中间以短横线隔开。根据课本181页图,可以确定短横线的段码为0x40.在设置状态或者计时状态下显示时、分、秒的时候,需要将当前的时、分、秒分成两位显示,即需要进行取余确定个位,除以10确定十位。 位码的确定每执行一次定时中断服务程序的时候,只显示一位。通过上面的方法确定段码后,还需要确定位选。定义一个全局变量nowwei来表示当前的位选,取值为07。然后138译码器并不能输入10进制数字,所以需要将nowwei的2进制代码中的低3位输出到138译码器。可以通过分别与4、2、1相与的方式确定低3位的01值。定义接入138译码器的输入端ABC引脚的变量如下:sbit G1 =P22; /数码管位选 接入3-8译码器,此为3-8译码器最低位sbit G2 =P23;sbit G3 =P24; /数码管位选 接入3-8译码器,此为3-8译码器最高位则,在RefreshBoard()函数中,通过下面的方法确定G1、G2、G3的数值:G3=(nowwei&4)=0?0:1; G2=(nowwei&2)=0?0:1;G1=(nowwei&1)=0?0:1;位选计算完成后,需要将nowwei变量+1,以便下次定时中断调用RefreshBoard()刷新数码管的时候显示下一位。要注意+1后如果是8要置0,形成循环。l 数码管代码void RefreshBoard() /数码管刷新if(state=0) /空闲状态,显示全0P0=seg0;elseif(nowwei=2 | nowwei=5)P0=0x40; /显示一个横线elseif(nowwei=0)int tmp=second%10;P0=segtmp;else if(nowwei=1)int tmp=second/10;P0=segtmp;else if(nowwei=3)int tmp=minite%10;P0=segtmp;else if(nowwei=4)int tmp=minite/10;P0=segtmp;else if(nowwei=6)int tmp=hour%10;P0=segtmp;else if(nowwei=7)int tmp=hour/10;P0=segtmp;G3=(nowwei&4)=0?0:1; /位选,接入3-8译码器G2=(nowwei&2)=0?0:1;G1=(nowwei&1)=0?0:1;nowwei+;if(nowwei=8) nowwei=0;4.7 矩阵键盘键盘为4*4的矩阵键盘,键盘的硬件电路如图4.4.1所示。l 按键的检测与消抖由于矩阵键盘存在抖动现象,需要消抖。由于本程序包含一个T0的中断程序,所以可以借助T0的中断服务进行消抖。每当当前中断服务程序检测到了键盘按下,而上一个中断服务程序没有检测到按下,就认为键盘按下,从而实现了消抖。关键代码如下:if(lastKeyState=0xf0 & nowkeyState!=0xf0) /有新的按键按下键盘的检测,检测输入线,此单片机学习板中为P1的高4位。当P1高4位全为1,则表示没有键按下,否则有键按下。关键代码如下:nowkeyState=P1 & 0xf0;一旦检测到有新的按键按下后,则开始逐行扫描。将输出线逐位置低,然后读取输入线状态。当读入的某位输入线为低,结合输出线即可确定按键位置。l 按键代码的保存与通知一旦检测到新的按键,即将当前按键码保存到keycode变量中,并将keysolved变量置0,表示当前按键没有处理。Main函数检测到keysolved的为0,即开始处理新的按键。l 按键程序代码RefreshKey()函数被中断服务程序T0ISR调用。void RefreshKey()uchar key,i,line;lastKeyState=nowkeyState;P1=0xf0;nowkeyState=P1 & 0xf0; /读入矩阵键盘输入线状态(P1高4位为输入线)if(beepcnt0) /错误的按键按下时,响固定时长的蜂鸣器,提高用户体验beep=beep;beepcnt-;if(lastKeyState=0xf0 & nowkeyState!=0xf0) /有新的按键按下for(i=0;i4;i+)P1=0xff;line=0x01;line=i;line=line;P1 &=line;key=P1 & 0xf0;switch(key)case(0xe0):keycode=0x40|(4-i);break;case(0xd0):keycode=0x30|(4-i);break;case(0xb0):keycode=0x20|(4-i);break;case(0x70):keycode=0x10|(4-i);break;default:keycode=0;break;if(keycode!=0) break;keysolved=0; /告诉主程序要处理4.8 LED灯状态刷新Led用来指示当前工作状态。分为系统状态和定时类型:此单片机学习板的LED接入在P2口,由于P2的2-4号口已经被138译码器占用,所以只能用其他端口。定义的LED端口如下:/指示系统状态-statesbit led0=P25; /空闲状态sbit led1=P26; /设置状态sbit led2=P27; /定时状态/指示定时类型-Timetypesbit led7=P20; /定时开状态sbit led6=P21; /定时关状态在中断服务程序中,调用RefreshLedState()函数显示LED的状态刷新。为什么要不断刷新LED状态?由于LED用来指示当前系统的工作状态,而工作状态的变量state在键盘按下,定时结束等地方都会被改变,所以用不断检测state和Timetype进行刷新。当然,也可以不刷新,如果不刷新的话,每次改变state和Timetype的时候都要更改相应的LED灯(可以封装为函数)。本程序采用的刷新LED的方案,会稍微增加一点系统消耗。l 程序代码void RefreshLedState() /刷新led,led用于指示当前状态if(state=0)led0=0;led1=1;led2=1;else if(state=1)led0=1;led1=0;led2=1;else if(state=2 | state=3)led0=1;led1=1;led2=0;if(Timetype=0)led7=0;led6=1;else if(Timetype=1)led6=0;led7=1;4.9 定时任务完成后的操作定时任务完成后系统依次进行以下操作:1、 TimeOut变量赋值为1,通知main函数(在中断服务程序完成)2、 保存当前状态到Laststate中,供后续程序使用(在中断服务程序完成)3、 切换系统状态到空闲状态(在中断服务程序完成)4、 设置剩余时间变量都是0(在中断服务程序完成)5、 Main函数检测到TimeOut为1后,根据Timetype(定时类型)进行定时开操作(Open函数)或者定时关(Close函数)操作。6、 设置TimeOut为0,表示操作已经完成了,可以开始下次定时。7、 Laststate为0。清空这次保存的状态。相关代码已经在4.1节贴过,此处不再介绍。l Open函数和Close函数上述步骤中,最核心的就是定时开(Open函数)和定时关(Close函数)了。定时开包括:1、 响蜂鸣器2、 吸合继电器定时关包括:1、 响蜂鸣器2、 断开继电器l 蜂鸣器其中都涉及到了蜂鸣器,此处的响蜂鸣器为一直响,直到用户按下确认键停止(在按键处理一节有介绍)。与用户按键错误后的蜂鸣器提醒不同(提醒大概只响0.1s)。所以,本系统中的蜂鸣器有两个作用:1、 用户按错键后响0.1s提醒用户。2、 定时结束后一直响,提醒用户。l 继电器由于本单片机学习板不带继电器,继电器另外购买的。继电器的实物图如下:图4.9.1 继电器实物图其中,左侧接入负载,右侧接入单片机。由于本程序中P0、P1、P2已经被沾满,此处我们使用P3的0号口作为信号输出。此继电器,高电平触发继电器断开,低电平触发继电器吸合。 程序代码所以,Open函数和Close函数的代码如下:sbit pin=P30; /定义继电器void Open()beepOn=1;pin=0; /低电平出发继电器吸合void Close()beepOn=1;pin=1; /高电平出发继电器断开 电路连接继电器通过P3的IO引脚连接单片机,继电器的另一端接入一个小电动机,作为电动机开关。电动机采用3节7号电池供电,单片机接入USB供电。连接图如下图所示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论