题目:可控节能开关
一,设计任务:设计并制作一可控节能开关(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单片机部分模块程序.zip51单片机部分模块程序.zip51单片机部分模块程序.zip 51单片机部分模块程序.zip51单片机部分模块程序.zip51单片机部分模块程序.zip 51单片机部分模块程序.zip51单片机部分模块程序.zip51...
51单片机多任务同时执行。 RTX51 Tiny是一种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入式应用系统经常有这种需求。...
"51多任务实现"这个文件应当包含了上述部分的实现,通过对代码的详细分析,我们可以学习到如何在资源有限的51单片机上优化任务调度,实现高效的任务管理。同时,通过附带的仿真,我们可以直观地观察多任务的运行效果...
在本文中,我们将深入探讨"51单片机多任务程序例程"这一主题,它主要涉及51系列单片机、多任务处理、系统设计以及51定时器的使用。51单片机因其简单易用和成本效益高而广泛应用于各种嵌入式系统中。实现多任务在...
在电子工程领域,51单片机是一种广泛应用的微控制器,尤其在初学者和许多简单的自动化项目中。本文将深入探讨基于51单片机的人体红外感应灯程序及其相关技术。 首先,51单片机是Intel 8051系列的微控制器,它包含一...
在本文中,我们将深入探讨如何在51单片机上实现一个简单的操作系统(OS),主要关注任务调度。这个话题基于KEIL开发环境和C51编程语言,这是一门专门针对8051系列单片机的编程语言。我们将讨论基本的OS概念,任务...
【简单的多任务操作系统_51单片机_】 在嵌入式系统领域,51单片机因其简单易用和广泛的市场支持而被广泛应用。一个简单的多任务操作系统(RTOS)对于51单片机来说,可以提高其处理能力,使得在有限的硬件资源下能够...
这些特性使得51单片机能够处理各种控制任务,从简单的LED闪烁到复杂的嵌入式系统设计。 C51程序代码是51单片机编程的主要方式,它允许开发者使用结构化的C语言编写程序,同时保持与汇编语言相当的效率。C51编译器将...
《51单片机经典任务及代码》是一个针对51单片机初学者的资源集合,其中包含了多个具有代表性的项目实例和相应的源代码。51单片机是微控制器领域中最基础且广泛使用的型号之一,它以其简洁的结构和丰富的资源成为了...
基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机...
本文将深入探讨如何在51单片机上实现多任务操作系统(OS),以便更好地管理和优化资源,提高系统的响应速度和效率。 51单片机的多任务OS设计通常基于中断服务和时间片轮转等技术。中断服务是单片机处理多个任务的...
“串口”部分则会介绍51单片机的串行通信接口。串口通信在嵌入式系统中应用广泛,用于设备间的短距离通信。51单片机有两个串行口,支持异步串行通信,采用起始位、数据位、校验位和停止位的形式进行数据传输。理解...
在本文中,我们将深入探讨基于51单片机的多任务切换简易操作系统。51单片机是一款广泛应用的微控制器,常用于各种嵌入式系统设计。多任务切换是操作系统中的一个关键概念,它允许系统在多个任务之间进行快速、高效地...
AT89S52是Atmel公司推出的一款增强型51系列单片机,具有8KB的Flash程序存储器、256字节的RAM、3个16位定时器/计数器、8路中断源、全双工UART串行口等功能,相较于传统的8051内核,其性能更加强大,适用于复杂的数据...
基于 51 单片机 多进程 多任务 纯 C语言 实现 死循环 调度 多任务 调度程序
这个“51单片机的最最基础部分”涵盖了学习51单片机所需的基本概念、硬件结构、编程语言以及基础应用。 首先,51单片机是由Intel公司开发的8位微处理器,它的核心是8051内核。它拥有四个8位数据总线和地址总线,...
这个压缩包“51单片机的部分AD常用库.rar”很可能包含了用于51单片机进行模拟信号数字化的库函数,这些库可以帮助开发者更方便地处理ADC相关的功能。 51单片机的AD转换通常涉及以下几个关键知识点: 1. **AD转换...
在电子工程和自动化领域,51单片机因其简洁的结构和丰富的资源,成为初学者及许多项目开发者首选的微控制器之一。本文将深入探讨51单片机在激光雕刻机控制系统中的应用,以及如何理解和使用提供的源码。 51单片机是...
传统的单片机系统监控程序通常是基于单任务机制的.这种机制具有简单直观、编程容易的优点 .然而由于程序只能按单一的线索顺序执行,缺乏灵活性,在复杂系统中难以胜任.为了在更广泛的领域应用单片机系统,必须对传统的...
这种方法的主要特点是在有限的硬件资源下实现多任务编程,以降低系统实现难度,尤其适用于那些刚接触51单片机编程的人。在循环轮询多任务编程模式中,任务被分解为多个小型任务,以确保系统的实时性,避免任务被阻塞...