2.2.3.1 全部点亮与全部熄灭
要全部点亮P0口所接的8个发光二极管,使用字节操作,只需语句“P0=0x00”。这时,P0口的8个位P0.0~P0.7都输出0(低电平),所接的发光二极管点亮。那么,如果要8个指示灯全部熄灭呢?使用语句“P0=0xff”,这时P0口的8个位全部输出1(高电平)。
到此,我们只需在while(1)死循环中,分别写“P0=0x00”实现全部点亮,接着写“P0=0xff”实现全部熄灭,然后不断循环。主函数部分如图2-10所示。
图2-10 全部点亮与熄灭
动一动
请读者完成图2-10所示的控制程序,编译无误后,下载到目标板上,查看运行效果。你的肉眼能看到指示灯在闪烁吗?如果看不到闪烁,是因为什么?
2.2.3.2 “数绵羊”
通过验证我们知道如图2-10所示的控制程序,在实际目标板上是看不到闪烁的效果的。这是由于肉眼本身的“反应速度”跟不上变换的速度,存在“视觉暂留”效应。我们看不到变换,是因为变换得太快。因此,如果变换得慢一些,比如1s变换一次,毫无疑问我们就能清楚地看出变换了。单片机的变换速度远远超出交流电,肉眼当然无法察觉到单片机的快速变换:点亮——熄灭——点亮——熄灭……
解决的办法是:点亮——延时——熄灭——延时——点亮……
那如何实现延时呢?众所周知,单片机执行程序是需要时间的,好比我们写字、吃饭都需要消耗时间一样,为实现延时的目的,我们可以让单片机去“数绵羊”。当“绵羊”数量很大时,要数完这些“绵羊”就需要较长时间;当“绵羊”数量很少时,要数完它们则需要较短时间。请看图2-11所示的主函数,编译无误后,下载到目标板上,观察现象。
图2-11 带延时的全部点亮与熄灭
明显地,图2-11所示的主函数,通过数50000只“绵羊”,实现了闪烁功能,而且通过改变变量i的数值,还能实现不同的延时时间(但几乎都是不精确的、粗糙的时间)。
2.2.3.3 模式2的实现
我们知道,P0=0x00实现全部点亮;P0=0xff实现全部熄灭。那如何实现奇数灯、偶数灯的点亮呢?请看表2-3。
表2-3 奇数灯、偶数灯点亮时P0口状态
可见,要点亮奇数灯,只要给P0口写二进制01010101,对应十六进制0x55;要点亮偶数灯,只要给P0口写二进制10101010,对应十六进制0xaa。这样参照全部指示灯的闪烁的控制程序,我们得到奇偶交替闪烁的控制程序如图2-12所示。
(www.xing528.com)
图2-12 奇偶交替闪烁的控制程序
动一动
请读者使用keil编写上述奇偶交替闪烁的控制程序,并下载验证。
2.2.3.4 变量的基本知识
请读者查阅相关资料,完成表2-4。
表2-4 数据类型
说明:
➢8051是8位机,能用unsigned char处理的,就不要用unsigned int或其他长度超过1个字节的情形。这好比,你一次能打一桶水,就尽量不要一次打两桶水,甚至4桶水。表面上,好像能力强了,但却耗费了太多精力。
➢再次强调,读者在定义变量时,请务必千万注意表示范围!比如你定义了unsigned char类型的变量,却企图给它赋值1000,这是无法实现的。
➢变量名是自己定义的,如前所述,建议在命名变量时做到“顾名思义”。再次提醒读者,C语言是严格区分大小写的。
动一动
1.请读者自行改变i的数值(0~65535),观察指示灯闪烁快慢。
2.如果将i定义为unsigned char类型,其他地方不变,还能达到一样的闪烁效果吗?为什么?提示:unsigned char的表示范围是0~255。
3.如果要实现数100000只“绵羊”,该怎么办呢?提示:1)改变变量类型;2)分几次实现。
4.请找出下列代码中存在的错误,并给予修正。
5.图2-11使用的是“倒计数”方式(从初值减少到0),读者能否编写“正计数”方式的延时呢(从0增加到设定的数)?提示:使用“++”实现“增计数”,并判断变量i是否小于某个设定数实现循环。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。