用52单片机怎么编一个能控制一个LED灯发出sos信号的程序

用52单片机怎么编一个能控制一个LED灯发出sos信号的程序,第1张

单片机上的8位数码管,每个数码管由8只发光二极管组成(7个用来显示数字一个用来显示小数点),可以显示数字1到9,当然也可以显示F、E、S这样的字母。首先楼主应该清楚你用的52芯片的电路构成,就是说控制这些发光二极管的信号是从单片机的哪个模块发出来的,然后确定这些二极管是共阴极还是共阳的(也就是说控制信号是1还是0的时候二极管会亮)。知道这些以后就简单啦,楼主只要计算出需要显示S和O时的组合即可,然后编写程序将这个组合值赋给驱动信号就行了。比如 0010 0001(用16进制表示就是21) 在数码管上显示是数字1(只是举例,没验证过。。。) 。注意到单片机上数码管是扫描显示的,也就是说,8支数码管,都是由同一个模块的那8个信号来驱动8个LED的,那么现在只需要编写一个扫描用的程序就好了,比如200ms内,驱动信号在第一只数码管停留25ms,第二个停留25ms,以此类推。而在第一个25ms的时候驱动输出S这个字母需要的组合,第二个输出O,第三个输出S,其他五个全是输出全0或者全1(看LED是共阴极还是共阳勒)。由于人眼的视觉暂留现象,你会看到一个稳定的SOS,其实它只亮了25ms,而剩下的175ms是没有显示的(PS:如果效果不好,可以把时间做的短一点比如10ms)。再进一步楼主还可以写一个延时函数,比如每延时一秒,所有驱动数据清零,再延时一秒,数据重新写入,这样就是闪烁的SOS啦。

这些只是方法和原理,具体的编程希望楼主自己做一做,实践才是王道,这样才能真的学会单片机~

ORG 0000H

JMP BEGIN

ORG 000BH

LJMP T0INT

ORG 001BH

LJMP T1INT

LEDD EQU 30H

LEDC EQU 36H

SECC EQU 37H

TCNT EQU 3AH

ORG 0030H

;---------------------------------------

TABLE: ; 共阴极数码管显示代码表

DB 3FH,06H,5BH,4FH,66H ;12345

DB 6DH,7DH,07H,7FH, ;6789

;---------------------------------------

DELAY:

MOV R6,#25

DLY01:

MOV R7,#100

DJNZ R7,$

DJNZ R6,DLY01

RET

;---------------------------------------

BEGIN:

MOV SP,#5FH

MOV TMOD,#11H

MOV TH0,#3CH

MOV TL0,#0B0H

MOV TH1,#0F4H

MOV TL1,#48H

MOV LEDC,#6

MOV R0,#LEDD

CLR A

INIT:

MOV @R0,A

INC R0

DJNZ LEDC,INIT

SETB ET1

SETB TR1

MOV P2,#0

MOV TCNT,#0

MOV SECC,#0

SETB ET0

SETB EA

MOV SECC,#59

LCALL DISSEC

SETB TR0

SETB TR1

LOOP:

SJMP $

;---------------------------------------

T1INT:

PUSH ACC

CLR TR1

MOV TH1,#0F4H

MOV TL1,#48H

SETB TR1

MOV DPTR,#TABLE

MOV R0,#LEDD

MOV A,LEDC

T1INT0:

JNZ T1INT1

MOV P2,#01H

MOV A,@R0

MOVC A,@A+DPTR

CPL A

MOV P1,A

SJMP T1INTD

T1INT1:

MOV P2,#02H

INC R0

MOV A,@R0

MOVC A,@A+DPTR

CPL A

MOV P1,A

T1INTD:

INC LEDC

MOV A,LEDC

CJNE A,#2,T1INT6

T1INT6:

JC T1INTE

MOV LEDC,#0

T1INTE:

POP ACC

RETI

;---------------------------------------

HBCD:

MOV B,#10

DIV AB

SWAP A

ORL A,B

RET

;---------------------------------------

T0INT:

PUSH ACC

CLR TR0

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

INC TCNT

MOV A,TCNT

CJNE A,#20,T0INT1

T0INT1:

JC T0INTE

MOV TCNT,#0

MOV A,SECC

DEC A

MOV SECC,A

JNZ T0INT2

MOV SECC,#59

T0INT2:

LCALL DISSEC

T0INTE:

POP ACC

RETI

;---------------------------------------

DISSEC:

MOV A,SECC

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 30H,A

POP ACC

SWAP A

ANL A,#0FH

MOV 31H,A

RET

;---------------------------------------

END

1 可以被编写。

2 c52单片机可以被编写程序,它是一款基于8位微处理器的嵌入式系统,具有强大的控制能力和可靠性,广泛应用于智能家电、仪器仪表、汽车电子等领域。

3 对于想要编写c52单片机程序的人来说,需要掌握嵌入式系统的相关知识和编程语言,例如C语言、汇编语言等,同时还需要熟练掌握单片机的内部结构和工作原理,才能编写出高质量的程序。

delayms(300)、delayms(2000)换成定时器中断是吧,那要看你晶振是多大的。如果晶振12M,12分频, 一个机器周期=12个时钟周期 ,那么一个机器周期时间为1/12812=1 us ,这是单片机时间的最小单位。以16位定时器0为例子,定时10ms如下:

void Timer0Init(void) //10毫秒@12000MHz

{

AUXR &= 0x7F; //定时器时钟12T模式

TMOD &= 0xF0; //设置定时器模式

TMOD |= 0x01; //设置定时器模式

TL0 = 0xF0; //设置定时初值

TH0 = 0xD8; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

}//主程序void main()

{

    while(1)

    {        if (num == 30)   // 3010ms = 300ms

        {

            num = 0;

            P1 = ~ P1;  //io口状态相反,即开关灯

        }

             if (num == 200)  // 20010ms = 2000ms

        {

            num = 0;

            P0 = ~ P0;  //io口状态相反,即开关灯

        }

    }

}

void T0_time() interrupt 1{   //中断服务函数

    TL0 = 0xF0;     //重赋值定时初值

TH0 = 0xD8;     //重赋值定时初值

    num++;           //num增加

}

以上就是关于用52单片机怎么编一个能控制一个LED灯发出sos信号的程序全部的内容,包括:用52单片机怎么编一个能控制一个LED灯发出sos信号的程序、求52单片机汇编程序,简单的电子钟实现59到0循环显示,倒计时秒表、c52单片机的程序可以被编写吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存