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

[复制链接]
6515|20
 楼主 | 2018-2-24 13:59 | 显示全部楼层 |阅读模式
本帖最后由 ohy3686 于 2018-2-24 14:01 编辑

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

广东职业技术学院   欧浩源

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

1、题目需求
   

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

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

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

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

------------------------------------------------

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-2-24 21:51 | 显示全部楼层
| 2018-2-25 17:19 | 显示全部楼层
楼主可以去学校当个老师了,清晰明了,这个系列对初学者有大助
 楼主 | 2018-2-25 17:24 | 显示全部楼层
gyh974 发表于 2018-2-25 17:19
楼主可以去学校当个老师了,清晰明了,这个系列对初学者有大助

鄙人正是广东职业技术学院的老师。
| 2018-2-25 17:48 | 显示全部楼层
ohy3686 发表于 2018-2-25 17:24
鄙人正是广东职业技术学院的老师。

 楼主 | 2018-2-25 18:56 | 显示全部楼层
| 2018-2-26 12:42 | 显示全部楼层
ohy3686 发表于 2018-2-25 17:24
鄙人正是广东职业技术学院的老师。

老师好 啊
| 2018-2-26 19:46 | 显示全部楼层
写得不错!顶!
| 2018-2-27 11:47 | 显示全部楼层
其实实际项目中按键去抖基本不用这种delay()方式~
 楼主 | 2018-2-27 11:56 | 显示全部楼层
小鱼儿1045 发表于 2018-2-27 11:47
其实实际项目中按键去抖基本不用这种delay()方式~

没错,你说得对...
| 2018-2-27 19:52 | 显示全部楼层
ohy3686 发表于 2018-2-27 11:56
没错,你说得对...

那一般按键检测怎么做好呢,有没有经典的作法
 楼主 | 2018-2-27 19:56 | 显示全部楼层
xiaozhuzhuzhj 发表于 2018-2-27 19:52
那一般按键检测怎么做好呢,有没有经典的作法

这个得问问9楼的朋友,他可能经验丰富。
| 2018-2-28 17:44 | 显示全部楼层
按键消抖时间用来处理其他任务啊,,死等效率多低,,
处理方式有很多,比如
        if((GPIOD->IDR & KEY == 0) //检测到按键按下
        {
                keyPressDownTime++;//计时
                if(keyPressDownTime > TIME20MS)//20ms后仍然是按下状态
                {
                  
                 }
          }
         else
        {
            keyPressDownTime = 0;//按键释放,计时清零
        }
只要设定好一定的时间段扫描按键就可以了。。。
 楼主 | 2018-2-28 23:18 | 显示全部楼层
hjl714016 发表于 2018-2-28 17:44
按键消抖时间用来处理其他任务啊,,死等效率多低,,
处理方式有很多,比如
        if((GPIOD->IDR & KEY ...

适合实际项目开发
对初学者来说,有难度,不易理解。
| 2018-3-8 15:30 | 显示全部楼层
不错,思路很清晰。
| 2018-3-28 00:09 | 显示全部楼层
| 2018-4-10 08:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
| 2018-4-11 13:46 | 显示全部楼层

写得不错!顶!
| 2018-4-14 13:42 | 显示全部楼层
ohy3686 发表于 2018-2-28 23:18
适合实际项目开发
对初学者来说,有难度,不易理解。

初学者总应该理解这种方法。不要让初学者走弯路。
| 2018-4-18 11:25 | 显示全部楼层
小鱼儿1045 发表于 2018-2-27 11:47
其实实际项目中按键去抖基本不用这种delay()方式~

说的对啊,
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /7 下一条

快速回复 返回顶部 返回列表