单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来

单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来,第1张

很酷的流水

#include <reg51h>

typedef unsigned char uchar;

#define Ton 40

#define LED P0

sbit leds=P1^4;

sbit LED0 = P0^0;

sbit LED1 = P0^1;

sbit LED2 = P0^2;

sbit LED3 = P0^3;

sbit LED4 = P0^4;

sbit LED5 = P0^5;

sbit LED6 = P0^6;

sbit LED7 = P0^7;

unsigned char Maikuan=0;

static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

uchar Occupy_led; //占空比越大,灯越亮

bit light;

uchar m;

void Inittime()

{

TMOD = 0x02; //定时器0,工作方式2,自动重装

TH0 = 256-Ton;

TL0 = 256-Ton;

ET0 = 1;

EA = 1;

TR0 = 1;

}

//定时器0中断

void time0() interrupt 1 using 0

{

Maikuan++;

}

void main()

{

unsigned char i = 0,j = 0; //初始化i,j

leds=0;

Inittime();

while (1)

{

//第1,3,5,7个灯半亮,其余的全亮。

for(i=254; i>0; i--)

{

while ( Maikuan!=20)

{

LED = 0x00;

}

while ( Maikuan!=200)

{

LED = 0x55;

}

Maikuan = 0;

}

//最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。

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

{

i = 0;

while(i!=255) // 由暗变亮

{

if( Maikuan == 0) // 点亮

{

LED = ledon[j];

}

if(Maikuan == i) // 熄灭

{

LED = 0xff;

}

if( Maikuan== 255)

{

i++;

}

}

}

for(j=7;j>=0;j--)

{

i = 0;

while(i!=255) // 由亮变暗

{

if(Maikuan == 0) // 熄灭

{

LED = 0xff;

}

if( Maikuan == i) // 点亮

{

LED = ledon[j];

}

if( Maikuan == 255)

{

i++;

}

}

}

//所有的灯逐渐从暗到全亮,再由全亮到暗。

for (m=254; m>0; m--)

{

while (Maikuan!=Occupy_led)

{

LED = 0x00;

}

while (Maikuan!=127)

{

LED = 0xff;

}

Maikuan = 0;

if (light)

{

Occupy_led++;

}

else

{

Occupy_led--;

}

if (Occupy_led==128)

{

Occupy_led = 127;

light = !light;

}

if (Occupy_led>128)

{

Occupy_led = 0;

light = !light;

}

}

}

}

;其实很简单,都不用判断键值,有键按下暂停2S程序如下:

ORG 0000H

LJMP STA

ORG 000BH

LJMP T0ISR

ORG 0030H

STA:

MOV TMOD,#01H

MOV TH0,#3CH

MOV TL0,#0B0H

SETB ET0

SETB EA

MOV 30,#0FEH

MOV R2,#0

CLR 00H

LOOP:

MOV P1,#0F0H

MOV A,P1

CJNE A,#0F0H,LOOP1

SJMP LOOP

LOOP1:

LCALL DELAY

MOV A,P1

CJNE A,#0F0H,LOOP2

SJMP LOOP

LOOP2:

SETB 00H

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#3CH

MOV TL0,0B0H

SETB TR0

JNB 00H,T0ISR1

INC R2

MOV A,R2

CJNE A,#40,T0ISRE

MOV R2,#0

CLR 00H

SJMP T0ISRE

T0ISR1:

MOV A,30H

RL A

MOV 30H,A

MOV P0,A

T0ISRE:

RETI

DELAY:

MOV R0,#20

DELAY1:

MOV R1,#250

DJNZ R1,$

DJNZ R0,DELAY1

RET

END

开关,接在 P27 与地之间。

#include <AT89X51H> //预处理命令

void w(unsigned char k)

{

unsigned int a; //定义变量a 为int 类型

if (k) {

while(P2_7); //没有按就循环,等待按下

for (a = 0; a < 600; a++); //延时消抖

while(P2_7); //没有按就循环

}

else while(!P2_7); //按下就循环,等待松开

}

