如何用51单片机制作简易电子钟
或者能够 ADC转换,键盘显示,温度指示器。。那种便宜 和比较容易做,就给我那种吧。先谢谢啦! 展开
我自己做的一个课程设计,程序运行已经成功了:
汇编程序如下:
ORG 0000H
AJMP main
ORG 000BH ;定时器0的中断向量地址
AJMP TIME0 ;跳转到真正的定时器程序处
ORG 30H
main:
mov dptr,#k1;
start:
MOV P0,#00H ;中断预处理程序
MOV P1,#00H
MOV P3,#00H ;关所有灯
MOV R0,#00H ;软件计数器预清0
MOV R7,#00H
MOV R6,#00H
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;即数15536
SETB EA ;开总中断允许
SETB ET0 ;开定时/计数器0允许
SETB TR0 ;定时/计数器0开始运行
LOOP: ;判断时钟进位程序
MOV A,R1
CJNE A,#60,LOOP1 ;R1等于60吗?
MOV R1,#0
INC R2 ;R1等于60那么R2加一,R1清0
MOV A,R2
CJNE A,#60,LOOP1 ;R2等于60吗?
MOV R2,#0
INC R3 ;R2等于60那么R3加一,R2清0
MOV A,R3
CJNE A,#24,LOOP1 ;R3等于24吗?
MOV R3,#0
;R3等于24那么R3清0
LOOP1:
mov a,r2 ;如果分钟显示为0,报警
cjne a,#01H,LOOP2
mov a,r1
cjne a,#00H,LOOP3
clr p2.0
LOOP3:
mov a,r1 ;如果秒钟显示为1,取消报警
cjne a,#05H,LOOP2
setb p2.0
LOOP2: ;显示数据处理
MOV A, R1 ;取来8位二进制数
MOV B, #100
DIV AB ;除以100
MOV A, B ;取回余数
MOV B, #10
DIV AB ;再除以10
MOV R4, A ;商是十位数,存放到R4
MOV R5, B ;余数是个位,存放到R5
MOV 42H,R4
mOV 41H,R5
;R1的BCD码放入41-42H单元
MOV A, R2 ;取来8位二进制数
MOV B, #100
DIV AB ;除以100
MOV A, B ;取回余数
MOV B, #10
DIV AB ;再除以10
MOV R4, A ;商是十位数,存放到R4
MOV R5, B ;余数是个位,存放到R5
MOV 44H,R4
MOV 43H,R5
;R2的BCD码放入43-44H单元
MOV A, R3 ;取来8位二进制数
MOV B, #100
DIV AB ;除以100
MOV A, B ;取回余数
MOV B, #10
DIV AB ;再除以10
MOV R4, A ;商是十位数,存放到R4
MOV R5, B ;余数是个位,存放到R5
MOV 46H,R4
mov 45H,R5
;R3的BCD码放入45-46H单元
L1:
mov a,41h
movc a,@a+dptr
mov 51h,a
mov a,42h
movc a,@a+dptr
mov 52h,a
mov a,43h
movc a,@a+dptr
mov 53h,a
mov a,44h
movc a,@a+dptr
mov 54h,a
mov a,45h
movc a,@a+dptr
mov 55h,a
mov a,46h
movc a,@a+dptr
mov 56h,a ;将显示代码送入51H--56H
display: ;显示程序
mov p0,#0ffH;一
mov p0,51H
mov P1,#0feH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;二
mov p0,52h
mov P1,#0fdH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;三
mov p0,53h
mov P1,#0fbH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;四
mov p0,54h
mov P1,#0f7H
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;五
mov p0,55h
mov P1,#0efH
acall delay1S
mov p1,#0ffH
mov p0,#0ffH;六
mov p0,56h
mov P1,#0dfH
acall delay1S
mov p1,#0ffH
;将51H-56H数据显示,
AJMP LOOP ;工作处理程序
TIME0: ;定时器0的中断处理程序
INC R7
MOV A,R7
CJNE A,#20,T_RET ;R7单元中的值到了20了吗?
T_L1:
INC R1 ;到了20那么R1+1
MOV R7,#0 ;清软件计数器
T_RET:;二十分之一秒时的程序
inc r6
mov a,r6
cjne r6,#3,T_over ;调节时间的延迟时间
mov r6,#0
jb p2.1,T_over1
mov a,r2
add a,#1
cjne a,#60,T_tiao1
mov a,#0
T_tiao1:
mov r2,a
T_over1:
jb p2.2,T_over
mov a,r3
add a,#1
cjne a,#24,T_tiao2
mov a,#0
T_tiao2:
mov r3,a
T_over:
MOV TH0,#3CH
MOV TL0,#0B0H ;如果没到一秒重置定时常数
reti
delay1s: MOV 31H,#100
D1: MOV 32H,#30
D2: DJNZ 32H,D2
DJNZ 31H,D1
RET
delay2s: MOV 33H,#255
D3: MOV 34H,#255
D4: DJNZ 34H,D4
DJNZ 33H,D3
RET
K1:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
END