【经典51懒人5步速成法-05】应用程序设计入门一例通

2020-03-07 17:53发布

本帖最后由 ohy3686 于 2018-2-24 14:01 编辑

【经典51懒人5步速成法-05】应用程序设计入门一例通
广东职业技术学院   欧浩源
    再高级的单片机也是解决问题的一个工具,如何灵活运用已掌握的外设模块来满足功能需求以解决实际问题,是我们学习单片机开发的目标。你的程序写得很快,每个外设用得很溜,并不能代表你解决问题的能力就很好。这需要通过实际开发的磨练与经验的积累。
    实际上每个工程师在不断的开发过程中,多多少少都会形成自己的思维模式和开发习惯。因此,在这一节我们所阐述的也只是本人的思维模式与设计习惯,可以抛砖引玉,作为参考。

1、题目需求
    51-50.PNG

2、基本思路
    我的设计模式是自上而下,从整体到局部。所以,在编写代码之前,我的脑子里面基本上已经有了比较完整的轮廓,包括应该定义那些变量,应该安排那些函数,程序框架大致如何。
    从本题的需求分析中,我们可以获得以下的信息:
    <1>  秒闪功能,需要使用定时器0,得安排一个初始化函数Init_Timer0()和一个中断服务函数SeviceTimer0()。
    <2> 定时器0使用16位模式,在12MHz晶振情况下,最大的定时值也只有65.535ms,因此要定时500ms不能够直接实现,那么就需要多次定时进行累加。把定时器0的间隔定时确定为50ms比较方便,累计10次就是500ms了,那么就需要一个定时累计变量t_count。
    <3> 按键功能,首先要定义一个按键扫描函数ScanKeys(),在扫描过程中需要做去抖动处理,那么就要安排一个简易的延时函数Delay()。
    <4> 再检查思考一下,还有什么吗?没有了。

3、程序框架
    严格来说,在开始编写代码之前,应该将程序的流程图和数据定义表做出来。
    不过,对于简单的功能,可以通过编写代码搭建整体框架的方式来体现。这就跟建设框架结构的房子一样,先把毛坯建好,再去做个单元进行装修。我比较喜欢这做。
    本题在基本思路分析指导下,可以搭建出程序框架结构。
    51-52.PNG

4、逐个填充
    <1> 定时器初始化函数:这个代码是可以重用的,直接拷贝过来就行了。
    51-53.PNG
    <2> 定时器中断服务函数。
    51-54.PNG
    <3> 按键扫描函数。
    51-55.PNG
   就这样,一个简单的51单片机应用程序开发就完成了。

5、小结
    作为入门学习,本系列教材到这里就结束了。实际上51单片机的内容也差不多就这么多了。至于那些上千页的书在讲述51单片机开发的,里面很多内容都是各种功能外设,与51内核无关,只是用51单片机操作那些外设而已。对于这部分的内容,你学习的不是51单片机了,而是那么功能外设。在实际的应用中,更多的是要应用各种外设来解决各种问题。所以,一个单片机的高手并不是把51单片机本身玩得有多溜,而是他心中掌握了多少功能模块的应用,设计了多少应用的代码,积累了多少项目的经验。
    入门教程结束了,而你们的征途才刚刚开始,加油!!!
---------------懒人系列教程相关链接--------------
01-经典51内核资源全览浓缩图
02-重要外设特殊功功能寄存器概览
03-程序开发流程与设计要点
04-三大外设的开发与可重用代码

------------------------------------------------
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
autopccopy
1楼-- · 2020-03-08 17:19
写得不错!顶!
小鱼儿1045
2楼-- · 2020-03-08 19:59
其实实际项目中按键去抖基本不用这种delay()方式~
ohy3686
3楼-- · 2020-03-08 22:02
小鱼儿1045 发表于 2018-2-27 11:47
其实实际项目中按键去抖基本不用这种delay()方式~

没错,你说得对...
xiaozhuzhuzhj
4楼-- · 2020-03-09 01:06
 精彩回答 2  元偷偷看……
ohy3686
5楼-- · 2020-03-09 04:52
xiaozhuzhuzhj 发表于 2018-2-27 19:52
那一般按键检测怎么做好呢,有没有经典的作法

这个得问问9楼的朋友,他可能经验丰富。
hjl714016
6楼-- · 2020-03-09 05:31
按键消抖时间用来处理其他任务啊,,死等效率多低,,
处理方式有很多,比如
        if((GPIOD->IDR & KEY == 0) //检测到按键按下
        {
                keyPressDownTime++;//计时
                if(keyPressDownTime > TIME20MS)//20ms后仍然是按下状态
                {
                  
                 }
          }
         else
        {
            keyPressDownTime = 0;//按键释放,计时清零
        }
只要设定好一定的时间段扫描按键就可以了。。。

一周热门 更多>