找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5383|回复: 0
打印 上一主题 下一主题
收起左侧

单片机定时闹钟

[复制链接]
跳转到指定楼层
楼主
ID:254313 发表于 2017-11-27 19:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      单片机定时闹钟
[电路概述]该时钟电路主要以单片机AT89S52为核心而设计的,通过单片机对信息的分析与处理控制外围设备。电路整体设计思想是想把它做成一个实用的器件,所以在题目要求的前提下,我们又加入了星期程序,温度程序,年、月、日程序以及时间的12—24转换程序。
     [关键字]:单片机 数码显示 温度传感器 光识电路
[题目分析与方案论证]按照系统设计功能的要求,初步确定设计系统由复位模块、时钟模块、温度模块、音乐模块、光识模块及显示模块共五个模块组成,后来在时钟模块的基础上又加载了日历、星期的模块
从单片机AT89S52入手,通过使用AT89S52的内部的可编程定时器/计数器,结合对外接晶振的调节来确定一个合适的振荡周期,从而确定出内部的机器周期。再通过对内部中断程序的设置来设计出时钟程序,即设计出了电子时钟的核心。
根据题目的要求,我们设计了以下方案:
[方案一]设计中加载了年、月、日的设计,刚开始时打算用18个共阳数码管,考虑到数码管太多是毕会给硬件电路带来麻烦,经过考虑后,决定把年、月、日与时间设置到一组数码管上来,即六个数码管即能显示时间又能显示年、月、日,这样一来就方便了硬件电路;
[方案二]主控芯片使用51系列AT89S52单片机设计时温度模块设计温度元件用AD590,利用AD590以及接口电路把温度转换成模拟电压,经由ADC0804转换成数字信号,然后经AT89S52处理显示温度。但由于AD590价钱比较贵,且只能转换成模拟电压,这样一来硬件就要增加更多的器件且又不经济,经查找发现18B20温度传感器价钱便宜且可以直接把温度转换成数字量测温范围为-55125度,最大分辨率可达0.0625度,采用3线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点,所以我们选择了18B20温度传感器。
18B20温度传感器工作原理:DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并可根据实际要求通过简单的编程实现912位的数字值读数方式。温度传感器DS18B20采集温度信号送该给单片机处理,存储器通过单片机对某些时间点的数据进行存储;DS18B20的性能特点如下:
   1、独特的单线接口仅需要一个引脚进行通信;
   2、多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
   3、无须外部器件;
   4、可通过数据线供电,电压范围为3.0---5.5V
   5、零待机功耗;
   6、温度以912位数字量读出;
   7、用户可定义的非易失性温度报警设置;
   8、报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
   9、负电压特性,电源极性接反是,温度计不会因发热而烧毁,但不能正常工作。
[系统总体结构框图]
[按键功能]
    a键:P2.112---24转换
    b键:P2.3口调整定时、计时的时、调整年
    c键:P2.5口调整计时的秒和定时状态及日
    d键:P2.7口判断定时到否
    e键:P2.0口调整星期
    f键:P2.2口定时、计时转换
    g键:P2.4口调整定时、计时的秒和判断定时状态、调整日
    h键:P2.6口调整定时的报警音乐、省电模式
    i键:复位键
    j键:P3.6口年、月、日的显示
