1.程序模块划分
电子表程序采用模块化设计,可以先根据电子表的功能需求对程序进行模块划分,这个过程是单片机程序模块化设计的基本设计步骤。电子表程序根据功能可以划分显示模块、按键模块和主程序模块,按键模块可以独立设计一个按键子程序,显示模块可采用动态显示程序,包含在定时器中断,主程序模块调用子程序,主函数调用子函数。
2.按键程序
根据功能要求,按下key1进入时间、定闹钟调整状态。由于需要对不同对象进行调整,并且要控制所调整的对象闪烁显示,因此需要设定一个记录key1按下次数的状态变量,比如key1_flag。未按下key1时,key1_flag值为0;电子表正常走时,第一次按下key1,key1_flag为1,进入调时状态,同时小时闪烁;再按下key1,key1_flag为2,此时调分钟,分钟闪烁;依次按下key1,可以分别进入其他时间调整。由于本项目中的电子表只需调整5个对象,key1_flag值增加到6时预置为1,重新进入调时状态。按键功能分配见表4-5,程序设计流程如图4-25所示。
表4-5 key1_flag值所对应的功能
(续)
图4-25 电子表按键程序设计流程
知道了按键功能分配以及程序流程很容易设计按键程序,首先要声明一些全局变量,如时间变量hour(时)、min(分)、sec(秒),调整中间变量hour_t、min_t、sec_t以及定闹钟所使用的变量hour_r(定闹钟时)、min_r(定闹钟分),以便在程序设计中用这些变量保存现在时间、调整时间、定闹钟时间。按键程序key.c的设计如下:
按键子程序保存在key.c文件中,用于主程序调用。程序的模块化设计是单片机C语言程序设计的优点,把一个完整小程序单元模块化,可以很容易被主程序或其他程序调用。这在以后的程序设计中会经常用到。(www.xing528.com)
3.主程序
主程序包含主函数、中断服务函数和T0初始化函数,主要完成时间计数、显示和定闹钟处理。由于电子表是采用6位数码管动态显示,并利用关键变量key1_flag控制显示状态,因此电子表的程序设计可以在动态显示的基础上实现。
主函数主要调用T0初始化函数,并时时比较现在时间与定闹钟时间是否一致,同时等待T0中断。T0中断服务函数不但要完成计时,而且要完成各种状态,如正常状态、调整时间状态等显示与驱动。T0中断服务函数是程序设计的关键,也是本项目的难点。其程序流程如图4-26所示。
图4-26 电子表显示程序流程
程序中使用的全局变量key1_flag必须在主程序中声明,主要是因为程序在编译时的顺序原因造成的。在程序设计时,不同的程序可以通过全局变量关联,如同全局变量使用在同一个程序中不同函数之间一样。电子表的程序如下:
按键子程序和主程序设计完成后要保存在同一个目录下。采用Keil设计程序时,在新建工程后直接添加主程序即可。由于程序中有很多类似的结构和程序,因此在编写电子表程序时,应尽量使用复制和粘贴功能,只更改不同的变量值即可,从而使程序输入量大大减小。
本节重点练习单片机程序设计基本技能,当读者在熟悉项目的任务后,只要按键功能分配合理、编写思路清晰,可以在很短的时间内完成电子表的设计。利用单片机完成电子表的设计是单片机程序设计基础最为典型的实训项目,因此,具备独立完成电子表设计能力是单片机项目开发和产品设计的最低要求。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。