kinve 4 سال پیش
کامیت
3b022f571a
31فایلهای تغییر یافته به همراه5665 افزوده شده و 0 حذف شده
  1. 1 0
      README.md
  2. 126 0
      可调时钟电路.pdf
  3. BIN
      自制电子钟_增加闹钟zz/Backup Of clock.DBK
  4. 238 0
      自制电子钟_增加闹钟zz/DS1302.H
  5. 803 0
      自制电子钟_增加闹钟zz/DS1302.c
  6. 191 0
      自制电子钟_增加闹钟zz/DS1302.hex
  7. 85 0
      自制电子钟_增加闹钟zz/Digitron.H
  8. 760 0
      自制电子钟_增加闹钟zz/LED时钟.LST
  9. BIN
      自制电子钟_增加闹钟zz/LED时钟.OBJ
  10. 696 0
      自制电子钟_增加闹钟zz/LED时钟.c
  11. BIN
      自制电子钟_增加闹钟zz/Last Loaded clock.DBK
  12. 198 0
      自制电子钟_增加闹钟zz/STARTUP.A51
  13. 252 0
      自制电子钟_增加闹钟zz/STARTUP.LST
  14. BIN
      自制电子钟_增加闹钟zz/STARTUP.OBJ
  15. BIN
      自制电子钟_增加闹钟zz/Sheet1.Pcb
  16. BIN
      自制电子钟_增加闹钟zz/Sheet1.Sch
  17. 178 0
      自制电子钟_增加闹钟zz/SoundPlay.h
  18. BIN
      自制电子钟_增加闹钟zz/clock.DSN
  19. BIN
      自制电子钟_增加闹钟zz/clock.PWI
  20. BIN
      自制电子钟_增加闹钟zz/dianzizhong
  21. 1094 0
      自制电子钟_增加闹钟zz/dianzizhong.M51
  22. 40 0
      自制电子钟_增加闹钟zz/dianzizhong.Opt
  23. 122 0
      自制电子钟_增加闹钟zz/dianzizhong.Uv2
  24. 333 0
      自制电子钟_增加闹钟zz/dianzizhong.hex
  25. 2 0
      自制电子钟_增加闹钟zz/dianzizhong.lnp
  26. 261 0
      自制电子钟_增加闹钟zz/dianzizhong.plg
  27. 40 0
      自制电子钟_增加闹钟zz/dianzizhong_Opt.Bak
  28. 124 0
      自制电子钟_增加闹钟zz/dianzizhong_Uv2.Bak
  29. 8 0
      自制电子钟_增加闹钟zz/music.h
  30. 85 0
      自制电子钟_增加闹钟zz/music_two_tiger.h
  31. 28 0
      自制电子钟_增加闹钟zz/定时器中断号意义.txt

+ 1 - 0
README.md

@@ -0,0 +1 @@
+自制电子钟

+ 126 - 0
可调时钟电路.pdf

@@ -0,0 +1,126 @@
+                                                                                                                         LED_WE_12                                                                                                                                                                               VCC
+                                                                                                                                        12
+                                                                                                                                                    E                                                                       E                                                    E                  E
+                                                                                                                                                              LED_WE_9
+                                                                                                                                                                             9B         B                                                                                  B                  B
+
+                                                                                                                                                                                                           LED_WE_8Q1                        Q2                                     Q3                 Q4
+                                                                                                                                                                                                                                8          MMBT3906
+
+                                                                                                                                                                                                                                                  LED_WE_6
+                                                                                                                                                                                                                                                                   6
+                                                                                                                                                               MMBT3906                                                                                                             MMBT3906           MMBT3906
+
+                                                                                                                                                    C                                                                       C                                                    C                  C
+
+                                                                                                            LED_DA   A                              a                                                                    a                                                    a                  a
+                                                                                                            LED_DB       11
+                                                                                                            LED_DC
+                                                                                                            LED_DD   B
+                                                                                                            LED_DE       7
+                                                                                                             LED_DF
+                                                                                                            LED_DG   C         f                               b                        f                                                  b                               f        b         f        b
+                                                                                                           LED_DDP       4
+
+                                                                                                                     D                U2g                                                                                g                                                    g                  g
+                                                                                                                         2        LED_8_4
+
+                                                                                                                     E
+                                                                                                                         1
+
+                                                                                                                     F 10 e                                    c                        e                                                                     c            e        c         e        c
+
+                                                                                                                     G   5
+
+                                                                                                                                                    d                                                                    d                                                    d                  d
+
+                                                                                                                     DP  3
+
+            3                 GND   4          5     RST
+                                X2                   IO
+X2                              X1  3  DS1302  6     SCLK
+         1                                           VCC1
+                             VCC2   2 U5 7
+
+                                    1          8                                                                                  1 R2100 2 LED_DA     LED_DB  LED_DC    R5100 LED_DD   1 R6100 2 LED_DE  R7100 LED_DF   1 R8100 2 LED_DG  1 R9100 2 LED_DDP
+
+                          2                          U6 BATT
+
+                                                              2
+
+                                                                                                                                                            2         2              2                                2
+
+                      R1     1k                                                                                                                     R3 100
+
+                                                              1                                                                                                R4100
+
+                          1
+
+                                                                              1                                            40                               1         1              1                                1
+                                                                                   P1.0/T2                        VCC
+                                               10UF                                                                                                                                                                                                                 A
+                                       10K C3                                 2                                            39                                                                                                                                       B
+                                                                                   P1.1/T2_EX         U1          P0.0                                                                                                                                              C
+                                       R10        2                                            STC89C52RC                                                                                                                                                           D
+                                                                              3                                            38                                                                                                                                       E
+                                    1                                              P1.2                           P0.1                                                                                                                                              F
+                                                                                                                                                                                                                                                                    G
+                                                                              4                                            37                                                                                                                                       DP
+                                                                                   P1.3                           P0.2
+                                                                   P3.0_RXD
+                                                                   P3.1_TXD   5                                            36
+                                                                                   P1.4                           P0.3
+                   1                        P3.1_TXD                                                                                                                                   LED_WE_12
+                                            P3.0_RXD                          6                                            35                                                          LED_WE_9
+                   2                                                               P1.5/MOSI                      P0.4                                                                 LED_WE_8
+J_PROG                                                                                                                                                                                 LED_WE_6
+                                                                              7                                            34
+                   3                                                               P1.6/MISO                      P0.5
+ J_P4
+                                                                              8                                            33
+                   4                                                               P1.7/SCK                       P0.6
+
+                                                     C1       30p             9                                            32
+                                                                                   RST                            P0.7
+                                                                                                                                                                                                                                                                 2      1
+                                                                             10                                            31
+                                                                     3             P3.0/RXD                   EA/VPP                                                                                                                                                K4
+                                                                        X1
+                                                                             11                                            30                                                                                                                                    2      1
+                                                                   1               P3.1/TXD                ALE/PROG
+                                                     C2       30p                                                                                                                                                                                                   K3
+                                                                             12                                            29
+                                                                                   P3.2/INT0                     PSEN
+
+                                                                             13                                            28
+                                                                                   P3.3/INT1                      P2.7
+
+                                                                             14                                            27
+                                                                                   P3.4/T0                        P2.6
+
+                                                                             15                                            26
+                                                                                   P3.5/T1                        P2.5
+
+                                                                             16                                          25
+                                                                                   P3.6/WR                       P2.4
+
+                                                                             17                                          24
+                                                                                   P3.7/RD                       P2.3
+
+                                                                             18                                          23
+                                                                                   XTAL2                         P2.2
+
+                                                                             19                                          22
+                                                                                   XTAL1                         P2.1
+
+                                                                             20                                            21
+                                                                                   GND                            P2.0
+
+                                                                                                                                                                                                                                                                 2      1
+
+                                                                                                                                                                                                                                                                    K2
+
+                                                                                                                                                                                                                                                                 2      1
+
+                                                                                                                                                                                                                                                                    K1
+

BIN
自制电子钟_增加闹钟zz/Backup Of clock.DBK


+ 238 - 0
自制电子钟_增加闹钟zz/DS1302.H

@@ -0,0 +1,238 @@
+#ifndef	__DS1302_H__
+#define __DS1302_H__
+
+#define HOU_MIN		0
+#define MIN_SECOND	1
+#define MON_DAY		2
+#define YEAR_S		3
+#define MON_DAY_HOU_MIN 4
+#define SET_HOU_MIN 5
+#define MAX_STATE	6
+
+#define AM(X)	X
+#define PM(X)	(X+12)            	 	//转成24小时制
+#define DS1302_SECOND	0x80          	//秒寄存器      
+#define DS1302_MINUTE	0x82          	//分寄存器
+#define DS1302_HOUR		0x84 			//时
+#define DS1302_WEEK		0x8A      		//周
+#define DS1302_DAY		0x86			//日
+#define DS1302_MONTH	0x88			//月
+#define DS1302_YEAR		0x8C			//年
+#define DS1302_READ		0x01		  	//读操作,因为读的时候地址要加1,使最低位为1
+#define DS1302_RAM(X)	(0xC0+(X)*2)   	//用于计算 DS1302_RAM 地址的宏 
+
+sbit T_CLK=P1^2;
+sbit T_IO =P1^1;
+sbit T_RST=P1^0;
+sbit ACC0=ACC^0;
+sbit ACC7=ACC^7;
+
+typedef struct __SYSTEMTIME__
+{
+	unsigned char Second;
+	unsigned char Minute;
+	unsigned char Hour;
+	unsigned char Week;
+	unsigned char Day;
+	unsigned char Month;
+	unsigned char Year;
+	unsigned char DateString[9];
+	unsigned char TimeString[9];
+}SYSTEMTIME;	//定义的时间类型
+
+//********DS1302读写程序***************
+/******************************************************************** 
+ 函 数 名:RTInputByte()
+ 功    能:实时时钟写入一字节
+ 说    明:往DS1302写入1Byte数据 (内部函数)
+ 入口参数:d 写入的数据 
+ 返 回 值:无  
+ ***********************************************************************/
+void RTInputByte(unsigned char d) 
+{ 
+    unsigned char i;
+    ACC = d;
+    for(i=8; i>0; i--)
+    {
+        T_IO = ACC0;           //相当于汇编中的 RRC
+        T_CLK = 1;
+        T_CLK = 0;
+        ACC = ACC >> 1; 
+    } 
+}
+/******************************************************************** 
+ 函 数 名:RTOutputByte()
+ 功    能:实时时钟读取一字节
+ 说    明:从DS1302读取1Byte数据 (内部函数)
+ 入口参数:无  
+ 返 回 值:ACC
+ 设    计:zhaojunjie           日    期:2002-03-19
+ 修    改:                     日    期: 
+***********************************************************************/
+unsigned char RTOutputByte(void) 
+{ 
+    unsigned char i;
+    for(i=8; i>0; i--)
+    {
+        ACC = ACC >>1;         //相当于汇编中的 RRC
+        ACC7 = T_IO;
+        T_CLK = 1;
+        T_CLK = 0;
+    } 
+    return(ACC); 
+}
+/******************************************************************** 
+ 函 数 名:Write1302()
+ 功    能:往DS1302写入数据
+ 说    明:先写地址,后写命令/数据 (内部函数)
+ 调    用:RTInputByte() , RTOutputByte()
+ 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
+ 返 回 值:无
+ ***********************************************************************/
+void Write1302(unsigned char ucAddr, unsigned char ucDa)
+{
+    T_RST = 0;
+    T_CLK = 0;
+    T_RST = 1;
+    RTInputByte(ucAddr);       // 地址,命令 
+    RTInputByte(ucDa);         // 写1Byte数据
+    T_CLK = 1;
+    T_RST = 0;
+}
+/******************************************************************** 
+ 函 数 名:Read1302()
+ 功    能:读取DS1302某地址的数据
+ 说    明:先写地址,后读命令/数据 (内部函数)
+ 调    用:RTInputByte() , RTOutputByte()
+ 入口参数:ucAddr: DS1302地址
+ 返 回 值:ucData :读取的数据
+***********************************************************************/
+unsigned char Read1302(unsigned char ucAddr)
+{
+    unsigned char ucData;
+    T_RST = 0;
+    T_CLK = 0;
+    T_RST = 1;
+    RTInputByte(ucAddr);             // 地址,命令 
+    ucData = RTOutputByte();         // 读1Byte数据
+    T_CLK = 1;
+    T_RST = 0;
+    return(ucData);
+}
+/******************************************************************** 
+ 函 数 名:Set1302()
+ 功    能:设置初始时间
+ 说    明:先写地址,后读命令/数据(寄存器多字节方式)
+ 调    用:Write1302()
+ 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
+                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
+ 返 回 值:无
+***********************************************************************/
+void Set1302(unsigned char *pClock) 
+{
+    unsigned char i;
+    unsigned char ucAddr = 0x80; 
+    Write1302(0x8e,0x00);           // 控制命令,WP=0,写操作
+    for(i =7; i>0; i--)
+    { 
+        Write1302(ucAddr,*pClock);  // 秒 分 时 日 月 星期 年
+        pClock++;
+        ucAddr +=2;
+    }
+    Write1302(0x8e,0x80);           // 控制命令,WP=1,写保护
+}
+
+/***************************************************************************/
+void DS1302_GetTime(SYSTEMTIME *Time)
+{
+#if 0
+	unsigned char Address;
+
+	Address = DS1302_SECOND|DS1302_READ; 
+	Time->Second = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16; //转换成10进制的秒
+
+	Address = DS1302_MINUTE|DS1302_READ; 
+	Time->Minute = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
+
+	Address = DS1302_HOUR|DS1302_READ; 
+	Time->Hour = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
+
+	Address = DS1302_WEEK|DS1302_READ; 
+	Time->Week = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
+
+	Address = DS1302_DAY|DS1302_READ; 
+	Time->Day = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
+
+	Address = DS1302_MONTH|DS1302_READ; 
+	Time->Month = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
+
+	Address = DS1302_YEAR|DS1302_READ; 
+	Time->Year = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
+#else
+	Time->Second = Read1302(DS1302_SECOND|DS1302_READ); 					//不转换成10进制的秒
+	Time->Minute = Read1302(DS1302_MINUTE|DS1302_READ);
+	Time->Hour = Read1302(DS1302_HOUR|DS1302_READ);
+	Time->Week = Read1302(DS1302_WEEK|DS1302_READ);
+	Time->Day = Read1302(DS1302_DAY|DS1302_READ);
+	Time->Month = Read1302(DS1302_MONTH|DS1302_READ);
+	Time->Year = Read1302(DS1302_YEAR|DS1302_READ);
+#endif
+}
+/*
+void DS1302_PutTime(SYSTEMTIME *Time)
+{
+	unsigned char Address;
+	Write1302(0x8e,0x00);//允许写操作	
+
+	Address = DS1302_SECOND; 
+	Write1302(Address,Time->Second/10*16+Time->Second%10);			//转换成16进制的秒
+
+	Address = DS1302_MINUTE; 
+ 	Write1302(Address,Time->Minute/10*16+Time->Minute%10);
+
+	Address = DS1302_HOUR; 
+ 	Write1302(Address,Time->Hour/10*16+Time->Hour%10);
+
+	Address = DS1302_WEEK; 
+ 	Write1302(Address,Time->Week/10*16+Time->Week%10);
+
+	Address = DS1302_DAY; 
+ 	Write1302(Address,Time->Day/10*16+Time->Day%10);
+
+	Address = DS1302_MONTH; 
+ 	Write1302(Address,Time->Month/10*16+Time->Month%10);
+
+	Address = DS1302_YEAR; 
+ 	Write1302(Address,Time->Year/10*16+Time->Year%10);
+
+  	Write1302(0x8e,0x80);//写保护,禁止写操作  
+}
+void DateToStr(SYSTEMTIME *Time)
+{
+	Time->DateString[0] = Time->Year/10 + '0'; //数字类型转化为字符类型
+	Time->DateString[1] = Time->Year%10 + '0';
+	Time->DateString[2] = '-';
+	Time->DateString[3] = Time->Month/10 + '0';
+	Time->DateString[4] = Time->Month%10 + '0';
+	Time->DateString[5] = '-';
+	Time->DateString[6] = Time->Day/10 + '0';
+	Time->DateString[7] = Time->Day%10 + '0';
+	Time->DateString[8] = '\0';
+}
+
+void TimeToStr(SYSTEMTIME *Time)
+{
+	Time->TimeString[0] = Time->Hour/10 + '0'; //数字类型转化为字符类型
+	Time->TimeString[1] = Time->Hour%10 + '0';
+	Time->TimeString[2] = ':';
+	Time->TimeString[3] = Time->Minute/10 + '0';
+	Time->TimeString[4] = Time->Minute%10 + '0';
+	Time->TimeString[5] = ':';
+	Time->TimeString[6] = Time->Second/10 + '0';
+	Time->TimeString[7] = Time->Second%10 + '0';
+	Time->DateString[8] = '\0';
+}
+*/
+
+#endif
+

+ 803 - 0
自制电子钟_增加闹钟zz/DS1302.c