[主要电路原理与设计]
1)系统硬件电路的设计:
电路是由控制部分和显示部分两大部分组成。利用单片机程序进行控制,单片机以晶体振荡器的振荡周期(或外部引入的时钟周期)为最小的时序单位,片内的各种微操作都以此周期为时序基准。振荡频率二分频后形成状态周期或称s周期,所以,1个状态周期包含有2个振荡周期。振荡频率foscl2分频后形成机器周期MC。所以,1个机器周期包含有6个状态周期或12个振荡周期。1个到4个机器周期确定一条指令的执行时间,这个时间就是指令周期。AT89S52单片机指令系统中,各条指令的执行时间都在1个到4个机器周期之间。
,并通过数码管进行显示单片机普遍采用锁相环技术,使单片机的时钟频率可由程序控制。锁相环允许用户在片外使用频率较低的晶振,可以很大地减小板级噪声;而且,由于时钟频率可由程序控制,系统时钟可以在一个很宽的范围内调整,总线频率往往能升得很高。但是,使用锁相环也会带来额外的功率消耗。单就时钟方案来讲,使用外部晶振且不使用锁相环是功率消耗最小的一种。AT89S52单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。
在引脚XTAL1XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。内部振荡方式的外部电路如下图所示。
图中,电容器C01C02起稳定振荡频率、快速起振的作用,其电容值一般在5-30pF。晶振频率的典型值为12MH2,采用6MHz的情况也比较多。内部振荡方式所得的时钟情号比较稳定,实用电路中使用较多。
外部振荡方式是把外部已有的时钟信号引入单片机内。这种方式适宜用来使单片机的时钟与外部信号保持同步。外部振荡方式的外部电路如下图所示。如图所示:
各模块分析:
显示模块——电路先通过电源电路送出+5V电压,单片机AT89S52通过74LS47CD45154—16译码器)驱动数码管显示数值, 显示部分采用普通共阳极数码管显示,采用动态扫描,以减少硬件电路。考虑到一次扫描12位数码管显示时会出现闪烁情况,设计时分两排显示,一排显示时间和年月日,一排显示星期和温度,  共阳极数码管中8个发光二极管的阳极(二极管正端)连在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输入端为低电平时,该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。采用动态显示方式,比较节省I/O口,硬件电路也较静态显示简单,但其亮度不如静态显示方式,而且在显示位数较多时,CPU要依次扫描,占用CPU较多时间。
为了提供共阳LED数码管的驱动电压,用三极管9012作电源驱动输出。采用12MHz晶振,有利于提高秒计时的精确性。三极管采用9012。数码管采用红色的共阳型LED数码管,亮度高些,因为是扫描的显示方式,所以各个数码管的abcdefg各脚采用了总线并联,改动510欧姆的电阻可以改变显示亮度;
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif
时钟模块——利用芯片内部的振荡器,然后在引脚XTAL1和引脚 XTAL2两端接晶体谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部的时钟电路,如图外接晶振时,C1C2的值通常选择30pF C1C2对频率有微调作用,晶体谐振器的频率12MHz。为了减少寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机芯片靠近。设置了12—24两种显示状态,调整计时的按键、设置定时的按键且定时设置了3次定时、还另加载了星期、年、月、日的调整及闰年的自动调整;
温度模块——主要由18B20通过单片机AT89S52中的温度程序不断的检测温度来显示温度温度传感器DS18B20采集温度信号送该给单片机处理,存储器通过单片机对某些时间点的数据进行存储
音乐模块——通过LM386N-1给扬声器信号来发出音乐,这个模块主要是为时钟定时到时发出音乐闹铃,而在软件部分设置了可以一次设置3次定时,每次定时到时,音乐程序中编了6种音乐,它可以自动选择6种音乐中的任一音乐响1分钟,如果中间不想让闹铃响可以按一按键,闹铃就立刻停止
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif
复位模块——单片机复位电路是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从该状态开始工作,例如复位后PC=0000H,使单片机从第一个单元取指令。无论是在单片机刚接上电源时,还是断电后或者发生故障后都要复位;单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值,见下表。
值得指出的是,记住一些特殊功能寄存器复位后的主要状态,对于了解单片机的初态,减少应用程序中的韧始化部分是十分必要的。
说明:表中符号*为随机状态;
A=00H,表明累加器已被清零;
  
特殊功能寄存器
  
  
初始状态
  
  
特殊功能寄存器
  
  
初始状态
  
  
A
  
  
00H
  
  
TMOD
  
  
00H
  
  
B
  
  
00H
  
  
TCON
  
  
00H
  
  
PSW
  
  
00H
  
  
TH0
  
  
00H
  
  
SP
  
  
07H
  
  
TL0
  
  
00H
  
  
DPL
  
  
00H
  
  
TH1
  
  
00H
  
  
DPH
  
  
00H
  
  
TL1
  
  
00H
  
  
P0~P3
  
  
FFH
  
  
SBUF
  
  
不定
  
  
IP
  
  
***00000B
  
  
SCON
  
  
00H
  
  
IE
  
  
0**00000B
  
  
PCON
  
  
0*******B
  
PSW=00H,表明选寄存器0组为工作寄存器组;
SP=07H,表明堆栈指针指向片内RAM 07H字节单元,根据堆栈操作的先加后压法则,第一个被压入的内容写入到08H单元中;
Po-P3=FFH,表明已向各端口线写入1,此时,各端口既可用于输入又可用于输出;
IP=×××00000B,表明各个中断源处于低优先级;
IE=0××00000B,表明各个中断均被关断;
系统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。
光识模块——同样也是为定时服务的,只要定时到,组成心字的18只发光二极管就会按程序先做左移位,再全亮全灭3次,然后再右移,再全亮全灭3次如此循环1分钟;
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image009.gif
  
        
AT89S52
   
         
   
   
   
P1
   
   
   
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gif
安全省电模式——电源电路上装了保险管只要电流大于额定电流保险就断来保护电路,省电模式:不看时显示不亮,看时,按下一键显示就亮,尽量达到人性化。
[软件系统设计]
计时程序是实现电子时钟的核心内容,本程序用中断time0来控制,计时显示的单元从50h开始,50h=秒的个位,51h=秒的十位,52h=分的个位,53h=分的十位,54h=时的个位,55h=时的十位
org    000bh           


jmp    time0
mov    tmod,#00010001b               
mov    ie,#10001010b               
mov    ip,#00000010b
           mov    th0,#(65536-2000)/256


          mov   tl0,#low(65536-2000)
           mov    4fh,#02;两个中断250次为1
