实验及实践课题:广告灯的左移右移1. 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环 2. 电路原理图 图4.4.1 3. 系统板上硬件连线 把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L84. 程序设计内容 我们可以运用输出端口指令MOV P1,A或MOV P1,#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)单向 org 0000h ajmp main org 0030hmain: mov p1,#00h ;全亮 lcall delay ; lcall delay ; lcall delay ;延时一段时间 mov a,#0feh ;每次只亮一个灯loop: mov p1,a ; lcall delay ; lcall delay ; lcall delay ; rl a ;循环左移 ajmp loop ; ajmp 2KB范围内绝对转移delay: mov r7,#00h ;延时子程序tt: mov r6,#00h djnz r6,$ djnz r7,tt ret end8. 汇编源程序 (3)来回 ORG 0 START: MOV R2,#8 MOV A,#0FEH ;给A赋值成11111110 SETB C ;将C状态位置1。
去掉此句变成相临的两个灯一起左移右移不明白LOOP: MOV P1,A ;将A送到P1口,发光二极管低电平点亮 LCALL DELAY RLC A ;累加器连进位标志左循环移位,即A为11111101 DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC 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 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<>(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(); } } }。