51单片机按键控制花样灯

51单片机按键控制花样灯
51单片机按键控制花样灯

51单片机按键控制花样灯

时间:2012-09-10 13:50:11 来源:51hei 作者:

/****************************************************

* 本程序实现用按键控制花样灯。

*

* 当K1按下时,灯从0xfe向左跑一遍;

*

* 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置;*

* 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。*

* 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。* * 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。* ******************************************************/

*************************************************

连接方法:P0接独立按键JP5;P2接LED灯接口JP1 *

***********************************************************/

#include //头文件,函数声明

#include

//定义按键所在位

sbit K1=P0^0;

sbit K2=P0^1;

sbit K3=P0^2;

页脚内容1

sbit K4=P0^3;

sbit K5=P0^4;

unsigned char led;

unsigned char j;

void delayms(unsigned char ms) // 1ms标准延时

{

while(ms--)

{

for(j=0;j<110;j++); //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确}

}

void main()

{ //P2=led;

unsigned int i;

while(1)

{

/*********************************************

页脚内容2

* 当K1按下时,灯从0xfe向左跑一遍;*

*********************************************/

if(K1==0)

delayms(10); //消除键盘抖动

if(K1==0)

{

led=0xfe;

for(i=0;i<7;i++) //i可以去8的倍数,表示本电路执行多少次

{

//led=0x7f; // P端口的初定义要在循环外面,不然会使效果错乱

P2=led; //由于这里已经初设一个灯,所以for里面要加上这一个

delayms(100); //起初这里设置500MS,使按键每按一下灯彩走一个,不能达到要求。

led=_crol_(led,1);

P2=led;

delayms(100);

}

while(!K1); //这里强调松开就没再次执行程序

P2=led; //说明执行完上面的程序的最后状态

页脚内容3

} //P2=led; // 如果把本行放在这里,虽然在开头中没有说明程序烧写好之后就先显示一个灯,但由于本行在if外面,所有最后还是会显示

/***********************************************************

*当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置*

***********************************************************/

if(K2==0)

delayms(10);

if(K2==0)

{

led=0x7f;

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

{

P2=led;

delayms(100);

led=_cror_(led,1);

P2=led;

delayms(100);

页脚内容4

}

while(!K1);

P2=led;

delayms(100);

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

{

led=_crol_(led,1);

P2=led;

delayms(100); //跑回去怎么就那么快呀?

} //此时led=0x7f

}

/*****************************************************

*当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。* *************************************************/

if(K3==0)

delayms(10); //消除抖动

if(K3==0)

页脚内容5

{

led=0xfe;

delayms(200);

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

{

P2=led;

delayms(200);

led=led<<1; // 备注led=_crol_(led,1)等于led<<1||led>>7;

P2=led;

delayms(200);

if(led==0x00)

break; //这里一定要有个break,跳出循环,然后别忘了此时的状态是00,而不是7f }

while(!K1);

led=0x7f;

P2=led;

delayms(200 );

页脚内容6

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

{

led=led>>1;

P2=led;

delayms(200);

}

}

/**************************************************** *当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。* ****************************************************/ if(K4==0)

delayms(10); //消除抖动

if(K4==0)

{

for(i=0;i<4;i++) //执行四次

{ led=0xf0;

P2=led;

delayms(500);

页脚内容7

led=0x0f;

P2=led;

delayms(500);

}

}

/********************************************************

*当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。*

********************************************************/ if(K5==0)

delayms(10);

if(K5==0)

P2=0xff;

}

}

/**** */

时钟+秒表+流水灯的单片机汇编程序

时间:2012-09-10 13:49:42 来源:作者://HJSMSY-V1.0单片机开发板测试程序

页脚内容8

//---------------------------------------------

// <<电脑钟>>

//---------------------------------------------

//=======主函数================================== ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T00

// ORG 001BH

// LJMP T11

ORG 0030H

//=======程序初始化============================= MAIN:

MOV TMOD,#11H

MOV TH0,#3CH

MOV TL0,#0B0H

MOV TH1,#0F0H

MOV TL1,#0B0H

SETB EA

SETB ET0

页脚内容9

// SETB ET1

SETB TR0

// SETB TR1

CLR P3.4

MOV R7,#00H ;秒值

MOV 30H,#00H ;秒个位值

MOV 31H,#00H ;秒十位值

MOV 32H,#00H ;分个位

MOV 33H,#00H ;分十位

MOV 34H,#00H ;时个位

MOV 35H,#00H ;时十位

MOV 44H,#00H ;秒表毫秒十位

MOV 45H,#00H ;秒表秒毫秒百位

MOV 46H,#00H ;秒表秒个位

MOV 47H,#00H ;秒表秒十位

MOV 48H,#00H ;秒表分个位

MOV 49H,#00H ;秒表分十位

MOV P2,#0F0H ;P2口按键初始化

MOV 40H,#01H ;数码管休眠值/流水灯/秒表开关数MOV 41H,#08H ;流水灯循环值

页脚内容10

MOV 42H,#00H ;秒表暂停

// ACALL T11

//-----------------------------------------------

MAIN1:

MOV P0,#0FFH

MOV P1,#0FFH

MOV R0,40H

CJNE R0,#01H,ACL1

ACALL MAIN2 ;时钟显示

ACL1:CJNE R0,#02H,ACL2

ACALL MAIN3 ;秒表

ACL2:CJNE R0,#03H,ACL3

ACALL LED ;流水灯

ACL3:ACALL KEY ;按键扫描

// ACALL BAO ;定时报警

LJMP MAIN1

//=======报警子程序============================ BAO:MOV R4,33H

CJNE R4,#03H,YY1

页脚内容11

CLR P3.2

ACALL KEY

LJMP YY2

YY1:CJNE R4,#05H,YY2

SETB P3.2

ACALL KEY

YY2:RET

//======时钟扫描子程序======================= MAIN2:

MOV A,30H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.0

ACALL DELAY

MOV A,31H

MOV DPTR,#TAB

MOVC A,@A+ DPTR

MOV P0,A

页脚内容12

CLR P1.1

SETB P1.0

ACALL DELAY

MOV A,32H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.2

SETB P1.1

ACALL DELAY

MOV A,33H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.3

SETB P1.2

ACALL DELAY

MOV A,34H

MOV DPTR,#TAB

MOVC A,@A+DPTR

页脚内容13

MOV P0,A

CLR P1.4

SETB P1.3

ACALL DELAY

MOV A,35H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.5

SETB P1.4

ACALL DELAY

MOV P0,#7FH

MOV P1,#0EBH

ACALL DELAY

MOV P1,#0FFH

RET

//========秒表扫描子程序========================= MAIN3:

MOV A,44H

MOV DPTR,#TAB

页脚内容14

MOVC A,@A+DPTR

MOV P0,A

CLR P1.0

ACALL DELAY

MOV A,45H

MOV DPTR,#TAB

MOVC A,@A+ DPTR

MOV P0,A

CLR P1.1

SETB P1.0

ACALL DELAY

MOV A,46H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.2

SETB P1.1

ACALL DELAY

MOV A,47H

MOV DPTR,#TAB

页脚内容15

MOVC A,@A+DPTR

MOV P0,A

CLR P1.3

SETB P1.2

ACALL DELAY

MOV A,48H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.4

SETB P1.3

ACALL DELAY

MOV A,49H

MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P0,A

CLR P1.5

SETB P1.4

ACALL DELAY

MOV P0,#7FH

页脚内容16

MOV P1,#0EBH

ACALL DELAY

MOV P1,#0FFH

RET

//=======定时器T0中断服务======================== T00:MOV TH0,#0D8H

MOV TL0,#0F0H

INC R7

CJNE R7,#64H,AA

MOV R7,#00H

//-------时钟跑值--------------------------------

TK1:INC 30H ;每秒钟秒个位增一

MOV R6,30H

CJNE R6,#0AH,AA

MOV 30H,#00H

TK2:INC 31H

MOV R6,31H

CJNE R6,#06H,AA

MOV 31H,#00H

TK3:INC 32H

页脚内容17

MOV R6,32H

CJNE R6,#0AH,AA

MOV 32H,#00H

TK4:INC 33H

MOV R6,33H

CJNE R6,#06H,AA

MOV 33H,#00H

TK5:INC 34H

MOV R5,34H

MOV R6,35H

CJNE R5,#04H,TK6

CJNE R6,#02H,TK6

MOV 34H,#00H

MOV 35H,#00H

TK6:CJNE R5,#0AH,AA

MOV 34H,#00H

INC 35H

//-------秒表跑值----------------------

AA:

MOV R5,42H

页脚内容18

CJNE R5,#01H,TK7

INC 44H

TK7:MOV R5,44H

CJNE R5,#0AH,AA1

MOV 44H,#00H

INC 45H

MOV R5,45H

CJNE R5,#0AH,AA1

MOV 45H,#00H

INC 46H

MOV R5,46H

CJNE R5,#0AH,AA1

MOV 46H,#00H

INC 47H

MOV R5,47H

CJNE R5,#06H,AA1

MOV 47H,#00H

INC 48H

MOV R5,48H

CJNE R5,#0AH,AA1

页脚内容19

MOV 48H,#00H

INC 49H

MOV R5,49H

CJNE R5,#06H,AA1

MOV 49H,#00H

AA1:RETI

//====定时器T1中断服务子程序==================== //T11:MOV TH1,#0F0H

// MOV TL1,#0B0H

// RETI

//******定时时间调整子程序*************************// TBAO:

MOV 50H,#00H

MOV 51H,#00H

MOV 52H,#00H

MOV 53H,#00H

MOV 54H,#00H

MOV 55H,#00H

MOV R3,50H

页脚内容20

相关主题
相关文档
最新文档