定时报警程序
作用是判断时间是否与设置的闹钟时间相等,如相等则开启闹钟。
单片机内定时振铃开关使用软件开关,即用标志寄存器,且程序设置了3次定时,可见要使电子时钟定时打铃,必须同时具备两个条件,第一:定时振铃开;第二:当前定时项数不为0项。 因为要使电子时钟定时打铃,必须同时具备上述的两个条件,所以在单片机执行查询定时各项的程序之前,主程序会首先查询这两个条件是否同时满足,如果满足的话,则进行一轮查询,所谓一轮查询定时,即将当前时间与定时各项一一比较,看是否相符,如果查到某项相符,则调用音乐程序。每查完一项,寄存器中的值会自动减1(即为定时时间的项数)。当定时时间的项数值自动减为0时,则表示这一轮查询定时时间完毕,只要条件允许(定时音乐开且定时项数不为0),有可以进行一轮新的查询定时时间。
定时133h=分,34h=时,定时235h=分,36h=时,定时337h=分,38h=时,定时状态=39h;定时显示的单元从60h开始,60h=定时状态,61h=此时;定时状态的音乐种类,62h=分的个位,63h=分的十位;64h=时的个位,65h=时的十位
温度程序:
57h=温度的十位,58h=温度的个位,
      
wendu:CALL REST;调复位




MOV   A,#0CCH
          CALL  WRITE调写程序
          MOV   A,#4EH
          CALL  WRITE
          MOV   A,#00H
          CALL  WRITE
          MOV   A,#00H
          CALL  WRITE
          MOV   A,#7FH
          CALL  WRITE
          CALL  REST
           MOV  A,#0CCH
          CALL  WRITE
          MOV   A,#44H
          CALL  WRITE
          MOV   R0,#20
LOOP5:MOV  R1,#100
    LOOP6:MOV   R2,#250
          DJNZ  R2,$
          DJNZ  R1,LOOP6
          DJNZ  R0,LOOP5
          CALL  REST
           MOV  A,#0CCH
          CALL  WRITE
          MOV   A,#0BEH
          CALL  WRITE
          CALL  READ2;调读程序
          MOV   A,#0ECH
          CALL  WRITE
          CALL  HUAN
          clr   20h.3
          ret


                        
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image011.gif


******初始化*************************************   
          org    0000h;计时显示的单元从50h开始,50h=秒的个位,51h=秒的十位,52h=
          jmp    main;分的个位,53h=分的十位,54h=时的个位,55h=时的十位,56h=
          org    000bh;星期,57h=温度的十位,58h=温度的个位,30h=秒,31h=分,32h=,定时133h=分,34h=时,
          jmp    time0;定时235h=分,36h=时,定时337h=分,38h=时,定时状态=39h
          org    001bh
          jmp    time1
************主程序******************************** main:mov    r0,#00;等待
djnz   r0,$
movsp,#6ah            ;定时显示的单元从60h开始,60h=定时状态,61h=此时
  mov    tmod,#00010001b    ;定时状态的音乐种类,62h=分的个位,63h=  分的十位
mov    ie,#10001010b      ;64h=时的个位,65h=                              的十位
mov    ip,#00000010b
mov    th0,#(65536-2000)/256
mov    tl0,#low(65536-2000)
  mov    4fh,#02;两个中断250次为1秒
mov    4eh,#00;光报警
  mov    2dh,#250;中断250次为0.5秒
  mov    2fh,#00h;设置计时显示数码管的编号
  mov    2eh,#00h;设置定时显示数码管的编号
  mov    24h,#00h;设置年月日显示数码管的编号
mov    30h,#00h;设置时间的初值
mov    31h,#00h
mov    32h,#12h
  mov    56h,#01h;
设置星期初值
mov    33h,#00h;
设置定时初值
mov   34h,#01h
mov   35h,#00h
mov    36h,#02h
mov   37h,#00h
mov   38h,#03h
mov    39h,#01h;
设置定时状态初始值
mov    3ah,#01h;设置定时状态1时音乐的初始值
          mov    3bh,#02h;设置定时状态2时音乐的初始值
          mov    3ch,#03h;设置定时状态3时音乐的初始值
          mov    21h,#00h;设置年初值,00表示2000年
          mov    22h,#01h;设置月初值
          mov    23h,#01h;设置日初值
           setb   20h.0;12,24标志位,1表示12小时制,0表示24小时制
          setb   20h.1;定时,计时标志位,1表示计时,0表示定时
          clr    20h.2;定时到否标志位,1表示到,0表示不到
          setb   20h.3;是否允许检测温度标志位,1表示允许
          clr    20h.4;
年标志位,1表示闰年
          setb   20h.5;
1表示31天,0表示30天
          clr    20h.6;1表示显示年月日
          setb   p3.0;上下午标志位,1表示上午,0表示下午
          clr    p1
          setb   tr0
