受人之托,部分完成任务51单片机

题目:可控节能开关
一,设计任务:设计并制作一可控节能开关(220v5A),能实现任意时钟设置,在24小时内可任意设置通断。考虑工艺和成本核算。(该开关用于家用电路,一方面可以实现工作时间长短设置,另一方面也可实现避开峰电期而在谷电期工作,达到节能节电效果)
二,设计要求
1,基本要求(1)实现任意时钟设置;(2)自动实现24小时内通,断功能;(3)实现通断转换报警设置(4)工艺流程编制和成本核算
2,发挥部分(1)实现开关接通与断开分别显示。(2)实现任意时刻接通以及接通时间长短设置(精确于分)。(3)能实现上述未提及的其他功能。

电路图:

注:实际电路图我们呢将数码管改成四个,精确到分即可,数码管分别接了单片机52的p2.3 p2.2 p2.1 p2.0 口 ,键盘分别接52的p1.0 p1.1 p1.2 p1.3口,52的p0.0 p0.1 p0.2 p0.3分别接芯片的A B C D ,图中的芯片74LS47改用了4511,并且想在按钮处加入一个控制按钮。图中按钮与单片机52之间的连接线上分别接了1k的电阻并统一接+5伏电源,去掉按钮左边的电阻和接地装置!
程序.txt------------------------------------

org 0000h
jmp start
org 0Bh
jmp tim0
;*******************
;系统参数初始化
;********************
start:mov sp, #70h ;设置堆栈在70H
mov 28h, #00 ;显示寄存器初值为00

mov 2bh, #00 ;"分"寄存器的初值为00
mov 2ch, #00 ;"秒"寄存器的初值为00
mov tmod, #01h ;为工作方式1
mov th0, #high(65536-4000) ;计时中断为4000微妙
mov tl0, #low(65536-4000)
setb et0 ;中断使能
setb ea
mov r4, #250 ;中断250次
setb tr0
;***********************
;时间调整子程序
;**********************
loop: jb p0.0, n2 ;判P0.0是否按下
call delay1 ;消除抖动
mov a, 2ch ;将秒的值载入累加器
add a, #01 ;累加器加1
da a ;十进制调整
mov 2ch, a
cjnz a , #60 n1 ;秒是否等于60,不等转移
mov 2ch, #00 ;秒清零
n1: jnb p0.0 , $ ;放开跳转
call delay1
n2: jb p0.1, n4 ;判P0.1是否按下
call delay1 ;消除抖动
mov a, #2bh ;将分的值载入累加器
add a, #01 ;累加器加1
da a ;十进制调整
mov 2bh,a
cjnz a,#60h n3 ;分是否等于60,不等转移
mov 2bh,00h ;分清零
n3: jnb p0.1,$ ;放开跳转
call delay1

n4: jb p0.2, loop ;判P0.1是否按下
call delay1 ;消除抖动
mov a , 2ah ;将时的值载入累加器
add a, #01 ;累加器加1
da a ;十进制调整
mov 2ah, a
jnb p0.5, n6
cjnz a,#24 n5 ;时是否等于24,不等转移
jmp n5
n6: cjnz a,#12 n5
mov #2ah, 00h ;时清零
n5: jnb p0.2, $ ;放开跳转
call delay
jmp loop

;*****************************
;中断子程序
;****************************
tim0: mov th0, #high(65536-4000) ;
mov tl0, #low(65536-4000)
push acc
push psw
djnz r4, x2
mov r4, #250
call clock
call disp
x2: call scan
pop psw
pop acc
reti
;**************************
;扫描子程序
;***********************
scan: mov r0, #28h ;(28h)为扫描指针
inc @r0 ;扫描指针加1
cjne @r0, #6,x3 ;扫描完6个显示器?不是调x3
mov @r0, #0 ;是则指针为零
x3: mov a, @r0 ;扫描指针载入A
add a, #20h ;a加常数20H=个时间显示区地址