void main(void) //主函数名

{

while(1) {

w(1); P1_0 = 0; w(0); P1_0 = 1;

w(1); P1_1 = 0; w(0); P1_1 = 1;

w(1); P1_2 = 0; w(0); P1_2 = 1;

w(1); P1_3 = 0; w(0); P1_3 = 1;

w(1); P1_4 = 0; w(0); P1_4 = 1;

w(1); P1_5 = 0; w(0); P1_5 = 1;

w(1); P1_6 = 0; w(0); P1_6 = 1;

w(1); P1_7 = 0; w(0); P1_7 = 1;

}

}

即使是LED的驱动,也不要直接用IO口来做。比如,你的限流电阻是1K,电源为5V,8个IO最大会吸入40mA的电流。有些单片机是不支持这样大的电流的。但是因为吸入电流太大而造成的可能性不是很大。我没有看数据手册,不好乱说。

看看有没有其他原因,比如:看门狗,电源等的原因。

这是只是百点亮P1口的程序

#include<reg51h>

void

main()

{

while(1)

{

p1=0x00;

}

}

这是闪烁度P1口回程序

#include<reg51h>

void

delay(unsigned

int

i)

//延时函数

{

unsigned

int

k;

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

}

void

main()

//主函数

{

while(1)

//循环函数

{

P1=0x00;

//点亮P1口

delay(2000);

//延时

P1=0xff;

//熄灭P1口

delay(200);

//延时

}

}

纯手打,答对你有帮助的话请采纳

谢谢

我只有这个程序,希望可以帮上你的忙/

现象说明:

间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环

三次;再分别从两边往中间流动三次;再从中间往两边流

动三次;8个全部闪烁3次;关闭发光管,程序停止。注:晶振为110592MHz/

#include<reg52h>

#include<intrinsh>

#define uint unsigned int

#define uchar unsigned char#define led P1

uint delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

{

for(y=110;y>0;y--);

}

}void main()

{

uint i,temp,j;

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

{

led=0xAA;

delay(300);

led=0x55;

delay(300);

} for(i=0;i<3;i++)

{

temp=0xfe;

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

{

led=temp;

delay(300);

temp=_crol_(temp,1);

}

temp=0xbf;

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

{

led=temp;

delay(300);

temp=_cror_(temp,1);

}

} for (i=0;i<3;i++)

{

led=0x7e;

delay(300);

led=0xbd;

delay(300);

led=0xdb;

delay(300);

led=0xe7;

delay(300);

} for (i=0;i<3;i++)

{

led=0xe7;

delay(300);

led=0xdb;

delay(300);

led=0xbd;

delay(300);

led=0x7e;

delay(300);

} for (i=0;i<3;i++)

{

led=0xff;

delay(300);

led=0x00;

delay(300);

} led=0xff; while(1);

}

你可能被扫描数码管和流水灯都需要延时而困扰了吧。确实,对于初学者一时不知怎么处理两个程序调用延时子程序。

解决的办法,方法一,采用中断定时控制流水灯,数码管显示还用延时子程序。因流水灯程序简单,中断后,对中断计数,假如流水灯05秒流动一次,则05秒到了输出一次流水灯。中断程序短,及时从中断返回,不影响数码管显示。

方法二,不想用定时器,还用延时子程序,那数码管显示还用延时子程序,因一般延时比较短。主程序调用一次显示程序,大概需要几毫秒到十几毫秒,对调用显示程序计数,例如调用40次的延时就作为流水灯的延时,流水灯流动一次。改变计数值大小,就改变流水灯流动的速度了。

以上就是关于单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来全部的内容,包括:单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来、89C51单片机 4*4矩阵键盘加流水灯问题,求个汇编程序代码。、怎么用89C51单片机实现用一个开关控制8个流水灯,要求开关按下去松开是亮的,再按下去松开是灭的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/9404200.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存