*************星期设置程序*************************************         
    startjb     p2.0,q1;调整星期
          call   del;消除抖动
          mov    a,56h
           add   a,#01h
          cjne   a,#07h,z1
mov   56h,#08h
jmp   a1
z1:cjne  a,#09h,z2
mov   56h,#01h
jmp   a1
z2:mov   56h,a
a1:call  del
jnb   p2.0,a1
jmp   start
*************设置12--24小时转换程序********************************         
q1:jb    p2.1,q2;
12,24小时制转换
call  del; 消除抖动
jnb   20h.0,b1
jnb    p3.0,b2;将12小时制转换为24小时制
jmp   a2
b2:mov    a,32h
add    a,#12h
da     a
cjne  a,#24h,b3
mov   32h,#00h
setb  p3.0
jmp   a2
b3:mov   32h,a
setb  p3.0
jmp   a2
b1:mov    a,32h;将24小时制转换为12小时制
cjne  a,#00h,b7
mov   32h,#12h
clr   p3.0
jmp   a2
b7:cjne  a,#20h,b8
mov   32h,#08h
clr   p3.0
jmp   a2
b8:cjne  a,#21h,b9
          mov    32h,#09h
          clr    p3.0
          jmp    a2
       b9:cjne   a,#12h,b4
          jmp    a2
       b4:jnc    b5
          jmp    a2
       b5:subb   a,#12h
          mov    32h,a
          clr    p3.0
       a2:cpl    20h.0
       b6:call   del
          jnb    p2.1,b6
          jmp    start
*************定时计时调整程序*************************************         
   q2:jb     p2.2,q3;定时,计时转换
          call   del;
          cpl    20h.1
       a3:call   del
          jnb    p2.2,a3
          jmp    start
       q3:jb     p2.3,q4;调整定时,计时的时,年
          call   del;消除抖动
          jnb    20h.6,c00
          call   yearyear
          jmp    a4   
      c00:jnb    20h.1,c1
        jb     20h.0,c2;计时调整
          mov    a,32h
          add    a,#01h
          da     a
          cjne   a,#24h,c3
          mov    32h,#00h
           jmp   a4
       c3:mov    32h,a
          jmp    a4
       c2:mov    a,32h
          add    a,#01h
          da     a
          mov    32h,a
          cjne   a,#13h,c4
          mov    32h,#01h
          cpl    p3.0
          jmp    a4
       c4:mov    32h,a
          jmp    a4
       c1:mov    a,39h;定时调整
          cjne   a,#01h,c5
          mov    r0,#34h
          jmp    c10
       c5:cjne   a,#02h,c6
          mov    r0,#36h
          jmp    c10
       c6:mov    r0,#38h
      c10:jb     20h.0,c7
          mov    a,@r0
          add    a,#01h
          da     a
          cjne   a,#24h,c8
          mov    @r0,#00h
          jmp    a4
       c8:mov    @r0,a
          jmp    a4
       c7:mov    a,@r0
          add    a,#01h
          da     a
          cjne   a,#13h,c9
          mov    @r0,#01h
          jmp    a4
       c9:mov    @r0,a
       a4:call   del
          jnb    p2.3,a4
          jmp    start
        q4:jb     p2.4,q5;调整定时,计时的分,月
          call   del
          jnb    20h.6,d00
          call   yueyue
          jmp    a5
      d00:jnb    20h.1,d1
          mov   a,31h;计时分调整
          add    a,#01h
          da     a
          cjne   a,#60h,d2
          mov    31h,#00h
          jmp    a5
       d2:mov    31h,a
          jmp    a5
       d1:mov   a,39h ;定时分调整
          cjne   a,#01h,d3
          mov    r0,#33h
          jmp    d5
       d3:cjne   a,#02h,d4
          mov    r0,#35h
          jmp    d5
        d4:mov   r0,#37h
       d5:mov    a,@r0
          add    a,#01h
          da     a
          cjne   a,#60h,d6
          mov    @r0,#00h
          jmp    a5
       d6:mov    @r0,a
       a5:call   del
          jnb    p2.4,a5
          jmp    start
        q5:jb  p2.5,q6;调整计时的秒和定时的状态,日
          call   del
          jnb    20h.6,e00
          call   ri
          jmp    a6
      e00:jnb    20h.1,e1
         mov  a,30h;调整计时的秒
          add    a,#01h
          da     a
          cjne   a,#60h,e2
          mov    30h,#00h
          jmp    a6
       e2:mov    30h,a
          jmp    a6
      e1:mov  a,39h;调整定时状态
          add    a,#01h
          da     a
          cjne   a,#04h,e3
          mov    39h,#01h
          jmp    a6
       e3:mov    39h,a
       a6:call   del
          jnb    p2.5,a6
          jmp    start