@@ -0,0 +1,803 @@
+#include <REG51.H>
+#include <intrins.h>
+//#include "LCD1602.h"
+//#include "DS1302.h"
+#define uint unsigned int
+#define uchar unsigned char
+sbit  DS1302_CLK = P1^7;              //实时时钟时钟线引脚 
+sbit  DS1302_IO  = P1^6;              //实时时钟数据线引脚 
+sbit  DS1302_RST = P1^5;              //实时时钟复位线引脚
+sbit  wireless_1 = P3^0;
+sbit  wireless_2 = P3^1;
+sbit  wireless_3 = P3^2;
+sbit  wireless_4 = P3^3;
+sbit  ACC0 = ACC^0;
+sbit  ACC7 = ACC^7;
+char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
+sbit Set = P2^0;       //模式切换键
+sbit Up = P2^1;        //加法按钮
+sbit Down = P2^2;      //减法按钮
+sbit out = P2^3;       //立刻跳出调整模式按钮
+sbit DQ = P1^0;        //温度传送数据IO口
+char done,count,temp,flag,up_flag,down_flag;
+uchar temp_value;      //温度值
+uchar TempBuffer[5],week_value[2];
+
+
+void show_time();   //液晶显示程序
+/***********1602液晶显示部分子程序****************/
+
+
+//Port Definitions**********************************************************
+sbit LcdRs		= P2^5;
+sbit LcdRw		= P2^6;
+sbit LcdEn  	= P2^7;
+sfr  DBPort 	= 0x80;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
+
+//内部等待函数**************************************************************************
+unsigned char LCD_Wait(void)
+{
+	LcdRs=0;
+	LcdRw=1;	_nop_();
+	LcdEn=1;	_nop_();
+						 
+	LcdEn=0;
+	return DBPort;		
+}
+//向LCD写入命令或数据************************************************************
+#define LCD_COMMAND			0      // Command
+#define LCD_DATA			1      // Data
+#define LCD_CLEAR_SCREEN	0x01      // 清屏
+#define LCD_HOMING  		0x02      // 光标返回原点
+void LCD_Write(bit style, unsigned char input)
+{
+	LcdEn=0;
+	LcdRs=style;
+	LcdRw=0;		_nop_();
+	DBPort=input;	_nop_();//注意顺序
+	LcdEn=1;		_nop_();//注意顺序
+	LcdEn=0;		_nop_();
+	LCD_Wait();	
+}
+
+//设置显示模式************************************************************
+#define LCD_SHOW			0x04    //显示开
+#define LCD_HIDE			0x00    //显示关	  
+
+#define LCD_CURSOR			0x02 	//显示光标
+#define LCD_NO_CURSOR		0x00    //无光标		     
+
+#define LCD_FLASH			0x01    //光标闪动
+#define LCD_NO_FLASH		0x00    //光标不闪动
+
+void LCD_SetDisplay(unsigned char DisplayMode)
+{
+	LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
+}
+
+//设置输入模式************************************************************
+#define LCD_AC_UP			0x02
+#define LCD_AC_DOWN			0x00      // default
+
+#define LCD_MOVE			0x01      // 画面可平移
+#define LCD_NO_MOVE			0x00      //default
+
+void LCD_SetInput(unsigned char InputMode)
+{
+	LCD_Write(LCD_COMMAND, 0x04|InputMode);
+}
+
+//初始化LCD************************************************************
+void LCD_Initial()
+{
+	LcdEn=0;
+	LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
+	LCD_Write(LCD_COMMAND,0x38);
+	LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
+	LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
+	LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
+}
+
+//液晶字符输入的位置************************
+void GotoXY(unsigned char x, unsigned char y)
+{
+	if(y==0)
+		LCD_Write(LCD_COMMAND,0x80|x);
+	if(y==1)
+		LCD_Write(LCD_COMMAND,0x80|(x-0x40));
+}
+
+//将字符输出到液晶显示
+void Print(unsigned char *str)
+{
+	while(*str!='\0')
+	{
+		LCD_Write(LCD_DATA,*str);
+		str++;
+	}
+}
+
+
+
+
+
+
+/***********DS1302时钟部分子程序******************/
+typedef struct __SYSTEMTIME__
+{
+	unsigned char Second;
+	unsigned char Minute;
+	unsigned char Hour;
+	unsigned char Week;
+	unsigned char Day;
+	unsigned char Month;
+	unsigned char  Year;
+	unsigned char DateString[11];
+	unsigned char TimeString[9];
+}SYSTEMTIME;	//定义的时间类型
+SYSTEMTIME CurrentTime;
+
+
+#define AM(X)	X
+#define PM(X)	(X+12)            	  // 转成24小时制
+#define DS1302_SECOND	0x80          //时钟芯片的寄存器位置,存放时间
+#define DS1302_MINUTE	0x82
+#define DS1302_HOUR		0x84 
+#define DS1302_WEEK		0x8A
+#define DS1302_DAY		0x86
+#define DS1302_MONTH	0x88
+#define DS1302_YEAR		0x8C 
+
+void DS1302InputByte(unsigned char d) 	//实时时钟写入一字节(内部函数)
+{ 
+    unsigned char i;
+    ACC = d;
+    for(i=8; i>0; i--)
+    {
+        DS1302_IO = ACC0;           	//相当于汇编中的 RRC
+        DS1302_CLK = 1;
+        DS1302_CLK = 0;
+        ACC = ACC >> 1; 
+    } 
+}
+
+unsigned char DS1302OutputByte(void) 	//实时时钟读取一字节(内部函数)
+{ 
+    unsigned char i;
+    for(i=8; i>0; i--)
+    {
+        ACC = ACC >>1;         			//相当于汇编中的 RRC 
+        ACC7 = DS1302_IO;
+        DS1302_CLK = 1;
+        DS1302_CLK = 0;
+    } 
+    return(ACC); 
+}
+
+void Write1302(unsigned char ucAddr, unsigned char ucDa)	//ucAddr: DS1302地址, ucData: 要写的数据
+{
+    DS1302_RST = 0;
+    DS1302_CLK = 0;
+    DS1302_RST = 1;
+    DS1302InputByte(ucAddr);       	// 地址,命令 
+    DS1302InputByte(ucDa);       	// 写1Byte数据
+    DS1302_CLK = 1;
+    DS1302_RST = 0;
+} 
+
+unsigned char Read1302(unsigned char ucAddr)	//读取DS1302某地址的数据
+{
+    unsigned char ucData;
+    DS1302_RST = 0;
+    DS1302_CLK = 0;
+    DS1302_RST = 1;
+    DS1302InputByte(ucAddr|0x01);        // 地址,命令 
+    ucData = DS1302OutputByte();         // 读1Byte数据
+    DS1302_CLK = 1;
+    DS1302_RST = 0;
+    return(ucData);
+}
+
+
+
+void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
+{
+	unsigned char ReadValue;
+	ReadValue = Read1302(DS1302_SECOND);
+	Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
+	ReadValue = Read1302(DS1302_MINUTE);
+	Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
+	ReadValue = Read1302(DS1302_HOUR);
+	Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
+	ReadValue = Read1302(DS1302_DAY);
+	Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
+	ReadValue = Read1302(DS1302_WEEK);
+	Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
+	ReadValue = Read1302(DS1302_MONTH);
+	Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
+	ReadValue = Read1302(DS1302_YEAR);
+	Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);	
+}
+
+void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
+{   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
+    {                               
+	  Time->DateString[0] = '2';
+	  Time->DateString[1] = '0';	 
+	  Time->DateString[2] = Time->Year/10 + '0';
+	  Time->DateString[3] = Time->Year%10 + '0';
+	}
+	  else
+	    { 
+	      Time->DateString[0] = ' ';
+	      Time->DateString[1] = ' ';		 
+	      Time->DateString[2] = ' ';
+	      Time->DateString[3] = ' ';
+		}
+	Time->DateString[4] = '/';
+	if(hide_month<2)
+	{
+	  Time->DateString[5] = Time->Month/10 + '0';
+	  Time->DateString[6] = Time->Month%10 + '0';
+	}
+	  else
+	  {
+	    Time->DateString[5] = ' ';
+	    Time->DateString[6] = ' ';
+	  }
+	Time->DateString[7] = '/';
+	if(hide_day<2)
+	{
+	  Time->DateString[8] = Time->Day/10 + '0';
+	  Time->DateString[9] = Time->Day%10 + '0';
+	}
+	  else
+	  {
+	    Time->DateString[8] = ' ';
+	    Time->DateString[9] = ' ';	    
+	  }
+	if(hide_week<2)
+	{
+	  week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
+	}
+	  else
+	  {
+	    week_value[0] = ' ';
+	  }
+	  week_value[1] = '\0';
+
+	Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
+}
+
+void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
+{   if(hide_hour<2)
+    {
+	  Time->TimeString[0] = Time->Hour/10 + '0';
+	  Time->TimeString[1] = Time->Hour%10 + '0';
+	}
+	  else
+	    {
+	      Time->TimeString[0] = ' ';
+	      Time->TimeString[1] = ' ';
+		}
+	Time->TimeString[2] = ':';
+    if(hide_min<2)
+	{
+	  Time->TimeString[3] = Time->Minute/10 + '0';
+	  Time->TimeString[4] = Time->Minute%10 + '0';
+	}
+	  else
+	    {
+	      Time->TimeString[3] = ' ';
+	      Time->TimeString[4] = ' ';
+   	    }
+	Time->TimeString[5] = ':';
+    if(hide_sec<2)
+    {
+	  Time->TimeString[6] = Time->Second/10 + '0';
+	  Time->TimeString[7] = Time->Second%10 + '0';
+    }
+      else
+       {
+         Time->TimeString[6] = ' ';
+	     Time->TimeString[7] = ' ';
+       }
+	Time->DateString[8] = '\0';
+}
+
+
+void Initial_DS1302(void)   //时钟芯片初始化
+{   
+	unsigned char Second=Read1302(DS1302_SECOND);
+	if(Second&0x80)	      //判断时钟芯片是否关闭	  
+    {
+	Write1302(0x8e,0x00); //写入允许
+	Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
+	Write1302(0x88,0x07);
+	Write1302(0x86,0x25);
+	Write1302(0x8a,0x07);
+	Write1302(0x84,0x23);
+	Write1302(0x82,0x59);
+	Write1302(0x80,0x55);
+	Write1302(0x8e,0x80); //禁止写入
+	}
+
+}
+
+/***********ds18b20子程序*************************/
+
+/***********ds18b20延迟子函数(晶振12MHz )*******/ 
+
+void delay_18B20(unsigned int i)
+{
+	while(i--);
+}
+
+/**********ds18b20初始化函数**********************/
+
+void Init_DS18B20(void) 
+{
+	 unsigned char x=0;
+	 DQ = 1;          //DQ复位
+	 delay_18B20(8);  //稍做延时
+	 DQ = 0;          //单片机将DQ拉低
+	 delay_18B20(80); //精确延时 大于 480us
+	 DQ = 1;          //拉高总线
+	 delay_18B20(14);
+	 x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
+	 delay_18B20(20);
+}
+
+/***********ds18b20读一个字节**************/  
+
+unsigned char ReadOneChar(void)
+{
+	uchar i=0;
+	uchar dat = 0;
+	for (i=8;i>0;i--)
+	 {
+		  DQ = 0; // 给脉冲信号
+		  dat>>=1;
+		  DQ = 1; // 给脉冲信号
+		  if(DQ)
+		  dat|=0x80;
+		  delay_18B20(4);
+	 }
+ 	return(dat);
+}
+
+/*************ds18b20写一个字节****************/  
+
+void WriteOneChar(uchar dat)
+{
+ 	unsigned char i=0;
+ 	for (i=8; i>0; i--)
+ 	{
+  		DQ = 0;
+ 		DQ = dat&0x01;
+    	delay_18B20(5);
+ 		DQ = 1;
+    	dat>>=1;
+ }
+}
+
+/**************读取ds18b20当前温度************/
+
+void ReadTemp(void)
+{
+	unsigned char a=0;
+	unsigned char b=0;
+	unsigned char t=0;
+
+	Init_DS18B20();
+	WriteOneChar(0xCC);    	// 跳过读序号列号的操作
+	WriteOneChar(0x44); 	// 启动温度转换
+
+	delay_18B20(100);       // this message is wery important
+
+	Init_DS18B20();
+	WriteOneChar(0xCC); 	//跳过读序号列号的操作
+	WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度
+
+	delay_18B20(100);
+
+	a=ReadOneChar();    	//读取温度值低位
+	b=ReadOneChar();   		//读取温度值高位
+	temp_value=b<<4;
+	temp_value+=(a&0xf0)>>4;               
+}
+void temp_to_str()   //温度数据转换成液晶字符显示
+{
+  TempBuffer[0]=temp_value/10+'0';  //十位
+  TempBuffer[1]=temp_value%10+'0';  //个位
+  TempBuffer[2]=0xdf;   //温度符号
+  TempBuffer[3]='C';
+  TempBuffer[4]='\0';
+}
+void Delay1ms(unsigned int count)
+{
+	unsigned int i,j;
+	for(i=0;i<count;i++)
+	for(j=0;j<120;j++);
+}
+
+/*延时子程序*/
+void mdelay(uint delay)
+{	uint i;
+ 	for(;delay>0;delay--)
+   		{for(i=0;i<62;i++) //1ms延时.
+       		{;}
+   		}
+}
+
+
+void outkey()                    //跳出调整模式,返回默认显示
+{ uchar Second;
+  if(out==0||wireless_1==1)         
+  { mdelay(8); 
+	count=0;
+	hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
+	Second=Read1302(DS1302_SECOND);
+    Write1302(0x8e,0x00); //写入允许
+	Write1302(0x80,Second&0x7f);
+	Write1302(0x8E,0x80);          //禁止写入
+	done=0;           
+	while(out==0);
+	while(wireless_1==1);
+  }
+}
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void Upkey()//升序按键
+{	   
+		Up=1;
+		if(Up==0||wireless_2==1)
+		          {
+				   mdelay(8);
+				       switch(count)
+				          {case 1:
+                                  temp=Read1302(DS1302_SECOND);  //读取秒数
+								  temp=temp+1;  //秒数加1
+                                  up_flag=1;    //数据调整后更新标志
+								  if((temp&0x7f)>0x59)   //超过59秒,清零
+                                  temp=0;								  
+								  break;
+				           case 2:
+                                  temp=Read1302(DS1302_MINUTE);  //读取分数
+								  temp=temp+1;  //分数加1
+                                  up_flag=1;
+								  if(temp>0x59)          //超过59分,清零
+								  temp=0;
+								  break;
+				           case 3:
+                                  temp=Read1302(DS1302_HOUR);  //读取小时数
+								  temp=temp+1;  //小时数加1
+                                  up_flag=1;
+								  if(temp>0x23)   //超过23小时,清零
+								  temp=0;
+								  break;
+				           case 4:
+                                  temp=Read1302(DS1302_WEEK);  //读取星期数
+								  temp=temp+1;  //星期数加1
+                                  up_flag=1;
+								  if(temp>0x7)  
+								  temp=1;
+								  break;
+				           case 5:
+                                  temp=Read1302(DS1302_DAY);  //读取日数
+								  temp=temp+1;  //日数加1
+                                  up_flag=1;
+								  if(temp>0x31)
+								  temp=1;
+								  break;
+				           case 6:
+                                  temp=Read1302(DS1302_MONTH);  //读取月数
+								  temp=temp+1;  //月数加1
+                                  up_flag=1;
+								  if(temp>0x12)
+								  temp=1;
+								  break;
+				           case 7:
+                                  temp=Read1302(DS1302_YEAR);  //读取年数
+								  temp=temp+1;  //年数加1
+                                  up_flag=1;
+								  if(temp>0x85)
+								  temp=0;
+								  break;
+					       default:break;
+				          }
+					  
+				   while(Up==0);
+	               while(wireless_2==1);
+				  }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void Downkey()//降序按键
+{	    
+		Down=1;
+	    if(Down==0||wireless_3==1)
+		          {
+				   mdelay(8);
+				     switch(count)
+				          {case 1:
+                                  temp=Read1302(DS1302_SECOND);  //读取秒数
+								  temp=temp-1;						    //秒数减1
+                                  down_flag=1;       //数据调整后更新标志
+								  if(temp==0x7f)     //小于0秒,返回59秒
+								  temp=0x59;
+								  break;
+				           case 2:
+                                  temp=Read1302(DS1302_MINUTE);  //读取分数
+								  temp=temp-1;  //分数减1
+                                  down_flag=1;
+								  if(temp==-1)
+								  temp=0x59;      //小于0秒,返回59秒
+								  break;
+				           case 3:
+                                  temp=Read1302(DS1302_HOUR);  //读取小时数
+								  temp=temp-1;  //小时数减1
+                                  down_flag=1;
+								  if(temp==-1)
+								  temp=0x23;
+								  break;
+				           case 4:
+                                  temp=Read1302(DS1302_WEEK);  //读取星期数
+								  temp=temp-1;  //星期数减1
+                                  down_flag=1;
+								  if(temp==0)
+								  temp=0x7;;
+								  break;
+				           case 5:
+                                  temp=Read1302(DS1302_DAY);  //读取日数
+								  temp=temp-1;  //日数减1
+                                  down_flag=1;
+								  if(temp==0)
+								  temp=31;
+								  break;
+				           case 6:
+                                  temp=Read1302(DS1302_MONTH);  //读取月数
+								  temp=temp-1;  //月数减1
+                                  down_flag=1;
+								  if(temp==0)
+								  temp=12;
+								  break;
+				           case 7:
+                                  temp=Read1302(DS1302_YEAR);  //读取年数
+								  temp=temp-1;  //年数减1
+                                  down_flag=1;
+								  if(temp==-1)
+								  temp=0x85;
+								  break;
+					      default:break;
+				         }
+					 
+				   while(Down==0);
+				   while(wireless_3==1);
+				  }
+}
+
+void Setkey()//模式选择按键
+{
+		Set=1;
+		if(Set==0||wireless_4==1)
+	    {
+           mdelay(8);
+           count=count+1;	 //Setkey按一次,count就加1
+		   done=1;			 //进入调整模式
+           while(Set==0);
+           while(wireless_4==1);
+		 }
+
+}
+
+void keydone()//按键功能执行
+{        uchar Second;
+		 if(flag==0)    //关闭时钟,停止计时
+         { Write1302(0x8e,0x00); //写入允许
+           temp=Read1302(0x80);
+           Write1302(0x80,temp|0x80);
+	       Write1302(0x8e,0x80); //禁止写入
+           flag=1;
+         }
+         Setkey();				            //扫描模式切换按键
+		 switch(count)
+		 {case 1:do					        //count=1,调整秒
+		          {
+                   outkey();			   //扫描跳出按钮
+				   Upkey();                //扫描加按钮
+				   Downkey();              //扫描减按钮
+				   if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x80,temp|0x80); //写入新的秒数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+
+				   hide_sec++;          //位闪计数
+				   if(hide_sec>3)
+				     hide_sec=0;
+                   show_time();         //液晶显示数据
+				  }while(count==2);break;  
+		  case 2:do					        //count=2,调整分
+		          {
+				   hide_sec=0;
+				   outkey();
+				   Upkey();
+				   Downkey();
+				   if(temp>0x60)
+				     temp=0;
+				   if(up_flag==1||down_flag==1)
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x82,temp); //写入新的分数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+				   hide_min++;
+				   if(hide_min>3)
+				     hide_min=0;
+                   show_time();
+				  }while(count==3);break;
+		  case 3:do					        //count=3,调整小时
+		          {
+                   hide_min=0; 
+				   outkey();
+				   Upkey();
+				   Downkey();
+				   if(up_flag==1||down_flag==1)
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x84,temp); //写入新的小时数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+				   hide_hour++;
+				   if(hide_hour>3)
+				     hide_hour=0;
+                   show_time();
+				  }while(count==4);break;
+		  case 4:do					        //count=4,调整星期
+		          {
+                   hide_hour=0; 
+				   outkey();
+				   Upkey();
+				   Downkey();
+				   if(up_flag==1||down_flag==1)
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x8a,temp); //写入新的星期数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+				   hide_week++;
+				   if(hide_week>3)
+				     hide_week=0;
+                   show_time();
+				  }while(count==5);break;
+		  case 5:do					        //count=5,调整日
+		          {
+				   hide_week=0; 
+				   outkey();
+				   Upkey();
+				   Downkey();
+				   if(up_flag==1||down_flag==1)
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x86,temp); //写入新的日数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+				   hide_day++;
+				   if(hide_day>3)
+				     hide_day=0;
+                   show_time();
+				  }while(count==6);break;
+		  case 6:do					        //count=6,调整月
+		          {
+                   hide_day=0; 
+				   outkey();
+				   Upkey();
+				   Downkey();
+				   if(up_flag==1||down_flag==1)
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x88,temp); //写入新的月数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+				   hide_month++;
+				   if(hide_month>3)
+				     hide_month=0;
+                   show_time();
+				  }while(count==7);break;
+		  case 7:do					        //count=7,调整年
+		          {
+                   hide_month=0; 
+				   outkey();
+				   Upkey();
+				   Downkey();
+				   if(up_flag==1||down_flag==1)
+				   {
+				   Write1302(0x8e,0x00); //写入允许
+				   Write1302(0x8c,temp); //写入新的年数
+				   Write1302(0x8e,0x80); //禁止写入
+				   up_flag=0;
+				   down_flag=0;
+				   }
+				   hide_year++;
+				   if(hide_year>3)
+				     hide_year=0;
+                   show_time();
+				  }while(count==8);break;
+		  case 8: count=0;hide_year=0;  //count8, 跳出调整模式,返回默认显示状态
+	              Second=Read1302(DS1302_SECOND);
+                  Write1302(0x8e,0x00); //写入允许
+	              Write1302(0x80,Second&0x7f);
+	              Write1302(0x8E,0x80);          //禁止写入
+				  done=0;
+		  break; //count=7,开启中断,标志位置0并退出
+		  default:break;
+
+		 }
+
+}
+
+
+void show_time()   //液晶显示程序
+{
+  DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
+  TimeToStr(&CurrentTime);       //时间数据转换液晶字符
+  DateToStr(&CurrentTime);       //日期数据转换液晶字符
+  ReadTemp();                    //开启温度采集程序
+  temp_to_str();                 //温度数据转换成液晶字符
+  GotoXY(12,1);                  //液晶字符显示位置
+  Print(TempBuffer);             //显示温度
+  GotoXY(0,1);
+  Print(CurrentTime.TimeString); //显示时间
+  GotoXY(0,0);
+  Print(CurrentTime.DateString); //显示日期
+  GotoXY(15,0);
+  Print(week_value);             //显示星期
+  GotoXY(11,0);
+  Print("Week");	//在液晶上显示 字母 week
+  Delay1ms(400);                 //扫描延时
+}
+
+
+
+main()
+{
+    flag=1;           //时钟停止标志
+	LCD_Initial();    //液晶初始化
+	Init_DS18B20( ) ;      //DS18B20初始化
+	Initial_DS1302(); //时钟芯片初始化
+	up_flag=0;
+	down_flag=0;
+	done=0;           //进入默认液晶显示
+	wireless_1=0;
+	wireless_2=0;
+	wireless_3=0;
+	wireless_4=0;
+	while(1)
+	{   
+        while(done==1)
+          keydone();    //进入调整模式
+		while(done==0)
+ 	    {  
+            show_time();                //液晶显示数据
+            flag=0;                  
+  		    Setkey();				 //扫描各功能键
+ 		}
+	}
+}
+
+
+
+

+ 191 - 0
自制电子钟_增加闹钟zz/DS1302.hex

@@ -0,0 +1,191 @@
+:050A01005765656B0064
+:0D09D400C2A5D2A600D2A700C2A7AF802204
+:10097700C2A7A20092A5C2A60085088000D2A70040
+:06098700C2A7000209D422
+:0A09ED00C200EF4408F50802097784
+:0A09F700C200EF4404F5080209777E
+:10084700C2A7C200750838120977C20075083812A6
+:1008570009777F041209EDC2007508011209777F35
+:04086700020209F789
+:1008F200AE07ED700AC200EE4480F508120977BD1A
+:0F090200010CC200EE24C04480F50812097722D0
+:1009490012066DFF6010D200F508120977740129AB
+:07095900F9E43AFA80EA22FA
+:0F09B400EF7F08A2E09296D297C297C313DFF4A9
+:0109C3002211
+:0F09C4007F08C313A29692E7D297C297DFF4FF82
+:0109D3002201
+:1007F000F5287F8012098DAC07E4FD7F8E12080D6D
+:0D080000EC547FFD7F8012080D7D807F8EFF
+:10080D00AE05C295C297D2951209B4AF061209B4BE
+:05081D00D297C29522F4
+:10098D00C295C297D295EF4401FF1209B41209C462
+:04099D00D297C29596
+:0109A1002233
+:1005BA007F8012098DEF5470C4540F75F00AA4FE9F
+:1005CA00EF540F2E1206B37F8212098DEF5470C4B6
+:1005DA00540F75F00AA4FEEF540F2E900001120674
+:1005EA00C57F8412098DEF5470C4540F75F00AA4A4
+:1005FA00FEEF540F2E9000021206C57F8612098D57
+:10060A00EF5470C4540F75F00AA4FEEF540F2E90E5
+:10061A0000041206C57F8A12098DEF5470C4540F64
+:10062A0075F00AA4FEEF540F2E9000031206C57F40
+:10063A008812098DEF5470C4540F75F00AA4FEEFA6
+:10064A00540F2E9000051206C57F8C12098DEF54A7
+:10065A0070C4540F75F00AA4FEEF540F2E900006D2
+:03066A000206C5C0
+:10020900C3E5286480948290000750327432120644
+:10021900C590000874301206C5900006120686754E
+:10022900F00A8424309000091206C59000061206CF
+:100239008675F00A84E5F0243090000A801A74204B
+:100249001206C590000874201206C5900009742092
+:100259001206C590000A74201206C590000B742F6F
+:100269001206C5C3E52264809482502590000512C8
+:10027900068675F00A84243090000C1206C5900099
+:100289000512068675F00A84E5F0243090000D8089
+:100299000D90000C74201206C590000D74201206F2
+:1002A900C590000E742F1206C5C3E52D6480948293
+:1002B900502590000412068675F00A8424309000B7
+:1002C9000F1206C590000412068675F00A84E5F03F
+:1002D9002430900010800D90000F74201206C590F4
+:1002E900001074201206C5C3E5246480948250125C
+:1002F90090000312068675F00A84E5F02430F5268D
+:0E0309008003752620E4F5279000110206C53A
+:1004F000C3E52E6480948250259000021206867512
+:10050000F00A8424309000121206C59000021206F0
+:100510008675F00A84E5F02430900013800D900079
+:100520001274201206C590001374201206C59000A4
+:1005300014743A1206C5C3E52F6480948250259046
+:10054000000112068675F00A842430900015120608
+:10055000C590000112068675F00A84E5F0243090FB
+:100560000016800D90001574201206C590001674B8
+:10057000201206C5900017743A1206C5C3E52C6414
+:10058000809482501E12066DFF75F00A842430900C
+:1005900000181206C5EF75F00A84E5F024309000CB
+:1005A00019800D90001874201206C590001974204F
+:0A05B0001206C590000FE40206C514
+:100746007F8012098DEF30E734E4FD7F8E12080DAD
+:100756007D077F8C12080D7F8812080D7D257F8608
+:1007660012080D7D077F8A12080D7D237F841208EB
+:0D0776000D7D597F8212080D7D551208047B
+:010783002253
+:0709A20012092F7F647E00A3
+:0B09A900EF1FAC0670011E4C70F62220
+:10086B00E4D2907F08FE1209A9C2907F507E00123D
+:10087B0009A9D2907F0E7E001209A9A2907F147E47
+:04088B00000209A9B5
+:10091100E4FB7D08C290EBC313FBD29030900343FC
+:0D09210003807F047E001209A9DDE9AF0309
+:01092E0022A6
+:02092F00AD0712
+:100931007B08C290ED1392907F057E001209A9D227
+:0709410090EDC313FDDBEB99
+:01094800228C
+:10078400E4FAFFF50812086B7FCC12092F7F44129C
+:1007940009A212086B7FCC12092F7FBE1209A21284
+:1007A4000911AA07120911EFC454F0F52BEA54F009
+:0707B400C4540F252BF52BA7
+:0107BB00221B
+:1008B200E52B75F00A842430F531E52B75F00A84B6
+:1008C200E5F02430F5327533DF753443E4F5352233
+:1008D200E4FDFCC3ED9FEC9E5015E4FBFA0BBB005C
+:0F08E200010AEB64784A70F50DBD00010C80E44B
+:0108F10022E4
+:04088F007F087E0060
+:10089300D3EF9400EE94004015E4FDFC0DBD000180
+:0E08A3000CED643E4C70F5EF1F70E51E80E218
+:0108B1002224
+:1008220030A30330B01E12088FE4F525F52CF52F06
+:10083200F52EF52DF524F5221207F0E4F52330A369
+:04084200FD20B0FDE8
+:01084600228F
+:10031700D2A130A10620B10302041012088FE525EF
+:1003270014B40700400302040A90033E75F003A4C7
+:10033700C58325F0C5837302035302037002038A42
+:100347000203A10203B80203CF0203E97F80120967
+:100357008D8F2A052A753001E52A547FD36480944E
+:10036700D9500302040A0204077F8212098D8F2ADB
+:10037700052A753001D3E52A648094D95003020415
+:100387000A807D7F8412098D8F2A052A753001D353
+:10039700E52A648094A3406B80667F8A12098D8F5B
+:1003A7002A052A753001D3E52A6480948740548052
+:1003B7002C7F8612098D8F2A052A753001D3E52AED
+:1003C700648094B1403D80157F8812098D8F2A057E
+:1003D7002A753001D3E52A648094924026752A0154
+:1003E70080217F8C12098D8F2A052A753001AF2A4B
+:1003F700EF3395E0FED3EF9485EE6480948040035D
+:0A040700E4F52A30A1FD20B1FD222A
+:060411001208221203177D
+:10041700D2A230A20620B2030204EF12088FE5250C
+:1004270014B4070040030204E990043E75F003A4E6
+:10043700C58325F0C5837302045302046A0204804E
+:100447000204960204AB0204C00204D57F8012099D
+:100457008D8F2A152A752901E52A647F6003020416
+:10046700E980117F8212098D8F2A152A752901E5E6
+:100477002AF4706E752A5980697F8412098D8F2A34
+:10048700152A752901E52AF47058752A2380537FA8
+:100497008A12098D8F2A152A752901E52A70437555
+:1004A7002A07803E7F8612098D8F2A152A75290112
+:1004B700E52A702E752A1F80297F8812098D8F2AB9
+:1004C700152A752901E52A7019752A0C80147F8C65
+:1004D70012098D8F2A152A752901E52AB4FF03759C
+:0904E7002A8530A2FD20B2FD229D
+:10096000D2A030A00330B30E12088F0525752301E5
+:0709700030A0FD20B3FD22C1
+:10000300E5217017FD7F8E12080D7F8012098D8FF9
+:100013002AE52A4480120803752101120960E525A7
+:1000230014B40800400302020890003A75F003A4D8
+:10003300C58325F0C5837302005202008B0200D3EF
+:1000430002010F02014B0201870201C30201FF12E9
+:100053000411E53064016005E529B40113E4FD7F73
+:100063008E12080DE52A4480120803E4F530F529C1
+:10007300052CD3E52C648094834003E4F52C12060D
+:10008300E7E525640260C822E4F52C120411D3E5E8
+:100093002A648094E04003E4F52AE53064016005B6
+:1000A300E529B40113E4FD7F8E12080DAD2A7F828A
+:1000B300120806E4F530F529052FD3E52F64809463
+:1000C300834003E4F52F1206E7E525640360B922B4
+:1000D300E4F52F120411E53064016005E529B4014C
+:1000E30013E4FD7F8E12080DAD2A7F84120806E407
+:1000F300F530F529052ED3E52E648094834003E47F
+:10010300F52E1206E7E525640460C522E4F52E12F8
+:100113000411E53064016005E529B40113E4FD7FB2
+:100123008E12080DAD2A7F8A120806E4F530F529F0
+:100133000524D3E524648094834003E4F524120664
+:10014300E7E525640560C522E4F524120411E530D2
+:1001530064016005E529B40113E4FD7F8E12080DE7
+:10016300AD2A7F86120806E4F530F529052DD3E57F
+:100173002D648094834003E4F52D1206E7E525649E
+:100183000660C522E4F52D120411E5306401600513
+:10019300E529B40113E4FD7F8E12080DAD2A7F8893
+:1001A300120806E4F530F5290522D3E5226480948C
+:1001B300834003E4F5221206E7E525640760C522C0
+:1001C300E4F522120411E53064016005E529B40168
+:1001D30013E4FD7F8E12080DAD2A7F8C120806E40E
+:1001E300F530F5290528D3E528648094834003E49A
+:1001F300F5281206E7E525640860C522E4F5251213
+:0502030007F0E4F52303
+:0102080022D3
+:1006E7007B007A0079361205BA1204F01202091259
+:1006F70007841208B27D017F0C1208F27B007A0092
+:100707007931120949E4FF1208F27A00794812098F
+:1007170049E41DFF1208F27A00793D1209497F0F5B
+:100727001208F27A0079261209497F0B1208F27B28
+:0F073700FF7A0A79011209497F907E010208D2E8
+:1007BC0075210112084712086B120746E4F530F553
+:1007CC0029F523C2B0C2B1C2B2C2B3E523B401054C
+:1007DC0012000380F6E52370F21206E7E4F521120D
+:0407EC00096080F12F
+:030000000209E111
+:0C09E100787FE4F6D8FD7581500207BC59
+:10066D00BB010689828A83E0225002E722BBFE028B
+:09067D00E32289828A83E49322BE
+:10068600BB010CE58229F582E5833AF583E0225029
+:1006960006E92582F8E622BBFE06E92582F8E22273
+:0D06A600E58229F582E5833AF583E493228D
+:1006B300BB010689828A83F0225002F722BBFE0126
+:0206C300F32220
+:1006C500F8BB010DE58229F582E5833AF583E8F06B
+:1006D500225006E92582C8F622BBFE05E92582C817
+:0206E500F222FF
+:00000001FF

+ 85 - 0
自制电子钟_增加闹钟zz/Digitron.H

@@ -0,0 +1,85 @@
+#ifndef __DIGITRON_H__
+#define __DIGITRON_H__
+
+sbit led0=P2^7;				//LED位选,因为布线不是按顺序布的,程序定义一下就可以了,下同
+sbit led1=P2^6;
+sbit led2=P2^5;
+sbit led3=P2^4;
+
+sbit COL=P1^3;
+
+#define DataLED P0						//定义LED数据口
+
+unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
+
+void delay(unsigned char k)				//延时函数
+{
+	unsigned char i,j;
+	for(i=0;i<k;i++)
+		for(j=0;j<50;j++);
+}
+#if 1
+extern void DisDIG_quiet(unsigned char post, unsigned char num)			//忽略P0^7		
+{
+	if(num < 10)
+	{
+		P0_0 = tab[num]&(1<<0)?1:0;											//数据 
+		P0_1 = tab[num]&(1<<1)?1:0; 
+		P0_2 = tab[num]&(1<<2)?1:0; 
+		P0_3 = tab[num]&(1<<3)?1:0; 
+		P0_4 = tab[num]&(1<<4)?1:0; 
+		P0_5 = tab[num]&(1<<5)?1:0; 
+		P0_6 = tab[num]&(1<<6)?1:0;
+
+		if(post == 0)	 		led0 = led1 = led2 = led3 = 1;	  	//全关	
+		else if(post == 1)		led0 = 0;									   //选择
+		else if(post == 2)		led1 = 0;
+		else if(post == 3)		led2 = 0;
+		else if(post == 4)		led3 = 0;
+	}
+	else if(num == 0xFF)
+	{		
+		if(post == 0)	 		led0 = led1 = led2 = led3 = 1;	  	//全开	
+		else if(post == 1)		led0 = 1;									   //选择
+		else if(post == 2)		led1 = 1;
+		else if(post == 3)		led2 = 1;
+		else if(post == 4)		led3 = 1;
+	}
+}
+extern void DisDIG_act(unsigned int num)							//动态显示四位函数	 数字
+{
+	DisDIG_quiet(1,(num/1000)%10);delay(10);DisDIG_quiet(1,0xFF);
+	DisDIG_quiet(2,(num/100)%10);delay(10);DisDIG_quiet(2,0xFF);
+	DisDIG_quiet(3,(num/10)%10);delay(10);DisDIG_quiet(3,0xFF);
+	DisDIG_quiet(4,(num/1)%10);delay(10);DisDIG_quiet(4,0xFF);
+}
+
+
+#else
+extern void DisDIG_act(unsigned int num)							//动态显示四位函数	 数字
+{
+	led0=0;DataLED = (tab[(num/1000)%10]&0x7F)|((P0_7?1:0)<<7);delay(10);led0=1;
+	led1=0;DataLED = (tab[(num/100)%10]&0x7F)|((P0_7?1:0)<<7);delay(10);led1=1;
+	led2=0;DataLED = (tab[(num/10)%10]&0x7F)|((P0_7?1:0)<<7);delay(10);led2=1;
+	led3=0;DataLED = (tab[(num/1)%10]&0x7F)|((P0_7?1:0)<<7);delay(10);led3=1;
+}
+extern void DisDIG_quiet(unsigned char post, unsigned char num)				//静态显示一位函数 0显示  1关闭	;	数字
+{
+	if(post == 0)	 		led0 = led1 = led2 = led3 =	0;
+	else if(post == 1)		led0 = 0;
+	else if(post == 2)		led1 = 0;
+	else if(post == 3)		led2 = 0;
+	else if(post == 4)		led3 = 0;
+	DataLED = (tab[num%10]&0x7F)|((P0_7?1:0)<<7);
+	delay(10);
+}
+extern void ClearDIG(void)							//显示函数
+{
+	led0=0;DataLED=0x7f|((P0_7?1:0)<<7);delay(10);led0=1;
+
+}
+
+#endif
+#endif
+
+

+ 760 - 0
自制电子钟_增加闹钟zz/LED时钟.LST

