广告灯的左移右移.doc
实验及实践课题:广告灯的左移右移1 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1L8分别接在单片机的P1.0P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0P1.1P1.2P1.3P1.7P1.6P1.0亮,重复循环。 2 电路原理图 图4.4.1 3 系统板上硬件连线 把“单片机系统”区域中的P1.0P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1L8端口上,要求:P1.0对应着L1,P1.1对应着L2,P1.7对应着L8。4 程序设计内容 我们可以运用输出端口指令MOVP1,A或MOVP1,DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。每次送出的数据是不同,具体的数据如下表1所示P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 说明 L8 L7 L6 L5 L4 L3 L2 L1 11111110 L1亮1111110 1L2亮111110 11L3亮11110 111L4亮1110 1111L5亮110 11111L6亮10 111111L7亮0 1111111L8亮表15 程序框图 图4.4.26汇编源程序 (1)单向ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY MOV P1,#11011111B ;最下面第三个的LED点亮 (以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 。ajmp 2KB范围内绝对转移;延时子程序,12M晶振延时约250毫秒DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END7汇编源程序 (2)单向org0000hajmpmainorg0030hmain:movp1,#00h;全亮lcalldelay;lcalldelay;lcalldelay;延时一段时间mova,#0feh;每次只亮一个灯。loop:movp1,a;lcalldelay;lcalldelay;lcalldelay;rla ;循环左移。ajmploop; ajmp 2KB范围内绝对转移delay:movr7,#00h;延时子程序tt:movr6,#00hdjnz r6,$djnz r7,ttretend8 汇编源程序 (3)来回ORG 0 START:MOV R2,#8 MOV A,#0FEH ;给A赋值成11111110SETB C ;将C状态位置1。去掉此句变成相临的两个灯一起左移右移。!不明白LOOP:MOV P1,A ;将A送到P1口,发光二极管低电平点亮LCALL DELAY RLC A ;累加器连进位标志左循环移位,即A为11111101DJNZ R2,LOOP MOV R2,#8 LOOP1:MOV P1,A LCALL DELAYRRC A ;累加器连进位标志右循环移位DJNZ R2,LOOP1 LJMP START ; LJMP 2KB范围内长转移DELAY:MOV R5,#20;延时子程序,延时0.2秒 D1:MOV R6,#20 D2:MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 9 C语言源程序 来回#include <AT89X51.H> unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) unsigned char m,n,s; for(m=20;m>0;m-) for(n=20;n>0;n-) for(s=248;s>0;s-); void main(void) while(1) temp=0xfe; P1=temp; delay(); for(i=1;i<8;i+) a=temp<<i; b=temp>>(8-i); P1=a|b; delay(); for(i=1;i<8;i+) a=temp>>i; /*如temp为11111110 右移1位后 变为01111111*/ b=temp<<(8-i); /* 11111110 左移7位后 变为01111111*/ P1=a|b; /*P1为01111111*/ delay();