*************调整定时的报警音乐,省电模式*********************************
       q6:jb     p2.6,q7
          call   del
          jnb    20h.1,gh
          cpl    p3.4
          jmp    i3
       gh:mov    a,39h
          cjne   a,#01h,i1
          mov    a,3ah
          add    a,#01h
          mov    3ah,a
          cjne   a,#07h,i3
          mov    3ah,#01h
          jmp    i3
       i1:cjne   a,#02h,i2
          mov    a,3bh
          add    a,#01H
          mov    3bh,a
          cjne   a,#07h,i3
          mov    3bh,#01h
          jmp    i3
       i2:mov    a,3ch
          add    a,#01h
          mov    3ch,a
          cjne   a,#07h,i3
          mov    3ch,#01h
       i3:call   del
          jnb    p2.6,i3
          jmp    start
************定时报警**************************        
       q7:jnb    20h.2,q8
          call   yinyue
          jmp    start
       q8:jnb    20h.3,q9
          call   wendu;检测温度
          jmp    start
       q9:jb     p3.6,q10
          cpl    20h.6
      q11:call   del
          jnb    p3.6,q11
      q10:jmp    start
  ***********闰年判断************************************************   
     nian:mov    a,21h
          cjne   a,#00h,nian0
          jmp    year
    nian0:cjne   a,#04h,nian1
          jmp    year
    nian1:cjne   a,#08h,nian2
          jmp    year
    nian2:cjne   a,#12h,nian3
          jmp    year
    nian3:cjne   a,#16h,nian4
          jmp    year
    nian4:cjne   a,#20h,nian5
          jmp    year
    nian5:cjne   a,#24h,nian6
          jmp    year
    nian6:cjne   a,#28h,nian7
          jmp    year
    nian7:cjne   a,#32h,nian8
          jmp    year
    nian8:cjne   a,#36h,nian9
          jmp    year
     nian9:cjne  a,#40h,nian10
          jmp    year
   nian10:cjne   a,#44h,nian11
          jmp    year
   nian11:cjne   a,#48h,nian12
          jmp    year
   nian12:cjne   a,#52h,nian13
          jmp    year
   nian13:cjne   a,#56h,nian14
          jmp    year
   nian14:cjne   a,#60h,nian15
          jmp    year
   nian15:cjne   a,#64h,nian16
          jmp    year
   nian16:cjne   a,#68h,nian17
          jmp    year
   nian17:cjne   a,#72h,nian18
          jmp    year
   nian18:cjne   a,#76h,nian19
          jmp    year
   nian19:cjne   a,#80h,nian20
          jmp    year
   nian20:cjne   a,#84h,nian21
          jmp    year
   nian21:cjne   a,#88h,nian22
          jmp    year
   nian22:cjne   a,#92h,nian23
          jmp    year
   nian23:cjne   a,#96h,nian24
     year:setb   20h.4
          jmp    year1
   nian24:clr    20h.4
    year1:ret
yue:mov a,22h;大月31天,小月30
          cjne   a,#04h,yue0
          jmp    yue4
     yue0:cjne   a,#06h,yue1
          jmp    yue4
     yue1:cjne   a,#09h,yue2
          jmp    yue4
     yue2:cjne   a,#11h,yue3
     yue4:clr    20h.5
          jmp    yue5
     yue3:setb   20h.5
     yue5:ret
yearyear:mov    a,21h;年加1
          add    a,#01h
          da     a
          mov    21h,a
          ret
   yueyue:mov    a,22h;月加1
          add    a,#01h
          da     a
          mov    22h,a
          cjne   a,#13h,yueyue0
          mov    22h,#01h
yueyuye0:ret
       ri:mov    a,23h;日加1
          add    a,#01h
          da     a
          mov    23h,a
          cjne   a,#29h,ri0
          mov    a,22h
          cjne   a,#02h,ri1
          call   nian
          jb     20h.4,ri1
          mov    23h,#01h
          jmp    ri1
      ri0:cjne   a,#31h,ri2
          call   yue
          jb     20h.5,ri1
          mov    23h,#01h
          jmp    ri1
      ri2:cjne   a,#32h,ri1
          mov    23h,#01h
      ri1:ret
