单片机实训课程设计说明书
2021年12月19日
目录
[一、 外观、电路 1](#外观电路)
[1.1 外观展示 1](#外观展示)
[1.1.1 表盘 1](#表盘)
[1.1.2 表边框 2](#表边框)
[1.1.3 表带 2](#表带)
[1.1.4 按键 2](#按键)
[1.2 电路设计 3](#电路设计)
[1.2.1 最小系统电路 3](#最小系统电路)
[1.2.2 数码管动态扫描电路
3](#数码管动态扫描电路)[1.2.3 蜂鸣器驱动电路 4](#蜂鸣器驱动电路)
[1.2.4 按键 5](#按键-1)
[1.2.5 状态灯电路 5](#状态灯电路)
[1.3 优势 6](#优势)
[1.4 创新点 6](#创新点)
[1.4.1 电路图方面 6](#电路图方面)
[二、 软件设计 7](#软件设计)
[2.1 算法描述 7](#算法描述)
[2.1.1 标志位设计 7](#标志位设计)
[2.1.2 全局变量与数组设计
7](#全局变量与数组设计)[2.1.3 dp秒点控制算法 8](#dp秒点控制算法)
[2.1.4 数码管段码 8](#数码管段码)
[2.1.5 自动退出当前模式 8](#自动退出当前模式)
[2.1.6 按键检测函数 9](#按键检测函数)
[2.1.7 调时函数 11](#调时函数)
[2.1.8 闹钟开关 12](#闹钟开关)
[2.1.9 调时与闹钟调时 13](#调时与闹钟调时)
[2.1.10 闹钟时间记录 13](#闹钟时间记录)
[2.1.11 计时模式的暂停 13](#计时模式的暂停)
[2.1.12 名次记录 14](#名次记录)
[2.2 遇到的问题 14](#遇到的问题)
[2.3 解决方案 14](#解决方案)
[2.4 创新点 15](#创新点-1)
[三、 使用说明 16](#使用说明)
[3.1 模式1:正常走时 16](#模式1正常走时)
[3.2 模式2:日期 16](#模式2日期)
[3.3 模式3:调时 16](#模式3调时)
[3.4 模式4:秒表(计时) 17](#模式4秒表计时)
[3.5 模式5:闹铃 18](#模式5闹铃)
[3.6 操作方法1:调整时间 18](#操作方法1调整时间)
[3.7 操作方法2:短跑计时 19](#操作方法2短跑计时)
[3.7.1 开始计时 19](#开始计时)
[3.7.2 查看成绩 19](#查看成绩)
[3.8 操作方法3:设置闹铃 19](#操作方法3设置闹铃)
[3.8.1 设置闹铃时间 19](#设置闹铃时间)
[3.8.2 开启闹铃 19](#开启闹铃)
外观、电路
外观展示
本组时钟设计选型为手表,采用灰色为主色调,表结构分为表盘、边框、表带、按键,整体如图1-1所示:
图 1-1 外观展示
表盘
表盘采用网格样式,整个表盘分为五个部分,如图1-2所示:
①音频区,发声部位,封装无源蜂鸣器。
②状态区,显示当前所处模式。
③显示区,显示时间、日期等。
④Logo区,显示品牌Logo。
⑤供电区,封装电源、接地器件。
图 1-2 表盘结构
表边框
表边框采用双层、两色(均为灰色)设计,相比其他表,显得更高端大气,如图1-3所示:
图 1-3 表边框展示
表带
表带采用对称、单向渐变、网格化设计,颜色由浅到深来展示,如图1-4所示:
图 1-4 表带展示
按键
按键采用对称、单键凸起、深色填充设计,用户一眼可以看到按键位置,方便操作,如图1-5所示:
图1-5 按键展示
电路设计
最小系统电路
最小系统电路元件选型如表1-1所示:
表1-1 最小系统元件选型
元件 名称 参数 数量
-------------------------- ------------- ---------------- --------------
单片机(AT89C52) AT89C52 12MHz 1
晶振(CRYSTAL) X1 12MHz 1
无极性电容(CAP) C1、C2 30pF、30pF 2
有极性电容(CAP-POL) C3 10uF 1
电阻(RES) R1 10K 1
电阻(RESPACK-8) RP1 \- 1
按键(BUTTON) \- \- 1
电源(POWER) VCC +5V 1
接地(GROUND) GND \- 1
----------------------------------------------------------------------
原理图如图1-6所示:
图1-6 最小系统原理图
数码管动态扫描电路
元件选型如表1-2所示:
表1-2 数码管动态扫描电路元件选型
------------------------------------------------------------------------
元件 名称 参数 数量
-------------------------- ------------- ---------------- --------------
数码管(7SEG-MPX1-CA) \- \- 2
数码管(7SEG-MPX2-CA) \- \- 2
------------------------------------------------------------------------
原理图如图1-7所示:
图1-7 数码管动态扫描电路
蜂鸣器驱动电路
元件选型如表1-3所示:
表1-3 蜂鸣器驱动电路元件选型
------------------------------------------------------------------------
元件 名称 参数 数量
-------------------------- ------------- ---------------- --------------
电阻(RES) R4、R5 300、200 2
三极管(PNP) Q2 \- 1
二极管(10A01) D1 \- 1
电源(POWER) VCC +5V 1
接地(GROUND) GND \- 1
------------------------------------------------------------------------
原理图如图1-7所示:
图1-7 蜂鸣器驱动电路原理图
按键
按键选型如表1-4所示:
表1-4 按键选型
------------------------------------------------------------------------
元件 名称 参数 数量
-------------------------- ------------- ---------------- --------------
按键(BUTTON) \- \- 2
接地(GROUND) GND \- 1
------------------------------------------------------------------------
原理图如图1-9所示:
图1-9 按键原理图
状态灯电路
电阻计算如公式1.1所示:
R = U I R = \frac{\ U\ }{I} R=I U
公式 1…1 电阻计算
由于AT89C51单片机工作电压(U)为5V,发光二极管默认工作电压(U)为2.2V,默认通过电流(I)为10mA,所以根据公式(1.1),该电路每个电阻(R)应设置为280Ω。
元件选型如表1-5所示:
表1-5 状态灯电路元件选型
------------------------------------------------------------------------
元件 名称 参数 数量
----------------------- ------------------ ----------------- -----------
发光二极管(LED-RED) D6、D7、D8、D9 \- 4
电阻(RES) R8、R9、 R10、R11 280Ω 4
电源(POWER) VCC +5V 1
------------------------------------------------------------------------
原理图如1-10所示:
图1-10状态灯原理图
优势
我们的设计相比其他组有以下优势:
-
采用黑灰色调,降低视觉疲劳,尽显商务气息。
-
实际使用更省电,我们没有使用发光二极管来代替秒点,直接使用了数码管的DP脚,与数码管一同扫描显示。
-
电路设计合理,封装了大部分器件,只让用户看到用户想看到的,底层的电路是怎么设计的,用户无需考虑。
创新点
电路图方面
表中秒点设计是直接使用数码管的DP脚,这样相比直接使用发光二极管来充当秒点要更合理、更省电,灵感来自于每栋楼都可以见到的饮水机。
软件设计
算法描述
程序总体思路以标志位当作开关控制程序,以下是各算法的详细描述:
标志位设计
图2-1 标志位
上图2-1中各标志位描述如下表2-1所示:
表2-1 标志位描述
-------------------------------------------------------------------------------
变量名 作用
---------------- --------------------------------------------------------------
ex0btn、ex1btn 外部中断按键标志位,按键按下则标志位置1,在按键处理函数中置0
alarm_switch 闹钟开关标志位,按下相应控制按钮,标志位状态切换(0或1)
alarm_flag 闹钟响铃标志位,置1开始闹钟响铃,响铃后置0
swatch_flag 秒表计时标志位,置1开始秒表计时,暂停后置0
jishi_flag 超时未操作自动退出标志位,置1开始计时,到时置0退出模式
jishi 模式自动退出计时变量,默认记5s无操作退出当前模式
alarm_jishi 闹钟响铃时间,用作计数变量,标志位开启后每秒增加1
-------------------------------------------------------------------------------
全局变量与数组设计
如下图2-2所示:
图2-2 数组及全局变量声明(1)
set_wei:调时模式显示位的切换,计时模式点按相应控制按键后依次点亮秒位、分位、时位。
alarm_wei:闹钟调时模式显示位的切换,闹钟调时模式点按相应控制按键后依次点亮时位、分位、秒位。
number_wei:计时模式中成绩排名的显示变量,显示数码管的dp点,从左到右排名依次靠后。
如下图2-3所示:
ld:为显示dp亮灭控制位。
al:为闹钟开关显示。
图2-3 数组及全局变量声明(2)
dp秒点控制算法
如下图2.4所示,在定时/计数器0中断中,控制50ms进入一次中断,20次后为1s,在秒增加1之后,秒点控制异或0x01,最后一位取反,则完成dp秒点控制。
图2-4 dp秒点控制算法
使用数码管dp闪烁替代秒点,从右往左开始,第1、2、4位数码管需要翻转,把dp点转到上方显示。
显示函数display中,如图2-5所示,控制中间四位数码管显示时异或ld,ld为0x01或0x00。dp点在电路接线中为数码管的最低位,所以数码管异或ld则可以控制最后一位亮灭。ld每秒进行一次取反,则数码管的dp点就会闪烁。
图2-5 送段码
数码管段码
如图2-6所示数码管段码分为正七段码和反七段码,分别对应正放置数码管和反放置七段码,反七段码则通过重新计算数码管a-g数据得出。
图2-6 正、反数码管动态扫描段码声明
自动退出当前模式
jishi_flag:模式自动退出标志位,进入除正常走时模式外的其他模式时标志位置1,开始倒计时(默认5s)。在定时计数器中断中,每秒减1,在相应模式中判断倒计时时间是否减到0,到0则退出当前模式,算法如图2-7所示。
图2-7 自动退出算法
按键检测函数
通过修改单击长按代码,增加双击,单击后长按键值。并结合外部中断进行按键检测,增加准确度。如图2-8所示。
图 2-8 外部中断0处理子函数
外部中断触发后将标志位置1,但不在外部中断中打开外部中断开关。不打开中断原因是打开中断会影响双击,单击后长按的判断。
外部中断与定时计数器中断冲突,如果长按按键,数码管扫描会受到影响,如图2-9所示。
图2-9 按键冲突代码位置定位
按键长按标志位设置,在每个长按判断之后把标志位置0,例如长按与单机后长按都会将btn_flag标志位置0。
标志位置0的原因是在按键键值返回之后,可能按键还没有放开,在按键函数返回键值之前会将外部中断打开,中断进入后重置标志位,按键函数中又进行一次按键判断,成为长按连发,如图2-10与2-11所示,这不利于模式进入和键值判断。
图2-10两按键长按
图2-11两按键单击后长按
在按键函数开头增加图2-12这段代码,每次进入先判断标志位是否为0,为0则表示上次返回的是有关于长按的键值,在判断中使用while等待按键放开,放开后进行按键消抖,并把外部中断打开,标志位打开进行下次按键判断。
图2-12 按键标志位判断
按键判断思路:按键中断把标志位置1,并且btn_flag标志位为1时进入按键判断。
如图2-13,首先进入按键检测函数通过P3端口判断出是按键1或2,赋值为单击键值,如果一直长按,则开始递减判断长按的变量,在变量减到0后,赋值为长按变量。
之后设置等待第二次按键变量,在等待固定时间后,如没有第二次触发按键,则返回上次判断的键值。在等待第二次触发按键时间段内,有按键按下,则开始判断,还是先赋值为单击后第二次单击键值,再进行长按变量递减,在长按变量递减到0时,键值重新赋值为单击后长按。
图2-13双击 单击后长按判断方法
调时函数
进入函数后首先获取当前时间,获取由set_flag标志位管理,因为程序一直通过主函数循环进入调试模式,所以只在第一次进入调试模式时获取一次当前时间,并把相应数码管点亮(调时模式依次调整秒、分、时并且依次点亮)之后开始循环检测键值,如图2-14所示:
图2-14 调时标志位
在jishi_flag没有置0时一直进行调时模式的按键检测并通过键值进行操作,如图2-15所示。
图2-15循环检测键值
在调时模式中,按键长按连发功能,通过获取到某个长按键值之后先判断需要增加的时间(时、分或秒),再通过while进行操作,按键按住不放则在while中一直增加相应时间,并进行少量延时,方便看清增加数值,如图2-16所示。
图2-16 长按连发
在模式自动退出时间抵达时,将标志位重置,退出相应模式如图2-17。
图2-17倒计时
在jishi_flag置0后主函数可以开始新的按键模式切换如图2-18所示。
图2-18主函数键值标志位
闹钟开关
闹钟开关在数码管最后一位的秒点上显示,通过相应按键进行操作,al在按键后异或0x01,可以实现数码管dp点亮灭,如图2-19所示。
图2-19闹钟点
调时与闹钟调时
在调时和闹钟调时开始时,通过标志位判断点亮相应时间位(时、分、秒)的数码管,如图2-20所示。
图2-20数码管调时显示
闹钟时间记录
闹钟的时间记录,在闹钟时间确认之后,把时间存放在数组当中,如图2-21所示,并在下一次进入之后,把数组当中的数值取出用作显示和调时。闹钟时间存放在数组当中也可以方便与走时时间进行闹钟响铃的判断。
图2-21闹钟时间记录
计时模式的暂停
计时模式中,相应的暂停操作放到了外部中断,在秒表计时时,按下外部中断1按键后,判断计时标志位是否为1,为1时停止计时。原因是将停止防置到计时模式中,在进行按键暂停后,会因为响应时间的问题造成停止时间不准确,如图2-22所示。
图2-22外部中断暂停
名次记录
进入秒表时,首先查看第一名的毫秒位是否有跑步成绩,有成绩说明秒表模式已经记录了跑步成绩,则开始显示记录的跑步成绩,并从第一个数码管的dp灯指示是第几名的成绩。把存放在数组中的成绩读取到显示的分、秒、毫秒中。使用二维数组ranking_flag[6][3],其中[6]是记录6名学生成绩(有六组分、秒、毫秒成绩),[3]是记录三个时间(分、秒、毫秒)成绩。
查看成绩模式中点击相应按键后,名次进行增加并显示,如图2-23所示。
图2-23计时排名
计录成绩时,通过增加number_wei显示位控制dp点,用来指示当前记录的名次,如图2-24所示。
图2-24排名显示增加
在显示函数中,将相应显示位通过计算现在的名次进行dp点显示。number_wei从1开始增加,但数码管wei数组从0开始,需要将名次减1后对应数码管的位,再进行和0x01的异或控制数码管dp点,如图2-25所示。
图2-25排名显示
遇到的问题
1.主函数切换模式时放开按键就退出相应模式。
2.按键判断时键值判断不准确
解决方案
1.通过设置自动退出标志位,让主函数不重复获取键值,只进入当前键值的模式当中进行操作。
2.通过在按键检测函数中打开外部中断开关,在检测完成之后再打开进行下一次判断。并在进入按键检测函数时检测长按是否放开。
创新点
1)计时模式使用数组记录成绩排名并在第二次进入时读取成绩。
2)按键键值判断增加双击,单击后长按。
使用说明
如图3-1所示手表外观左边的按键为LEFT,右边的按键为RIGHT。
图3-1 按键图示
模式1:正常走时
打开Proteus仿真软件,点击左下角播放按钮开始仿真则手表开机,手表开机后默认为正常走时模式,正常走时状态下按键功能如下表3-1所示:
表3-1 模式1:正常走时按键功能
---------------------------------------------------------------------------------
按键名称 按键方式 功能
------------- --------------- ---------------------------------------------------
LEFT 单击 显示日期,3s超时退回正常模式
双击 确认,如在其他模式,双击后则退回模式1
长按 进入调时模式,"秒"位开始闪烁
单击后长按 进入闹铃设置模式
RIGHT 单击 闹铃开关(DP亮灭)
双击 退出,如在其他模式,双击后取消当前操作并返回模式1
长按 进入秒表计时模式,无操作3s超时退出
单击后长按 闹铃铃声设置
---------------------------------------------------------------------------------
模式2:日期
单击LEFT进入日期显示无操作5秒后则退回时钟正常走点模式。
模式3:调时
①长按LEFT进入调时模式(设置过程中秒点跟着闪),设置位时,分位和时位不显示,设置分位则时位不显示。
②秒位秒点(dp点)开始闪烁,开始设置妙位,单击LEFT秒位加1,长按LEFT连发加1,单击RIGHT秒位减1,长按RIGHT秒位连发减1,设置完成后双击LEFT完成秒位设置后进入分位设置。
③分位秒点(dp点)开始闪烁,开始设置分位,单击LEFT分位加1,长按LEFT分位连发加1,单击RIGHT分位减1,长按RIGHT分位连发减1,设置完成后双击LEFT则完成分位设置进入时位设置。
④时位秒点(dp点)开始闪烁,开始设置时位,单机LEFT时位加1,长按LEFT时位连发加1,单击RIGHT时位减1,长按RIGHT时位连发减1,再次双击LEFT则回到秒位的设置,设置完成后双击RIGHT则完成设置退回正常走点模式并为设置之后的时间。
长按LEFT进入调时模式后具体设置如表3-1所示。
表3-2 模式3:调时模式日期模式
-----------------------------------------------------------------------------------------------------------------
按键名称 按键方式 功能
--------------- ------------ ------------------------------------------------------------------------------------
LEFT 单击 加1
长按 连发加1
双击 进入分调整,再次双击进入时调整,再双击调时模式退出,无操作5s超时退出,按原时间运行
RIGHT 单击 减1
长按 连发减1
双击 退出并确认
-----------------------------------------------------------------------------------------------------------------
模式4:秒表(计时)
①长按RIGHT进入秒表计时模式(误操作5秒后推出),进入计时模式后,秒位、分位、时位都变成0,单击RIGHT暂停,双击RIGHT为退出秒表(计时)模式。
②单击RIGHT开始计时,双击LEFT记第一个时间,再次双击记第二个时间…支持最高记6次,计满自动推出显示第一名。
长按RIGHT进入秒表计时模式(误操作5秒后推出),具体按键设置如图3-3所示。
表3-3 秒表(计时)模式按键功能
---------------------------------------------------------------------------------------------------------------------
按键名称 按键方式 功能
----------------- ----------------- ---------------------------------------------------------------------------------
LEFT 单击 开始
双击 计第一个时间,再次双击再计第二个时间......支持最高计6次,计满自动退出显示第一名
RIGHT 单击 暂停/下一个时间
长按 连发减1
双击 退出并确认
---------------------------------------------------------------------------------------------------------------------
模式5:闹铃
①正常走点模式中单击RIGHT设置当前时间的闹铃。
②LEFT单击后长按进入闹铃设置模式,从时位开始设置(设置过程中秒位跟着闪),时位秒点(dp点)开始闪烁,设置时位,双击LEFT,分位秒点(dp点)开始闪烁,设置分位,双击LEFT,秒位秒点(dp点)开始闪烁,设置秒位。
③设置过程中单击LEFT为加1,长按LEFT为连发加1,单击RIGHT为减1,长按RIGHT为连发减1。
在模式1LEFT单击后长按进入闹铃设置模式后,具体设置如表3-4所示。
表3-4 模式5:闹铃模式按键功能
---------------------------------------------------------------------------------------------------------------
按键名称 按键方式 功能
------------- ------------ ------------------------------------------------------------------------------------
LEFT 单击 加1
长按 连发加1
双击 进入分调整,再次双击进入时调整,再双击调时模式退出,无操作5s超时退出,按原时间运行
RIGHT 单击 减1
长按 连发减1
双击 退出并确认
---------------------------------------------------------------------------------------------------------------
操作方法1:调整时间
第一步:长按LEFT键进入调时模式(状态灯亮2个)
第二步:单击或长按LEFT或RIGHT进行加或减(设置"秒")。
第三步:设置完秒位后,双击LEFT,单击或长按LEFT或RIGHT进行加或减(设置"分")。
第四步:设置完分位后,双击LEFT,单击或长按LEFT或RIGHT进行加或减(设置"时")。
第五步:双击RIGHT保存(保存并退出)。
操作方法2:短跑计时
开始计时
第一步:长按RIGHT进入秒表计时模式(状态灯亮3个)。
第二步:单击LEFT开始计时。
第三步:双击LEFT记成绩,最多支持记六位选手成绩。
查看成绩
第一步:退出计时模式后,长按RIGHT重新进入计时模式后即可查看记录下来的名次,双击LEFT查看下一位选手的名次。
操作方法3:设置闹铃
设置闹铃时间
第一步:LEFT单击后长按进入闹铃设置模式(状态灯亮4个)
第二步:单击或长按LEFT或RIGHT进行加或减(设置"时")。
第三步:设置完时位后,双击LEFT,单击或长按LEFT或RIGHT进行加或减(设置"分")。
第四步:设置完分位后,双击LEFT,单击或长按LEFT或RIGHT进行加或
减(设置"秒")。
第五步:双击RIGHT保存(保存并退出)。
开启闹铃
第一步:在模式1中单击RIGHT开启闹铃(第6位数码管dp点亮后,即开启成功)。