用汇编程序实现3个数码管循环闪亮(显示为8),相当于3个LED流水灯,用89c51怎么写

用汇编程序实现3个数码管循环闪亮(显示为8),相当于3个LED流水灯,用89c51怎么写,第1张

网上的这种程序比较多,也不是很难,自己学学可以编的。

下面是1~8数字循环显示

;仿照例77

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

;CLR P25

;CLR P27

MOV A,#03H            ;控制字

MOV DPTR,#6100H;8155的命令状态口地址

MOVX @DPTR,A

DISPLY:MOV R0,#8

MOV R3,#0FEH

MOV A,R3                       ;字位

LD:MOV DPTR,#6102H;B口地址

MOVX @DPTR,A          ;B口

MOV DPTR,#DTAB

MOV A,R0

MOVC A,@A+DPTR    ;查表

MOV DPTR,#6101H

MOVX @DPTR,A        ;A口

ACALL DELAY           ;延时

MOV A,R3

RL A

MOV R3,A                  ; 下一位

DJNZ R0,LD              ;下一位循环

SJMP DISPLY            ;显示了一遍循环

RET

DTAB:DB 6FH,7FH,07H,7DH,6DH

DB 66H,4FH,5BH,06H,3FH                ;数字9~0

DELAY: MOV R7,#250

DELAY1: MOV R6,#250

DELAY2:MOV R5,#4

DELAY3: DJNZ R5,DELAY3

DJNZ R6,DELAY2

DJNZ R7,DELAY1

RET                                                  ;延时大约2u4255255=05s

END

蜂鸣器一直响很容易实现,无源蜂鸣器给电平就可以控制发声了,程序如下:

FMQ EQU P32

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

    MOV A,#0FEH

    CLR FMQ

LOOP:

    MOV P1,A

    RL A

    LCALL DELAY

    SJMP LOOP

DELAY:

    MOV R2,#200

DLY:

    MOV R3,#250

    DJNZ R3,$

    DJNZ R2,DLY

    RET

    END

#include "reg52h"

#include "intrinsh"

int INTcount,flag;

sbit P1^1=CLK;

sbit P1^2=DAT;

void main()

{

EA=1;

ET0=1;

TR0=1;

DAT=1;

while(1)

{

CLK=0;

if(flag/7==0)DAT=1;

else DAT=0;

}

}

void timer() interrupt 1

{

TH0=(65536-50000)/256;

TH0=(65536-50000)%256;

INTcount;

if(INTcount==20){CLK=1;INTcount=0;};

flag++;

}

74HC164就是个移位寄存器,假设你使用的单片机是12M晶振,使用定时器1,并且LED是高电平点亮。那么程序如上,很简单,就是设置两个标志位再使用定时器中断,你每隔一秒发送一个数据给74HC164就可以了。

开关,接在 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;

}

}

这个非常简单啊

#include <reg51h>

unsigned int code dat[16]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};//要什么花样取决于这里的数据,这里是单个流水

//

void delay(unsigned int ms)

{

unsigned char j;

for(;ms>0;ms--)

{

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

}

}

//

void main(void)

{

unsigned char i;

while(1)

{

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

{

P1=dat[i];

P2=dat[i]>>8;

delay(300);

}

}

}//简单吧

//AT89C52 的引脚 和STC89C51的 引脚一样的,不一样的是RAM大小

;其实很简单,都不用判断键值,有键按下暂停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

很酷的流水灯

#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;

}

}

}

}

以上就是关于用汇编程序实现3个数码管循环闪亮(显示为8),相当于3个LED流水灯,用89c51怎么写全部的内容,包括:用汇编程序实现3个数码管循环闪亮(显示为8),相当于3个LED流水灯,用89c51怎么写、求AT89C51单片机无源蜂鸣器加流水灯程序、51单片机:at89c51接74hc164写流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9427999.html

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

发表评论

登录后才能评论

评论列表(0条)

保存