【例4-3】 片内RAM中存放有10个数据,首地址为30H,编程将数据块传送到片外RAM以1000H为首地址的存储单元。
解:该程序是单重循环程序,片内RAM首地址30H、片外RAM首地址1000H和数据块长度10都是循环初始化的内容。
循环控制是对数据块长度进行判断,每传送一个数据,存放数据块长度的寄存器减1;10个数据传送完,存放数据块长度的寄存器内容正好为零,退出循环。
【例4-4】 P1口为输出口,控制8盏灯(P1口输出低电平时灯被点亮)。编写程序,使灯按以下规律显示:同一时间只有两盏灯点亮,用P1.7、P1.6口控制的灯开始,每盏灯闪烁5次,再移向下两盏灯,同样闪烁5次,循环往复,延时时间1s。晶振频率为6MHz。
解:主程序是双重循环程序,循环移位是外循环,灯闪烁5次是内循环,内循环程序不能与外循环程序交叉。
延时1s采用三重循环程序。晶振频率为6MHz时,机器周期为2μs,延时程序的延时时间计算方法如下:
【例4-5】 P1口为输出口,控制步进电动机的四相绕组。编写程序,控制步进电动机每2s正向转动一步。晶振频率为6MHz。
解:步距角(°)θb=360/mZ
电动机转速(r/min)n=60f/mZ
式中f———脉冲频率(Hz或步/s);
m———拍数,本例中为4;
Z———转子齿数,本例中为5。
拍数m=4,若使用的步进电动机转子齿数Z为5,则步距角θb=18°。题目要求步进电动机每2s正向转动一步,即T=2s,则f=0.5Hz,电动机转速n=1.5r/min。(www.xing528.com)
用三重循环设计2s的循环程序。晶振频率为6MHz时,机器周期为2μs,延时程序的延时时间计算方法如下:
{1+[1+(1+1+2×123+2)×200+2]×20+2}×2μs
=2000126μs=2.000126s
P1.0~P1.3口为输出口,分别控制步进电动机的四相绕组,步进电动机的控制状态与P1口的控制码的对应关系见表4-1。
表4-1 步进电动机的控制状态与P1口控制码的关系
【例4-6】 片内RAM从50H单元开始存放了10个无符号数,编程将它们按由小到大的顺序排列。
解:数据排序的方法有很多,本例采用常用的冒泡排序法,又称为两两比较法,程序流程图如图4-7所示。
想象把10个数纵向排列,自上而下将存储单元相邻的两个数进行比较,若前数大于后数,则存储单元中的两个数互换位置;若前数小于后数,则存储单元中的两个数保持原来位置。按同样的原则依次比较后面的数据,直到该组数据全部比较完,经过第1轮的比较,最大的数据就像冒泡一样排在了存储单元最末的位置上。经过9轮冒泡,便可完成10个数据的排序。
图4-7 冒泡排序程序流程图
在实际排序中,10个数不一定要经过9轮排序冒泡,可能只要几次就可以了。为了减少不必要的冒泡次数,可以设计一个交换标志,每一轮冒泡的开始将交换标志位清0,在该轮数据比较中若有数据位置互换,则将交换标志位置1;每轮冒泡结束时,若交换标志位仍为0,则表明数据排序已完成,可以提前结束排序。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。