mov r1, a
mov a , @r0
swap a ;高底半字节互换
orl a , @r1 ;a=a或@r1;;;;;SJMP $ ; 原地踏步 =LOOP:SJMP LOOP
mov p1, a
ret
;**************************
;计时子程序
;**************************
clock: mov a, #2ch
add a, #1
da a
mov 2ch, a
cjne a, #60 x4
mov a, #00
mov a, 2bh
add, a, #1
da a
mov 2bh, a
cjne a, #60 x4
mov 2bh, #00
mov a, 2ah
add a, #1
da a
mov 2ah, a
jnb p0.5, n6
cjnz a,#24 x4 ;时是否等于24,不等转移
mov 2ah, #00
n6: cjnz a,#12 x4
mov 2ah, #00
x4: ret
;***********************************
;显示子程序
;**********************************
disp: mov r1, #20
mov a, 2ch //2ch里有秒
mov b, #10
div ab ; c=a,a=a/b and b=c%b


mov @r1,b ;将b写入显存,b为秒的个位
inc r1 ;r1增加1;找到a的地址
mov @r1,a;将a写入显存,a为秒的十位
inc r1 找到分的个位
mov a,2bh //2bh分
mov b,#10h
div ab ;将a分离,新a为a的前半部分

mov @r1,b b入分的个位
inc r1
mov @r1,a a入分的十位
inc r1
mov a,2ah //2ah时
mov b,#10
div ab
mov @r1,b
inc r1
mov @r1,a
ret

;***********************
;时间间隔显示点程序
;********************
disp1:
dsp: clr p2.2
call delay2
cpl p2.2
jmp dsp
ret


;*****************************
;闹钟设置子程序
;*****************************
naozhong: jnb,p



;*************************
;整点报时子程序
;************************
fmz:
z1: mov a, #2ch ;将秒存于累加器
cjnz a, #00 z1 ;判断秒是否为零,不等跳Z1
z2: mov a, #2bh ;将分存于累加器
cjnz a, #00 z2 ;判断秒是否为零,不等跳Z2
mov r3, #5 ;给R3一个值
c1: clr p1.7 ;p1.7清零
call delay2 ;延时0.5秒
cpl p1.7 ;取反
djnz r3,c1 ; 循环5次
clr p1.7
call delay2 ;延时0.5秒
setb p1.7
call delay2 ;延时1秒
call delay2
clr p1.7 ;清零
ret

;*************************
;延时子程序
;***********************
delay1: mov r6,#10 ;延时5ms
d1: mov r7,#248
djnz r7,$
djnz r6,d1
ret
delay2: mov r5, #5 ;延时0.5s
d2: mov r6, #100
d3: mov r7, #248
djnz r7, $
djnz r6, d3
djnz r7, d2
ret
程序.txt------------------------


new 程序.txt--------------
;*************************
;与另一较早文档相比,改变了显示模块中的部分 disp部分,删除秒的表达,并假设分的地址为20 ,以适应文档要求的“数码管改成四个 ;”
;改变了时间调整中的p00 p01 p02 为p10 p11 p12,似乎这样更加符合文档要求“键盘分别接52的p1.0 p1.1 p1.2 p1.3”
;***************************
org 0000h
jmp start
org 0Bh
jmp tim0
;*******************
;系统参数初始化
;********************
start:mov sp, #70h ;设置堆栈在70H
mov 28h, #00 ;显示寄存器初值为00

mov 2bh, #00 ;"分"寄存器的初值为00
mov 2ch, #00 ;"秒"寄存器的初值为00
mov tmod, #01h ;为工作方式1
mov th0, #high(65536-4000) ;计时中断为4000微妙
mov tl0, #low(65536-4000)
setb et0 ;中断使能
setb ea
mov r4, #250 ;中断250次
setb tr0
;***********************
;时间调整子程序
;**********************
loop: jb p1.0, n2 ;判P0.0是否按下
call delay1 ;消除抖动
mov a, 2ch ;将秒的值载入累加器
add a, #01 ;累加器加1
da a ;十进制调整
mov 2ch, a
cjnz a , #60 n1 ;秒是否等于60,不等转移
mov 2ch, #00 ;秒清零
n1: jnb p1.0 , $ ;放开跳转
call delay1
n2: jb p1.1, n4 ;判P0.1是否按下
call delay1 ;消除抖动
mov a, #2bh ;将分的值载入累加器
add a, #01 ;累加器加1
da a ;十进制调整
mov 2bh,a
cjnz a,#60h n3 ;分是否等于60,不等转移
mov 2bh,00h ;分清零
n3: jnb p1.1,$ ;放开跳转
call delay1

