完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
交通灯实例
同学们在学习技术的时候,一定要多动脑筋,遇到问题后,三思而后问。有些时候你考虑的和真理就差一点点了,没有坚持下去,别人告诉你后才恍然大悟。这样得到的结论,可以让你学到知识,但是却培养不了你的逻辑思维能力。不是不能问,而是要在认真思考的基础上再发问。 有同学有疑问,板子上只有8个流水灯,那如果我要做很多个流水灯一起花样显示怎么办呢?那我们在讲课的时候其实都提到过了,板子上是有8个流水灯,还有6个数码管,还有1个点阵LED,一个数码管相当于8个小灯,一个点阵相当于64个小灯,那如果全部算上的话,我们板子上实际共接了8+6*8+64=120个小灯,你如果单独只接小灯,花样灯就做出来了。 还有同学问,板子上流水灯和数码管可以一起工作吗?如何一起工作呢?我们刚说了,一个数码管是8个小灯,但是大家反过来想一想,8个流水灯不也就是相当于一个数码管吗。那板子上6个数码管我们可以让他们同时亮,7个数码管就不会了吗?当然了,思考的习惯是要慢慢培养的,想不到的同学继续努力,每天前进一小步,坚持一段时间后回头看看,就会发现你学会了很多。 我们做了一个交通灯的程序给大家做学习参考。因为板子资源有限,所以我把左边LED8和LED9一起亮作为绿灯,把中间LED5和LED6一起亮作为黄灯,把右边LED2和LED3一起亮作为红灯,用数码管的低2位做倒计时,让LED和数码管同时参与工作。程序并不复杂,也没有什么新知识点,大家完全可以自己分析了,然后下载编译试试看吧。 51单片机RAM区域的划分 前边介绍单片机资源的时候,我们提到过STC89C52共有512字节的RAM,是用来保存数据的,比如我们定义的变量都是直接存在RAM里边的。但是单片机的这512字节的RAM在地位上并不都是平等的,而是分块的,块与块之间在物理结构和用法上都是有区别的,因此我们在使用的时候,也要注意一些问题。 51单片机的RAM分为两个部分,一块是片内RAM,一块是片外RAM。标准51的片内RAM地址从0x00H~0x7F共128个字节,而现在我们用的51系列的单片机都是带扩展片内RAM的,即RAM是从0x00~0xFF共256个字节。片外RAM最大可以扩展到0x0000~0xFFFF共64K字节。这里有一点大家要明白,片内RAM和片外RAM的地址不是连起来的,片内是从0x00开始,片外也是从0x0000开始的。还有一点,片内和片外这两个名词来自于早期的51单片机,分别指在芯片内部和芯片外部,但现在几乎所有的51单片机芯片内部都是集成了片外RAM的,而真正的芯片外扩展则很少用到了,虽然它还叫片外RAM,但实际上它现在也是在单片机芯片内部的,我们的STC89C52就是这样。以下是几个Keil C51语言中的关键字,代表了RAM不同区域的划分,大家先记一下。 data:片内RAM从0x00~0x7F idata:片内RAM从0x00~0xFF pdata:片外RAM从0x00~0xFF xdata:片外RAM从0x0000~0xFFFF 大家可以看出来,data是idata的一部分,pdata是xdata的一部分。为什么还这样去区分呢?因为RAM分块的访问方式主要和汇编指令有关,因此这块内容大家了解一下即可,只需要记住如何访问速度更快就行了。 我们定义一个变量a,可以这样:unsigned char data a=0,而我们前边定义变量时都没有加data这个关键字,是因为在Keil默认设置下,data是可以省略的,即什么都不加的时候变量就是定义到data区域中的。data区域RAM的访问在汇编语言中用的是直接寻址,执行速度是最快的。如果你定义成idata,不仅仅可以访问data区域,还可以访问0x80H~0xFF的范围,但加了idata关键字后,访问的时候51单片机用的是通用寄存器间接寻址,速度较data会慢一些,而且我们平时大多数情况下不太希望访问到0x80H~0xFF,因为这块通常用于中断与函数调用的堆栈,所以在绝大多数情况下,我们使用内部RAM的时候,只用data就可以了。 对于外部RAM来说,使用pdata定义的变量存到了外部RAM的0x00~0xFF的地址范围内,这块地址的访问和idata类似,都是用通用寄存器间接寻址,而如果你定义成xdata,可以访问的范围更广泛,从0到64K的地址都可以访问到,但是它需要使用2个字节寄存器DPTRH和DPTRL来进行间接寻址,速度是最慢的。 我们的STC89C52共有512字节的RAM,分为256字节的片内RAM和256字节的片外RAM。一般情况下,我们是使用data区域,data不够用了,我们就用xdata,如果希望程序执行效率尽量高一点,就使用pdata关键字来定义。其它型号有更大的RAM的51系列单片机,如果要使用更大的RAM,就必须得用xdata来访问了。 长短按键的应用 在单片机系统中应用按键的时候,如果只需要按下一次按键加1或减1,那用第8章学到的知识就可以完成了,但如果想连续加很多数字的时候,要一次次按下这个按键确实有点不方便,这时我们会希望一直按住按键,数字就自动持续增加或减小,这就是所谓的长短按键应用。 当检测到一个按键产生按下动作后,马上执行一次相应的操作,同时在程序里记录按键按下的持续时间,该时间超过1秒后(主要是为了区别短按和长按这两个动作,因短按的时间通常都达到几百ms),每隔200ms(如果你需要更快那就用更短的时间,反之亦然)就自动再执行一次该按键对应的操作,这就是一个典型的长按键效果。 对此,我们做了一个模拟定时***效果的实例,提供给大家作为参考。打开开关后,数码管显示数字0,按向上的按键数字加1,按向下的按键数字减1,长按向上按键1秒后,数字会持续增加,长按向下按键1秒后,数字会持续减小。设定好数字后,按下回车按键,时间就会进行倒计时,当倒计时到0的时候,用蜂鸣器和板子上的8个LED小灯做***效果,蜂鸣器持续响,LED小灯全亮。 长按键功能实现的重点有两个:第一,是在原来的矩阵按键扫描函数KeyScan内,当检测到按键按下后,持续的对一个时间变量进行累加,其目的是用这个时间变量来记录按键按下的时间;第二,是在按键驱动函数KeyDriver里,除了原来的检测到按键按下这个动作时执行按键动作函数KeyAction外,还监测表示按键按下时间的变量,根据它的值来完成长按时的连续快速按键动作功能。 |
|
|
|
只有小组成员才能发言,加入小组>>
物联网工程师必备:怎么选择不同的无线连接技术,本指南帮你忙!
3257 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3904 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3411 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
3964 浏览 1 评论
20603 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
737浏览 2评论
923浏览 2评论
953浏览 1评论
1078浏览 1评论
359浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:54 , Processed in 0.801839 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号