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

xiaoxiao2026-05-22  0

题目:可控节能开关 一,设计任务:设计并制作一可控节能开关(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-----------------
转载请注明原文地址: https://www.6miu.com/read-5049173.html

最新回复(0)