n4: jb p1.2, loop ;判P0.1是否按下
call delay1 ;消除抖动
mov a , 2ah ;将时的值载入累加器
add a, #01 ;累加器加1
da a ;十进制调整
mov 2ah, a
jnb p0.5, n6
cjnz a,#24 n5 ;时是否等于24,不等转移
jmp n5
n6: cjnz a,#12 n5
mov #2ah, 00h ;时清零
n5: jnb p1.2, $ ;放开跳转
call delay
jmp loop

;*****************************
;中断子程序
;****************************
tim0: mov th0, #high(65536-4000) ;
mov tl0, #low(65536-4000)
push acc
push psw
djnz r4, x2
mov r4, #250
call clock
call disp
x2: call scan
pop psw
pop acc
reti
;**************************
;扫描子程序
;***********************
scan: mov r0, #28h ;(28h)为扫描指针
inc @r0 ;扫描指针加1
cjne @r0, #6,x3 ;扫描完6个显示器?不是调x3
mov @r0, #0 ;是则指针为零
x3: mov a, @r0 ;扫描指针载入A
add a, #20h ;a加常数20H=个时间显示区地址


mov r1, a
mov a , @r0
swap a ;高底半字节互换
orl a , @r1 ;a=a或@r1;;;;;SJMP $ ; 原地踏步 =LOOP:SJMP LOOP
mov p1, a
ret
;**************************
;计时子程序
;**************************
clock: mov a, #2ch
add a, #1
da a
mov 2ch, a
cjne a, #60 x4
mov a, #00
mov a, 2bh
add, a, #1
da a
mov 2bh, a
cjne a, #60 x4
mov 2bh, #00
mov a, 2ah
add a, #1
da a
mov 2ah, a
jnb p0.5, n6
cjnz a,#24 x4 ;时是否等于24,不等转移
mov 2ah, #00
n6: cjnz a,#12 x4
mov 2ah, #00
x4: ret
;***********************************
;显示子程序
;**********************************
disp: mov r1, #20;分个位地址;或许分的地址应该为22
mov a,2bh ;2bh分
mov b,#10h
div ab ;将a分离,新a为a的前半部分

mov @r1,b ; b入分的个位
inc r1
mov @r1,a ; a入分的十位
inc r1
mov a,2ah ;2ah时
mov b,#10
div ab
mov @r1,b
inc r1
mov @r1,a
ret

;***********************
;时间间隔显示点程序
;********************
disp1:
dsp: clr p2.2
call delay2
cpl p2.2
jmp dsp
ret


;*****************************
;闹钟设置子程序
;*****************************
naozhong: jnb,p



;*************************
;整点报时子程序
;************************
fmz:
z1: mov a, #2ch ;将秒存于累加器
cjnz a, #00 z1 ;判断秒是否为零,不等跳Z1
z2: mov a, #2bh ;将分存于累加器
cjnz a, #00 z2 ;判断秒是否为零,不等跳Z2
mov r3, #5 ;给R3一个值
c1: clr p1.7 ;p1.7清零
call delay2 ;延时0.5秒
cpl p1.7 ;取反
djnz r3,c1 ; 循环5次
clr p1.7
call delay2 ;延时0.5秒
setb p1.7
call delay2 ;延时1秒
call delay2
clr p1.7 ;清零
ret

;*************************
;延时子程序
;***********************
delay1: mov r6,#10 ;延时5ms
d1: mov r7,#248
djnz r7,$
djnz r6,d1
ret
delay2: mov r5, #5 ;延时0.5s
d2: mov r6, #100
d3: mov r7, #248
djnz r7, $
djnz r6, d3
djnz r7, d2
ret
new程序.txt-----------------

你可能感兴趣的:(受人之托,部分完成任务51单片机)