单片机彩灯移动实验_51单片机键控彩灯实验

本文介绍了如何使用51单片机进行键控彩灯实验,通过4个独立按键控制LED灯实现流水灯的花样变换。实验旨在掌握单片机I/O口操作、汇编指令以及键盘控制方法,同时提供了汇编和C语言的程序示例,包括延时函数、键盘扫描和不同灯效的实现。
摘要由CSDN通过智能技术生成

51单片机键控彩灯实验

一、实验目的

1.掌握利用单片机I/O口的工作状态

2. 熟记汇编指令

3. 掌握键盘控制的方法,了解软件去抖动的方法

二、实验内容

1.利用4个独立按键控制LED灯实现流水灯花样变换

2.根据实验目的将程序编写出来

3.电路工作原理图

三、实验器材

电脑一台,单片机实验板

四、实验步骤

1.把实验板上的32P口LED的跳线跳到32P口LED的位置,电源接通。

2.保存文件到E盘,扩展名为.asm或者为.c。

3.编译,检察语法错误,修改程序至无错误为止。

4.将编译的可执行文件(后缀 .hex)下载到开发板,观察实验现象。

五、实验注意事项

1.文件的扩展名必须为.ASM或.C,文件名不可为汉字。

2.必须在编译完程序后才可执行程序。

六、参考程序

1.汇编程序

ORG      0000H                 ;开始

JMP      MAIN

ORG      0080H

MAIN:  MOV      SP,#60H               ;

MOV      P0,#00H

CALL     DELAY

MOV      P0,#0FFH

CALL     DELAY

CALL     KEY

JMP      MAIN

FUN0:  MOV      P0,#0F8H

CALL     DELAY

MOV      P0,#0FFH

CALL     DELAY

CALL     KEY

JMP      FUN0

FUN1:  MOV      P0,#0C7H

CALL     DELAY

MOV      P0,#0FFH

CALL     DELAY

CALL     KEY

JMP      FUN1

FUN2:  MOV      P0,#3FH

CALL     DELAY

MOV      P0,#0FFH

CALL     DELAY

CALL     KEY

JMP      FUN2

FUN3:  MOV      P0,#0F1H

CALL     DELAY

MOV      P0,#0FFH

CALL     DELAY

CALL     KEY

JMP      FUN3

KEY:   CALL     JP

JZ       RETURN

CALL     DELAY10MS

KEY0:  JNB      ACC.4,KEY1

KSF0:  CALL     DELAY10MS

CALL     JP

JNZ      KSF0

CALL     FUN0

JMP      RETURN

KEY1:  JNB      ACC.5,KEY2

KSF1:  CALL     DELAY10MS

CALL     JP

JNZ      KSF1

CALL     FUN1

JMP      RETURN

KEY2:  JNB      ACC.6,KEY3

KSF2:  CALL     DELAY10MS

CALL     JP

JNZ      KSF2

CALL     FUN2

JMP      RETURN

KEY3:  JNB      ACC.7,RETURN

KSF3:  CALL     DELAY10MS

CALL     JP

JNZ      KSF3

CALL     FUN3

RETURN: RET

JP:    MOV      P1,#0FFH

MOV      A,P1

CPL      A

ANL      A,#0F0H

RET

DELAY10MS: NOP

NOP

NOP

MOV  R6,#50

D3:        MOV  R5,#50

DJNZ R5,$

DJNZ R6,D3

RET

DELAY: MOV      R7,#30

DL1:   MOV      R6,#50

DL2:   MOV      R5,#50

DJNZ     R5,$

DJNZ     R6,DL2

DJNZ     R7,DL1

RET

END

2.C语言程序

#include"reg51.h"

//延时函数

void Delay(void)

{

unsigned char i,j,k;

for(i=0;i<30;i++)

for(j=0;j<50;j++)

for(k=0;k<50;k++);

}

//延时函数

void Delay10MS(void)

{

unsigned char j,k;

for(j=0;j<50;j++)

for(k=0;k<50;k++);

}

unsigned char GetKey(void)

{

unsigned char value=0,key=0;

P1=0xFF;

value=P1;

value=value&0x3C;

if(value != 0x3C)

{

Delay10MS();

P1=0xFF;

value=P1;

value=value&0xF0;

if(value != 0xF0)

{

key=value;

while( value != 0xF0 )

{

P1=0xFF;

value=P1;

value=value&0xF0;

P2=0xF1;

Delay();

P2=0xFF;

Delay10MS();

}

return key;

}

}

return 0x0F;

}

//主函数

void main(void)

{

unsigned char i=0,keyvalue=0;

bit flag=0;

while(1)

{

P0=0xFF;

Delay();

P0=0x00;

Delay();

P0=0xFF;

Delay();

keyvalue=GetKey();

if(keyvalue!=0xF0)flag=1;

while(flag)

{

if((keyvalue&0x10)==0)//P1.4

{

do

{

P0=0xF8;

Delay();

P0=0xFF;

Delay();

keyvalue=GetKey();

}

while((keyvalue&0xF0)==0xF0);

}

else if((keyvalue&0x20)==0)//P1.5

{

do

{

P0=0xC7;

Delay();

P0=0xFF;

Delay();keyvalue=GetKey();

}

while((keyvalue&0xF0)==0xF0);

}

else if((keyvalue&0x40)==0)//P1.6

{

do

{

P0=0x3F;

Delay();

P0=0xFF;

Delay();keyvalue=GetKey();

}

while((keyvalue&0xF0)==0xF0);

}

else if((keyvalue&0x80)==0)//P1.7

{

do

{

P0=0xF1;

Delay();

P0=0xFF;

Delay();keyvalue=GetKey();

}

while((keyvalue&0xF0)==0xF0);

}

else

{

keyvalue=GetKey();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值