| 
 4. 广告灯的左移右移  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. 电路原理图  file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg 图4.4.1  3. 系统板上硬件连线  把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。  4. 程序设计内容  我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。  每次送出的数据是不同,具体的数据如下表1所示  表1  5.程序框图    file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 图4.4.2    6. 汇编源程序 
ORG 0 
START: MOV R2,#8 
MOV A,#0FEH 
SETB C 
LOOP: MOV P1,A 
LCALL DELAY 
RLC A 
DJNZ R2,LOOP 
MOV R2,#8 
LOOP1: MOV P1,A 
LCALL DELAY 
RRC A 
DJNZ R2,LOOP1 
LJMP START 
DELAY: MOV R5,#20 ; 
D1: MOV R6,#20 
D2: MOV R7,#248 
DJNZ R7,$ 
DJNZ R6,D2 
DJNZ R5,D1 
RET 
END 
7. 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; 
b=temp<<(8-i); 
P1=a|b; 
delay(); 
} 
} 
}     
 |