`
me-
  • 浏览: 72981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

受人之托,部分完成任务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单片机部分模块程序.zip

    51单片机部分模块程序.zip51单片机部分模块程序.zip51单片机部分模块程序.zip 51单片机部分模块程序.zip51单片机部分模块程序.zip51单片机部分模块程序.zip 51单片机部分模块程序.zip51单片机部分模块程序.zip51...

    51单片机多任务同时执行

    51单片机多任务同时执行。 RTX51 Tiny是一种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入式应用系统经常有这种需求。...

    51单片机多任务程序

    "51多任务实现"这个文件应当包含了上述部分的实现,通过对代码的详细分析,我们可以学习到如何在资源有限的51单片机上优化任务调度,实现高效的任务管理。同时,通过附带的仿真,我们可以直观地观察多任务的运行效果...

    51单片机多任务程序例程

    在本文中,我们将深入探讨"51单片机多任务程序例程"这一主题,它主要涉及51系列单片机、多任务处理、系统设计以及51定时器的使用。51单片机因其简单易用和成本效益高而广泛应用于各种嵌入式系统中。实现多任务在...

    基于51单片机人体红外感应灯程序_人体感应MCU_红外感应灯_51单片机_源码

    在电子工程领域,51单片机是一种广泛应用的微控制器,尤其在初学者和许多简单的自动化项目中。本文将深入探讨基于51单片机的人体红外感应灯程序及其相关技术。 首先,51单片机是Intel 8051系列的微控制器,它包含一...

    51单片机简易OS任务调度

    在本文中,我们将深入探讨如何在51单片机上实现一个简单的操作系统(OS),主要关注任务调度。这个话题基于KEIL开发环境和C51编程语言,这是一门专门针对8051系列单片机的编程语言。我们将讨论基本的OS概念,任务...

    简单的多任务操作系统_51单片机_

    【简单的多任务操作系统_51单片机_】 在嵌入式系统领域,51单片机因其简单易用和广泛的市场支持而被广泛应用。一个简单的多任务操作系统(RTOS)对于51单片机来说,可以提高其处理能力,使得在有限的硬件资源下能够...

    51单片机 51单片机 51单片机 51单片机 C51程序代码和原理图

    这些特性使得51单片机能够处理各种控制任务,从简单的LED闪烁到复杂的嵌入式系统设计。 C51程序代码是51单片机编程的主要方式,它允许开发者使用结构化的C语言编写程序,同时保持与汇编语言相当的效率。C51编译器将...

    51单片机经典任务及代码

    《51单片机经典任务及代码》是一个针对51单片机初学者的资源集合,其中包含了多个具有代表性的项目实例和相应的源代码。51单片机是微控制器领域中最基础且广泛使用的型号之一,它以其简洁的结构和丰富的资源成为了...

    51单片机学习代码-普中51单片机.zip

    基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机...

    51单片机多任务OS

    本文将深入探讨如何在51单片机上实现多任务操作系统(OS),以便更好地管理和优化资源,提高系统的响应速度和效率。 51单片机的多任务OS设计通常基于中断服务和时间片轮转等技术。中断服务是单片机处理多个任务的...

    51单片机自学课件

    “串口”部分则会介绍51单片机的串行通信接口。串口通信在嵌入式系统中应用广泛,用于设备间的短距离通信。51单片机有两个串行口,支持异步串行通信,采用起始位、数据位、校验位和停止位的形式进行数据传输。理解...

    基于51单片机写的一个多任务切换的简易OS

    在本文中,我们将深入探讨基于51单片机的多任务切换简易操作系统。51单片机是一款广泛应用的微控制器,常用于各种嵌入式系统设计。多任务切换是操作系统中的一个关键概念,它允许系统在多个任务之间进行快速、高效地...

    51单片机郭天祥TX-1C51单片机开发板pdf

    AT89S52是Atmel公司推出的一款增强型51系列单片机,具有8KB的Flash程序存储器、256字节的RAM、3个16位定时器/计数器、8路中断源、全双工UART串行口等功能,相较于传统的8051内核,其性能更加强大,适用于复杂的数据...

    基于 51 单片机 多进程 多任务 纯 C语言 调度 程序

    基于 51 单片机 多进程 多任务 纯 C语言 实现 死循环 调度 多任务 调度程序

    51单片机的最最基础部分

    这个“51单片机的最最基础部分”涵盖了学习51单片机所需的基本概念、硬件结构、编程语言以及基础应用。 首先,51单片机是由Intel公司开发的8位微处理器,它的核心是8051内核。它拥有四个8位数据总线和地址总线,...

    51单片机的部分AD常用库.rar

    这个压缩包“51单片机的部分AD常用库.rar”很可能包含了用于51单片机进行模拟信号数字化的库函数,这些库可以帮助开发者更方便地处理ADC相关的功能。 51单片机的AD转换通常涉及以下几个关键知识点: 1. **AD转换...

    51单片机程序_51单片机激光雕刻机源码_

    在电子工程和自动化领域,51单片机因其简洁的结构和丰富的资源,成为初学者及许多项目开发者首选的微控制器之一。本文将深入探讨51单片机在激光雕刻机控制系统中的应用,以及如何理解和使用提供的源码。 51单片机是...

    51单片机多任务编程思想

    传统的单片机系统监控程序通常是基于单任务机制的.这种机制具有简单直观、编程容易的优点 .然而由于程序只能按单一的线索顺序执行,缺乏灵活性,在复杂系统中难以胜任.为了在更广泛的领域应用单片机系统,必须对传统的...

    51单片机循环轮询多任务编程.pdf

    这种方法的主要特点是在有限的硬件资源下实现多任务编程,以降低系统实现难度,尤其适用于那些刚接触51单片机编程的人。在循环轮询多任务编程模式中,任务被分解为多个小型任务,以确保系统的实时性,避免任务被阻塞...

Global site tag (gtag.js) - Google Analytics