@@ -0,0 +1,760 @@
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 1   
+
+
+C51 COMPILER V8.02, COMPILATION OF MODULE LED时钟
+OBJECT MODULE PLACED IN LED时钟.OBJ
+COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE LED时钟.c BROWSE DEBUG OBJECTEXTEND
+
+line level    source
+
+   1          #include <REGx51.H>
+   2          #include "ds1302.h"                     //包含DS1302头文件 
+   3          #include "music_two_tiger.h"
+   4          //#include "AT25F4096.h"
+   5          sfr   P0M1   = 0X93;
+   6          sfr   P0M0   = 0X94;
+   7          sfr   P1M1   = 0X91;
+   8          sfr   P1M0   = 0X92;
+   9          sfr   P2M1   = 0X95;
+  10          sfr   P2M0   = 0X96;
+  11          #define leddata P0                      //定义LED数据口
+  12          
+  13          sbit SET=P2^0;                          //按键定义,下同
+  14          sbit UP=P2^1;
+  15          sbit DOWN=P2^2;
+  16          sbit MODE=P2^3; 
+  17          
+  18          sbit led0=P2^7;                         //LED位选,因为布线不是按顺序布的,程序定义一下就可以了,下同
+  19          sbit led1=P2^6;
+  20          sbit led2=P2^5;
+  21          sbit led3=P2^4;
+  22          
+  23          sbit SYSLED=P1^4;
+  24          sbit COL=P1^3;
+  25          
+  26          volatile SYSTEMTIME  SysTime;
+  27          unsigned char s_state = HOU_MIN;
+  28          //sbit led4=P2^6;
+  29          //sbit led5=P2^5;
+  30          //**************函数声明*****************
+  31          void delays(unsigned char);
+  32          void display(void);
+  33          void Scan_Key(void);
+  34          void id_case1_key();
+  35          void id_case2_key();
+  36          void Set_id(unsigned char ,unsigned char);
+  37          //*************变量定义******************
+  38          bit If_start_run_ringtime=0;
+  39          
+  40          char per_run_time = _PER_RUN_TIME;                                                      //每首曲子运行2次
+  41          char ring_space_1min = _RING_SPACE_1MIN;                                        //每遍间隔1分钟
+  42          char ring_run_time = _RING_RUN_TIME;                                            //重复5遍
+  43          char ring_flash_countdown = _RING_FLASH_COUNTDOWN/50;           //闪烁3秒
+  44          
+  45          unsigned char Ringtime_HOU=0xFF,Ringtime_MIN=0xFF,Ringtime_HOU_tmp=0xFF,Ringtime_MIN_tmp=0xFF;
+  46          unsigned char id=0,timecount=0,re_disp=0,second_time=0;         //定义用到的变量,id为调整模式用,不为0时表示调整
+             -模式,调整哪个量由id值确定
+  47                                                                                                  //timecount用于500ms定时记数,时间到取反flag标志位,re_disp记数200次共10s,调整状态下按键无操作
+             -10s自动返回正常显示状态
+  48          bit hour,minute,second,month,days,years_1,years_2,flag,flag_1302_1s,system_1s_flag;                             //定义位变量,hour,
+             -minute,second分别为调整时闪烁标志位,flag 500ms取反一次,调整位闪烁及冒号闪烁用
+  49          unsigned char system_26s_flag;
+  50          unsigned char set_flash_flag = 0xFF;
+  51          bit If_play_music = 0;
+  52          bit If_start_flash = 0;
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 2   
+
+  53          bit If_Into_set_ringtime = 0;           //1进入,0退出
+  54          //unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};    //LED码表,根据硬件修
+             -改
+  55          unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
+  56          
+  57          unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x07,0x29,0x24};                                         //初始化1302时用到的初始化数据    年20
+             -14-1990=24
+  58          //                          秒  分钟 小时  日   月   星期  年 
+  59          /*
+  60          void t0(void) interrupt 1 using 0                       //中断处理程序,主要用于取反标志位,返回正常显示状态
+  61          {
+  62                  TH0=(65535-50000)/256; //50ms定时
+  63                  TL0=(65535-50000)%256;  
+  64                  timecount++;re_disp++;second_time++;
+  65          
+  66                  if(timecount == 9)                              //10*50ms == 500ms
+  67                          {
+  68                          flag=~flag;
+  69                                  timecount = 0;
+  70                          }
+  71                  if(second_time == 19)                           //20*50ms == 1000ms
+  72                          {
+  73                          flag_1302_1s=~flag_1302_1s;
+  74                                  second_time = 0;
+  75          
+  76                          system_26s_flag++;
+  77                                  if(system_26s_flag > 25)        system_26s_flag = 0;
+  78                          }
+  79          
+  80                  if(re_disp>200){re_disp=0;if(id)id=0;}
+  81          }*/
+  82          void delays(unsigned char k)                            //延时函数
+  83          {
+  84   1              unsigned char i,j;
+  85   1              for(i=0;i<k;i++)
+  86   1                      for(j=0;j<50;j++);
+  87   1      }
+  88          
+  89          void display()                                                  //显示函数
+  90          {
+  91   1              unsigned char year_temp;                                //获取一次
+  92   1              unsigned char secound_temp;                             //COL的显示
+  93   1              if(secound_temp != SysTime.Second)
+  94   1              {
+  95   2                      flag_1302_1s = !flag_1302_1s;
+  96   2                      secound_temp = SysTime.Second;
+  97   2              }
+  98   1              if(If_start_flash == 1)
+  99   1              {
+ 100   2                      if(set_flash_flag == 0)                                 {s_state=HOU_MIN;hour=1;minute=1;}
+ 101   2                      else if(set_flash_flag == 1)                    {s_state=SET_HOU_MIN;hour=1;minute=1;}                          //不显示
+ 102   2                      else if(set_flash_flag == 2)                    {s_state=SET_HOU_MIN;hour=1;minute=1;}
+ 103   2                      else if(set_flash_flag == 3)                    {s_state=HOU_MIN;hour=1;minute=1;}                                      //不显示                
+ 104   2              }
+ 105   1      
+ 106   1          switch(s_state)
+ 107   1              {
+ 108   2              case HOU_MIN:
+ 109   2                      if(flag&hour)                                                   //如hour为1表示调整时,flag为1时不显示
+ 110   2                              {
+ 111   3                                      led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 112   3                                      led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值决
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 3   
+
+             -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+ 113   3                              }
+ 114   2                      else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 115   2                              {
+ 116   3                                      leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+ 117   3                                      leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 118   3                              }
+ 119   2                      if(flag&minute)
+ 120   2                              {
+ 121   3                                      led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 122   3                                      led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 123   3                              }
+ 124   2                      else
+ 125   2                              {
+ 126   3                                      leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+ 127   3                                      leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 128   3                              }               
+ 129   2               //dis cos
+ 130   2                 P0_7 = COL = flag_1302_1s; delays(10);
+ 131   2      
+ 132   2              break;
+ 133   2              case MON_DAY_HOU_MIN:
+ 134   2                      if(system_26s_flag < 20)
+ 135   2                      {
+ 136   3                              if(flag&hour)                                                   //如hour为1表示调整时,flag为1时不显示
+ 137   3                                      {
+ 138   4                                              led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 139   4                                              led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值�
+             -龆ɡ聪允拘∈�悖��1时显示,4个小数点组成两对冒号,下同
+ 140   4                                      }
+ 141   3                              else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 142   3                                      {
+ 143   4                                              leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+ 144   4                                              leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 145   4                                      }
+ 146   3                              if(flag&minute)
+ 147   3                                      {
+ 148   4                                              led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 149   4                                              led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 150   4                                      }
+ 151   3                              else
+ 152   3                                      {
+ 153   4                                              leddata=leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+ 154   4                                              leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 155   4                                      }               
+ 156   3                      //dis cos
+ 157   3                              P0_7 = COL = flag_1302_1s; delays(10);
+ 158   3      
+ 159   3                       }
+ 160   2                       else
+ 161   2                       {
+ 162   3                              if(flag&month)                                                  //如min为1表示调整时,flag为1时不显示
+ 163   3                                      {
+ 164   4                                              led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 165   4                                              led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值�
+             -龆ɡ聪允拘∈�悖��1时显示,4个小数点组成两对冒号,下同
+ 166   4                                      }
+ 167   3                              else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 168   3                                      {
+ 169   4                                              leddata=(tab[SysTime.Month/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+ 170   4                                              leddata=(tab[SysTime.Month%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 171   4                                      }
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 4   
+
+ 172   3                              if(flag&days)
+ 173   3                                      {
+ 174   4                                              led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 175   4                                              led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 176   4                                      }
+ 177   3                              else
+ 178   3                                      {
+ 179   4                                              leddata=(tab[SysTime.Day/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+ 180   4                                              leddata=(tab[SysTime.Day%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 181   4                                      }
+ 182   3                              //dis cos
+ 183   3                                      P0_7 = COL = 1; delays(10);
+ 184   3      
+ 185   3                        }
+ 186   2      
+ 187   2              break;
+ 188   2              case MIN_SECOND:
+ 189   2                      if(flag&minute)                                                 //如min为1表示调整时,flag为1时不显示
+ 190   2                              {
+ 191   3                                      led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 192   3                                      led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值决
+             -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+ 193   3                              }
+ 194   2                      else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 195   2                              {
+ 196   3                                      leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+ 197   3                                      leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 198   3                              }
+ 199   2                      if(flag&second)
+ 200   2                              {
+ 201   3                                      led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 202   3                                      led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 203   3                              }
+ 204   2                      else
+ 205   2                              {
+ 206   3                                      leddata=(tab[SysTime.Second/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+ 207   3                                      leddata=(tab[SysTime.Second%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 208   3                              }
+ 209   2               //dis cos
+ 210   2                 P0_7 = COL = flag_1302_1s; delays(10);
+ 211   2      
+ 212   2              break;
+ 213   2      
+ 214   2              case MON_DAY:
+ 215   2                      if(flag&month)                                                  //如min为1表示调整时,flag为1时不显示
+ 216   2                              {
+ 217   3                                      led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 218   3                                      led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值决
+             -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+ 219   3                              }
+ 220   2                      else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 221   2                              {
+ 222   3                                      leddata=(tab[SysTime.Month/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+ 223   3                                      leddata=(tab[SysTime.Month%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 224   3                              }
+ 225   2                      if(flag&days)
+ 226   2                              {
+ 227   3                                      led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 228   3                                      led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 229   3                              }
+ 230   2                      else
+ 231   2                              {
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 5   
+
+ 232   3                                      leddata=(tab[SysTime.Day/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+ 233   3                                      leddata=(tab[SysTime.Day%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 234   3                              }
+ 235   2               //dis cos
+ 236   2                  P0_7 = COL = 1; delays(10);                                         //关闭col
+ 237   2      
+ 238   2              break;
+ 239   2              case SET_HOU_MIN:
+ 240   2                      if(flag&hour)                                                   //如hour为1表示调整时,flag为1时不显示
+ 241   2                              {
+ 242   3                                      led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 243   3                                      led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值决
+             -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+ 244   3                              }
+ 245   2                      else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 246   2                              {
+ 247   3                                      leddata=(tab[Ringtime_HOU_tmp/10]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;  //已转化10进制
+ 248   3                                      leddata=(tab[Ringtime_HOU_tmp%10]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 249   3                              }
+ 250   2                      if(flag&minute)
+ 251   2                              {
+ 252   3                                      led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 253   3                                      led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 254   3                              }
+ 255   2                      else
+ 256   2                              {
+ 257   3                                      leddata=(tab[Ringtime_MIN_tmp/10]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;  //已转化10进制
+ 258   3                                      leddata=(tab[Ringtime_MIN_tmp%10]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 259   3                              }               
+ 260   2               //dis cos
+ 261   2                 P0_7 = COL = flag_1302_1s; delays(10);
+ 262   2              break;
+ 263   2              case YEAR_S:
+ 264   2                      year_temp = SysTime.Year/16*10 + SysTime.Year%16;
+ 265   2                      if(flag&years_1)                                                        //如min为1表示调整时,flag为1时不显示
+ 266   2                              {
+ 267   3                                      led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+ 268   3                                      led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;  //&~((unsigned char)~flag<<6)该句根据flag的值决
+             -定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+ 269   3                              }
+ 270   2                      else                                                                    //flag为0时显示,产生闪烁效果,下同
+ 271   2                              {
+ 272   3                                      leddata=(tab[((year_temp+1990)/1000)%10]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+ 273   3                                      leddata=(tab[((year_temp+1990)/100)%10]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+ 274   3                              }
+ 275   2                      if(flag&years_2)
+ 276   2                              {
+ 277   3                                      led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+ 278   3                                      led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+ 279   3                              }
+ 280   2                      else
+ 281   2                              {
+ 282   3                                      leddata=(tab[((year_temp+1990)/10)%10]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+ 283   3                                      leddata=(tab[((year_temp+1990)/1)%10]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+ 284   3                              }
+ 285   2                      
+ 286   2               //dis cos
+ 287   2                 P0_7 = COL = 1; delays(10);
+ 288   2      
+ 289   2              break;
+ 290   2      
+ 291   2              default:
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 6   
+
+ 292   2              break;
+ 293   2              }
+ 294   1      
+ 295   1      #if 0
+                      if(flag&second)
+                              {
+                                      led4=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led4=1;
+                                      led5=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led5=1;
+                              }
+                      else
+                              {
+                                      leddata=tab[SysTime.Second/16];led4=0;delays(10);led4=1;
+                                      leddata=tab[SysTime.Second%16];led5=0;delays(10);led5=1;
+                              }
+               #endif
+ 307   1      }
+ 308          
+ 309          void just_play_when_beep(void)
+ 310          {
+ 311   1              unsigned char secound_temp;                             //COL的显示
+ 312   1              static char i=1;
+ 313   1                                      
+ 314   1              if(secound_temp != SysTime.Second)
+ 315   1              {
+ 316   2                      flag_1302_1s = !flag_1302_1s;
+ 317   2                      secound_temp = SysTime.Second;
+ 318   2              }
+ 319   1              if(!SET || !UP ||!DOWN ||!MODE)                                 
+ 320   1              {
+ 321   2                      //跳出铃声
+ 322   2                      m=0xFF;n=0xFF;per_run_time=0;                                           //跳出次数
+ 323   2                      //关闭蜂鸣器
+ 324   2                      TR0=0;beepIO=0;
+ 325   2                      //初始化
+ 326   2                      If_start_run_ringtime=0;                                                        //关着的
+ 327   2                      ring_space_1min = _RING_SPACE_1MIN;                                     //每遍间隔1分钟
+ 328   2                      ring_run_time = _RING_RUN_TIME;                                         //重复5遍
+ 329   2              }
+ 330   1              switch(i)
+ 331   1              {
+ 332   2                      case 1:
+ 333   2                              led3=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;i=2;
+ 334   2                      break;
+ 335   2                      case 2:
+ 336   2                              led0=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;i=3;
+ 337   2                      break;
+ 338   2                      case 3:
+ 339   2                              led1=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;i=4;
+ 340   2                      break;
+ 341   2                      case 4:
+ 342   2                              led2=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;i=5;
+ 343   2                      break;
+ 344   2                      case 5:
+ 345   2                              P0_7 = COL = flag_1302_1s;
+ 346   2                              leddata=(0x7F)|((P0_7?1:0)<<7);led0=led1=led2=led3=1;
+ 347   2                              i=1;
+ 348   2                      break;
+ 349   2                      default:
+ 350   2                      break;
+ 351   2              }
+ 352   1      }
+ 353          
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 7   
+
+ 354          void Set_ringtime_id(unsigned char sel,unsigned char sel_1)             //执行调整项目的函数
+ 355          {
+ 356   1              signed char max,mini,address,item;                                      
+ 357   1              if(sel==1)  {address=DS1302_HOUR; max=23;mini=0;}    //小时     //根据id值确定要调整的项,并确定调整上下限,�
+             -峦�
+ 358   1              else if(sel==2)  {address=DS1302_MINUTE; max=59;mini=0;}    //分钟
+ 359   1              if(sel==1)
+ 360   1                      item=Ringtime_HOU_tmp;                                                                          //从相应的地址读取当前数据并转换为十进制
+ 361   1              else if(sel==2)
+ 362   1                      item=Ringtime_MIN_tmp;
+ 363   1              if (sel_1==0) item--;  else item++;                                                             //确定是对项目加还是减,并对越限处理
+ 364   1              if(item>max) item=mini;   
+ 365   1              if(item<mini) item=max;
+ 366   1      
+ 367   1              if(sel==1)
+ 368   1                      Ringtime_HOU_tmp = item;
+ 369   1              if(sel==2)
+ 370   1                      Ringtime_MIN_tmp = item;
+ 371   1      }
+ 372          
+ 373          void set_ringtime_case0(void)                                           //键盘处理函数,只有按下set键时才会进入,
+ 374          {
+ 375   1              display();                                                              
+ 376   1              if (!DOWN) //不保存
+ 377   1              {
+ 378   2                      while(!DOWN)display();                  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 379   2                      Ringtime_HOU = 0xFF;
+ 380   2                      Ringtime_MIN = 0xFF;
+ 381   2                      If_start_run_ringtime = 0;              //闹钟计时不开始
+ 382   2                      If_start_flash = 1;                             //退出模式,闪烁
+ 383   2                      If_Into_set_ringtime = 0;               //退出模式,进入小时-分
+ 384   2              }
+ 385   1              if (!UP)  //保存
+ 386   1              {
+ 387   2                      while(!UP)display();
+ 388   2                      Ringtime_HOU = Ringtime_HOU_tmp/10*16+Ringtime_HOU_tmp%10;              //16进制保存
+ 389   2                      Ringtime_MIN = Ringtime_MIN_tmp/10*16+Ringtime_MIN_tmp%10;
+ 390   2                      If_start_run_ringtime = 1;              //闹钟计时开始
+ 391   2                      If_start_flash = 1;                             //退出模式,进入闪烁
+ 392   2                      If_Into_set_ringtime = 0;               //退出模式,进入小时-分
+ 393   2              }
+ 394   1              //直接退出
+ 395   1              if (!MODE)
+ 396   1              {
+ 397   2                      while(!MODE)display();
+ 398   2                      Ringtime_HOU = 0xFF;
+ 399   2                      Ringtime_MIN = 0xFF;
+ 400   2                      If_start_run_ringtime = 0;
+ 401   2                      If_Into_set_ringtime = 0;
+ 402   2                      s_state=HOU_MIN;hour=0;minute=0;                                //退出模式,进入小时-分,不闪烁
+ 403   2              }
+ 404   1      }
+ 405          void set_ringtime_case1(void)                                           //键盘处理函数,只有按下set键时才会进入,
+ 406          {
+ 407   1              display();                                                              
+ 408   1              if (!DOWN) //减少
+ 409   1              {
+ 410   2                      while(!DOWN)display();                  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 411   2                      re_disp=0;                                              //清除记数,重新开始10s定时
+ 412   2                      Set_ringtime_id(id,0);                                  //跳到加减判断函数,下同,
+ 413   2              }
+ 414   1              if (!UP)  //增加
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 8   
+
+ 415   1              {
+ 416   2                      while(!UP)display();
+ 417   2                      re_disp=0;
+ 418   2                      Set_ringtime_id(id,1);    
+ 419   2              }
+ 420   1              //直接退出
+ 421   1              if (!MODE)
+ 422   1              {
+ 423   2                      while(!MODE)display();
+ 424   2                      Ringtime_HOU = 0xFF;
+ 425   2                      Ringtime_MIN = 0xFF;
+ 426   2                      If_start_run_ringtime = 0;
+ 427   2                      If_Into_set_ringtime = 0;
+ 428   2                      s_state=HOU_MIN;hour=0;minute=0;                                //退出模式,进入小时-分,不闪烁
+ 429   2              }
+ 430   1      }
+ 431                           
+ 432          void Into_set_ringtime(void)                            //定时铃声函数
+ 433          {
+ 434   1         unsigned char set_i;
+ 435   1         If_Into_set_ringtime = 1;
+ 436   1         If_start_flash = 1;//开始闪
+ 437   1       //初始化set time数据
+ 438   1         set_i = id = 1;
+ 439   1         Ringtime_HOU_tmp = SysTime.Hour/16*10+SysTime.Hour%16;               //取出并转化10进制 (用)
+ 440   1         Ringtime_MIN_tmp = SysTime.Minute/16*10+SysTime.Minute%16;
+ 441   1      //   Ringtime_HOU_tmp = item/10*16+item%10;                                                                     //转化16进制 (存)
+ 442   1      //   Ringtime_MIN_tmp = item/10*16+item%10;
+ 443   1      
+ 444   1         while(If_Into_set_ringtime)
+ 445   1         {
+ 446   2                      //修改定时时间          SET移动,UP+,DOWN-
+ 447   2                      if (!SET)
+ 448   2              {
+ 449   3                      while(!SET)display();                   //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 450   3                              re_disp=0;                              //清除记数,重新开始10s定时
+ 451   3                              set_i++;if(set_i>2)set_i=0;             //id加1,后面根据id值对应调整项目
+ 452   3                              id = set_i;
+ 453   3                              s_state=SET_HOU_MIN;
+ 454   3                      }
+ 455   2                      if(id==0){hour=0;minute=0;set_ringtime_case0();}        //根据id值跳到相应处理函数
+ 456   2                      if(id==1){hour=1;set_ringtime_case1();}                                 //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函�
+             -��峦�
+ 457   2                      else if(id==2){hour=0;minute=1;set_ringtime_case1();}                           
+ 458   2         }
+ 459   1      
+ 460   1      }
+ 461          
+ 462          void Scan_Key(void)                             //键盘检测函数
+ 463          {
+ 464   1              display();                                      //程序开头调用显示函数
+ 465   1              if(!SET)                                        
+ 466   1              {
+ 467   2                      while(!SET)display();   //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 468   2                      re_disp=0;                              //清除记数,重新开始10s定时
+ 469   2                      id++;if(id>7)id=0;              //id加1,后面根据id值对应调整项目
+ 470   2                      switch(id)
+ 471   2                      {
+ 472   3                              case 0: s_state=HOU_MIN;break;
+ 473   3                              case 1: s_state=HOU_MIN;break;
+ 474   3                              case 2: s_state=HOU_MIN;break;
+ 475   3                              case 3: s_state=MON_DAY;break;
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 9   
+
+ 476   3                              case 4: s_state=MON_DAY;break;
+ 477   3                              case 5: s_state=YEAR_S;break;
+ 478   3                              case 6: s_state=YEAR_S;break;
+ 479   3                              case 7: s_state=SET_HOU_MIN;break;
+ 480   3                              default:break;
+ 481   3                      }
+ 482   2              }
+ 483   1      
+ 484   1              switch(id)
+ 485   1              {
+ 486   2                      case 0: hour=0;minute=0;second=0;month=0;days=0;years_1=0;years_2=0;id_case2_key();break;  //根据id值跳�
+             -较嘤Υ�砗��
+ 487   2                      case 1: hour=1;id_case1_key();break;               //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,�
+             -峦�
+ 488   2                      case 2: hour=0;minute=1;id_case1_key();break;
+ 489   2                      case 3: minute=0;month=1;id_case1_key();break;
+ 490   2                      case 4: month=0;days=1;id_case1_key();break;
+ 491   2                      case 5: days=0;years_1=1;id_case1_key();break;
+ 492   2                      case 6: years_1=0;years_2=1;id_case1_key();break;
+ 493   2                      case 7: years_2=0;Into_set_ringtime();break;
+ 494   2                      default:break;
+ 495   2              }
+ 496   1              //if(id==3){minute=0;second=1;id_case1_key();}
+ 497   1      }
+ 498          void id_case1_key(void)                                         //键盘处理函数,只有按下set键时才会进入,
+ 499          {
+ 500   1              display();                                                              
+ 501   1              if (!DOWN) //减少
+ 502   1              {
+ 503   2                      while(!DOWN)display();                  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 504   2                      re_disp=0;                                              //清除记数,重新开始10s定时
+ 505   2                      Set_id(id,0);                                   //跳到加减判断函数,下同,
+ 506   2              }
+ 507   1              if (!UP)  //增加
+ 508   1              {
+ 509   2                      while(!UP)display();
+ 510   2                      re_disp=0;
+ 511   2                      Set_id(id,1);    
+ 512   2              }
+ 513   1      }
+ 514          void id_case2_key(void)                                         //键盘处理函数,只有id==0时才会进入,
+ 515          {
+ 516   1              static char DOWN_key_add = HOU_MIN;
+ 517   1              display();                                                              
+ 518   1              if (!DOWN) //
+ 519   1              {
+ 520   2                      while(!DOWN)display();                  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 521   2                      DOWN_key_add ++;
+ 522   2                      if(DOWN_key_add > 2)                            DOWN_key_add = 0;
+ 523   2                      if(DOWN_key_add == 0)                           s_state = HOU_MIN;
+ 524   2                      else if(DOWN_key_add == 1)                      s_state = MON_DAY_HOU_MIN;
+ 525   2                      else if(DOWN_key_add == 2)                      s_state = MIN_SECOND;   
+ 526   2              }
+ 527   1              if (!UP)  //
+ 528   1              {
+ 529   2                      while(!UP)display();                    //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 530   2                      DOWN_key_add --;
+ 531   2                      if(DOWN_key_add < 0)                            DOWN_key_add = 2;
+ 532   2                      if(DOWN_key_add == 0)                           s_state = HOU_MIN;
+ 533   2                      else if(DOWN_key_add == 1)                      s_state = MON_DAY_HOU_MIN;
+ 534   2                      else if(DOWN_key_add == 2)                      s_state = MIN_SECOND;   
+ 535   2              }
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 10  
+
+ 536   1              if (!MODE)
+ 537   1              {
+ 538   2                      while(!MODE)display();                  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 539   2                      Into_set_ringtime();
+ 540   2              }
+ 541   1      }
+ 542          //根据选择调整相应项目并写入DS1302
+ 543          void Set_id(unsigned char sel,unsigned char sel_1)              //执行调整项目的函数
+ 544          {
+ 545   1              signed char max,mini,address,item;                                      
+ 546   1              switch(sel)
+ 547   1              {
+ 548   2                      case 1: address=DS1302_HOUR; max=23;mini=0;break;               //小时  //根据id值确定要调整的项,并确定调整上下限,�
+             -峦�
+ 549   2                      case 2: address=DS1302_MINUTE; max=59;mini=0;break;             //分钟
+ 550   2                      case 3: address=DS1302_MONTH; max=12;mini=1;break;              //月
+ 551   2                      case 4: address=DS1302_DAY; max=31;mini=0;break;                //日
+ 552   2                      case 5: address=DS1302_YEAR; max=20;mini=20;break;              //年20
+ 553   2                      case 6: address=DS1302_YEAR; max=99;mini=0;break;               //年14
+ 554   2                      default:break;
+ 555   2              }
+ 556   1              //if(sel==3)  {address=sec; max=0;mini=0;}     //秒
+ 557   1      
+ 558   1              item=Read1302(address|DS1302_READ)/16*10+Read1302(address|DS1302_READ)%16;      //从相应的地址读取当前数据并
+             -转换为十进制
+ 559   1              if (sel_1==0) item--;  else item++;                                                             //确定是对项目加还是减,并对越限处理
+ 560   1              if(item>max) item=mini;   
+ 561   1              if(item<mini) item=max;
+ 562   1              Write1302(0x8e,0x00);//允许写操作       
+ 563   1              Write1302(address,item/10*16+item%10);                                                  //将调整结果转换成压缩BCD码重新写入1302
+ 564   1              Write1302(0x8e,0x80);//写保护,禁止写操作  
+ 565   1      }
+ 566          
+ 567          void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数
+ 568          {
+ 569   1              Write1302(0x8e,0x00);//允许写操作       
+ 570   1              Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位为十位,低4位为个位
+ 571   1              Write1302(0x8e,0x80);//写保护,禁止写操作  
+ 572   1      }
+ 573          void Initial_DS1302(void)
+ 574          {
+ 575   1              unsigned char Second=Read1302(DS1302_SECOND|DS1302_READ);
+ 576   1              if(Second&0x80)    //如果第七为1(表明没有启动), 则启动时钟               
+ 577   1                      DS1302_SetTime(DS1302_SECOND,Second&0x3F);                      //小于60秒      3F=63   
+ 578   1      }
+ 579          
+ 580          void t1(void) interrupt 3 using 0                       //中断处理程序,主要用于取反标志位,返回正常显示状态
+ 581          {
+ 582   1              TH1=(65535-50000)/256; //50ms定时
+ 583   1              TL1=(65535-50000)%256;  
+ 584   1              timecount++;re_disp++;second_time++;
+ 585   1      
+ 586   1              if(If_start_flash == 1 && set_flash_flag <= 3)
+ 587   1              {
+ 588   2                      if(ring_flash_countdown-- == 0)         //50ms*60 == 3s
+ 589   2                      {
+ 590   3                              ring_flash_countdown = _RING_FLASH_COUNTDOWN/50;
+ 591   3                              If_start_flash = 0;
+ 592   3                              set_flash_flag = 0xFF;
+ 593   3                              if(If_Into_set_ringtime)        {s_state = SET_HOU_MIN;hour=1;minute=0;}                                        //最后到设置,闪
+ 594   3                              else                                            {s_state = HOU_MIN;hour=0;minute=0;}                                            //最后退出设置,不闪
+ 595   3                      }
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 11  
+
+ 596   2              }
+ 597   1      
+ 598   1              if(timecount >= 9)                              //10*50ms == 500ms
+ 599   1                      {                                                                                               
+ 600   2                      flag=~flag;
+ 601   2                              if(set_flash_flag > 3)                  set_flash_flag = 0;
+ 602   2                              if(If_start_flash == 1)                 set_flash_flag ++;
+ 603   2                              timecount = 0;
+ 604   2                      }
+ 605   1              if(second_time >= 19)                           //20*50ms == 1000ms
+ 606   1                      {
+ 607   2                              second_time = 0;
+ 608   2                      system_1s_flag=~system_1s_flag;                 //系统读秒1302
+ 609   2      
+ 610   2                      system_26s_flag++;
+ 611   2                              if(system_26s_flag > 25)        system_26s_flag = 0;
+ 612   2                      }
+ 613   1      
+ 614   1              if(re_disp>200){re_disp=0;if(id)id=0;}
+ 615   1      }
+ 616          
+ 617          void InitialT0T1(void)                          //
+ 618          {
+ 619   1                      TMOD=0x11;                                      //初始化定时器  方式2   波特率发生器
+ 620   1                      //TH0=0xFF;                                     //T0高八位
+ 621   1                      //TL0=0xFF;                                     //T0低八位
+ 622   1                      TH1=(65535-50000)/256;          //T1高八位
+ 623   1                      TL1=(65535-50000)%256;          //T1低八位
+ 624   1      
+ 625   1                      EA=1;                                           //总中断开关
+ 626   1                      ET0=1;                                          //T0中断
+ 627   1                      //TR0=0;                                        //定时器T0 不开始计时
+ 628   1                      ET1=1;                                          //T1中断
+ 629   1                      TR1=1;                                          //定时器T1 开始计时
+ 630   1      }
+ 631          /*
+ 632          void InitialT1(void)                            //
+ 633          {
+ 634                          TMOD|=0x10;                                     //初始化定时器  方式2   波特率发生器
+ 635                          TH1=(65535-50000)/256;          //T0高八位
+ 636                          TL1=(65535-50000)%256;          //T0低八位
+ 637                          EA=1;                                           //总中断开关
+ 638                          ET1=1;                                          //T0中断
+ 639                          TR1=1;                                          //定时器T0 开始计时
+ 640          }*/
+ 641          void main()                                                     //主函数
+ 642                  {
+ 643   1                      //配置播放器T0 模式3下 占用T1资源,所以 只能用T1(波特率发生器)
+ 644   1                      //配置定时器T1
+ 645   1                      //InitialT1();
+ 646   1                      InitialT0T1();
+ 647   1                      //初始化,并启动DS1302的时钟
+ 648   1                      Write1302(0x90,0xa0);//关闭充电二级管,不能对后备电池进行充电,防止发胀,原来的程序是打开的请关闭 
+ 649   1                      Write1302(0x8e,0x80);//写保护,禁止写操作 
+ 650   1                      Initial_DS1302();
+ 651   1                      if(!UP&!DOWN)Set1302(inittime);                 //如果同时按下UP和DOWN键则初始化1302,该语句在while(1)前,只执行一次,
+             -需要复位,防止误操作
+ 652   1                      //配置P0口,全部推挽输出                01
+ 653   1                      P0M0 = 0x00;    
+ 654   1                      P0M1 = 0xFF;
+ 655   1                      //延时稳定 
+ 656   1                      SYSLED = 0;                             //系统灯开 
+C51 COMPILER V8.02   LED时钟                                                               07/22/2014 16:33:38 PAGE 12  
+
+ 657   1                      delays(100);
+ 658   1                      SYSLED = 1;                                     //系统灯关 
+ 659   1                      while(1)
+ 660   1                              {
+ 661   2                                      SYSLED = system_1s_flag;                //系统灯闪
+ 662   2                                      DS1302_GetTime(&SysTime);               //获取时间 
+ 663   2                                      Scan_Key();                                             //键盘检测和显示
+ 664   2                                      if(!P3_0)                                       
+ 665   2                                      {
+ 666   3                                              while(!P3_0)display();  //等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 667   3                                              If_play_music = 1;
+ 668   3                                              play_2tigers();
+ 669   3                                              If_play_music = 0;
+ 670   3                                      }
+ 671   2                                      if(If_start_run_ringtime)
+ 672   2                                      {
+ 673   3                                              if(Ringtime_HOU == SysTime.Hour && Ringtime_MIN == SysTime.Minute)
+ 674   3                                              {
+ 675   4                                                      if(ring_run_time--==0)                  //到了次数,不再播放
+ 676   4                                                      {
+ 677   5                                                              Ringtime_HOU = 0xFF;
+ 678   5                                                              Ringtime_MIN = 0xFF;
+ 679   5                                                              If_start_run_ringtime = 0;
+ 680   5                                                              ring_run_time = _RING_RUN_TIME;         //初始化一下 下个5遍运行 ,不然ring_run_time--后,0xFF一直间隔响
+ 681   5                                                      }   
+ 682   4                                                      else                                                    //重装,间隔x分钟 ring_space_1min
+ 683   4                                                      {
+ 684   5                                                              Ringtime_HOU_tmp = Ringtime_HOU_tmp + (Ringtime_MIN_tmp + ring_space_1min)/59;
+ 685   5                                                              Ringtime_MIN_tmp = (Ringtime_MIN_tmp + ring_space_1min)%59;
+ 686   5                                                              Ringtime_HOU = Ringtime_HOU_tmp/10*16+Ringtime_HOU_tmp%10;              //16进制保存
+ 687   5                                                              Ringtime_MIN = Ringtime_MIN_tmp/10*16+Ringtime_MIN_tmp%10;
+ 688   5                                                              If_start_run_ringtime = 1;
+ 689   5                                                      }                                                       
+ 690   4                                                      If_play_music = 1;
+ 691   4                                                      play_2tigers();
+ 692   4                                                      If_play_music = 0;
+ 693   4                                              }
+ 694   3                                      } 
+ 695   2                              }
+ 696   1      }
+
+
+MODULE INFORMATION:   STATIC OVERLAYABLE
+   CODE SIZE        =   4123    ----
+   CONSTANT SIZE    =    186    ----
+   XDATA SIZE       =   ----    ----
+   PDATA SIZE       =   ----    ----
+   DATA SIZE        =     51       9
+   IDATA SIZE       =   ----    ----
+   BIT SIZE         =     14    ----
+END OF MODULE INFORMATION.
+
+
+C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

BIN
自制电子钟_增加闹钟zz/LED时钟.OBJ


+ 696 - 0
自制电子钟_增加闹钟zz/LED时钟.c

@@ -0,0 +1,696 @@
+#include <REGx51.H>
+#include "ds1302.h"			//包含DS1302头文件 
+#include "music_two_tiger.h"
+//#include "AT25F4096.h"
+sfr   P0M1   = 0X93;
+sfr   P0M0   = 0X94;
+sfr   P1M1   = 0X91;
+sfr   P1M0   = 0X92;
+sfr   P2M1   = 0X95;
+sfr   P2M0   = 0X96;
+#define leddata P0			//定义LED数据口
+
+sbit SET=P2^0; 				//按键定义,下同
+sbit UP=P2^1;
+sbit DOWN=P2^2;
+sbit MODE=P2^3;	
+
+sbit led0=P2^7;				//LED位选,因为布线不是按顺序布的,程序定义一下就可以了,下同
+sbit led1=P2^6;
+sbit led2=P2^5;
+sbit led3=P2^4;
+
+sbit SYSLED=P1^4;
+sbit COL=P1^3;
+
+volatile SYSTEMTIME  SysTime;
+unsigned char s_state = HOU_MIN;
+//sbit led4=P2^6;
+//sbit led5=P2^5;
+//**************函数声明*****************
+void delays(unsigned char);
+void display(void);
+void Scan_Key(void);
+void id_case1_key();
+void id_case2_key();
+void Set_id(unsigned char ,unsigned char);
+//*************变量定义******************
+bit If_start_run_ringtime=0;
+
+char per_run_time = _PER_RUN_TIME;							//每首曲子运行2次
+char ring_space_1min = _RING_SPACE_1MIN;					//每遍间隔1分钟
+char ring_run_time = _RING_RUN_TIME;						//重复5遍
+char ring_flash_countdown = _RING_FLASH_COUNTDOWN/50;		//闪烁3秒
+
+unsigned char Ringtime_HOU=0xFF,Ringtime_MIN=0xFF,Ringtime_HOU_tmp=0xFF,Ringtime_MIN_tmp=0xFF;
+unsigned char id=0,timecount=0,re_disp=0,second_time=0;		//定义用到的变量,id为调整模式用,不为0时表示调整模式,调整哪个量由id值确定
+											//timecount用于500ms定时记数,时间到取反flag标志位,re_disp记数200次共10s,调整状态下按键无操作10s自动返回正常显示状态
+bit hour,minute,second,month,days,years_1,years_2,flag,flag_1302_1s,system_1s_flag;				//定义位变量,hour,minute,second分别为调整时闪烁标志位,flag 500ms取反一次,调整位闪烁及冒号闪烁用
+unsigned char system_26s_flag;
+unsigned char set_flash_flag = 0xFF;
+bit If_play_music = 0;
+bit If_start_flash = 0;
+bit If_Into_set_ringtime = 0;		//1进入,0退出
+//unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};	//LED码表,根据硬件修改
+unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
+
+unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x07,0x29,0x24};						//初始化1302时用到的初始化数据	  年2014-1990=24
+//                          秒  分钟 小时  日   月   星期  年 
+/*
+void t0(void) interrupt 1 using 0			//中断处理程序,主要用于取反标志位,返回正常显示状态
+{
+  	TH0=(65535-50000)/256; //50ms定时
+  	TL0=(65535-50000)%256;  
+  	timecount++;re_disp++;second_time++;
+
+  	if(timecount == 9)				//10*50ms == 500ms
+   		{
+    		flag=~flag;
+			timecount = 0;
+   		}
+  	if(second_time == 19)	  			//20*50ms == 1000ms
+   		{
+    		flag_1302_1s=~flag_1302_1s;
+			second_time = 0;
+
+    		system_26s_flag++;
+			if(system_26s_flag > 25)	system_26s_flag = 0;
+   		}
+
+	if(re_disp>200){re_disp=0;if(id)id=0;}
+}*/
+void delays(unsigned char k)				//延时函数
+{
+	unsigned char i,j;
+	for(i=0;i<k;i++)
+		for(j=0;j<50;j++);
+}
+
+void display()							//显示函数
+{
+	unsigned char year_temp;				//获取一次
+ 	unsigned char secound_temp;				//COL的显示
+	if(secound_temp != SysTime.Second)
+	{
+		flag_1302_1s = !flag_1302_1s;
+		secound_temp = SysTime.Second;
+	}
+ 	if(If_start_flash == 1)
+	{
+		if(set_flash_flag == 0)					{s_state=HOU_MIN;hour=1;minute=1;}
+		else if(set_flash_flag == 1)			{s_state=SET_HOU_MIN;hour=1;minute=1;}				//不显示
+		else if(set_flash_flag == 2)			{s_state=SET_HOU_MIN;hour=1;minute=1;}
+		else if(set_flash_flag == 3)			{s_state=HOU_MIN;hour=1;minute=1;} 					//不显示		
+	}
+
+    switch(s_state)
+	{
+	case HOU_MIN:
+		if(flag&hour)							//如hour为1表示调整时,flag为1时不显示
+			{
+				led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+				led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+			}
+		else									//flag为0时显示,产生闪烁效果,下同
+			{
+				leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+				leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+			}
+		if(flag&minute)
+			{
+				led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+				led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+			}
+		else
+			{
+				leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+				leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+			}		
+	 //dis cos
+	   P0_7 = COL = flag_1302_1s; delays(10);
+
+	break;
+ 	case MON_DAY_HOU_MIN:
+  		if(system_26s_flag < 20)
+		{
+			if(flag&hour)							//如hour为1表示调整时,flag为1时不显示
+				{
+					led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+					led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+				}
+			else									//flag为0时显示,产生闪烁效果,下同
+				{
+					leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+					leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+				}
+			if(flag&minute)
+				{
+					led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+					led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+				}
+			else
+				{
+					leddata=leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+					leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+				}		
+	 	//dis cos
+	   		P0_7 = COL = flag_1302_1s; delays(10);
+
+		 }
+		 else
+		 {
+			if(flag&month)							//如min为1表示调整时,flag为1时不显示
+				{
+					led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+					led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+				}
+			else									//flag为0时显示,产生闪烁效果,下同
+				{
+					leddata=(tab[SysTime.Month/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+					leddata=(tab[SysTime.Month%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+				}
+			if(flag&days)
+				{
+					led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+					led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+				}
+			else
+				{
+					leddata=(tab[SysTime.Day/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+					leddata=(tab[SysTime.Day%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+				}
+ 	 		//dis cos
+	   			P0_7 = COL = 1; delays(10);
+
+ 		  }
+
+	break;
+	case MIN_SECOND:
+		if(flag&minute)							//如min为1表示调整时,flag为1时不显示
+			{
+				led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+				led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+			}
+		else									//flag为0时显示,产生闪烁效果,下同
+			{
+				leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+				leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+			}
+		if(flag&second)
+			{
+				led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+				led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+			}
+		else
+			{
+				leddata=(tab[SysTime.Second/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+				leddata=(tab[SysTime.Second%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+			}
+	 //dis cos
+	   P0_7 = COL = flag_1302_1s; delays(10);
+
+	break;
+
+	case MON_DAY:
+ 		if(flag&month)							//如min为1表示调整时,flag为1时不显示
+			{
+				led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+				led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+			}
+		else									//flag为0时显示,产生闪烁效果,下同
+			{
+				leddata=(tab[SysTime.Month/16]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+				leddata=(tab[SysTime.Month%16]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+			}
+		if(flag&days)
+			{
+				led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+				led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+			}
+		else
+			{
+				leddata=(tab[SysTime.Day/16]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+				leddata=(tab[SysTime.Day%16]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+			}
+ 	 //dis cos
+	    P0_7 = COL = 1; delays(10);	  					//关闭col
+
+ 	break;
+	case SET_HOU_MIN:
+		if(flag&hour)							//如hour为1表示调整时,flag为1时不显示
+			{
+				led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+				led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+			}
+		else									//flag为0时显示,产生闪烁效果,下同
+			{
+				leddata=(tab[Ringtime_HOU_tmp/10]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;  //已转化10进制
+				leddata=(tab[Ringtime_HOU_tmp%10]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+			}
+		if(flag&minute)
+			{
+				led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+				led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+			}
+		else
+			{
+				leddata=(tab[Ringtime_MIN_tmp/10]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;  //已转化10进制
+				leddata=(tab[Ringtime_MIN_tmp%10]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+			}		
+	 //dis cos
+	   P0_7 = COL = flag_1302_1s; delays(10);
+ 	break;
+	case YEAR_S:
+		year_temp = SysTime.Year/16*10 + SysTime.Year%16;
+ 		if(flag&years_1)							//如min为1表示调整时,flag为1时不显示
+			{
+				led0=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led0=1;
+				led1=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led1=1;	//&~((unsigned char)~flag<<6)该句根据flag的值决定来显示小数点,为1时显示,4个小数点组成两对冒号,下同
+			}
+		else									//flag为0时显示,产生闪烁效果,下同
+			{
+				leddata=(tab[((year_temp+1990)/1000)%10]&0x7F)|((P0_7?1:0)<<7);led0=0;delays(10);led0=1;
+				leddata=(tab[((year_temp+1990)/100)%10]&0x7F)|((P0_7?1:0)<<7);led1=0;delays(10);led1=1;
+			}
+		if(flag&years_2)
+			{
+				led2=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led2=1;
+				led3=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led3=1;
+			}
+		else
+			{
+				leddata=(tab[((year_temp+1990)/10)%10]&0x7F)|((P0_7?1:0)<<7);led2=0;delays(10);led2=1;
+				leddata=(tab[((year_temp+1990)/1)%10]&0x7F)|((P0_7?1:0)<<7);led3=0;delays(10);led3=1;
+			}
+		
+	 //dis cos
+	   P0_7 = COL = 1; delays(10);
+
+ 	break;
+
+	default:
+  	break;
+	}
+
+#if 0
+	if(flag&second)
+		{
+			led4=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led4=1;
+			led5=0;leddata=0x7f|((P0_7?1:0)<<7);delays(10);led5=1;
+		}
+	else
+		{
+			leddata=tab[SysTime.Second/16];led4=0;delays(10);led4=1;
+			leddata=tab[SysTime.Second%16];led5=0;delays(10);led5=1;
+		}
+ #endif
+}
+
+void just_play_when_beep(void)
+{
+ 	unsigned char secound_temp;				//COL的显示
+	static char i=1;
+				
+	if(secound_temp != SysTime.Second)
+	{
+		flag_1302_1s = !flag_1302_1s;
+		secound_temp = SysTime.Second;
+	}
+	if(!SET || !UP ||!DOWN ||!MODE)					
+	{
+		//跳出铃声
+		m=0xFF;n=0xFF;per_run_time=0;						//跳出次数
+		//关闭蜂鸣器
+		TR0=0;beepIO=0;
+		//初始化
+		If_start_run_ringtime=0;							//关着的
+		ring_space_1min = _RING_SPACE_1MIN;					//每遍间隔1分钟
+		ring_run_time = _RING_RUN_TIME;						//重复5遍
+	}
+	switch(i)
+	{
+		case 1:
+			led3=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Hour/16]&0x7F)|((P0_7?1:0)<<7);led0=0;i=2;
+		break;
+		case 2:
+			led0=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Hour%16]&0x7F)|((P0_7?1:0)<<7);led1=0;i=3;
+		break;
+		case 3:
+			led1=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Minute/16]&0x7F)|((P0_7?1:0)<<7);led2=0;i=4;
+		break;
+		case 4:
+			led2=1;leddata=(0x7F)|((P0_7?1:0)<<7);leddata=(tab[SysTime.Minute%16]&0x7F)|((P0_7?1:0)<<7);led3=0;i=5;
+		break;
+		case 5:
+			P0_7 = COL = flag_1302_1s;
+ 			leddata=(0x7F)|((P0_7?1:0)<<7);led0=led1=led2=led3=1;
+			i=1;
+		break;
+		default:
+		break;
+	}
+}
+
+void Set_ringtime_id(unsigned char sel,unsigned char sel_1)		//执行调整项目的函数
+{
+  	signed char max,mini,address,item;					
+	if(sel==1)  {address=DS1302_HOUR; max=23;mini=0;}    //小时	//根据id值确定要调整的项,并确定调整上下限,下同
+	else if(sel==2)  {address=DS1302_MINUTE; max=59;mini=0;}    //分钟
+ 	if(sel==1)
+  		item=Ringtime_HOU_tmp;										//从相应的地址读取当前数据并转换为十进制
+ 	else if(sel==2)
+		item=Ringtime_MIN_tmp;
+  	if (sel_1==0) item--;  else item++;								//确定是对项目加还是减,并对越限处理
+ 	if(item>max) item=mini;   
+  	if(item<mini) item=max;
+
+	if(sel==1)
+		Ringtime_HOU_tmp = item;
+	if(sel==2)
+		Ringtime_MIN_tmp = item;
+}
+
+void set_ringtime_case0(void)						//键盘处理函数,只有按下set键时才会进入,
+{
+	display();								
+  	if (!DOWN) //不保存
+  	{
+   		while(!DOWN)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		Ringtime_HOU = 0xFF;
+		Ringtime_MIN = 0xFF;
+		If_start_run_ringtime = 0;		//闹钟计时不开始
+		If_start_flash = 1;			 	//退出模式,闪烁
+		If_Into_set_ringtime = 0;		//退出模式,进入小时-分
+  	}
+   	if (!UP)  //保存
+  	{
+   		while(!UP)display();
+		Ringtime_HOU = Ringtime_HOU_tmp/10*16+Ringtime_HOU_tmp%10;	 	//16进制保存
+		Ringtime_MIN = Ringtime_MIN_tmp/10*16+Ringtime_MIN_tmp%10;
+		If_start_run_ringtime = 1;		//闹钟计时开始
+		If_start_flash = 1;			 	//退出模式,进入闪烁
+		If_Into_set_ringtime = 0;		//退出模式,进入小时-分
+  	}
+	//直接退出
+	if (!MODE)
+  	{
+   		while(!MODE)display();
+		Ringtime_HOU = 0xFF;
+		Ringtime_MIN = 0xFF;
+		If_start_run_ringtime = 0;
+		If_Into_set_ringtime = 0;
+		s_state=HOU_MIN;hour=0;minute=0;				//退出模式,进入小时-分,不闪烁
+	}
+}
+void set_ringtime_case1(void)						//键盘处理函数,只有按下set键时才会进入,
+{
+	display();								
+  	if (!DOWN) //减少
+  	{
+   		while(!DOWN)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		re_disp=0;						//清除记数,重新开始10s定时
+   		Set_ringtime_id(id,0);					//跳到加减判断函数,下同,
+  	}
+   	if (!UP)  //增加
+  	{
+   		while(!UP)display();
+		re_disp=0;
+   		Set_ringtime_id(id,1);    
+  	}
+	//直接退出
+	if (!MODE)
+  	{
+   		while(!MODE)display();
+		Ringtime_HOU = 0xFF;
+		Ringtime_MIN = 0xFF;
+		If_start_run_ringtime = 0;
+		If_Into_set_ringtime = 0;
+		s_state=HOU_MIN;hour=0;minute=0;				//退出模式,进入小时-分,不闪烁
+	}
+}
+		 
+void Into_set_ringtime(void)				//定时铃声函数
+{
+   unsigned char set_i;
+   If_Into_set_ringtime = 1;
+   If_start_flash = 1;//开始闪
+ //初始化set time数据
+   set_i = id = 1;
+   Ringtime_HOU_tmp = SysTime.Hour/16*10+SysTime.Hour%16;		//取出并转化10进制 (用)
+   Ringtime_MIN_tmp = SysTime.Minute/16*10+SysTime.Minute%16;
+//   Ringtime_HOU_tmp = item/10*16+item%10;									//转化16进制 (存)
+//   Ringtime_MIN_tmp = item/10*16+item%10;
+
+   while(If_Into_set_ringtime)
+   {
+ 		//修改定时时间		SET移动,UP+,DOWN-
+		if (!SET)
+      	{
+       		while(!SET)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+			re_disp=0;				//清除记数,重新开始10s定时
+			set_i++;if(set_i>2)set_i=0;		//id加1,后面根据id值对应调整项目
+ 			id = set_i;
+ 			s_state=SET_HOU_MIN;
+		}
+		if(id==0){hour=0;minute=0;set_ringtime_case0();}	//根据id值跳到相应处理函数
+ 		if(id==1){hour=1;set_ringtime_case1();}					//id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,下同
+		else if(id==2){hour=0;minute=1;set_ringtime_case1();}				
+   }
+
+}
+
+void Scan_Key(void)				//键盘检测函数
+{
+	display();					//程序开头调用显示函数
+	if(!SET)					
+	{
+		while(!SET)display();	//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		re_disp=0;				//清除记数,重新开始10s定时
+		id++;if(id>7)id=0;		//id加1,后面根据id值对应调整项目
+		switch(id)
+		{
+			case 0: s_state=HOU_MIN;break;
+			case 1: s_state=HOU_MIN;break;
+			case 2: s_state=HOU_MIN;break;
+			case 3: s_state=MON_DAY;break;
+			case 4: s_state=MON_DAY;break;
+			case 5: s_state=YEAR_S;break;
+			case 6: s_state=YEAR_S;break;
+			case 7: s_state=SET_HOU_MIN;break;
+			default:break;
+		}
+	}
+
+	switch(id)
+	{
+		case 0: hour=0;minute=0;second=0;month=0;days=0;years_1=0;years_2=0;id_case2_key();break;  //根据id值跳到相应处理函数
+		case 1: hour=1;id_case1_key();break;		   //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,下同
+		case 2: hour=0;minute=1;id_case1_key();break;
+		case 3: minute=0;month=1;id_case1_key();break;
+		case 4: month=0;days=1;id_case1_key();break;
+		case 5: days=0;years_1=1;id_case1_key();break;
+		case 6: years_1=0;years_2=1;id_case1_key();break;
+		case 7: years_2=0;Into_set_ringtime();break;
+		default:break;
+	}
+	//if(id==3){minute=0;second=1;id_case1_key();}
+}
+void id_case1_key(void)						//键盘处理函数,只有按下set键时才会进入,
+{
+	display();								
+  	if (!DOWN) //减少
+  	{
+   		while(!DOWN)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		re_disp=0;						//清除记数,重新开始10s定时
+   		Set_id(id,0);					//跳到加减判断函数,下同,
+  	}
+   	if (!UP)  //增加
+  	{
+   		while(!UP)display();
+		re_disp=0;
+   		Set_id(id,1);    
+  	}
+}
+void id_case2_key(void)						//键盘处理函数,只有id==0时才会进入,
+{
+	static char DOWN_key_add = HOU_MIN;
+	display();								
+  	if (!DOWN) //
+  	{
+   		while(!DOWN)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		DOWN_key_add ++;
+		if(DOWN_key_add > 2)				DOWN_key_add = 0;
+		if(DOWN_key_add == 0)				s_state = HOU_MIN;
+		else if(DOWN_key_add == 1)			s_state = MON_DAY_HOU_MIN;
+		else if(DOWN_key_add == 2)			s_state = MIN_SECOND;	
+  	}
+   	if (!UP)  //
+  	{
+   		while(!UP)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		DOWN_key_add --;
+		if(DOWN_key_add < 0)				DOWN_key_add = 2;
+		if(DOWN_key_add == 0)				s_state = HOU_MIN;
+		else if(DOWN_key_add == 1)			s_state = MON_DAY_HOU_MIN;
+		else if(DOWN_key_add == 2)			s_state = MIN_SECOND;	
+  	}
+	if (!MODE)
+  	{
+   		while(!MODE)display();			//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+		Into_set_ringtime();
+	}
+}
+//根据选择调整相应项目并写入DS1302
+void Set_id(unsigned char sel,unsigned char sel_1)		//执行调整项目的函数
+{
+  	signed char max,mini,address,item;					
+	switch(sel)
+	{
+		case 1: address=DS1302_HOUR; max=23;mini=0;break;	 	//小时	//根据id值确定要调整的项,并确定调整上下限,下同
+		case 2: address=DS1302_MINUTE; max=59;mini=0;break;	 	//分钟
+		case 3: address=DS1302_MONTH; max=12;mini=1;break;		//月
+		case 4: address=DS1302_DAY; max=31;mini=0;break;   		//日
+		case 5: address=DS1302_YEAR; max=20;mini=20;break;		//年20
+		case 6: address=DS1302_YEAR; max=99;mini=0;break;		//年14
+		default:break;
+	}
+  	//if(sel==3)  {address=sec; max=0;mini=0;}     //秒
+
+  	item=Read1302(address|DS1302_READ)/16*10+Read1302(address|DS1302_READ)%16;	//从相应的地址读取当前数据并转换为十进制
+  	if (sel_1==0) item--;  else item++;								//确定是对项目加还是减,并对越限处理
+ 	if(item>max) item=mini;   
+  	if(item<mini) item=max;
+	Write1302(0x8e,0x00);//允许写操作	
+  	Write1302(address,item/10*16+item%10);							//将调整结果转换成压缩BCD码重新写入1302
+  	Write1302(0x8e,0x80);//写保护,禁止写操作  
+}
+
+void DS1302_SetTime(unsigned char Address, unsigned char Value)        // 设置时间函数
+{
+	Write1302(0x8e,0x00);//允许写操作	
+	Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位为十位,低4位为个位
+  	Write1302(0x8e,0x80);//写保护,禁止写操作  
+}
+void Initial_DS1302(void)
+{
+	unsigned char Second=Read1302(DS1302_SECOND|DS1302_READ);
+	if(Second&0x80)    //如果第七为1(表明没有启动), 则启动时钟		  
+		DS1302_SetTime(DS1302_SECOND,Second&0x3F);			//小于60秒	3F=63	
+}
+
+void t1(void) interrupt 3 using 0			//中断处理程序,主要用于取反标志位,返回正常显示状态
+{
+  	TH1=(65535-50000)/256; //50ms定时
+  	TL1=(65535-50000)%256;  
+  	timecount++;re_disp++;second_time++;
+
+ 	if(If_start_flash == 1 && set_flash_flag <= 3)
+	{
+		if(ring_flash_countdown-- == 0)		//50ms*60 == 3s
+		{
+			ring_flash_countdown = _RING_FLASH_COUNTDOWN/50;
+			If_start_flash = 0;
+			set_flash_flag = 0xFF;
+			if(If_Into_set_ringtime)	{s_state = SET_HOU_MIN;hour=1;minute=0;}					//最后到设置,闪
+			else						{s_state = HOU_MIN;hour=0;minute=0;}						//最后退出设置,不闪
+		}
+	}
+
+  	if(timecount >= 9)				//10*50ms == 500ms
+   		{												
+    		flag=~flag;
+			if(set_flash_flag > 3)   		set_flash_flag = 0;
+			if(If_start_flash == 1) 		set_flash_flag ++;
+			timecount = 0;
+   		}
+  	if(second_time >= 19)	  			//20*50ms == 1000ms
+   		{
+			second_time = 0;
+    		system_1s_flag=~system_1s_flag; 		//系统读秒1302
+
+    		system_26s_flag++;
+			if(system_26s_flag > 25)	system_26s_flag = 0;
+   		}
+
+	if(re_disp>200){re_disp=0;if(id)id=0;}
+}
+
+void InitialT0T1(void)				//
+{
+		TMOD=0x11;					//初始化定时器 	方式2	波特率发生器
+  		//TH0=0xFF;					//T0高八位
+  		//TL0=0xFF;					//T0低八位
+  		TH1=(65535-50000)/256;		//T1高八位
+  		TL1=(65535-50000)%256;		//T1低八位
+
+  		EA=1;						//总中断开关
+  		ET0=1;						//T0中断
+		//TR0=0; 					//定时器T0 不开始计时
+  		ET1=1;						//T1中断
+		TR1=1; 						//定时器T1 开始计时
+}
+/*
+void InitialT1(void)				//
+{
+		TMOD|=0x10;					//初始化定时器 	方式2	波特率发生器
+  		TH1=(65535-50000)/256;		//T0高八位
+  		TL1=(65535-50000)%256;		//T0低八位
+  		EA=1;						//总中断开关
+  		ET1=1;						//T0中断
+		TR1=1; 						//定时器T0 开始计时
+}*/
+void main()							//主函数
+	{
+ 		//配置播放器T0 模式3下 占用T1资源,所以 只能用T1(波特率发生器)
+ 		//配置定时器T1
+		//InitialT1();
+		InitialT0T1();
+ 		//初始化,并启动DS1302的时钟
+		Write1302(0x90,0xa0);//关闭充电二级管,不能对后备电池进行充电,防止发胀,原来的程序是打开的请关闭 
+ 		Write1302(0x8e,0x80);//写保护,禁止写操作 
+		Initial_DS1302();
+		if(!UP&!DOWN)Set1302(inittime);			//如果同时按下UP和DOWN键则初始化1302,该语句在while(1)前,只执行一次,需要复位,防止误操作
+ 		//配置P0口,全部推挽输出		01
+		P0M0 = 0x00;	
+		P0M1 = 0xFF;
+		//延时稳定 
+		SYSLED = 0; 				//系统灯开 
+ 		delays(100);
+		SYSLED = 1;					//系统灯关 
+		while(1)
+			{
+				SYSLED = system_1s_flag; 		//系统灯闪
+				DS1302_GetTime(&SysTime);		//获取时间 
+				Scan_Key();						//键盘检测和显示
+				if(!P3_0)					
+				{
+					while(!P3_0)display();	//等待按键释放,如一直按下一直调用显示函数,防止显示中断
+ 					If_play_music = 1;
+					play_2tigers();
+ 					If_play_music = 0;
+				}
+				if(If_start_run_ringtime)
+				{
+					if(Ringtime_HOU == SysTime.Hour && Ringtime_MIN == SysTime.Minute)
+					{
+						if(ring_run_time--==0) 			//到了次数,不再播放
+						{
+							Ringtime_HOU = 0xFF;
+							Ringtime_MIN = 0xFF;
+							If_start_run_ringtime = 0;
+							ring_run_time = _RING_RUN_TIME;		//初始化一下 下个5遍运行 ,不然ring_run_time--后,0xFF一直间隔响
+						}   
+						else							//重装,间隔x分钟 ring_space_1min
+						{
+							Ringtime_HOU_tmp = Ringtime_HOU_tmp + (Ringtime_MIN_tmp + ring_space_1min)/59;
+							Ringtime_MIN_tmp = (Ringtime_MIN_tmp + ring_space_1min)%59;
+							Ringtime_HOU = Ringtime_HOU_tmp/10*16+Ringtime_HOU_tmp%10;	 	//16进制保存
+							Ringtime_MIN = Ringtime_MIN_tmp/10*16+Ringtime_MIN_tmp%10;
+							If_start_run_ringtime = 1;
+						}							
+	 					If_play_music = 1;
+						play_2tigers();
+	 					If_play_music = 0;
+					}
+				} 
+			}
+}

BIN
自制电子钟_增加闹钟zz/Last Loaded clock.DBK


+ 198 - 0
自制电子钟_增加闹钟zz/STARTUP.A51

@@ -0,0 +1,198 @@
+$NOMOD51
+;------------------------------------------------------------------------------
+;  This file is part of the C51 Compiler package
+;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
+;  Version 8.01
+;
+;  *** <<< Use Configuration Wizard in Context Menu >>> ***
+;------------------------------------------------------------------------------
+;  STARTUP.A51:  This code is executed after processor reset.
+;
+;  To translate this file use A51 with the following invocation:
+;
+;     A51 STARTUP.A51
+;
+;  To link the modified STARTUP.OBJ file to your application use the following
+;  Lx51 invocation:
+;
+;     Lx51 your object file list, STARTUP.OBJ  controls
+;
+;------------------------------------------------------------------------------
+;
+;  User-defined <h> Power-On Initialization of Memory
+;
+;  With the following EQU statements the initialization of memory
+;  at processor reset can be defined:
+;
+; <o> IDATALEN: IDATA memory size <0x0-0x100>
+;     <i> Note: The absolute start-address of IDATA memory is always 0
+;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
+IDATALEN        EQU     80H
+;
+; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
+;     <i> The absolute start address of XDATA memory
+XDATASTART      EQU     0     
+;
+; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
+;     <i> The length of XDATA memory in bytes.
+XDATALEN        EQU     0      
+;
+; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
+;     <i> The absolute start address of PDATA memory
+PDATASTART      EQU     0H
+;
+; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
+;     <i> The length of PDATA memory in bytes.
+PDATALEN        EQU     0H
+;
+;</h>
+;------------------------------------------------------------------------------
+;
+;<h> Reentrant Stack Initialization
+;
+;  The following EQU statements define the stack pointer for reentrant
+;  functions and initialized it:
+;
+; <h> Stack Space for reentrant functions in the SMALL model.
+;  <q> IBPSTACK: Enable SMALL model reentrant stack
+;     <i> Stack space for reentrant functions in the SMALL model.
+IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
+;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
+;     <i> Set the top of the stack to the highest location.
+IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+; </h>
+;
+; <h> Stack Space for reentrant functions in the LARGE model.      
+;  <q> XBPSTACK: Enable LARGE model reentrant stack
+;     <i> Stack space for reentrant functions in the LARGE model.
+XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
+;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
+;     <i> Set the top of the stack to the highest location.
+XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
+; </h>
+;
+; <h> Stack Space for reentrant functions in the COMPACT model.    
+;  <q> PBPSTACK: Enable COMPACT model reentrant stack
+;     <i> Stack space for reentrant functions in the COMPACT model.
+PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
+;
+;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
+;     <i> Set the top of the stack to the highest location.
+PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+; </h>
+;</h>
+;------------------------------------------------------------------------------
+;
+;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
+;  <e>Compact Model Page Definition
+;
+;  <i>Define the XDATA page used for PDATA variables. 
+;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
+;
+; Enable pdata memory page initalization
+PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
+;
+; <o> PPAGE number <0x0-0xFF> 
+; <i> uppermost 256-byte address of the page used for PDATA variables.
+PPAGE           EQU     0
+;
+; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
+; <i> most 8051 variants use P2 as uppermost address byte
+PPAGE_SFR       DATA    0A0H
+;
+; </e>
+;------------------------------------------------------------------------------
+
+; Standard SFR Symbols 
+ACC     DATA    0E0H
+B       DATA    0F0H
+SP      DATA    81H
+DPL     DATA    82H
+DPH     DATA    83H
+
+                NAME    ?C_STARTUP
+
+
+?C_C51STARTUP   SEGMENT   CODE
+?STACK          SEGMENT   IDATA
+
+                RSEG    ?STACK
+                DS      1
+
+                EXTRN CODE (?C_START)
+                PUBLIC  ?C_STARTUP
+
+                CSEG    AT      0
+?C_STARTUP:     LJMP    STARTUP1
+
+                RSEG    ?C_C51STARTUP
+
+STARTUP1:
+
+IF IDATALEN <> 0
+                MOV     R0,#IDATALEN - 1
+                CLR     A
+IDATALOOP:      MOV     @R0,A
+                DJNZ    R0,IDATALOOP
+ENDIF
+
+IF XDATALEN <> 0
+                MOV     DPTR,#XDATASTART
+                MOV     R7,#LOW (XDATALEN)
+  IF (LOW (XDATALEN)) <> 0
+                MOV     R6,#(HIGH (XDATALEN)) +1
+  ELSE
+                MOV     R6,#HIGH (XDATALEN)
+  ENDIF
+                CLR     A
+XDATALOOP:      MOVX    @DPTR,A
+                INC     DPTR
+                DJNZ    R7,XDATALOOP
+                DJNZ    R6,XDATALOOP
+ENDIF
+
+IF PPAGEENABLE <> 0
+                MOV     PPAGE_SFR,#PPAGE
+ENDIF
+
+IF PDATALEN <> 0
+                MOV     R0,#LOW (PDATASTART)
+                MOV     R7,#LOW (PDATALEN)
+                CLR     A
+PDATALOOP:      MOVX    @R0,A
+                INC     R0
+                DJNZ    R7,PDATALOOP
+ENDIF
+
+IF IBPSTACK <> 0
+EXTRN DATA (?C_IBP)
+
+                MOV     ?C_IBP,#LOW IBPSTACKTOP
+ENDIF
+
+IF XBPSTACK <> 0
+EXTRN DATA (?C_XBP)
+
+                MOV     ?C_XBP,#HIGH XBPSTACKTOP
+                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
+ENDIF
+
+IF PBPSTACK <> 0
+EXTRN DATA (?C_PBP)
+                MOV     ?C_PBP,#LOW PBPSTACKTOP
+ENDIF
+
+                MOV     SP,#?STACK-1
+
+; This code is required if you use L51_BANK.A51 with Banking Mode 4
+;<h> Code Banking
+; <q> Select Bank 0 for L51_BANK.A51 Mode 4
+#if 0   
+;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
+EXTRN CODE (?B_SWITCH0)
+                CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
+#endif
+;</h>
+                LJMP    ?C_START
+
+                END

+ 252 - 0
自制电子钟_增加闹钟zz/STARTUP.LST

@@ -0,0 +1,252 @@
+A51 MACRO ASSEMBLER  STARTUP                                                              07/18/2014 16:18:05 PAGE     1
+
+
+MACRO ASSEMBLER A51 V8.00
+OBJECT MODULE PLACED IN STARTUP.OBJ
+ASSEMBLER INVOKED BY: D:\Keil\C51\BIN\A51.EXE STARTUP.A51 SET(SMALL) DEBUG EP
+
+LOC  OBJ            LINE     SOURCE
+
+                       1     $nomod51 
+                       2     ;------------------------------------------------------------------------------
+                       3     ;  This file is part of the C51 Compiler package
+                       4     ;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
+                       5     ;  Version 8.01
+                       6     ;
+                       7     ;  *** <<< Use Configuration Wizard in Context Menu >>> ***
+                       8     ;------------------------------------------------------------------------------
+                       9     ;  STARTUP.A51:  This code is executed after processor reset.
+                      10     ;
+                      11     ;  To translate this file use A51 with the following invocation:
+                      12     ;
+                      13     ;     A51 STARTUP.A51
+                      14     ;
+                      15     ;  To link the modified STARTUP.OBJ file to your application use the following
+                      16     ;  Lx51 invocation:
+                      17     ;
+                      18     ;     Lx51 your object file list, STARTUP.OBJ  controls
+                      19     ;
+                      20     ;------------------------------------------------------------------------------
+                      21     ;
+                      22     ;  User-defined <h> Power-On Initialization of Memory
+                      23     ;
+                      24     ;  With the following EQU statements the initialization of memory
+                      25     ;  at processor reset can be defined:
+                      26     ;
+                      27     ; <o> IDATALEN: IDATA memory size <0x0-0x100>
+                      28     ;     <i> Note: The absolute start-address of IDATA memory is always 0
+                      29     ;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
+  0080                30     IDATALEN        EQU     80H
+                      31     ;
+                      32     ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
+                      33     ;     <i> The absolute start address of XDATA memory
+  0000                34     XDATASTART      EQU     0     
+                      35     ;
+                      36     ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
+                      37     ;     <i> The length of XDATA memory in bytes.
+  0000                38     XDATALEN        EQU     0      
+                      39     ;
+                      40     ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
+                      41     ;     <i> The absolute start address of PDATA memory
+  0000                42     PDATASTART      EQU     0H
+                      43     ;
+                      44     ; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
+                      45     ;     <i> The length of PDATA memory in bytes.
+  0000                46     PDATALEN        EQU     0H
+                      47     ;
+                      48     ;</h>
+                      49     ;------------------------------------------------------------------------------
+                      50     ;
+                      51     ;<h> Reentrant Stack Initialization
+                      52     ;
+                      53     ;  The following EQU statements define the stack pointer for reentrant
+                      54     ;  functions and initialized it:
+                      55     ;
+                      56     ; <h> Stack Space for reentrant functions in the SMALL model.
+                      57     ;  <q> IBPSTACK: Enable SMALL model reentrant stack
+                      58     ;     <i> Stack space for reentrant functions in the SMALL model.
+A51 MACRO ASSEMBLER  STARTUP                                                              07/18/2014 16:18:05 PAGE     2
+
+  0000                59     IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
+                      60     ;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
+                      61     ;     <i> Set the top of the stack to the highest location.
+  0100                62     IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+                      63     ; </h>
+                      64     ;
+                      65     ; <h> Stack Space for reentrant functions in the LARGE model.      
+                      66     ;  <q> XBPSTACK: Enable LARGE model reentrant stack
+                      67     ;     <i> Stack space for reentrant functions in the LARGE model.
+  0000                68     XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
+                      69     ;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
+                      70     ;     <i> Set the top of the stack to the highest location.
+  0000                71     XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
+                      72     ; </h>
+                      73     ;
+                      74     ; <h> Stack Space for reentrant functions in the COMPACT model.    
+                      75     ;  <q> PBPSTACK: Enable COMPACT model reentrant stack
+                      76     ;     <i> Stack space for reentrant functions in the COMPACT model.
+  0000                77     PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
+                      78     ;
+                      79     ;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
+                      80     ;     <i> Set the top of the stack to the highest location.
+  0100                81     PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
+                      82     ; </h>
+                      83     ;</h>
+                      84     ;------------------------------------------------------------------------------
+                      85     ;
+                      86     ;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
+                      87     ;  <e>Compact Model Page Definition
+                      88     ;
+                      89     ;  <i>Define the XDATA page used for PDATA variables. 
+                      90     ;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
+                      91     ;
+                      92     ; Enable pdata memory page initalization
+  0000                93     PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
+                      94     ;
+                      95     ; <o> PPAGE number <0x0-0xFF> 
+                      96     ; <i> uppermost 256-byte address of the page used for PDATA variables.
+  0000                97     PPAGE           EQU     0
+                      98     ;
+                      99     ; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
+                     100     ; <i> most 8051 variants use P2 as uppermost address byte
+  00A0               101     PPAGE_SFR       DATA    0A0H
+                     102     ;
+                     103     ; </e>
+                     104     ;------------------------------------------------------------------------------
+                     105     
+                     106     ; Standard SFR Symbols 
+  00E0               107     ACC     DATA    0E0H
+  00F0               108     B       DATA    0F0H
+  0081               109     SP      DATA    81H
+  0082               110     DPL     DATA    82H
+  0083               111     DPH     DATA    83H
+                     112     
+                     113                     NAME    ?C_STARTUP
+                     114     
+                     115     
+                     116     ?C_C51STARTUP   SEGMENT   CODE
+                     117     ?STACK          SEGMENT   IDATA
+                     118     
+----                 119                     RSEG    ?STACK
+0000                 120                     DS      1
+                     121     
+                     122                     EXTRN CODE (?C_START)
+                     123                     PUBLIC  ?C_STARTUP
+                     124     
+A51 MACRO ASSEMBLER  STARTUP                                                              07/18/2014 16:18:05 PAGE     3
+
+----                 125                     CSEG    AT      0
+0000 020000   F      126     ?C_STARTUP:     LJMP    STARTUP1
+                     127     
+----                 128                     RSEG    ?C_C51STARTUP
+                     129     
+0000                 130     STARTUP1:
+                     131     
+                     132     IF IDATALEN <> 0
+0000 787F            133                     MOV     R0,#IDATALEN - 1
+0002 E4              134                     CLR     A
+0003 F6              135     IDATALOOP:      MOV     @R0,A
+0004 D8FD            136                     DJNZ    R0,IDATALOOP
+                     137     ENDIF
+                     138     
+                     139     IF XDATALEN <> 0
+                                             MOV     DPTR,#XDATASTART
+                                             MOV     R7,#LOW (XDATALEN)
+                               IF (LOW (XDATALEN)) <> 0
+                                             MOV     R6,#(HIGH (XDATALEN)) +1
+                               ELSE
+                                             MOV     R6,#HIGH (XDATALEN)
+                               ENDIF
+                                             CLR     A
+                             XDATALOOP:      MOVX    @DPTR,A
+                                             INC     DPTR
+                                             DJNZ    R7,XDATALOOP
+                                             DJNZ    R6,XDATALOOP
+                             ENDIF
+                     153     
+                     154     IF PPAGEENABLE <> 0
+                                             MOV     PPAGE_SFR,#PPAGE
+                             ENDIF
+                     157     
+                     158     IF PDATALEN <> 0
+                                             MOV     R0,#LOW (PDATASTART)
+                                             MOV     R7,#LOW (PDATALEN)
+                                             CLR     A
+                             PDATALOOP:      MOVX    @R0,A
+                                             INC     R0
+                                             DJNZ    R7,PDATALOOP
+                             ENDIF
+                     166     
+                     167     IF IBPSTACK <> 0
+                             EXTRN DATA (?C_IBP)
+                             
+                                             MOV     ?C_IBP,#LOW IBPSTACKTOP
+                             ENDIF
+                     172     
+                     173     IF XBPSTACK <> 0
+                             EXTRN DATA (?C_XBP)
+                             
+                                             MOV     ?C_XBP,#HIGH XBPSTACKTOP
+                                             MOV     ?C_XBP+1,#LOW XBPSTACKTOP
+                             ENDIF
+                     179     
+                     180     IF PBPSTACK <> 0
+                             EXTRN DATA (?C_PBP)
+                                             MOV     ?C_PBP,#LOW PBPSTACKTOP
+                             ENDIF
+                     184     
+0006 758100   F      185                     MOV     SP,#?STACK-1
+                     186     
+                     187     ; This code is required if you use L51_BANK.A51 with Banking Mode 4
+                     188     ;<h> Code Banking
+                     189     ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
+                     190     
+A51 MACRO ASSEMBLER  STARTUP                                                              07/18/2014 16:18:05 PAGE     4
+
+                             
+                             
+                                             
+                             
+                     195     ;</h>
+0009 020000   F      196                     LJMP    ?C_START
+                     197     
+                     198                     END
+A51 MACRO ASSEMBLER  STARTUP                                                              07/18/2014 16:18:05 PAGE     5
+
+SYMBOL TABLE LISTING
+------ ----- -------
+
+
+N A M E             T Y P E  V A L U E   ATTRIBUTES
+
+?C_C51STARTUP. . .  C SEG    000CH       REL=UNIT
+?C_START . . . . .  C ADDR   -----       EXT
+?C_STARTUP . . . .  C ADDR   0000H   A   
+?STACK . . . . . .  I SEG    0001H       REL=UNIT
+ACC. . . . . . . .  D ADDR   00E0H   A   
+B. . . . . . . . .  D ADDR   00F0H   A   
+DPH. . . . . . . .  D ADDR   0083H   A   
+DPL. . . . . . . .  D ADDR   0082H   A   
+IBPSTACK . . . . .  N NUMB   0000H   A   
+IBPSTACKTOP. . . .  N NUMB   0100H   A   
+IDATALEN . . . . .  N NUMB   0080H   A   
+IDATALOOP. . . . .  C ADDR   0003H   R   SEG=?C_C51STARTUP
+PBPSTACK . . . . .  N NUMB   0000H   A   
+PBPSTACKTOP. . . .  N NUMB   0100H   A   
+PDATALEN . . . . .  N NUMB   0000H   A   
+PDATASTART . . . .  N NUMB   0000H   A   
+PPAGE. . . . . . .  N NUMB   0000H   A   
+PPAGEENABLE. . . .  N NUMB   0000H   A   
+PPAGE_SFR. . . . .  D ADDR   00A0H   A   
+SP . . . . . . . .  D ADDR   0081H   A   
+STARTUP1 . . . . .  C ADDR   0000H   R   SEG=?C_C51STARTUP
+XBPSTACK . . . . .  N NUMB   0000H   A   
+XBPSTACKTOP. . . .  N NUMB   0000H   A   
+XDATALEN . . . . .  N NUMB   0000H   A   
+XDATASTART . . . .  N NUMB   0000H   A   
+
+
+REGISTER BANK(S) USED: 0 
+
+
+ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)

BIN
自制电子钟_增加闹钟zz/STARTUP.OBJ


BIN
自制电子钟_增加闹钟zz/Sheet1.Pcb


BIN
自制电子钟_增加闹钟zz/Sheet1.Sch


+ 178 - 0
自制电子钟_增加闹钟zz/SoundPlay.h

@@ -0,0 +1,178 @@
+/**************************************************************************
+   
+     					SOUND PLAY FOR 51MCU
+  
+               		COPYRIGHT (c)   2005 BY JJJ.
+                       		--  ALL RIGHTS RESERVED  --
+  
+   File Name:       SoundPlay.h
+   Author:          Jiang Jian Jun
+   Created:         2005/5/16
+   Modified:		NO
+   Revision: 		1.0
+  
+*******************************************************************************/
+
+/*说明**************************************************************************
+ 曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0};	末尾:0,0 表示结束(Important)
+
+ 音高由三位数字组成:
+ 		个位是表示 1~7 这七个音符 
+ 		十位是表示音符所在的音区:1-低音,2-中音,3-高音;
+ 		百位表示这个音符是否要升半音: 0-不升,1-升半音。
+ 
+ 音长最多由三位数字组成: 
+ 		个位表示音符的时值,其对应关系是: 
+ 			|数值(n):  |0 |1 |2 |3 | 4 | 5 | 6 
+ 			|几分音符: |1 |2 |4 |8 |16 |32 |64 		音符=2^n
+ 		十位表示音符的演奏效果(0-2):  0-普通,1-连音,2-顿音
+ 		百位是符点位: 0-无符点,1-有符点
+
+ 调用演奏子程序的格式
+ 		Play(乐曲名,调号,升降八度,演奏速度);
+	|乐曲名           : 要播放的乐曲指针,结尾以(0,0)结束;
+	|调号(0-11)       :	是指乐曲升多少个半音演奏;
+	|升降八度(1-3)	  : 1:降八度, 2:不升不降, 3:升八度;
+	|演奏速度(1-12000):	值越大速度越快;
+
+***************************************************************************/
+#ifndef __SOUNDPLAY_H_REVISION_FIRST__
+#define __SOUNDPLAY_H_REVISION_FIRST__
+
+//**************************************************************************
+
+#define SYSTEM_OSC 		12000000	//定义晶振频率12000000HZ
+#define SOUND_SPACE 	4/5 		//定义普通音符演奏的长度分率,//每4分音符间隔
+sbit    BeepIO    =   	P1^7;		//定义输出管脚
+
+unsigned int  code FreTab[12]  = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
+unsigned char code SignTab[7]  = { 0,2,4,5,7,9,11 }; 								  //1~7在频率表中的位置
+unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };						
+unsigned char Sound_Temp_TH0,Sound_Temp_TL0;	//音符定时器初值暂存 
+unsigned char Sound_Temp_TH1,Sound_Temp_TL1;	//音长定时器初值暂存
+//**************************************************************************
+void InitialSound(void)
+{
+	BeepIO = 0;
+	Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;	// 计算TL1应装入的初值 	(10ms的初装值)
+	Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;	// 计算TH1应装入的初值 
+	TH1 = Sound_Temp_TH1;
+	TL1 = Sound_Temp_TL1;
+	TMOD  |= 0x11;
+	ET0    = 1;
+	ET1	   = 0;
+	TR0	   = 0;
+	TR1    = 0;
+	EA     = 1;
+}
+
+/*
+void BeepTimer0(void) interrupt 1	//音符发生中断
+{
+	BeepIO = !BeepIO;
+	TH0    = Sound_Temp_TH0;
+ 	TL0    = Sound_Temp_TL0;
+}*/
+//**************************************************************************
+void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
+{
+	unsigned int NewFreTab[12];		//新的频率表
+	unsigned char i,j;
+	unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
+	unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
+	for(i=0;i<12;i++) 				// 根据调号及升降八度来生成新的频率表 
+	{
+		j = i + Signature;
+		if(j > 11)
+		{
+			j = j-12;
+			NewFreTab[i] = FreTab[j]*2;
+		}
+		else
+			NewFreTab[i] = FreTab[j];
+
+		if(Octachord == 1)
+			NewFreTab[i]>>=2;
+		else if(Octachord == 3)
+			NewFreTab[i]<<=2;
+	}									
+	
+	SoundLength = 0;
+	while(Sound[SoundLength] != 0x00)	//计算歌曲长度
+	{
+		SoundLength+=2;
+	}
+
+	Point = 0;
+	Tone   = Sound[Point];	
+	Length = Sound[Point+1]; 			// 读出第一个音符和它时时值
+	
+	LDiv0 = 12000/Speed;				// 算出1分音符的长度(几个10ms) 	
+	LDiv4 = LDiv0/4; 					// 算出4分音符的长度 
+	LDiv4 = LDiv4-LDiv4*SOUND_SPACE; 	// 普通音最长间隔标准 
+	TR0	  = 0;
+	TR1   = 1;
+	while(Point < SoundLength)
+	{
+		SL=Tone%10; 								//计算出音符 
+		SM=Tone/10%10; 								//计算出高低音 
+		SH=Tone/100; 								//计算出是否升半 
+		CurrentFre = NewFreTab[SignTab[SL-1]+SH]; 	//查出对应音符的频率 	
+		if(SL!=0)
+		{
+			if (SM==1) CurrentFre >>= 2; 		//低音 
+			if (SM==3) CurrentFre <<= 2; 		//高音
+			Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
+			Sound_Temp_TH0 = Temp_T/256; 
+			Sound_Temp_TL0 = Temp_T%256; 
+			TH0 = Sound_Temp_TH0;  
+			TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿 
+		}
+		SLen=LengthTab[Length%10]; 	//算出是几分音符
+		XG=Length/10%10; 			//算出音符类型(0普通1连音2顿音) 
+		FD=Length/100;
+		LDiv=LDiv0/SLen; 			//算出连音音符演奏的长度(多少个10ms)
+		if (FD==1) 
+			LDiv=LDiv+LDiv/2;
+		if(XG!=1)	
+			if(XG==0) 				//算出普通音符的演奏长度 
+				if (SLen<=4)	
+					LDiv1=LDiv-LDiv4;
+				else
+					LDiv1=LDiv*SOUND_SPACE;
+			else
+				LDiv1=LDiv/2; 		//算出顿音的演奏长度 
+		else
+			LDiv1=LDiv;
+		if(SL==0) LDiv1=0;
+			LDiv2=LDiv-LDiv1; 		//算出不发音的长度 
+	  	if (SL!=0)
+		{
+			TR0=1;
+			for(i=LDiv1;i>0;i--) 	//发规定长度的音 
+			{
+				while(TF1==0);
+				TH1 = Sound_Temp_TH1;
+				TL1 = Sound_Temp_TL1;
+				TF1=0;
+			}
+		}
+		if(LDiv2!=0)
+		{
+			TR0=0; BeepIO=0;
+			for(i=LDiv2;i>0;i--) 	//音符间的间隔
+			{
+				while(TF1==0);
+				TH1 = Sound_Temp_TH1;
+				TL1 = Sound_Temp_TL1;
+				TF1=0;
+			}
+		}
+		Point+=2; 
+		Tone=Sound[Point];
+		Length=Sound[Point+1];
+	}
+	BeepIO = 0;
+}
+//**************************************************************************
+#endif

BIN
自制电子钟_增加闹钟zz/clock.DSN


BIN
自制电子钟_增加闹钟zz/clock.PWI


BIN
自制电子钟_增加闹钟zz/dianzizhong


+ 1094 - 0
自制电子钟_增加闹钟zz/dianzizhong.M51

@@ -0,0 +1,1094 @@
+BL51 BANKED LINKER/LOCATER V6.00                                                        07/22/2014  16:33:38  PAGE 1
+
+
+BL51 BANKED LINKER/LOCATER V6.00, INVOKED BY:
+D:\KEIL\C51\BIN\BL51.EXE LED时钟.obj TO dianzizhong
+
+
+MEMORY MODEL: SMALL
+
+
+INPUT MODULES INCLUDED:
+  LED时钟.obj (LED时钟)
+  D:\KEIL\C51\LIB\C51S.LIB (?C_STARTUP)
+  D:\KEIL\C51\LIB\C51S.LIB (?C?SCDIV)
+  D:\KEIL\C51\LIB\C51S.LIB (?C?CLDPTR)
+  D:\KEIL\C51\LIB\C51S.LIB (?C?CSTPTR)
+  D:\KEIL\C51\LIB\C51S.LIB (?C?CSTOPTR)
+  D:\KEIL\C51\LIB\C51S.LIB (?C?UIDIV)
+  D:\KEIL\C51\LIB\C51S.LIB (?C_INIT)
+
+
+LINK MAP OF MODULE:  dianzizhong (LED时钟)
+
+
+            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
+            -----------------------------------------------------
+
+            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
+            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
+            DATA    0008H     0005H     UNIT         _DATA_GROUP_
+                    000DH     0013H                  *** GAP ***
+            BIT     0020H.0   0001H.6   UNIT         ?BI?LED时钟
+                    0021H.6   0000H.2                *** GAP ***
+            DATA    0022H     0033H     UNIT         ?DT?LED时钟
+            IDATA   0055H     0001H     UNIT         ?STACK
+
+            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
+            CODE    0000H     0003H     ABSOLUTE     
+                    0003H     0008H                  *** GAP ***
+            CODE    000BH     0003H     ABSOLUTE     
+            CODE    000EH     000BH     UNIT         ?PR?_READ1302?LED时钟
+                    0019H     0002H                  *** GAP ***
+            CODE    001BH     0003H     ABSOLUTE     
+            CODE    001EH     07D7H     UNIT         ?PR?DISPLAY?LED时钟
+            CODE    07F5H     015BH     UNIT         ?PR?JUST_PLAY_WHEN_BEEP?LED时钟
+            CODE    0950H     00C4H     UNIT         ?C?LIB_CODE
+            CODE    0A14H     00C1H     UNIT         ?PR?MAIN?LED时钟
+            CODE    0AD5H     00BDH     UNIT         ?PR?SCAN_KEY?LED时钟
+            CODE    0B92H     00BAH     UNIT         ?CO?LED时钟
+            CODE    0C4CH     00A9H     UNIT         ?PR?_SET_ID?LED时钟
+            CODE    0CF5H     009AH     UNIT         ?PR?PLAY_2TIGERS?LED时钟
+            CODE    0D8FH     008CH     UNIT         ?C_C51STARTUP
+            CODE    0E1BH     0088H     UNIT         ?PR?T1?LED时钟
+            CODE    0EA3H     0078H     UNIT         ?PR?ID_CASE2_KEY?LED时钟
+            CODE    0F1BH     0072H     UNIT         ?PR?SET_RINGTIME_CASE0?LED时钟
+            CODE    0F8DH     006DH     UNIT         ?PR?INTO_SET_RINGTIME?LED时钟
+            CODE    0FFAH     0051H     UNIT         ?PR?_DS1302_GETTIME?LED时钟
+            CODE    104BH     0049H     UNIT         ?PR?SET_RINGTIME_CASE1?LED时钟
+            CODE    1094H     0048H     UNIT         ?PR?_SET_RINGTIME_ID?LED时钟
+            CODE    10DCH     0048H     UNIT         ?C_INITSEG
+            CODE    1124H     0035H     UNIT         ?PR?T0_INT?LED时钟
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 2
+
+
+            CODE    1159H     002DH     UNIT         ?PR?ID_CASE1_KEY?LED时钟
+            CODE    1186H     0025H     UNIT         ?PR?_SET1302?LED时钟
+            CODE    11ABH     0025H     UNIT         ?PR?_DS1302_SETTIME?LED时钟
+            CODE    11D0H     0021H     UNIT         ?PR?_DELAY_MUSIC?LED时钟
+            CODE    11F1H     001EH     UNIT         ?PR?_DELAYS?LED时钟
+            CODE    120FH     0016H     UNIT         ?PR?_RTINPUTBYTE?LED时钟
+            CODE    1225H     0014H     UNIT         ?PR?PAUSE_MUSIC?LED时钟
+            CODE    1239H     0013H     UNIT         ?PR?_WRITE1302?LED时钟
+            CODE    124CH     0012H     UNIT         ?PR?INITIAL_DS1302?LED时钟
+            CODE    125EH     0012H     UNIT         ?PR?INITIALT0T1?LED时钟
+            CODE    1270H     0010H     UNIT         ?PR?RTOUTPUTBYTE?LED时钟
+
+
+
+OVERLAY MAP OF MODULE:   dianzizhong (LED时钟)
+
+
+SEGMENT                                   DATA_GROUP 
+  +--> CALLED SEGMENT                   START    LENGTH
+-------------------------------------------------------
+?PR?T0_INT?LED时钟                      -----    -----
+  +--> ?CO?LED时钟
+
+*** NEW ROOT ***************************************************
+
+?C_C51STARTUP                           -----    -----
+  +--> ?PR?MAIN?LED时钟
+  +--> ?C_INITSEG
+
+?PR?MAIN?LED时钟                        -----    -----
+  +--> ?PR?INITIALT0T1?LED时钟
+  +--> ?PR?_WRITE1302?LED时钟
+  +--> ?PR?INITIAL_DS1302?LED时钟
+  +--> ?PR?_SET1302?LED时钟
+  +--> ?PR?_DELAYS?LED时钟
+  +--> ?PR?_DS1302_GETTIME?LED时钟
+  +--> ?PR?SCAN_KEY?LED时钟
+  +--> ?PR?DISPLAY?LED时钟
+  +--> ?PR?PLAY_2TIGERS?LED时钟
+
+?PR?_WRITE1302?LED时钟                  -----    -----
+  +--> ?PR?_RTINPUTBYTE?LED时钟
+
+?PR?INITIAL_DS1302?LED时钟              -----    -----
+  +--> ?PR?_READ1302?LED时钟
+  +--> ?PR?_DS1302_SETTIME?LED时钟
+
+?PR?_READ1302?LED时钟                   -----    -----
+  +--> ?PR?_RTINPUTBYTE?LED时钟
+  +--> ?PR?RTOUTPUTBYTE?LED时钟
+
+?PR?_DS1302_SETTIME?LED时钟             -----    -----
+  +--> ?PR?_WRITE1302?LED时钟
+
+?PR?_SET1302?LED时钟                    0008H    0001H
+  +--> ?PR?_WRITE1302?LED时钟
+
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 3
+
+
+?PR?_DS1302_GETTIME?LED时钟             -----    -----
+  +--> ?PR?_READ1302?LED时钟
+
+?PR?SCAN_KEY?LED时钟                    -----    -----
+  +--> ?PR?DISPLAY?LED时钟
+  +--> ?PR?ID_CASE2_KEY?LED时钟
+  +--> ?PR?ID_CASE1_KEY?LED时钟
+  +--> ?PR?INTO_SET_RINGTIME?LED时钟
+
+?PR?DISPLAY?LED时钟                     0008H    0001H
+  +--> ?PR?_DELAYS?LED时钟
+  +--> ?CO?LED时钟
+
+?PR?ID_CASE2_KEY?LED时钟                -----    -----
+  +--> ?PR?DISPLAY?LED时钟
+  +--> ?PR?INTO_SET_RINGTIME?LED时钟
+
+?PR?INTO_SET_RINGTIME?LED时钟           -----    -----
+  +--> ?PR?DISPLAY?LED时钟
+  +--> ?PR?SET_RINGTIME_CASE0?LED时钟
+  +--> ?PR?SET_RINGTIME_CASE1?LED时钟
+
+?PR?SET_RINGTIME_CASE0?LED时钟          -----    -----
+  +--> ?PR?DISPLAY?LED时钟
+
+?PR?SET_RINGTIME_CASE1?LED时钟          -----    -----
+  +--> ?PR?DISPLAY?LED时钟
+  +--> ?PR?_SET_RINGTIME_ID?LED时钟
+
+?PR?ID_CASE1_KEY?LED时钟                -----    -----
+  +--> ?PR?DISPLAY?LED时钟
+  +--> ?PR?_SET_ID?LED时钟
+
+?PR?_SET_ID?LED时钟                     0008H    0001H
+  +--> ?PR?_READ1302?LED时钟
+  +--> ?PR?_WRITE1302?LED时钟
+
+?PR?PLAY_2TIGERS?LED时钟                0008H    0002H
+  +--> ?CO?LED时钟
+  +--> ?PR?_DELAY_MUSIC?LED时钟
+  +--> ?PR?PAUSE_MUSIC?LED时钟
+
+?PR?_DELAY_MUSIC?LED时钟                000AH    0002H
+  +--> ?PR?JUST_PLAY_WHEN_BEEP?LED时钟
+
+?PR?JUST_PLAY_WHEN_BEEP?LED时钟         000CH    0001H
+  +--> ?CO?LED时钟
+
+?PR?PAUSE_MUSIC?LED时钟                 000AH    0001H
+  +--> ?PR?JUST_PLAY_WHEN_BEEP?LED时钟
+
+
+
+SYMBOL TABLE OF MODULE:  dianzizhong (LED时钟)
+
+  VALUE           TYPE          NAME
+  ----------------------------------
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 4
+
+
+
+  -------         MODULE        LED时钟
+  C:0000H         SYMBOL        _ICE_DUMMY_
+  D:0093H         PUBLIC        P0M1
+  B:00E0H.7       PUBLIC        ACC7
+  B:0020H.0       PUBLIC        second
+  D:0080H         PUBLIC        P0
+  C:1094H         PUBLIC        _Set_ringtime_id
+  D:0090H         PUBLIC        P1
+  D:00A0H         PUBLIC        P2
+  B:00A8H.7       PUBLIC        EA
+  D:0024H         PUBLIC        Ringtime_MIN
+  C:124CH         PUBLIC        Initial_DS1302
+  B:0090H.2       PUBLIC        T_CLK
+  C:0F8DH         PUBLIC        Into_set_ringtime
+  D:0025H         PUBLIC        second_time
+  D:0026H         PUBLIC        Ringtime_HOU
+  C:0AD5H         PUBLIC        Scan_Key
+  D:0027H         PUBLIC        per_run_time
+  B:00B0H.0       PUBLIC        P3_0
+  B:0020H.1       PUBLIC        minute
+  B:0080H.7       PUBLIC        P0_7
+  B:0020H.2       PUBLIC        flag
+  B:0020H.3       PUBLIC        If_Into_set_ringtime
+  C:0BF6H         PUBLIC        music
+  C:0E1BH         PUBLIC        t1
+  B:00A0H.1       PUBLIC        UP
+  C:000EH         PUBLIC        _Read1302
+  B:00A0H.3       PUBLIC        MODE
+  C:1225H         PUBLIC        pause_music
+  C:0A14H         PUBLIC        main
+  B:0020H.4       PUBLIC        month
+  C:1159H         PUBLIC        id_case1_key
+  C:0EA3H         PUBLIC        id_case2_key
+  B:0020H.5       PUBLIC        system_1s_flag
+  B:0090H.0       PUBLIC        T_RST
+  C:1124H         PUBLIC        T0_int
+  C:1215H         PUBLIC        _RTInputByte
+  B:0020H.6       PUBLIC        If_start_flash
+  B:0020H.7       PUBLIC        days
+  C:123DH         PUBLIC        _Write1302
+  D:0089H         PUBLIC        TMOD
+  B:0090H.7       PUBLIC        beepIO
+  C:0C42H         PUBLIC        tab
+  B:0021H.0       PUBLIC        years_1
+  B:0021H.1       PUBLIC        years_2
+  B:00A0H.2       PUBLIC        DOWN
+  C:0C4CH         PUBLIC        _Set_id
+  D:0028H         PUBLIC        set_flash_flag
+  D:0029H         PUBLIC        Ringtime_MIN_tmp
+  B:0021H.2       PUBLIC        If_start_run_ringtime
+  B:0021H.3       PUBLIC        hour
+  C:0F1BH         PUBLIC        set_ringtime_case0
+  C:104BH         PUBLIC        set_ringtime_case1
+  D:002AH         PUBLIC        Ringtime_HOU_tmp
+  D:00E0H         PUBLIC        ACC
+  B:0021H.4       PUBLIC        flag_1302_1s
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 5
+
+
+  B:00A8H.1       PUBLIC        ET0
+  B:00A8H.3       PUBLIC        ET1
+  B:0090H.1       PUBLIC        T_IO
+  D:008CH         PUBLIC        TH0
+  B:0021H.5       PUBLIC        If_play_music
+  D:002BH         PUBLIC        id
+  D:008DH         PUBLIC        TH1
+  D:008AH         PUBLIC        TL0
+  D:008BH         PUBLIC        TL1
+  D:002CH         PUBLIC        SysTime
+  C:0FFAH         PUBLIC        _DS1302_GetTime
+  C:0B92H         PUBLIC        T
+  C:1270H         PUBLIC        RTOutputByte
+  C:1186H         PUBLIC        _Set1302
+  B:0090H.4       PUBLIC        SYSLED
+  B:0088H.4       PUBLIC        TR0
+  B:0088H.6       PUBLIC        TR1
+  C:125EH         PUBLIC        InitialT0T1
+  C:0CF5H         PUBLIC        play_2tigers
+  C:11ABH         PUBLIC        _DS1302_SetTime
+  D:0045H         PUBLIC        timecount
+  B:0090H.3       PUBLIC        COL
+  D:0046H         PUBLIC        system_26s_flag
+  C:11FEH         PUBLIC        _delays
+  B:00A0H.7       PUBLIC        led0
+  B:00A0H.6       PUBLIC        led1
+  D:0047H         PUBLIC        inittime
+  B:00A0H.5       PUBLIC        led2
+  B:00A0H.4       PUBLIC        led3
+  D:004EH         PUBLIC        re_disp
+  D:004FH         PUBLIC        ring_flash_countdown
+  B:00A0H.0       PUBLIC        SET
+  D:0050H         PUBLIC        m
+  D:0051H         PUBLIC        n
+  C:07F5H         PUBLIC        just_play_when_beep
+  C:11D0H         PUBLIC        _delay_music
+  D:0052H         PUBLIC        s_state
+  B:00E0H.0       PUBLIC        ACC0
+  D:0053H         PUBLIC        ring_space_1min
+  C:001EH         PUBLIC        display
+  D:0054H         PUBLIC        ring_run_time
+  D:0094H         PUBLIC        P0M0
+  -------         PROC          L?0423
+  -------         ENDPROC       L?0423
+  -------         PROC          _RTINPUTBYTE
+  D:0007H         SYMBOL        d
+  -------         DO            
+  D:0007H         SYMBOL        i
+  -------         ENDDO         
+  C:1215H         LINE#         51
+  C:1215H         LINE#         52
+  C:1215H         LINE#         54
+  C:1216H         LINE#         55
+  C:1218H         LINE#         56
+  C:1218H         LINE#         57
+  C:121CH         LINE#         58
+  C:121EH         LINE#         59
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 6
+
+
+  C:1220H         LINE#         60
+  C:1222H         LINE#         61
+  C:1224H         LINE#         62
+  -------         ENDPROC       _RTINPUTBYTE
+  -------         PROC          RTOUTPUTBYTE
+  -------         DO            
+  D:0007H         SYMBOL        i
+  -------         ENDDO         
+  C:1270H         LINE#         72
+  C:1270H         LINE#         73
+  C:1270H         LINE#         75
+  C:1272H         LINE#         76
+  C:1272H         LINE#         77
+  C:1274H         LINE#         78
+  C:1278H         LINE#         79
+  C:127AH         LINE#         80
+  C:127CH         LINE#         81
+  C:127EH         LINE#         82
+  C:127FH         LINE#         83
+  -------         ENDPROC       RTOUTPUTBYTE
+  C:1239H         SYMBOL        L?0422
+  -------         PROC          L?0421
+  -------         ENDPROC       L?0421
+  C:1239H         SYMBOL        L?0422
+  -------         PROC          _WRITE1302
+  D:0007H         SYMBOL        ucAddr
+  D:0006H         SYMBOL        ucDa
+  C:123DH         LINE#         92
+  C:123FH         LINE#         93
+  C:123FH         LINE#         94
+  C:123FH         LINE#         95
+  C:123FH         LINE#         96
+  C:123FH         LINE#         97
+  C:1242H         LINE#         98
+  C:1247H         LINE#         99
+  C:1249H         LINE#         100
+  C:124BH         LINE#         101
+  -------         ENDPROC       _WRITE1302
+  -------         PROC          _READ1302
+  D:0007H         SYMBOL        ucAddr
+  -------         DO            
+  D:0007H         SYMBOL        ucData
+  -------         ENDDO         
+  C:000EH         LINE#         110
+  C:000EH         LINE#         111
+  C:000EH         LINE#         113
+  C:000EH         LINE#         114
+  C:000EH         LINE#         115
+  C:000EH         LINE#         116
+  C:0011H         LINE#         117
+  C:0014H         LINE#         118
+  C:0016H         LINE#         119
+  C:0018H         LINE#         120
+  C:0018H         LINE#         121
+  -------         ENDPROC       _READ1302
+  -------         PROC          _SET1302
+  D:0001H         SYMBOL        pClock
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 7
+
+
+  -------         DO            
+  D:0004H         SYMBOL        i
+  D:0008H         SYMBOL        ucAddr
+  -------         ENDDO         
+  C:1186H         LINE#         131
+  C:1186H         LINE#         132
+  C:1186H         LINE#         134
+  C:1189H         LINE#         135
+  C:118CH         LINE#         136
+  C:118EH         LINE#         137
+  C:118EH         LINE#         138
+  C:1197H         LINE#         139
+  C:119EH         LINE#         140
+  C:11A2H         LINE#         141
+  C:11A4H         LINE#         142
+  -------         ENDPROC       _SET1302
+  -------         PROC          _DS1302_GETTIME
+  D:0001H         SYMBOL        Time
+  C:0FFAH         LINE#         146
+  C:0FFAH         LINE#         147
+  C:0FFAH         LINE#         172
+  C:1003H         LINE#         173
+  C:100FH         LINE#         174
+  C:101BH         LINE#         175
+  C:1027H         LINE#         176
+  C:1033H         LINE#         177
+  C:103FH         LINE#         178
+  -------         ENDPROC       _DS1302_GETTIME
+  -------         PROC          _DELAY_MUSIC
+  D:000AH         SYMBOL        p
+  -------         DO            
+  D:000BH         SYMBOL        i
+  D:0007H         SYMBOL        j
+  -------         ENDDO         
+  C:11D0H         LINE#         24
+  C:11D2H         LINE#         25
+  C:11D2H         LINE#         27
+  C:11D9H         LINE#         28
+  C:11DCH         LINE#         29
+  C:11DFH         LINE#         30
+  C:11E3H         LINE#         31
+  C:11F0H         LINE#         32
+  -------         ENDPROC       _DELAY_MUSIC
+  -------         PROC          PAUSE_MUSIC
+  -------         DO            
+  D:000AH         SYMBOL        i
+  D:0007H         SYMBOL        j
+  -------         ENDDO         
+  C:1225H         LINE#         34
+  C:1225H         LINE#         35
+  C:1225H         LINE#         37
+  C:1228H         LINE#         38
+  C:122BH         LINE#         39
+  C:122FH         LINE#         40
+  C:1238H         LINE#         41
+  -------         ENDPROC       PAUSE_MUSIC
+  -------         PROC          T0_INT
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 8
+
+
+  C:1124H         LINE#         42
+  C:112CH         LINE#         44
+  C:112EH         LINE#         45
+  C:1150H         LINE#         46
+  -------         ENDPROC       T0_INT
+  -------         PROC          PLAY_2TIGERS
+  -------         DO            
+  D:0008H         SYMBOL        i
+  D:0009H         SYMBOL        j
+  -------         ENDDO         
+  C:0CF5H         LINE#         58
+  C:0CF5H         LINE#         59
+  C:0CF5H         LINE#         60
+  C:0CFAH         LINE#         63
+  C:0D01H         LINE#         64
+  C:0D01H         LINE#         65
+  C:0D0BH         LINE#         66
+  C:0D0BH         LINE#         67
+  C:0D2DH         LINE#         68
+  C:0D37H         LINE#         69
+  C:0D39H         LINE#         70
+  C:0D3DH         LINE#         71
+  C:0D41H         LINE#         72
+  C:0D46H         LINE#         73
+  C:0D52H         LINE#         74
+  C:0D64H         LINE#         75
+  C:0D74H         LINE#         77
+  C:0D7DH         LINE#         78
+  C:0D7FH         LINE#         79
+  C:0D88H         LINE#         80
+  C:0D8BH         LINE#         81
+  C:0D8EH         LINE#         82
+  -------         ENDPROC       PLAY_2TIGERS
+  C:11F1H         SYMBOL        L?0420
+  -------         PROC          L?0419
+  -------         ENDPROC       L?0419
+  C:11F1H         SYMBOL        L?0420
+  -------         PROC          _DELAYS
+  D:0007H         SYMBOL        k
+  -------         DO            
+  D:0006H         SYMBOL        i
+  D:0005H         SYMBOL        j
+  -------         ENDDO         
+  C:11FEH         LINE#         82
+  C:11FEH         LINE#         83
+  C:11FEH         LINE#         85
+  C:1205H         LINE#         86
+  C:120EH         LINE#         87
+  -------         ENDPROC       _DELAYS
+  -------         PROC          DISPLAY
+  -------         DO            
+  D:0003H         SYMBOL        year_temp
+  D:0008H         SYMBOL        secound_temp
+  -------         ENDDO         
+  C:001EH         LINE#         89
+  C:001EH         LINE#         90
+  C:001EH         LINE#         93
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 9
+
+
+  C:0024H         LINE#         94
+  C:0024H         LINE#         95
+  C:0026H         LINE#         96
+  C:0029H         LINE#         97
+  C:0029H         LINE#         98
+  C:002CH         LINE#         99
+  C:002CH         LINE#         100
+  C:0032H         LINE#         101
+  C:0039H         LINE#         102
+  C:0043H         LINE#         103
+  C:004FH         LINE#         104
+  C:004FH         LINE#         106
+  C:0076H         LINE#         107
+  C:0076H         LINE#         108
+  C:0076H         LINE#         109
+  C:007CH         LINE#         110
+  C:007CH         LINE#         111
+  C:008CH         LINE#         112
+  C:00A2H         LINE#         113
+  C:00A4H         LINE#         115
+  C:00A4H         LINE#         116
+  C:00CCH         LINE#         117
+  C:00F3H         LINE#         118
+  C:00F3H         LINE#         119
+  C:00F9H         LINE#         120
+  C:00F9H         LINE#         121
+  C:0109H         LINE#         122
+  C:011FH         LINE#         123
+  C:0121H         LINE#         125
+  C:0121H         LINE#         126
+  C:0149H         LINE#         127
+  C:0170H         LINE#         128
+  C:0170H         LINE#         130
+  C:0170H         LINE#         132
+  C:0173H         LINE#         133
+  C:0173H         LINE#         134
+  C:017DH         LINE#         135
+  C:017DH         LINE#         136
+  C:0183H         LINE#         137
+  C:0183H         LINE#         138
+  C:0193H         LINE#         139
+  C:01A9H         LINE#         140
+  C:01ABH         LINE#         142
+  C:01ABH         LINE#         143
+  C:01D3H         LINE#         144
+  C:01FAH         LINE#         145
+  C:01FAH         LINE#         146
+  C:0200H         LINE#         147
+  C:0200H         LINE#         148
+  C:0210H         LINE#         149
+  C:0226H         LINE#         150
+  C:0228H         LINE#         152
+  C:0228H         LINE#         153
+  C:0252H         LINE#         154
+  C:0279H         LINE#         155
+  C:0279H         LINE#         157
+  C:0279H         LINE#         159
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 10
+
+
+  C:027CH         LINE#         161
+  C:027CH         LINE#         162
+  C:0282H         LINE#         163
+  C:0282H         LINE#         164
+  C:0292H         LINE#         165
+  C:02A8H         LINE#         166
+  C:02AAH         LINE#         168
+  C:02AAH         LINE#         169
+  C:02D2H         LINE#         170
+  C:02F9H         LINE#         171
+  C:02F9H         LINE#         172
+  C:02FFH         LINE#         173
+  C:02FFH         LINE#         174
+  C:030FH         LINE#         175
+  C:0325H         LINE#         176
+  C:0327H         LINE#         178
+  C:0327H         LINE#         179
+  C:034FH         LINE#         180
+  C:0376H         LINE#         181
+  C:0376H         LINE#         183
+  C:0376H         LINE#         185
+  C:0376H         LINE#         187
+  C:0379H         LINE#         188
+  C:0379H         LINE#         189
+  C:037FH         LINE#         190
+  C:037FH         LINE#         191
+  C:038FH         LINE#         192
+  C:03A5H         LINE#         193
+  C:03A7H         LINE#         195
+  C:03A7H         LINE#         196
+  C:03CFH         LINE#         197
+  C:03F6H         LINE#         198
+  C:03F6H         LINE#         199
+  C:03FCH         LINE#         200
+  C:03FCH         LINE#         201
+  C:040CH         LINE#         202
+  C:0422H         LINE#         203
+  C:0424H         LINE#         205
+  C:0424H         LINE#         206
+  C:044CH         LINE#         207
+  C:0473H         LINE#         208
+  C:0473H         LINE#         210
+  C:0473H         LINE#         212
+  C:0476H         LINE#         214
+  C:0476H         LINE#         215
+  C:047CH         LINE#         216
+  C:047CH         LINE#         217
+  C:048CH         LINE#         218
+  C:04A2H         LINE#         219
+  C:04A4H         LINE#         221
+  C:04A4H         LINE#         222
+  C:04CCH         LINE#         223
+  C:04F3H         LINE#         224
+  C:04F3H         LINE#         225
+  C:04F9H         LINE#         226
+  C:04F9H         LINE#         227
+  C:0509H         LINE#         228
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 11
+
+
+  C:051FH         LINE#         229
+  C:0521H         LINE#         231
+  C:0521H         LINE#         232
+  C:0549H         LINE#         233
+  C:0570H         LINE#         234
+  C:0570H         LINE#         236
+  C:0570H         LINE#         238
+  C:0573H         LINE#         239
+  C:0573H         LINE#         240
+  C:0579H         LINE#         241
+  C:0579H         LINE#         242
+  C:0589H         LINE#         243
+  C:059FH         LINE#         244
+  C:05A1H         LINE#         246
+  C:05A1H         LINE#         247
+  C:05CAH         LINE#         248
+  C:05F5H         LINE#         249
+  C:05F5H         LINE#         250
+  C:05FBH         LINE#         251
+  C:05FBH         LINE#         252
+  C:060BH         LINE#         253
+  C:0621H         LINE#         254
+  C:0623H         LINE#         256
+  C:0623H         LINE#         257
+  C:064CH         LINE#         258
+  C:0677H         LINE#         259
+  C:0677H         LINE#         261
+  C:067DH         LINE#         262
+  C:0680H         LINE#         263
+  C:0680H         LINE#         264
+  C:0690H         LINE#         265
+  C:0696H         LINE#         266
+  C:0696H         LINE#         267
+  C:06A6H         LINE#         268
+  C:06BCH         LINE#         269
+  C:06BEH         LINE#         271
+  C:06BEH         LINE#         272
+  C:06FFH         LINE#         273
+  C:0740H         LINE#         274
+  C:0740H         LINE#         275
+  C:0746H         LINE#         276
+  C:0746H         LINE#         277
+  C:0756H         LINE#         278
+  C:076CH         LINE#         279
+  C:076EH         LINE#         281
+  C:076EH         LINE#         282
+  C:07AFH         LINE#         283
+  C:07EBH         LINE#         284
+  C:07EBH         LINE#         287
+  C:07F4H         LINE#         289
+  C:07F4H         LINE#         291
+  C:07F4H         LINE#         292
+  C:07F4H         LINE#         293
+  C:07F4H         LINE#         307
+  -------         ENDPROC       DISPLAY
+  -------         PROC          JUST_PLAY_WHEN_BEEP
+  -------         DO            
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 12
+
+
+  D:000CH         SYMBOL        secound_temp
+  D:0022H         SYMBOL        i
+  -------         ENDDO         
+  C:07F5H         LINE#         309
+  C:07F5H         LINE#         310
+  C:07F5H         LINE#         314
+  C:07FBH         LINE#         315
+  C:07FBH         LINE#         316
+  C:07FDH         LINE#         317
+  C:0800H         LINE#         318
+  C:0800H         LINE#         319
+  C:080CH         LINE#         320
+  C:080CH         LINE#         322
+  C:0815H         LINE#         324
+  C:0819H         LINE#         326
+  C:081BH         LINE#         327
+  C:081EH         LINE#         328
+  C:0821H         LINE#         329
+  C:0821H         LINE#         330
+  C:0840H         LINE#         331
+  C:0840H         LINE#         332
+  C:0840H         LINE#         333
+  C:087AH         LINE#         334
+  C:087BH         LINE#         335
+  C:087BH         LINE#         336
+  C:08B4H         LINE#         337
+  C:08B5H         LINE#         338
+  C:08B5H         LINE#         339
+  C:08EFH         LINE#         340
+  C:08F0H         LINE#         341
+  C:08F0H         LINE#         342
+  C:0929H         LINE#         343
+  C:092AH         LINE#         344
+  C:092AH         LINE#         345
+  C:0930H         LINE#         346
+  C:094CH         LINE#         347
+  C:094FH         LINE#         348
+  C:094FH         LINE#         349
+  C:094FH         LINE#         350
+  C:094FH         LINE#         351
+  C:094FH         LINE#         352
+  -------         ENDPROC       JUST_PLAY_WHEN_BEEP
+  -------         PROC          _SET_RINGTIME_ID
+  D:0007H         SYMBOL        sel
+  D:0005H         SYMBOL        sel_1
+  -------         DO            
+  D:0003H         SYMBOL        max
+  D:0004H         SYMBOL        mini
+  D:0002H         SYMBOL        address
+  D:0006H         SYMBOL        item
+  -------         ENDDO         
+  C:1094H         LINE#         354
+  C:1094H         LINE#         355
+  C:1094H         LINE#         357
+  C:109DH         LINE#         358
+  C:10A4H         LINE#         359
+  C:10A7H         LINE#         360
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 13
+
+
+  C:10ABH         LINE#         361
+  C:10AEH         LINE#         362
+  C:10B0H         LINE#         363
+  C:10B7H         LINE#         364
+  C:10C4H         LINE#         365
+  C:10D1H         LINE#         367
+  C:10D4H         LINE#         368
+  C:10D6H         LINE#         369
+  C:10D9H         LINE#         370
+  C:10DBH         LINE#         371
+  -------         ENDPROC       _SET_RINGTIME_ID
+  -------         PROC          SET_RINGTIME_CASE0
+  C:0F1BH         LINE#         373
+  C:0F1BH         LINE#         374
+  C:0F1BH         LINE#         375
+  C:0F1EH         LINE#         376
+  C:0F21H         LINE#         377
+  C:0F21H         LINE#         378
+  C:0F29H         LINE#         379
+  C:0F2CH         LINE#         380
+  C:0F2FH         LINE#         381
+  C:0F31H         LINE#         382
+  C:0F33H         LINE#         383
+  C:0F35H         LINE#         384
+  C:0F35H         LINE#         385
+  C:0F38H         LINE#         386
+  C:0F38H         LINE#         387
+  C:0F40H         LINE#         388
+  C:0F55H         LINE#         389
+  C:0F6AH         LINE#         390
+  C:0F6CH         LINE#         391
+  C:0F6EH         LINE#         392
+  C:0F70H         LINE#         393
+  C:0F70H         LINE#         395
+  C:0F73H         LINE#         396
+  C:0F73H         LINE#         397
+  C:0F7BH         LINE#         398
+  C:0F7EH         LINE#         399
+  C:0F81H         LINE#         400
+  C:0F83H         LINE#         401
+  C:0F85H         LINE#         402
+  C:0F8CH         LINE#         403
+  C:0F8CH         LINE#         404
+  -------         ENDPROC       SET_RINGTIME_CASE0
+  -------         PROC          SET_RINGTIME_CASE1
+  C:104BH         LINE#         405
+  C:104BH         LINE#         406
+  C:104BH         LINE#         407
+  C:104EH         LINE#         408
+  C:1051H         LINE#         409
+  C:1051H         LINE#         410
+  C:1059H         LINE#         411
+  C:105CH         LINE#         412
+  C:1062H         LINE#         413
+  C:1062H         LINE#         414
+  C:1065H         LINE#         415
+  C:1065H         LINE#         416
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 14
+
+
+  C:106DH         LINE#         417
+  C:1070H         LINE#         418
+  C:1077H         LINE#         419
+  C:1077H         LINE#         421
+  C:107AH         LINE#         422
+  C:107AH         LINE#         423
+  C:1082H         LINE#         424
+  C:1085H         LINE#         425
+  C:1088H         LINE#         426
+  C:108AH         LINE#         427
+  C:108CH         LINE#         428
+  C:1093H         LINE#         429
+  C:1093H         LINE#         430
+  -------         ENDPROC       SET_RINGTIME_CASE1
+  -------         PROC          INTO_SET_RINGTIME
+  -------         DO            
+  D:0001H         SYMBOL        set_i
+  -------         ENDDO         
+  C:0F8DH         LINE#         432
+  C:0F8DH         LINE#         433
+  C:0F8DH         LINE#         435
+  C:0F8FH         LINE#         436
+  C:0F91H         LINE#         438
+  C:0F96H         LINE#         439
+  C:0FA7H         LINE#         440
+  C:0FB8H         LINE#         444
+  C:0FBBH         LINE#         445
+  C:0FBBH         LINE#         447
+  C:0FBEH         LINE#         448
+  C:0FBEH         LINE#         449
+  C:0FC6H         LINE#         450
+  C:0FC9H         LINE#         451
+  C:0FD2H         LINE#         452
+  C:0FD4H         LINE#         453
+  C:0FD7H         LINE#         454
+  C:0FD7H         LINE#         455
+  C:0FE2H         LINE#         456
+  C:0FEBH         LINE#         457
+  C:0FF7H         LINE#         458
+  C:0FF9H         LINE#         460
+  -------         ENDPROC       INTO_SET_RINGTIME
+  -------         PROC          SCAN_KEY
+  C:0AD5H         LINE#         462
+  C:0AD5H         LINE#         463
+  C:0AD5H         LINE#         464
+  C:0AD8H         LINE#         465
+  C:0ADBH         LINE#         466
+  C:0ADBH         LINE#         467
+  C:0AE3H         LINE#         468
+  C:0AE6H         LINE#         469
+  C:0AF2H         LINE#         470
+  C:0B18H         LINE#         471
+  C:0B18H         LINE#         472
+  C:0B1AH         LINE#         473
+  C:0B1CH         LINE#         474
+  C:0B21H         LINE#         475
+  C:0B23H         LINE#         476
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 15
+
+
+  C:0B28H         LINE#         477
+  C:0B2AH         LINE#         478
+  C:0B2FH         LINE#         479
+  C:0B32H         LINE#         480
+  C:0B32H         LINE#         481
+  C:0B32H         LINE#         482
+  C:0B32H         LINE#         484
+  C:0B58H         LINE#         485
+  C:0B58H         LINE#         486
+  C:0B69H         LINE#         487
+  C:0B6DH         LINE#         488
+  C:0B73H         LINE#         489
+  C:0B79H         LINE#         490
+  C:0B7FH         LINE#         491
+  C:0B85H         LINE#         492
+  C:0B8CH         LINE#         493
+  C:0B91H         LINE#         494
+  C:0B91H         LINE#         495
+  C:0B91H         LINE#         497
+  -------         ENDPROC       SCAN_KEY
+  -------         PROC          ID_CASE1_KEY
+  C:1159H         LINE#         498
+  C:1159H         LINE#         499
+  C:1159H         LINE#         500
+  C:115CH         LINE#         501
+  C:115FH         LINE#         502
+  C:115FH         LINE#         503
+  C:1167H         LINE#         504
+  C:116AH         LINE#         505
+  C:1170H         LINE#         506
+  C:1170H         LINE#         507
+  C:1173H         LINE#         508
+  C:1173H         LINE#         509
+  C:117BH         LINE#         510
+  C:117EH         LINE#         511
+  C:1185H         LINE#         512
+  C:1185H         LINE#         513
+  -------         ENDPROC       ID_CASE1_KEY
+  -------         PROC          ID_CASE2_KEY
+  -------         DO            
+  D:0023H         SYMBOL        DOWN_key_add
+  -------         ENDDO         
+  C:0EA3H         LINE#         514
+  C:0EA3H         LINE#         515
+  C:0EA3H         LINE#         517
+  C:0EA6H         LINE#         518
+  C:0EA9H         LINE#         519
+  C:0EA9H         LINE#         520
+  C:0EB1H         LINE#         521
+  C:0EB3H         LINE#         522
+  C:0EBFH         LINE#         523
+  C:0EC7H         LINE#         524
+  C:0ED1H         LINE#         525
+  C:0ED9H         LINE#         526
+  C:0ED9H         LINE#         527
+  C:0EDCH         LINE#         528
+  C:0EDCH         LINE#         529
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 16
+
+
+  C:0EE4H         LINE#         530
+  C:0EE6H         LINE#         531
+  C:0EF2H         LINE#         532
+  C:0EFAH         LINE#         533
+  C:0F04H         LINE#         534
+  C:0F0CH         LINE#         535
+  C:0F0CH         LINE#         536
+  C:0F0FH         LINE#         537
+  C:0F0FH         LINE#         538
+  C:0F17H         LINE#         539
+  C:0F1AH         LINE#         540
+  C:0F1AH         LINE#         541
+  -------         ENDPROC       ID_CASE2_KEY
+  -------         PROC          _SET_ID
+  D:0007H         SYMBOL        sel
+  D:0008H         SYMBOL        sel_1
+  -------         DO            
+  D:0001H         SYMBOL        max
+  D:0003H         SYMBOL        mini
+  D:0004H         SYMBOL        address
+  D:0002H         SYMBOL        item
+  -------         ENDDO         
+  C:0C4CH         LINE#         543
+  C:0C4EH         LINE#         544
+  C:0C4EH         LINE#         546
+  C:0C63H         LINE#         547
+  C:0C63H         LINE#         548
+  C:0C6BH         LINE#         549
+  C:0C73H         LINE#         550
+  C:0C7BH         LINE#         551
+  C:0C83H         LINE#         552
+  C:0C8BH         LINE#         553
+  C:0C91H         LINE#         554
+  C:0C91H         LINE#         555
+  C:0C91H         LINE#         558
+  C:0CADH         LINE#         559
+  C:0CB5H         LINE#         560
+  C:0CC2H         LINE#         561
+  C:0CCFH         LINE#         562
+  C:0CD2H         LINE#         563
+  C:0CEEH         LINE#         564
+  -------         ENDPROC       _SET_ID
+  -------         PROC          _DS1302_SETTIME
+  D:0003H         SYMBOL        Address
+  D:0004H         SYMBOL        Value
+  C:11ABH         LINE#         567
+  C:11AFH         LINE#         568
+  C:11AFH         LINE#         569
+  C:11B2H         LINE#         570
+  C:11C9H         LINE#         571
+  -------         ENDPROC       _DS1302_SETTIME
+  -------         PROC          INITIAL_DS1302
+  -------         DO            
+  D:0007H         SYMBOL        Second
+  -------         ENDDO         
+  C:124CH         LINE#         573
+  C:124CH         LINE#         574
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 17
+
+
+  C:124CH         LINE#         575
+  C:1251H         LINE#         576
+  C:1255H         LINE#         577
+  C:125DH         LINE#         578
+  -------         ENDPROC       INITIAL_DS1302
+  -------         PROC          T1
+  C:0E1BH         LINE#         580
+  C:0E22H         LINE#         582
+  C:0E25H         LINE#         583
+  C:0E28H         LINE#         584
+  C:0E2EH         LINE#         586
+  C:0E38H         LINE#         587
+  C:0E38H         LINE#         588
+  C:0E3FH         LINE#         589
+  C:0E3FH         LINE#         590
+  C:0E42H         LINE#         591
+  C:0E44H         LINE#         592
+  C:0E47H         LINE#         593
+  C:0E53H         LINE#         594
+  C:0E5AH         LINE#         595
+  C:0E5AH         LINE#         596
+  C:0E5AH         LINE#         598
+  C:0E61H         LINE#         599
+  C:0E61H         LINE#         600
+  C:0E63H         LINE#         601
+  C:0E6DH         LINE#         602
+  C:0E72H         LINE#         603
+  C:0E75H         LINE#         604
+  C:0E75H         LINE#         605
+  C:0E7CH         LINE#         606
+  C:0E7CH         LINE#         607
+  C:0E7FH         LINE#         608
+  C:0E81H         LINE#         610
+  C:0E83H         LINE#         611
+  C:0E8DH         LINE#         612
+  C:0E8DH         LINE#         614
+  C:0E9EH         LINE#         615
+  -------         ENDPROC       T1
+  -------         PROC          INITIALT0T1
+  C:125EH         LINE#         617
+  C:125EH         LINE#         618
+  C:125EH         LINE#         619
+  C:1261H         LINE#         622
+  C:1264H         LINE#         623
+  C:1267H         LINE#         625
+  C:1269H         LINE#         626
+  C:126BH         LINE#         628
+  C:126DH         LINE#         629
+  C:126FH         LINE#         630
+  -------         ENDPROC       INITIALT0T1
+  -------         PROC          MAIN
+  C:0A14H         LINE#         641
+  C:0A14H         LINE#         642
+  C:0A14H         LINE#         646
+  C:0A17H         LINE#         648
+  C:0A1EH         LINE#         649
+  C:0A25H         LINE#         650
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 18
+
+
+  C:0A28H         LINE#         651
+  C:0A38H         LINE#         653
+  C:0A3BH         LINE#         654
+  C:0A3EH         LINE#         656
+  C:0A40H         LINE#         657
+  C:0A45H         LINE#         658
+  C:0A47H         LINE#         659
+  C:0A47H         LINE#         660
+  C:0A47H         LINE#         661
+  C:0A4BH         LINE#         662
+  C:0A54H         LINE#         663
+  C:0A57H         LINE#         664
+  C:0A5AH         LINE#         665
+  C:0A5AH         LINE#         666
+  C:0A62H         LINE#         667
+  C:0A64H         LINE#         668
+  C:0A67H         LINE#         669
+  C:0A69H         LINE#         670
+  C:0A69H         LINE#         671
+  C:0A6CH         LINE#         672
+  C:0A6CH         LINE#         673
+  C:0A76H         LINE#         674
+  C:0A76H         LINE#         675
+  C:0A7DH         LINE#         676
+  C:0A7DH         LINE#         677
+  C:0A80H         LINE#         678
+  C:0A83H         LINE#         679
+  C:0A85H         LINE#         680
+  C:0A88H         LINE#         681
+  C:0A8AH         LINE#         683
+  C:0A8AH         LINE#         684
+  C:0A97H         LINE#         685
+  C:0A9FH         LINE#         686
+  C:0AB4H         LINE#         687
+  C:0AC9H         LINE#         688
+  C:0ACBH         LINE#         689
+  C:0ACBH         LINE#         690
+  C:0ACDH         LINE#         691
+  C:0AD0H         LINE#         692
+  C:0AD2H         LINE#         693
+  C:0AD2H         LINE#         694
+  C:0AD2H         LINE#         695
+  -------         ENDPROC       MAIN
+  -------         ENDMOD        LED时钟
+
+  -------         MODULE        ?C?SCDIV
+  C:0950H         PUBLIC        ?C?SCDIV
+  -------         ENDMOD        ?C?SCDIV
+
+  -------         MODULE        ?C?CLDPTR
+  C:0972H         PUBLIC        ?C?CLDPTR
+  -------         ENDMOD        ?C?CLDPTR
+
+  -------         MODULE        ?C?CSTPTR
+  C:098BH         PUBLIC        ?C?CSTPTR
+  -------         ENDMOD        ?C?CSTPTR
+
+BL51 BANKED LINKER/LOCATER V6.00                                                      07/22/2014  16:33:38  PAGE 19
+
+
+  -------         MODULE        ?C?CSTOPTR
+  C:099DH         PUBLIC        ?C?CSTOPTR
+  -------         ENDMOD        ?C?CSTOPTR
+
+  -------         MODULE        ?C?UIDIV
+  C:09BFH         PUBLIC        ?C?UIDIV
+  -------         ENDMOD        ?C?UIDIV
+
+Program Size: data=66.6 xdata=0 code=4726
+LINK/LOCATE RUN COMPLETE.  0 WARNING(S),  0 ERROR(S)

+ 40 - 0
自制电子钟_增加闹钟zz/dianzizhong.Opt

@@ -0,0 +1,40 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+ cExt (*.c)
+ aExt (*.s*; *.src; *.a*)
+ oExt (*.obj)
+ lExt (*.lib)
+ tExt (*.txt; *.h; *.inc)
+ pExt (*.plm)
+ CppX (*.cpp)
+ DaveTm { 0,0,0,0,0,0,0,0 }
+
+Target (Target 1), 0x0000 // Tools: 'MCS-51'
+GRPOPT 1,(Source Group 1),1,0,0
+
+OPTFFF 1,1,1,738197507,0,666,689,0,<.\LEDʱÖÓ.c><LEDʱÖÓ.c> { 44,0,0,0,2,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,66,0,0,0,87,0,0,0,14,4,0,0,151,1,0,0 }
+
+ExtF <.\MUSIC_TWO_TIGER.H> 1,1,0,{ 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,44,0,0,0,58,0,0,0,134,4,0,0,194,1,0,0 }
+
+TARGOPT 1, (Target 1)
+ CLK51=12000000
+  OPTTT 1,1,1,0
+  OPTHX 0,65535,0,0,0
+  OPTLX 120,65,8,<.\>
+  OPTOX 16
+  OPTLT 1,1,1,0,1,1,0,1,0,0,0,0
+  OPTXL 1,1,1,1,1,1,1,0,0
+  OPTFL 1,0,1
+  OPTBL 0,(Data Sheet)<DATASHTS\ATMEL\AT89C51_DS.PDF>
+  OPTBL 1,(Instruction Set Manual)<DATASHTS\ATMEL\AT_C51ISM.PDF>
+  OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51)
+  OPTDBG 48126,9,()()()()()()()()()() (BIN\VDM51.DLL)()()()
+  OPTKEY 0,(DLGTP51)((98=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0))
+  OPTKEY 0,(VDM51)(-A127.0.0.1 -P8000 -O2)
+  OPTKEY 0,(DLGDP51)((98=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0))
+  OPTDF 0x40000086
+  OPTLE <>
+  OPTLC <>
+EndOpt
+

+ 122 - 0
自制电子钟_增加闹钟zz/dianzizhong.Uv2

@@ -0,0 +1,122 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+Target (Target 1), 0x0000 // Tools: 'MCS-51'
+
+Group (Source Group 1)
+
+File 1,1,<.\LEDʱÖÓ.c><LEDʱÖÓ.c> 0x0 
+
+
+Options 1,0,0  // Target 'Target 1'
+ Device (AT89C51)
+ Vendor (Atmel)
+ Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000))
+ FlashUt ()
+ StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code"))
+ FlashDR ()
+ DevID (2976)
+ Rgf (REGX51.H)
+ Mem ()
+ C ()
+ A ()
+ RL ()
+ OH ()
+ DBC_IFX ()
+ DBC_CMS ()
+ DBC_AMS ()
+ DBC_LMS ()
+ UseEnv=0
+ EnvBin ()
+ EnvInc ()
+ EnvLib ()
+ EnvReg (ÿAtmel\)
+ OrgReg (ÿAtmel\)
+ TgStat=16
+ OutDir (.\)
+ OutName (dianzizhong)
+ GenApp=1
+ GenLib=0
+ GenHex=1
+ Debug=1
+ Browse=1
+ LstDir (.\)
+ HexSel=0
+ MG32K=0
+ TGMORE=0
+ RunUsr 0 0 <>
+ RunUsr 1 0 <>
+ BrunUsr 0 0 <>
+ BrunUsr 1 0 <>
+ SVCSID <>
+ MODEL5=0
+ RTOS5=0
+ ROMSZ5=2
+ DHOLD5=0
+ XHOLD5=0
+ T51FL=80
+ XT51FL=0
+ CBANKS5=0
+ XBANKS5=0
+ RCB51 { 0,0,0,0,0,255,255,0,0 }
+ RXB51 { 0,0,0,0,0,0,0,0,0 }
+ OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IRO51 { 1,0,0,0,0,0,16,0,0 }
+ IRA51 { 0,0,0,0,0,128,0,0,0 }
+ XRA51 { 0,0,0,0,0,0,0,0,0 }
+ XRA512 { 0,0,0,0,0,0,0,0,0 }
+ IROM512 { 0,0,0,0,0,0,0,0,0 }
+ C51FL=21630224
+ C51VA=0
+ C51MSC ()
+ C51DEF ()
+ C51UDF ()
+ INCC5 ()
+ AX51FL=4
+ AX51MSC ()
+ AX51SET ()
+ AX51RST ()
+ INCA5 ()
+ PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IncBld=1
+ AlwaysBuild=0
+ GenAsm=0
+ AsmAsm=0
+ PublicsOnly=0
+ StopCode=3
+ CustArgs ()
+ LibMods ()
+ BankNo=65535
+ LX51FL=292
+ LX51OVL ()
+ LX51MSC ()
+ LX51DWN ()
+ LX51LFI ()
+ LX51ASN ()
+ LX51RES ()
+ LX51CCL ()
+ LX51UCL ()
+ LX51CSC ()
+ LX51UCS ()
+ LX51COB ()
+ LX51XDB ()
+ LX51PDB ()
+ LX51BIB ()
+ LX51DAB ()
+ LX51IDB ()
+ LX51PRC ()
+ LX51STK ()
+ LX51COS ()
+ LX51XDS ()
+ LX51BIS ()
+ LX51DAS ()
+ LX51IDS ()
+  OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51)
+  OPTDBG 48126,9,()()()()()()()()()() (BIN\VDM51.DLL)()()()
+ FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 }
+ FLASH2 ()
+ FLASH3 ()
+ FLASH4 ()
+EndOpt
+

+ 333 - 0
自制电子钟_增加闹钟zz/dianzizhong.hex

@@ -0,0 +1,333 @@
+:100B92000000F88BF8F2F95BF9B7FA14FA66FAB9C1
+:100BA200FB03FB4AFB8FFBCFFC0BFC43FC78FCAB4B
+:100BB200FCDBFD08FD33FD5BFD81FDA5FDC7FDE707
+:100BC200FE05FE21FE3CFE55FE6DFE84FE99FEAD45
+:100BD200FEC0FE02FEE3FEF3FF02FF10FF1DFF2A2E
+:100BE200FF36FF42FF4CFF56FF60FF69FF71FF793E
+:100BF200FF81FFFF00040D080F0811080D080D0802
+:100C02000F0811080D08110812081408000811082D
+:100C1200120814080008140616021406120211081B
+:100C22000D08140616021406120211080D080F0808
+:100C320008080D0800080F0808080D080008FFFF43
+:0A0C4200C0F9A4B0999282F88090E6
+:1010DC00015001015101015200C10A0127020153C3
+:1010EC0001015405014F3C0126FF0124FF012AFF99
+:1010FC000129FF012B00014500014E0001250001D3
+:10110C0028FFC10DC106C1030747000012160729AD
+:07111C002401220101230060
+:06120F00C290C292D290D1
+:0F121500EF7F08A2E09291D292C292C313DFF44E
+:0112240022A7
+:0F1270007F08C313A29192E7D292C292DFF4FFDC
+:01127F00224C
+:04123900E4FD7F8EC3
+:0F123D00AE0512120FAF06121215D292C29022F6
+:0A000E0012120F121270D292C2906B
+:0100180022C5
+:101186007508801212397C07120972FDAF08121217
+:101196003D740129F9E43AFA05080508DCEA7D8080
+:0511A6007F8E02123DE6
+:100FFA007F8112000EEF12098B7F8312000E900080
+:10100A0001EF12099D7F8512000E900002EF12096E
+:10101A009D7F8B12000E900003EF12099D7F8712AD
+:10102A00000E900004EF12099D7F8912000E9000B5
+:10103A0005EF12099D7F8D12000E900006EF02093E
+:01104A009D08
+:0211D0008F0A84
+:1011D200E50AD394004017750BB51207F57F5BDF64
+:0E11E200FE150BE50BD3940050F0150A80E2C9
+:0111F00022DC
+:10122500750A961207F57F50DFFE150AE50AD39475
+:031235000050F076
+:011238002293
+:03000B00021124BB
+:10112400C0E0C083C082C0D0B297E55025E02492CD
+:10113400F582E4340BF583E493F58CE55025E02443
+:1011440093F582E4340BF583E493F58AD0D0D0820E
+:05115400D083D0E03261
+:100CF500E4F508F509E5277003020D8BE550B4FF0F
+:100D050005E551F46074E50825E024F6F582E43440
+:100D15000BF583E493F550E50825E024F7F582E427
+:100D2500340BF583E493F551E550B4FF07E551B471
+:100D3500FF021527E5507004C28C8035E550B4FFDD
+:100D45000CC28C7F1E1211D0E4F50880AFE5082592
+:100D5500E024F8F582E4340BF583E493B55010D222
+:100D65008CAF511211D0C28C1212250508808DD27C
+:100D75008CAF511211D005088082E4F50875500139
+:090D8500755101020CFA752702F8
+:010D8E002242
+:0D11F100EFC43333335480447FF5807F0A10
+:1011FE00E4FEEEC39F5009E4FD0DBD32FC0E80F2FD
+:01120E0022BD
+:10001E00E508652C6005B20C852C08300623E52812
+:10002E0070028017E528B401028005E528B40205A8
+:10003E007552058008E528B40307E4F552D20BD2B9
+:10004E0001E552147003020379147003020476144E
+:10005E00700302068014700302017314700302050C
+:10006E0073240560030207F4A20B82025028C2A774
+:10007E003087047F0180027F001211F1D2A7C2A641
+:10008E003087047F0180027F00EFC4333333548006
+:10009E00447FF5808048E52EC4540F900C42935453
+:1000AE007FFF3087047E0180027E00EEC43333333F
+:1000BE0054804FF580C2A77F0A1211FED2A7E52EFB
+:1000CE00540F900C4293547FFF3087047E018002C0
+:1000DE007E00EEC433333354804FF580C2A67F0AC0
+:1000EE001211FED2A6A20182025028C2A5308704A8
+:1000FE007F0180027F001211F1D2A5C2A4308704C5
+:10010E007F0180027F00EFC43333335480447FF588
+:10011E00808048E52DC4540F900C4293547FFF30DD
+:10012E0087047E0180027E00EEC433333354804F49
+:10013E00F580C2A57F0A1211FED2A5E52D540F90AF
+:10014E000C4293547FFF3087047E0180027E00EEC6
+:10015E00C433333354804FF580C2A47F0A1211FE8C
+:10016E00D2A4020677E546C39414400302027CA291
+:10017E000B82025028C2A73087047F0180027F00C5
+:10018E001211F1D2A7C2A63087047F0180027F0030
+:10019E00EFC43333335480447FF5808048E52EC45A
+:1001AE00540F900C4293547FFF3087047E018002DF
+:1001BE007E00EEC433333354804FF580C2A77F0ADE
+:1001CE001211FED2A7E52E540F900C4293547FFFCE
+:1001DE003087047E0180027E00EEC43333335480B8
+:1001EE004FF580C2A67F0A1211FED2A6A20182028C
+:1001FE005028C2A53087047F0180027F001211F1C2
+:10020E00D2A5C2A43087047F0180027F00EFC433E1
+:10021E0033335480447FF580804AE52DC4540F90CB
+:10022E000C4293547FFF3087047E0180027E00EEE5
+:10023E00C433333354804FF580F580C2A57F0A1244
+:10024E0011FED2A5E52D540F900C4293547FFF3032
+:10025E0087047E0180027E00EEC433333354804F18
+:10026E00F580C2A47F0A1211FED2A4020677A20460
+:10027E0082025028C2A73087047F0180027F0012BD
+:10028E0011F1D2A7C2A63087047F0180027F00EF52
+:10029E00C43333335480447FF5808048E531C454F1
+:1002AE000F900C4293547FFF3087047E0180027EB4
+:1002BE0000EEC433333354804FF580C2A77F0A1249
+:1002CE0011FED2A7E531540F900C4293547FFF30AC
+:1002DE0087047E0180027E00EEC433333354804F98
+:1002EE00F580C2A67F0A1211FED2A6A20782025084
+:1002FE0028C2A53087047F0180027F001211F1D23F
+:10030E00A5C2A43087047F0180027F00EFC433337F
+:10031E00335480447FF5808048E530C4540F900CF0
+:10032E004293547FFF3087047E0180027E00EEC42C
+:10033E0033333354804FF580C2A57F0A1211FED29B
+:10034E00A5E530540F900C4293547FFF3087047E06
+:10035E000180027E00EEC433333354804FF580C2E9
+:10036E00A47F0A1211FED2A40207EBA20182025050
+:10037E0028C2A73087047F0180027F001211F1D2BC
+:10038E00A7C2A63087047F0180027F00EFC43333FB
+:10039E00335480447FF5808048E52DC4540F900C73
+:1003AE004293547FFF3087047E0180027E00EEC4AC
+:1003BE0033333354804FF580C2A77F0A1211FED219
+:1003CE00A7E52D540F900C4293547FFF3087047E87
+:1003DE000180027E00EEC433333354804FF580C269
+:1003EE00A67F0A1211FED2A6A20082025028C2A532
+:1003FE003087047F0180027F001211F1D2A5C2A4C2
+:10040E003087047F0180027F00EFC4333333548082
+:10041E00447FF5808048E52CC4540F900C429354D1
+:10042E007FFF3087047E0180027E00EEC4333333BB
+:10043E0054804FF580C2A57F0A1211FED2A5E52C7D
+:10044E00540F900C4293547FFF3087047E0180023C
+:10045E007E00EEC433333354804FF580C2A47F0A3E
+:10046E001211FED2A4020677A20482025028C2A75D
+:10047E003087047F0180027F001211F1D2A7C2A63D
+:10048E003087047F0180027F00EFC4333333548002
+:10049E00447FF5808048E531C4540F900C4293544C
+:1004AE007FFF3087047E0180027E00EEC43333333B
+:1004BE0054804FF580C2A77F0A1211FED2A7E531F4
+:1004CE00540F900C4293547FFF3087047E018002BC
+:1004DE007E00EEC433333354804FF580C2A67F0ABC
+:1004EE001211FED2A6A20782025028C2A53087049E
+:1004FE007F0180027F001211F1D2A5C2A4308704C1
+:10050E007F0180027F00EFC43333335480447FF584
+:10051E00808048E530C4540F900C4293547FFF30D6
+:10052E0087047E0180027E00EEC433333354804F45
+:10053E00F580C2A57F0A1211FED2A5E530540F90A8
+:10054E000C4293547FFF3087047E0180027E00EEC2
+:10055E00C433333354804FF580C2A47F0A1211FE88
+:10056E00D2A40207EBA20B82025028C2A730870446
+:10057E007F0180027F001211F1D2A7C2A63087043C
+:10058E007F0180027F00EFC43333335480447FF504
+:10059E0080804DE52A75F00A84900C4293547FFFBB
+:1005AE003087047E0180027E00EEC43333335480E4
+:1005BE004FF580C2A77F0A1211FED2A7E52A75F069
+:1005CE000A84E5F0900C4293547FFF3087047E013D
+:1005DE0080027E00EEC433333354804FF580C2A6C2
+:1005EE007F0A1211FED2A6A20182025028C2A530A5
+:1005FE0087047F0180027F001211F1D2A5C2A430C0
+:10060E0087047F0180027F00EFC43333335480446C
+:10061E007FF580804DE52975F00A84900C42935445
+:10062E007FFF3087047E0180027E00EEC4333333B9
+:10063E0054804FF580C2A57F0A1211FED2A5E5297E
+:10064E0075F00A84E5F0900C4293547FFF308704D6
+:10065E007E0180027E00EEC433333354804FF5802A
+:10066E00C2A47F0A1211FED2A4A20C929392870208
+:10067E0007EFE532C4540F75F00AA4FFE532540FAC
+:10068E002FFBA20882025028C2A73087047F018068
+:10069E00027F001211F1D2A7C2A63087047F01801B
+:1006AE00027F00EFC43333335480447FF580807B68
+:1006BE00EB24C6FFE43407FE7C037DE81209BF7C01
+:1006CE00007D0A1209BF74422DF582740C3CF5832D
+:1006DE00E493547FFF3087047E0180027E00EEC4D7
+:1006EE0033333354804FF580C2A77F0A1211FED2E6
+:1006FE00A7EB24C6FFE43407FE7C007D641209BF1D
+:10070E007C007D0A1209BF74422DF582740C3CF5F3
+:10071E0083E493547FFF3087047E0180027E00EED7
+:10072E00C433333354804FF580C2A67F0A1211FEB4
+:10073E00D2A6A20982025028C2A53087047F01806A
+:10074E00027F001211F1D2A5C2A43087047F01806E
+:10075E00027F00EFC43333335480447FF5808076BC
+:10076E00EB24C6FFE43407FE7C007D0A1209BF7C31
+:10077E00007D0A1209BF74422DF582740C3CF5837C
+:10078E00E493547FFF3087047E0180027E00EEC426
+:10079E0033333354804FF580C2A57F0A1211FED237
+:1007AE00A5AF03EB24C6FFE43407FE7C007D0A12DE
+:1007BE0009BF74422DF582740C3CF583E493547F8B
+:1007CE00FF3087047E0180027E00EEC43333335443
+:1007DE00804FF580C2A47F0A1211FED2A4D293D20A
+:0607EE00877F0A1211FED4
+:0107F40022E2
+:1007F500E50C652C6005B20C852C0C30A00930A1E8
+:100805000630A20320A3157550FF7551FFE4F527A7
+:10081500C28CC297C20A755301755405E52224FEA0
+:1008250060541470030208B51470030208F01470C4
+:100835000302092A2404600302094FD2A430870465
+:100845007F0180027F00EFC43333335480447FF54A
+:1008550080E52EC4540F900C4293547FFF308704DB
+:100865007E0180027E00EEC433333354804FF58021
+:10087500C2A775220222D2A73087047F0180027F9A
+:1008850000EFC43333335480447FF580E52E540F95
+:10089500900C4293547FFF3087047E0180027E00D6
+:1008A500EEC433333354804FF580C2A6752203223C
+:1008B500D2A63087047F0180027F00EFC433333333
+:1008C5005480447FF580E52DC4540F900C42935419
+:1008D5007FFF3087047E0180027E00EEC433333310
+:1008E50054804FF580C2A575220422D2A530870415
+:1008F5007F0180027F00EFC43333335480447FF59A
+:1009050080E52D540F900C4293547FFF3087047E71
+:100915000180027E00EEC433333354804FF580C22C
+:10092500A475220522A20C929392873087047F0139
+:1009350080027F00EFC43333335480447FF580D287
+:0A094500A4D2A5D2A6D2A775220104
+:01094F002285
+:10109400BF01067B17E4FC8007BF02047B3BE4FC32
+:1010A400BF0104AE2A8005BF0202AE29ED70031E03
+:1010B40080010ED3EB6480F8EE6480984002AE04A5
+:1010C400C3EC6480F8EE6480985002AE03BF010262
+:0710D4008E2ABF02028E29E3
+:0110DB0022F2
+:100F1B0012001E20A21420A20512001E80F87526B6
+:100F2B00FF7524FFC20AD206C20320A13820A105F7
+:100F3B0012001E80F8E52A75F00A84C454F0FFE510
+:100F4B002A75F00A84EF25F0F526E52975F00A8459
+:100F5B00C454F0FFE52975F00A84EF25F0F524D28F
+:100F6B000AD206C20320A31920A30512001E80F883
+:100F7B007526FF7524FFC20AC203E4F552C20BC2E9
+:020F8B00012241
+:10104B0012001E20A21120A20512001E80F8E4F54A
+:10105B004EFDAF2B12109420A11220A10512001EE1
+:10106B0080F8E4F54E7D01AF2B12109420A31920CC
+:10107B00A30512001E80F87526FF7524FFC20AC255
+:09108B0003E4F552C20BC201227C
+:100F8D00D203D206752B017901E52EC4540F75F0ED
+:100F9D000AA4FFE52E540F2FF52AE52DC4540F7525
+:100FAD00F00AA4FFE52D540F2FF52930033E20A0A4
+:100FBD001920A00512001E80F8E4F54E09E9D3941E
+:100FCD00024002E4F9892B755205E52B7007C20B1F
+:100FDD00C201120F1BE52BB40104D20B8009E52BC6
+:0C0FED00B402C8C20BD20112104B80BF2E
+:010FF90022D5
+:100AD50012001E20A05720A00512001E80F8E4F584
+:100AE5004E052BE52BD394074003E4F52BE52BB4FA
+:100AF50008005039900B00F8282873020B18020BD8
+:100B05001A020B1C020B21020B23020B28020B28D5
+:100B1500020B2F80028000E4F5528011800075528F
+:100B250002800A80007552038003755205E52BB4D7
+:100B350008005058900B40F8282873020B58020BF8
+:100B450069020B6D020B73020B79020B7F020B8599
+:100B5500020B8CC20BC201C200C204C207C208C28A
+:100B650009020EA3D20B801CC20BD2018016C20152
+:100B7500D2048010C204D207800AC207D2088004BA
+:0D0B8500C208D209021159C209120F8D22B7
+:1011590012001E20A21120A20512001E80F8E4F53B
+:101169004EFDAF2B120C4C20A11220A10512001E1E
+:0D11790080F8E4F54E7D01AF2B120C4C22E6
+:100EA30012001E20A23020A20512001E80F8052386
+:100EB300D3E523648094824003E4F523E52370049F
+:100EC300F5528012E523B401057552048008E52329
+:100ED300B4020375520120A13020A10512001E8027
+:100EE300F81523C3E523648094805003752302E53A
+:100EF300237004F5528012E523B401057552048072
+:100F030008E523B4020375520120A30B20A30512A5
+:070F1300001E80F8120F8D93
+:010F1A0022B4
+:020C4C008D0811
+:100C4E00EF24FE601814601D1460221460271460D7
+:100C5E002C2405702E7C847917E4FB80267C827907
+:100C6E003BE4FB801E7C88790C7B0180167C8679A8
+:100C7E001FE4FB800E7C8C79147B1480067C8C79AF
+:100C8E0063E4FBEC4401FF12000EEFC4540F75F049
+:100C9E000AA4FEEC4401FF12000EEF540F2EFAE5EB
+:100CAE000870031A80010AD3E96480F8EA64809818
+:100CBE004002AA03C3EB6480F8EA6480985002AA4B
+:100CCE0001121239AF04EA75F00A120950C454F039
+:100CDE00FEEA75F00A120950ADF0EE2DFD12123D2E
+:070CEE007D807F8E02123DA4
+:1011AB00AC05AB07121239AF03EC75F00A84C454CB
+:1011BB00F0FEEC75F00A84E5F04EFD12123D7D80D9
+:0511CB007F8E02123DC1
+:10124C007F8112000EEF30E708543FFD7F801211B2
+:01125C00ABE6
+:01125D00226E
+:03001B00020E1BB7
+:100E1B00C0E0C0D075D000758D3C758BAF05450516
+:100E2B004E0525300629E528D394035022AF4F15E4
+:100E3B004FEF701B754F3CC2067528FF30030975C9
+:100E4B005205D20BC2018007755200C20BC201E5DD
+:100E5B0045C394094014B202E528D39403400375AB
+:100E6B0028003006020528754500E525C39413407C
+:100E7B0011752500B2050546E546D3941940037557
+:100E8B004600E54ED394C8400A754E00E52B60032F
+:080E9B00752B00D0D0D0E0322D
+:10125E00758911758D3C758BAFD2AFD2A9D2ABD239
+:02126E008E22CE
+:100A140012125E7DA07F9012123D7D807F8E121295
+:100A24003D12124CA2A1B3B0A250097B007A007906
+:100A340047121186E4F5947593FFC2947F641211F2
+:100A4400FED294A20592947B007A00792C120FFABC
+:100A5400120AD520B00F20B00512001E80F8D20D66
+:100A6400120CF5C20D300ADBE526B52ED6E524B509
+:100A74002DD1AF541554EF700D7526FF7524FFC2A8
+:100A84000A7554058041E5292553FF75F03B8425FB
+:100A94002AF52AEF75F03B8485F029E52A75F00ADA
+:100AA40084C454F0FFE52A75F00A84EF25F0F52696
+:100AB400E52975F00A84C454F0FFE52975F00A8429
+:100AC400EF25F0F524D20AD20D120CF5C20D020A5C
+:010AD40047DA
+:03000000020D8F5F
+:0C0D8F00787FE4F6D8FD758154020DD683
+:10095000C2D530F707B2D563F0FF05F030E70CB22F
+:10096000D5F4048463F0FF05F080018430D502F4EF
+:0209700004225F
+:10097200BB010689828A83E0225002E722BBFE0283
+:09098200E32289828A83E49322B6
+:10098B00BB010689828A83F0225002F722BBFE014B
+:02099B00F32245
+:10099D00F8BB010DE58229F582E5833AF583E8F090
+:1009AD00225006E92582C8F622BBFE05E92582C83C
+:0209BD00F22224
+:1009BF00BC000BBE0029EF8DF084FFADF022E4CC1C
+:1009CF00F875F008EF2FFFEE33FEEC33FCEE9DECE5
+:1009DF00984005FCEE9DFE0FD5F0E9E4CEFD22ED2B
+:1009EF00F8F5F0EE8420D21CFEADF075F008EF2F75
+:1009FF00FFED33FD4007985006D5F0F222C398FD66
+:050A0F000FD5F0EA2202
+:100D9B00020A14E493A3F8E493A34003F68001F250
+:100DAB0008DFF48029E493A3F85407240CC8C33359
+:100DBB00C4540F4420C8834004F456800146F6DF28
+:100DCB00E4800B01020408102040809010DCE47ECC
+:100DDB00019360BCA3FF543F30E509541FFEE4931D
+:100DEB00A360010ECF54C025E060A840B8E493A3E4
+:100DFB00FAE493A3F8E493A3C8C582C8CAC583CA0F
+:100E0B00F0A3C8C582C8CAC583CADFE9DEE780BEC6
+:0111230000CB
+:00000001FF

+ 2 - 0
自制电子钟_增加闹钟zz/dianzizhong.lnp

@@ -0,0 +1,2 @@
+"LEDʱÖÓ.obj" 
+TO "dianzizhong" 

+ 261 - 0
自制电子钟_增加闹钟zz/dianzizhong.plg

@@ -0,0 +1,261 @@
+<html>
+<body>
+<pre>
+<h1>礦ision3 Build Log</h1>
+<h2>Project:</h2>
+E:\STC89C52RC\code\自制电子钟_增加闹钟zz\dianzizhong.uv2
+Project File Date:  07/21/2014
+
+<h2>Output:</h2>
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
+    SEGMENT: ?PR?JUST_PLAY_WHEN_BEEP?LED时钟
+Program Size: data=63.6 xdata=0 code=4698
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 1 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4732
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4732
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4732
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4732
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4732
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4732
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+LED时钟.C(566): error C141: syntax error near 'break'
+Target not created
+Build target 'Target 1'
+compiling LED时钟.c...
+LED时钟.C(566): error C141: syntax error near 'break'
+Target not created
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4728
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4735
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4735
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+MUSIC_TWO_TIGER.H(26): warning C280: 'j': unreferenced local variable
+MUSIC_TWO_TIGER.H(36): warning C280: 'j': unreferenced local variable
+linking...
+Program Size: data=67.6 xdata=0 code=4727
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 2 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).
+Build target 'Target 1'
+compiling LED时钟.c...
+linking...
+Program Size: data=66.6 xdata=0 code=4726
+creating hex file from "dianzizhong"...
+"dianzizhong" - 0 Error(s), 0 Warning(s).

+ 40 - 0
自制电子钟_增加闹钟zz/dianzizhong_Opt.Bak

@@ -0,0 +1,40 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+ cExt (*.c)
+ aExt (*.s*; *.src; *.a*)
+ oExt (*.obj)
+ lExt (*.lib)
+ tExt (*.txt; *.h; *.inc)
+ pExt (*.plm)
+ CppX (*.cpp)
+ DaveTm { 0,0,0,0,0,0,0,0 }
+
+Target (Target 1), 0x0000 // Tools: 'MCS-51'
+GRPOPT 1,(Source Group 1),1,0,0
+
+OPTFFF 1,1,1,1,0,613,629,0,<.\LEDʱÖÓ.c><LEDʱÖÓ.c> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,66,0,0,0,87,0,0,0,14,4,0,0,151,1,0,0 }
+
+ExtF <.\MUSIC_TWO_TIGER.H> 5,32,0,{ 44,0,0,0,2,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,226,255,255,255,44,0,0,0,58,0,0,0,134,4,0,0,194,1,0,0 }
+
+TARGOPT 1, (Target 1)
+ CLK51=24000000
+  OPTTT 1,1,1,0
+  OPTHX 0,65535,0,0,0
+  OPTLX 120,65,8,<.\>
+  OPTOX 16
+  OPTLT 1,1,1,0,1,1,0,1,0,0,0,0
+  OPTXL 1,1,1,1,1,1,1,0,0
+  OPTFL 1,0,1
+  OPTBL 0,(Data Sheet)<DATASHTS\ATMEL\AT89C51_DS.PDF>
+  OPTBL 1,(Instruction Set Manual)<DATASHTS\ATMEL\AT_C51ISM.PDF>
+  OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51)
+  OPTDBG 48126,9,()()()()()()()()()() (BIN\VDM51.DLL)()()()
+  OPTKEY 0,(DLGTP51)((98=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0))
+  OPTKEY 0,(VDM51)(-A127.0.0.1 -P8000 -O2)
+  OPTKEY 0,(DLGDP51)((98=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0))
+  OPTDF 0x40000086
+  OPTLE <>
+  OPTLC <>
+EndOpt
+

+ 124 - 0
自制电子钟_增加闹钟zz/dianzizhong_Uv2.Bak

@@ -0,0 +1,124 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+Target (Target 1), 0x0000 // Tools: 'MCS-51'
+
+Group (Source Group 1)
+
+File 1,1,<.\LEDʱÖÓ.c><LEDʱÖÓ.c> 0x0 
+
+
+Options 1,0,0  // Target 'Target 1'
+ Device (AT89C51)
+ Vendor (Atmel)
+ Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000))
+ FlashUt ()
+ StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code"))
+ FlashDR ()
+ DevID (2976)
+ Rgf (REGX51.H)
+ Mem ()
+ C ()
+ A ()
+ RL ()
+ OH ()
+ DBC_IFX ()
+ DBC_CMS ()
+ DBC_AMS ()
+ DBC_LMS ()
+ UseEnv=0
+ EnvBin ()
+ EnvInc ()
+ EnvLib ()
+ EnvReg (ÿAtmel\)
+ OrgReg (ÿAtmel\)
+ TgStat=16
+ OutDir (.\)
+ OutName (dianzizhong)
+ GenApp=1
+ GenLib=0
+ GenHex=1
+ Debug=1
+ Browse=1
+ LstDir (.\)
+ HexSel=0
+ MG32K=0
+ TGMORE=0
+ RunUsr 0 0 <>
+ RunUsr 1 0 <>
+ BrunUsr 0 0 <>
+ BrunUsr 1 0 <>
+ CrunUsr 0 0 <>
+ CrunUsr 1 0 <>
+ SVCSID <>
+ MODEL5=0
+ RTOS5=0
+ ROMSZ5=2
+ DHOLD5=0
+ XHOLD5=0
+ T51FL=80
+ XT51FL=0
+ CBANKS5=0
+ XBANKS5=0
+ RCB51 { 0,0,0,0,0,255,255,0,0 }
+ RXB51 { 0,0,0,0,0,0,0,0,0 }
+ OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IRO51 { 1,0,0,0,0,0,16,0,0 }
+ IRA51 { 0,0,0,0,0,128,0,0,0 }
+ XRA51 { 0,0,0,0,0,0,0,0,0 }
+ XRA512 { 0,0,0,0,0,0,0,0,0 }
+ IROM512 { 0,0,0,0,0,0,0,0,0 }
+ C51FL=21630224
+ C51VA=0
+ C51MSC ()
+ C51DEF ()
+ C51UDF ()
+ INCC5 ()
+ AX51FL=4
+ AX51MSC ()
+ AX51SET ()
+ AX51RST ()
+ INCA5 ()
+ PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IncBld=1
+ AlwaysBuild=0
+ GenAsm=0
+ AsmAsm=0
+ PublicsOnly=0
+ StopCode=3
+ CustArgs ()
+ LibMods ()
+ BankNo=65535
+ LX51FL=292
+ LX51OVL ()
+ LX51MSC ()
+ LX51DWN ()
+ LX51LFI ()
+ LX51ASN ()
+ LX51RES ()
+ LX51CCL ()
+ LX51UCL ()
+ LX51CSC ()
+ LX51UCS ()
+ LX51COB ()
+ LX51XDB ()
+ LX51PDB ()
+ LX51BIB ()
+ LX51DAB ()
+ LX51IDB ()
+ LX51PRC ()
+ LX51STK ()
+ LX51COS ()
+ LX51XDS ()
+ LX51BIS ()
+ LX51DAS ()
+ LX51IDS ()
+  OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51)
+  OPTDBG 48126,9,()()()()()()()()()() (BIN\VDM51.DLL)()()()
+ FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 }
+ FLASH2 ()
+ FLASH3 ()
+ FLASH4 ()
+EndOpt
+

+ 8 - 0
自制电子钟_增加闹钟zz/music.h

@@ -0,0 +1,8 @@
+/*----The Length of This Array is 200 Byte.----*/
+
+unsigned char code beiguozhichun[]={
+
+0x0E,0x14, 0x0E,0x01, 0x0E,0x02, 0x00,0x00
+
+};
+

+ 85 - 0
自制电子钟_增加闹钟zz/music_two_tiger.h

@@ -0,0 +1,85 @@
+#ifndef	__MUSIC_TWO_TIGER_H__
+#define	__MUSIC_TWO_TIGER_H__
+
+#define _PER_RUN_TIME			2			//每首曲子运行2次
+#define _RING_SPACE_1MIN		1			//每遍间隔1分钟
+#define _RING_RUN_TIME			5			//重复5遍
+#define _RING_FLASH_COUNTDOWN	3000		//闪烁3秒
+
+#define uchar unsigned char
+sbit beepIO=P1^7;
+uchar m=1,n=1; 
+uchar code T[50][2]={{0,0},
+{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
+{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
+{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
+{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81},
+{0xFF,0xFF}
+};
+uchar code music[][2]={{0,4},
+{13,8},{15,8},{17,8},{13,8},{13,8},{15,8},{17,8},{13,8},{17,8},{18,8},{20,8},{0,8},{17,8},{18,8},{20,8},{0,8},{20,6},{22,2},{20,6},{18,2},{17,8},{13,8},{20,6},{22,2},{20,6},{18,2},{17,8},{13,8},{15,8},{8,8},{13,8},{0,8},{15,8},{8,8},{13,8},{0,8},
+{0xFF,0xFF}};
+
+void just_play_when_beep(void);
+void delay_music(uchar p)
+{
+    uchar i,j; 
+    for(;p>0;p--)
+    for(i=181;i>0;i--){
+		just_play_when_beep();
+	    for(j=91;j>0;j--);	  	  //181
+	}	
+}								   
+
+void pause_music()
+{
+    uchar i,j;
+    for(i=150;i>0;i--){	 
+		just_play_when_beep();
+	    for(j=80;j>0;j--);	  	//150
+	}
+}
+void T0_int() interrupt 1
+{
+ beepIO=!beepIO;
+ TH0=T[m][0]; TL0=T[m][1];
+}
+/*
+void InitialT0(void)				//
+{
+		TMOD|=0x01;					//初始化定时器 	方式2	波特率发生器
+  		TH0=0xFF;					//T0高八位
+  		TL0=0xFF;					//T0低八位
+  		EA=1;						//总中断开关
+  		ET0=1;						//T0中断
+		TR0=0; 						//定时器T0 开始计时
+}*/
+extern char per_run_time;
+void play_2tigers(void)
+{
+ uchar i=0,j=0; 
+// TMOD|=0x01;  EA=1; ET0=1; 
+ //InitialT0();
+ while(per_run_time)
+ {
+	 while(!(m==0xFF&&n==0xFF))
+      {
+           m=music[i][0];n=music[i][1];
+           if(m==0xFF&&n==0xFF)
+             {per_run_time--;} 
+           if(m==0x00)
+             {TR0=0;delay_music(n);i++;} 
+           else if(m==0xFF)
+             {TR0=0;delay_music(30);i=0;} 
+           else if(m==music[i+1][0]) 
+             {TR0=1;delay_music(n);TR0=0;pause_music();i++;}
+           else
+             {TR0=1;delay_music(n);i++;}
+      }
+	 i=0;m=1;n=1;	//完事,初始化一下
+}
+ per_run_time=_PER_RUN_TIME;	//完事,初始化一下			
+}
+
+#endif
+

+ 28 - 0
自制电子钟_增加闹钟zz/定时器中断号意义.txt

@@ -0,0 +1,28 @@
+			   1、返回值 函数名 interrupt n
+
+    其中n 对应中断源的编号,其值从0 开始,以80C51 单片机为例,编号从0~4,分别对应外中断0、定时器0 中断、外中断1、定时器1 中断和串行口中断。
+
+2、在C51 中,寄存器组选择取决于特定的编译器指令,即使用using n 指定,其中n 的值是0~3,对应使用四组工作寄存器。
+    例如可以这样来写:
+     void timer0() interrupt 1 using 2
+     {…}
+    即表示在该中断程序中使用第2 组工作寄存器。
+
+
+using ** 不要写,写了易出错,不写绝对不出错. 
+interrupt**是中断源.具体编号如下: 
+INT0 INTERRUPT 0 
+T0 1 
+INT1 2 
+T1 3 
+UART 4 
+T2 5 
+UART1 6 
+外部中断2 7 
+外部中断3 8 
+外部中断4 9 
+外部中断5 10 
+看门狗定时器 11 
+
+请自己验证
+