**************计时子程序************************     
    jishi:mov    a,30h;秒加一        
          add    a,#01h
          da     a
          mov    30h,a
          cjne   a,#60h,f4
          mov    30h,#00h
         setb  20h.3;允许检测温度
          mov    a,31h;分加一
           add   a,#01h
          da     a
          mov    31h,a
          cjne   a,#60h,f4
          mov    31h,#00h
          mov    a,32h;时加一
          add    a,#01h
          da     a
          mov    32h,a
          jb     20h.0,f1
          cjne   a,#24h,f4
          mov    32h,#00h
          jmp    f2
       f1:cjne   a,#13h,f4
          mov    32h,#01h
          cpl    p3.0
          jnb    p3.0,f4
       f2:mov    a,56h; 星期加一
          add    a,#01h
          mov    56h,a
          cjne   a,#07h,f3
          mov    56h,#08h
          jmp    f4
       f3:cjne   a,#09h,f4
          mov    56h,#01h
       f4:call   day;更新年月日
   jb     p2.7,f7;定时到否子程序段
          mov    a,31h
          cjne   a,33h,f5
          mov    a,32h
           cjne  a,34h,f8
          setb   20h.2
          mov    a,3ah
          mov    2ch,a
          jmp    a7
       f8:mov    a,31h
       f5:cjne   a,35h,f6
          mov    a,32h
          cjne   a,36h,f9
          setb   20h.2
          mov    a,3bh
          mov    2ch,a
          jmp    a7
       f9:mov    a,31h
       f6:cjne   a,37h,f7
          mov    a,32h
          cjne   a,38h,f7
          setb   20h.2
          mov    a,3ch
          mov    2ch,a
          jmp    a7
        f7:clr   20h.2
       a7:ret
      day:mov    a,23h;日加1
          add    a,#01h
          da     a
          mov    23h,a
          cjne   a,#29h,rri0
          mov    a,22h
          cjne   a,#02h,wan
          call   nian
          jb     20h.4,wan
          mov    23h,#01h
          jmp    yuey
     rri0:cjne   a,#31h,rri2
          call   yue
          jb     20h.5,wan
          mov    23h,#01h
          jmp    yuey
     rri2:cjne   a,#32h,wan
          mov    23h,#01h
     yuey:mov    a,22h;月加1
          add    a,#01h
          da     a
          mov    22h,a
          cjne   a,#13h,wan
          mov    22h,#01h
          mov    a,21h;年加1
          add    a,#01h
          da     a
          mov    21h,a
      wan:ret
    ************计时扫描子程序********************************  
    scan1:mov    r0,#2fh
          inc    @r0
          cjne   @r0,#0ch,g1
          mov    @r0,#00h
       g1:mov    a,@r0
          add    a,#50h
          mov    r1,a
          mov    a,@r0
          swap   a
          orl    a,@r1
          mov    p0,a
          ret
   ***********定时扫描子程序********************************      
    scan2:mov    r0,#2eh
          inc    @r0
          cjne   @r0,#06h,g2
          mov    @r0,#00h
        g2:mov   a,@r0
          add    a,#60h
          mov    r1,a
          mov    a,@r0
          swap   a
          orl    a,@r1
          mov    p0,a
          ret
scan3:mov r0,#24h;定时扫描子程序
          inc    @r0
          cjne   @r0,#06h,gg2
           mov   @r0,#00h
      gg2:mov    a,@r0
          add    a,#40h
          mov    r1,a
          mov    a,@r0
          swap   a
          orl    a,@r1
          mov    p0,a
          ret
  **************计时显示子程序**************************        
xianshi1:mov    r1,#50h
          mov    a,30h
          mov    b,#10h
          div    ab
          mov    @r1,b
          inc    r1
          mov    @r1,a
          inc    r1
          mov    a,31h
          mov    b,#10h
          div    ab
          mov    @r1,b
          inc    r1
          mov    @r1,a
          inc    r1
          mov    a,32h
          mov    b,#10h
          div    ab
          mov    @r1,b
          inc    r1
          mov    @r1,a
          ret
********定时显示子程序*******     
xianshi2: mov  a,39h
          mov   60h,a
          cjne  a,#01h,h1
          mov   a,3ah
          mov   61h,a
          mov   r1,#62h
          mov   a,33h
          mov   b,#10h
          div   ab
          mov   @r1,b
          inc   r1
          mov   @r1,a
          inc   r1
          mov   a,34h
          mov   b,#10h
          div   ab
          mov   @r1,b
          inc   r1
          mov   @r1,a
          jmp   h3
       h1:cjne  a,#02h,h2
          mov   a,3bh
          mov   61h,a
          mov   r1,#62h
          mov   a,35h
          mov   b,#10h
          div   ab
          mov   @r1,b
          inc   r1
          mov   @r1,a
          inc   r1
          mov   a,36h
          mov   b,#10h
          div   ab
          mov   @r1,b
          inc   r1
          mov   @r1,a
          jmp   h3
       h2:mov   a,3ch
          mov   61h,a
          mov   r1,#62h
          mov   a,37h
          mov   b,#10h
          div   ab
          mov   @r1,b
          inc   r1
          mov   @r1,a
          inc   r1
          mov   a,38h
          mov   b,#10h
          div   ab
          mov   @r1,b
          inc   r1
          mov   @r1,a
       h3:ret
