![基于Proteus和Keil的C51程序设计项目教程(第2版):理论、仿真、实践相融合](https://wfqqreader-1252317822.image.myqcloud.com/cover/785/36511785/b_36511785.jpg)
2.4 任务4:有规律变化的花样灯——高/低4位交替闪烁
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_72_2.jpg?sign=1738857233-ctDiRJMe98I00NmB706plAlHSke4COHb-0-9f571fdbac4e6b17ce0ed5404d8d61e9)
2.4.1 任务要求与分析
1.任务要求
8个LED,高4位的LED与低4位的LED交替闪烁。假设初始状态为高4位的LED灭,低4位的LED亮。
2.任务目标
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_72_3.jpg?sign=1738857233-Ae9XN411rPgO5tRGW1IhRxoJyXrFLNaT-0-81c3f2cfce6b6c2d2059d96446afd517)
(1)掌握先分解后主线串联的问题分析方法。
(2)学习现象分析并用表达式表示。
(3)掌握goto语句应用。
(4)灵活应用位运算符及移位函数。
3.任务分析
硬件电路如图2-9所示。P1口控制8个LED。根据亮灯逻辑,引脚电平为高,LED灭;引脚电平为低,LED亮。显示状态只有两种,见表2-11。显然,两种状态的数据正好相反,由状态1到状态2,只要数据按位取反或高/低4位数据互换位置即可。
表2-11 高/低4位交替闪烁的状态
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_72_4.jpg?sign=1738857233-oKkQtuFhfnn1pgWGWYC1exfWKGysKtuU-0-b3b5f9b0d09f4758b07415ab613d16b1)
2.4.2 流程与程序设计
高/低4位LED交替闪烁的程序流程图如图2-24所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_73_1.jpg?sign=1738857233-z81gctmKgrVd7VnYoAimbO7sl3EKZ3TE-0-a7d788657dd2b329ad8360c00baeab99)
图2-24 高/低4位LED交替闪烁的程序流程图
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_73_2.jpg?sign=1738857233-5WAkqwLxLBB7QrR0Cb2d2juWq7yYonZN-0-1b0727ff7b9353dfaf4976ec582394f3)
2.4.3 编译、代码下载、仿真、测判
按第1章所述方法,先在Keil中新建工程LED24,然后添加源程序、设置工程选项并编译,生成代码文件LED24.HEX。参考2.1.7节下载代码,设置振荡频率为12MHz,进行仿真调试。
将代码下载到实物板进行测试。实践记录:是否成功?__________。自评分:__________。
2.4.4 进阶设计与思路点拨4:用“>>”“<<”实现两个亮点相向和相背运动
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_73_3.jpg?sign=1738857233-VOpiHmvTkEdPC6nQEOhWD2gTXpbHhW6s-0-22761d844915665d4c3e753bc544f4ec)
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_73_4.jpg?sign=1738857233-ZSaZpvxpgDyRpvAddtSySzcSbBZ9O565-0-dfe7a7878a7156ebd871dc514b90cde9)
1.任务要求
(1)8个LED,最高位和最低位的两个亮点(LED)相向运动,相邻时重新循环;
(2)8个LED,中间两个亮点相背运动,到两端后重新循环。
2.任务目标
(1)掌握先分解后主线串联的问题分析方法。
(2)分析现象并推理数据变化规律的表达式。
(3)举一反三,灵活应用“>>”“<<”及位的逻辑运算符。
3.亮点相向任务分析
硬件电路如图2-9所示。P1口控制8个LED。根据亮灯逻辑,引脚电平为高,LED灭;引脚电平为低,LED亮。显示状态只有4种,见表2-12:高4位中为“0”的位逐位向右移;低4位中为“0”的位逐位向左移;移位三次后,从初始化开始重新进入下一个循环。因需要移位移入的都是1,即右移时进入最高位的是1,左移时进入最低位的也是1。所以若用移位运算符,则右移时,最高位与1相或;左移时,最低位与1相或。数据处理步骤如下:
表2-12 用移位运算符实现两个亮点相向运动的数据变化规律推演
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_74_1.jpg?sign=1738857233-v5VVMITxWLpYucSNyafFMSnDWheMYVCN-0-ffeb0d5ac195371325be5530696eaaaa)
(1)对上一状态数据,右移1位,最高位“或”1,得高4位的过程数据;左移1位,最低位“或”1,得低4位的过程数据。
(2)在(1)的基础上,高4位的过程数据&0xF0屏蔽低4位,低4位的过程数据&0x0F屏蔽高4位。
(3)高、低4位的过程数据相或合并为1字节。
编程思路如下,设输出数据初始值状态1为01111110B(十六进制数为0x7E),状态2数据为10111101B,数据变化分析见表2-13。
表2-13 由状态1到状态2的数据变化分析
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_74_2.jpg?sign=1738857233-YvjNopFUHB5RJwKUK6sm3i00eEB0fdKu-0-90347e62d2735c45bcd8edee8a2c8ba1)
用移位运算符实现两个亮点相向运动的数据变化规律推演,即四个状态的数据变化见表2-12。请自行写出状态3、状态4的表达式。
4.亮点相向任务实现
根据以上分析,参考图2-25,编程、调试,直到成功。
注意:4个状态依次显示后,重新开始下一个循环。可设置一变量记录显示状态,状态4过后,要复位回到状态1。
根据图2-25把下面程序补充完整。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_75_1.jpg?sign=1738857233-Ym9OQJ8X1bm2gzJt4k63A6omPbOGod2s-0-a2aba2c569bf066100d8b93655e6432c)
图2-25 亮点相向运动的程序流程图
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_75_2.jpg?sign=1738857233-vi8L33i7sssgsGcL4rrbqe6f0cHW2AYF-0-17f16b2eb8966002456b42ff9bc97baf)
5.两个亮点相背运动
可参考表2-12把数据变化规律分析清楚,先完成表2-14。
表2-14 用移位运算符实现两个亮点相背运动的数据变化规律推演
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_75_3.jpg?sign=1738857233-AC2e0804dy5ksP8mJaWb68czO7IY3Zjm-0-05d4e9b8b2711e278267c7da16ee8ae0)
程序流程参考图2-25,注意数据初始化及数据处理的不同。程序参考本节“4.亮点相向任务实现”。
请自行分析、设计,并进行仿真调试。
2.4.5 进阶设计与思路点拨5:用移位函数实现两个亮点相向运动
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_76_1.jpg?sign=1738857233-TEl62QpFug9DFaOv215rAzDBygDiJNWQ-0-b4d5752f2d8561304cbf42440ae82262)
1.思路点拨
_crol_()、_cror()是8位数封闭循环移动。考虑设置两个变量分别实现高/低4位数据规律演化。设代表高4位数据的初始值为01111111B,代表低4位数据的初始值为11111110B,这两个数据经移位函数后分别得到高、低4位数,见表2-15。
表2-15 用移位函数实现两个亮点相向运动的数据变化规律推演
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_76_2.jpg?sign=1738857233-JFSDyYZYQrJBUSJTAfPNNTz5CYQylyY9-0-c0cc1aefc76a40409f4998c58c32957c)
高、低4位的演化数据再相“或”便可得到每个状态的数据,如由状态1到状态2,具体见表2-16。
表2-16 用移位函数实现两个亮点相向运动的数据变化规律推演
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_76_3.jpg?sign=1738857233-683hVGfYJJEqiH7kZszZjmkRkiAWojjl-0-80456ece29a40120041417bc872b21e5)
2.程序设计与调试
根据以上分析,参考图2-24画出程序流程图、编程、调试,直到成功。
注意:4个状态依次显示后,重新开始下一循环。可设置一变量记录显示状态,状态4过后,要复位回到状态1。
2.4.6 进阶设计与思路点拨6:用移位函数实现两个亮点相背运动
在理解2.4.5节的基础上,参考表2-15、表2-16,填写表2-17,并完成程序设计与调试。
表2-17 用移位函数实现两个亮点相背运动的数据变化规律推演
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_77_1.jpg?sign=1738857233-60Y2fhwWnKjPIStUz6Ib9iZo4qSESK1A-0-edbdeaadaf5d9755728d236f57873e1c)