打印
[51单片机]

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

[复制链接]
10950|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ohy3686|  楼主 | 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-三大外设的开发与可重用代码

------------------------------------------------
评论
pinao 2023-10-25 12:37 回复TA
用sbit来定义引脚 
lu888 2022-11-25 15:21 回复TA
为什么我秒这个程式上去检测错误 
lu888 2022-11-24 11:42 回复TA
高手 

相关帖子

沙发
dirtwillfly| | 2018-2-24 21:51 | 只看该作者

使用特权

评论回复
板凳
gyh974| | 2018-2-25 17:19 | 只看该作者
楼主可以去学校当个老师了,清晰明了,这个系列对初学者有大助

使用特权

评论回复
评论
知我者 2020-1-31 17:25 回复TA
楼主就是大学老师、 欧阳老师 
地板
ohy3686|  楼主 | 2018-2-25 17:24 | 只看该作者
gyh974 发表于 2018-2-25 17:19
楼主可以去学校当个老师了,清晰明了,这个系列对初学者有大助

鄙人正是广东职业技术学院的老师。

使用特权

评论回复
评论
lu888 2022-11-26 09:38 回复TA
为什么我照抄上面的程式上去怎么不行呢 
5
gyh974| | 2018-2-25 17:48 | 只看该作者
ohy3686 发表于 2018-2-25 17:24
鄙人正是广东职业技术学院的老师。

使用特权

评论回复
6
ohy3686|  楼主 | 2018-2-25 18:56 | 只看该作者

使用特权

评论回复
7
lihui567| | 2018-2-26 12:42 | 只看该作者
ohy3686 发表于 2018-2-25 17:24
鄙人正是广东职业技术学院的老师。

老师好 啊

使用特权

评论回复
8
autopccopy| | 2018-2-26 19:46 | 只看该作者
写得不错!顶!

使用特权

评论回复
9
小鱼儿1045| | 2018-2-27 11:47 | 只看该作者
其实实际项目中按键去抖基本不用这种delay()方式~

使用特权

评论回复
10
ohy3686|  楼主 | 2018-2-27 11:56 | 只看该作者
小鱼儿1045 发表于 2018-2-27 11:47
其实实际项目中按键去抖基本不用这种delay()方式~

没错,你说得对...

使用特权

评论回复
11
xiaozhuzhuzhj| | 2018-2-27 19:52 | 只看该作者
ohy3686 发表于 2018-2-27 11:56
没错,你说得对...

那一般按键检测怎么做好呢,有没有经典的作法

使用特权

评论回复
12
ohy3686|  楼主 | 2018-2-27 19:56 | 只看该作者
xiaozhuzhuzhj 发表于 2018-2-27 19:52
那一般按键检测怎么做好呢,有没有经典的作法

这个得问问9楼的朋友,他可能经验丰富。

使用特权

评论回复
13
hjl714016| | 2018-2-28 17:44 | 只看该作者
按键消抖时间用来处理其他任务啊,,死等效率多低,,
处理方式有很多,比如
        if((GPIOD->IDR & KEY == 0) //检测到按键按下
        {
                keyPressDownTime++;//计时
                if(keyPressDownTime > TIME20MS)//20ms后仍然是按下状态
                {
                  
                 }
          }
         else
        {
            keyPressDownTime = 0;//按键释放,计时清零
        }
只要设定好一定的时间段扫描按键就可以了。。。

使用特权

评论回复
14
ohy3686|  楼主 | 2018-2-28 23:18 | 只看该作者
hjl714016 发表于 2018-2-28 17:44
按键消抖时间用来处理其他任务啊,,死等效率多低,,
处理方式有很多,比如
        if((GPIOD->IDR & KEY ...

适合实际项目开发
对初学者来说,有难度,不易理解。

使用特权

评论回复
15
dongshan| | 2018-3-8 15:30 | 只看该作者
不错,思路很清晰。

使用特权

评论回复
16
青泉| | 2018-3-28 00:09 | 只看该作者

使用特权

评论回复
17
zqx1000| | 2018-4-10 08:47 | 只看该作者
不错,思路很清晰。

使用特权

评论回复
18
sum123456| | 2018-4-11 13:46 | 只看该作者

写得不错!顶!

使用特权

评论回复
19
datouyuan| | 2018-4-14 13:42 | 只看该作者
ohy3686 发表于 2018-2-28 23:18
适合实际项目开发
对初学者来说,有难度,不易理解。

初学者总应该理解这种方法。不要让初学者走弯路。

使用特权

评论回复
20
yhchen2001| | 2018-4-18 11:25 | 只看该作者
小鱼儿1045 发表于 2018-2-27 11:47
其实实际项目中按键去抖基本不用这种delay()方式~

说的对啊,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

2900

粉丝