xianshi3:mov    r1,#40h;计时显示子程序
          mov    a,21h
          mov    b,#10h
          div    ab
          mov    @r1,b
          inc    r1
          mov    @r1,a
          inc    r1
          mov    a,22h
          mov    b,#10h
          div    ab
          mov    @r1,b
          inc    r1
          mov    @r1,a
          inc    r1
          mov    a,23h
          mov    b,#10h
          div    ab
          mov    @r1,b
          inc    r1
          mov    @r1,a
          ret
    time0:mov    th0,#(65536-2000)/256
          mov    tl0,#low(65536-2000)
          push   a
          push   psw
          setb   rs0
          clr    rs1
          djnz   2dh,h4
          mov    2dh,#250
          djnz   4fh,h4
          mov    4fh,#02
          call   jishi
       h4:jnb    20h.6,hh4
          call   xianshi3
          call   scan3
          jmp    h6
      hh4:jb     20h.1,h5
          call   xianshi2
          call   scan2
          jmp    h6
       h5:call   xianshi1
          call   scan1
       h6:pop    psw
          pop    a
          reti
      del:mov    r6,#40
       j1:mov    r5,#248
          djnz   r5,$
          djnz   r6,j1
          ret
  ***************音乐程序*****        
   yinyue:push   a
          push   psw
          setb   rs1
          clr    rs0
    main1:mov    2bh,#00h
        m:mov    a,2ch
          cjne   a,#01,q
          mov    dptr,#song1
          jmp    pu
        q:cjne   a,#02,w
          mov    dptr,#song2
          jmp    pu
        w:cjne   a,#03,e
          mov    dptr,#song3
          jmp    pu
        e:cjne   a,#04,r
          mov    dptr,#song4
          jmp    pu
        r:cjne   a,#05,t
          mov    dptr,#song5
          jmp    pu
        t:mov    dptr,#song6
       pu:jnb    20h.2,jj
          mov    a,2bh
          movc   a,@a+dptr
          mov    r0,a
          jz     end0
          anl    a,#0fh
          mov    r7,a
          mov    a,r0
          swap   a
          anl    a,#0fh
          jnz    sing
          clr    tr1
          jmp    dd1
     sing:dec    a
          mov    2ah,a
          mov    dptr,#table1
          movc    a,@a+dptr
          mov    29h,a
          mov    th1,a
          mov    a,2ah
          mov    dptr,#table2
          movc    a,@a+dptr
          mov    28h,a
          mov    tl1,a
          setb   tr1
      dd1:call   yanshi
          inc    2bh
          inc    4eh
          mov    a,4eh
          cjne   a,#60,www;????
          mov    4eh,#00
      www:mov    dptr,#table3
          mov    a,4eh
          movc   a,@a+dptr
          mov    p1,a
          jmp    m
     end0:clr    tr1
          jmp    main1
   yanshi:mov    r6,#02
      dd2:mov    r5,#125
      dd3:mov    r4,#248
          djnz   r4,$
           djnz  r5,dd3
          djnz   r6,dd2
          djnz   r7,yanshi
          ret
       jj:jmp    mmm
    time1:push   a
          push   psw
          cpl    p3.1
          mov    th1,29h
          mov    tl1,28h
          pop    psw
           pop   a
          reti
    song1:db  42h,42h,42h,52h,64h,04h
          db  62h,62h,62h,72h,84h,04h
          db  92h,92h,82h,72h,64h,04h
          db  82h,82h,52h,62h,44h,04h
          db  42h,42h,42h,52h,64h,04h
          db  62h,62h,62h,72h,84h,04h
          db  92h,92h,82h,72h,64h,04h
          db  82h,82h,52h,62h,44h,04h
          db  00h
    song2:db  82h,01h,81h,94h,84h
          db  0b4h,0a4h,04h
          db  82h,01h,81h,94h,84h
          db  0c4h,0b4h,04h
          db  82h,01h,81h,0f4h,0d4h
          db  0b4h,0a4h,94h
          db  0e2h,01h,0e1h,0d4h,0b4h
          db  0c4h,0b4h,04h
          db  00h
    song3:db  84h,94h,88h
          db  64h,54h,68h
          db  84h,64h,54h,44h
          db  62h,82h,42h,62h,58h
           db 84h,94h,88h
          db  64h,54h,68h
          db  84h,64h,54h,44h
          db  52h,42h,52h,62h,48h
          db  00h
    song4:db  84h,02h,82h,64h,54h
          db  64h,54h,48h,
          db  64h,02h,52h,44h,24h
          db  14h,24h,18h
          db  24h,02h,22h,42h,24h
          db  44h,54h,68h
          db  54h,02h,52h,84h,84h
          db  54h,64h,48h
          db  00h
    song5:db  44h,54h,64h,44h
          db  44h,54h,64h,44h
          db  64h,74h,88h
          db  64h,74h,88h
          db  82h,92h,82h,72h,64h,44h
          db  82h,92h,82h,72h,64h,44h
          db  44h,84h,48h
          db  44h,14h,48h
          db  00h
    song6:db  62h,82h,82h,62h,98h
          db  92h,0b2h,0b2h,82h,98h
          db  62h,82h,82h,52h,68h
          db  92h,0b2h,0b2h,82h,98h
          db  62h,82h,82h,62h,92h,92h,94h
          db  92h,0b2h,0b2h,92h,84h,94h
          db  0b8h,0b4h,04h
          db  00h
  table1: db  251,251,251,252
          db  252,253,253,253
          db  253,254,254,254
          db  254,254,254
               
