
单片机上的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单片机的程序可以被编写吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)