table2: db  004,144,248,068
          db  172,009,052,130
          db  200,006,034,086
          db  131,154,193
  table3: db  0feh,0fdh,0fbh,0f7h
          db  0efh,0dfh,0bfh,7fh
          db  00h,0ffh,00h,0ffh
          db  7fh,0bfh,0dfh,0efh
          db  0f7h,0fh,0fdh,0feh
          db  00h,0ffh,00h,0ffh
          db  81h,0c3h,0e7h,0ffh
          db  0e7h,0c3h,81h,00h
          db  81h,42h,24h,18h,00h
      mmm:clr  tr1
          clr  p1
          pop  psw
          pop  a
          ret
   **************温度程序******      
    wendu:CALL  REST
          MOV   A,#0CCH
          CALL  WRITE
          MOV   A,#4EH
          CALL  WRITE
          MOV   A,#00H
          CALL  WRITE
          MOV   A,#00H
          CALL  WRITE
          MOV   A,#7FH
          CALL  WRITE
          CALL  REST
          MOV   A,#0CCH
          CALL  WRITE
          MOV   A,#44H
          CALL  WRITE
          MOV   R0,#20
    LOOP5:MOV   R1,#100
    LOOP6:MOV   R2,#250
          DJNZ  R2,$
          DJNZ  R1,LOOP6
          DJNZ  R0,LOOP5
          CALL  REST
          MOV   A,#0CCH
          CALL  WRITE
          MOV   A,#0BEH
          CALL  WRITE
          CALL  READ2
          MOV   A,#0ECH
          CALL  WRITE
          CALL  HUAN
          clr   20h.3
          ret
     rest:SETB P3.3
          NOP
          CLR P3.3
          MOV R0,#0ffH;
          DJNZ R0,$; 延时
          SETB P3.3
          NOP
          NOP
          NOP
          MOV R0,#25H
    LOOP0:JNB P3.3,LOOP1
          DJNZ R0,LOOP0
          JMP  REST
    LOOP1:MOV R0,#06BH
          DJNZ R0,$ ;
          SETB P3.3
          RET
    READ: MOV R2,#8
    LOOP2:CLR C
          SETB P3.3
           NOP
          NOP
          CLR P3.3
          NOP
          NOP
          NOP
          SETB P3.3
          MOV R3,#7
          DJNZ R3,$
          MOV C,P3.3
          MOV R3,#23
          DJNZ R3,$
          RRC A
          DJNZ R2,LOOP2
          RET
    WRITE:MOV R2,#8
          CLR C
    LOOP3:CLR P3.3
          MOV R3,#6
          DJNZ R3,$
          RRC A
          MOV P3.3,C
          MOV R3,#23
          DJNZ R3,$
          SETB P3.3
          NOP
          DJNZ R2,LOOP3
          SETB P3.3
          RET
    READ2:MOV  R0,#02
          MOV  R1,#42H
    LOOP7:CALL READ
          MOV  @R1,A
          INC  R1
          DJNZ R0,LOOP7
          RET
    HUAN: MOV  A,4dH
          ANL  A,#0F0H
          SWAP  A
          MOV  4dH,A
          MOV  A,4cH
          ANL  A,#0FH
          SWAP  A
          ORL  A,4dH
          MOV  4dH,A
mov r0,#00h ;占存十进制数的十位与个位数,高4位存十位数,低4位存个位数
mov r1,#00h ;占存十进制数的百位数
mov r3,#08h ;算法(((((((0*2+1)*2+1)*2+1)*2+1)*2+1)*2+1)*2+1)*2+1=255  因此需循环8
aaa:mov a,4dh    ;将要转换的十六进制数放在a中;
clr c
rlc a       ;将最高位放在c
mov 4dh,a  ;;将剩下的几位存在40h mov  a,r0   ;;乘以2并加上现在的最高          位上的数
addc a,r0
da   a       ;;十进制调整后,a高4位存十位数,低4位存个位数
mov r0,a
mov  a,r1    ;;百位数乘2并加上十进制调整后的进位
addc a,r1
da  a
mov r1,a
djnz r3,aaa
mov a,r0


mov  r6,a
anl a,#0fh
mov  58h,a   ;;将转换后的个位数存在50h单元
mov  a,r6
anl a,#0f0h
swap a
mov 57h,a    ;;将转换后的十位数存在51h单元
ret
end
[功能测试及结果分析]
硬件调试时,先查看了焊接质量,检查无误后,用示波器测试晶振及各端口的波形情况,进行综合硬件测试分析。
[参考资料]
1、李光飞、楼然苗等 《单片机课程设计实例指导》北京航空航天大学出版社,2004
2、吴金戌、沈庆阳、郭庭吉 《8051单片机实践与应用》清华大学出版社、2001



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表