📄 dateandtime.lst
字号:
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DATEANDTIME
OBJECT MODULE PLACED IN DateAndTime.OBJ
COMPILER INVOKED BY: D:\电类软件\keil\C51\BIN\C51.EXE DateAndTime.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***********************************************************************************
2 ************************************************************************************
3 ********************************
4 基于MSC-51单片机的万年历程序
5 ********************************
6 文件名称:DataAndTime.c
7 设 计 者: 黄开坤
8 ***********************************************************************************/
9 #include <reg51.h>
10 #include <LCD1602.h>
11 #include <DS18B20.h>
12 sbit led =P3^7 ; //LCD屏背光灯控制线
13 sbit Play =P3^0 ; //启到发音
14 /***全局变量************************************************************************/
15 unsigned char year =7 ; //年变量,初始值为2007年
16 unsigned char month =4 ; //月娈量,初始值为4月
17 unsigned char day =20 ; //日变量,初始值为20日
18 unsigned char week =5 ; //周 ,初始值为周5
19 unsigned char hour =12 ; //时 ,初始值为12
20 unsigned char minute =0 ; //分 ,初始值为0
21 unsigned char second =0 ; //秒 ,初始值为0
22 unsigned char Timer_hour =12 ; //定时器的时变量
23 unsigned char Timer_minute =0 ; //定时器的分变量
24 unsigned char days =30 ; //用于存放每月的天数,初使值为30天
25 unsigned char Timer_Ring =1 ; //定时器提示音编号
26 unsigned char led_on =15 ; //LCD显示屏背光灯亮的时间
27 unsigned char Number =0 ; //用于指定报第几个音
28
29 bit Temperature_sin =1 ; //温度转换标志,为1,则启动温度转换并刷新
30 bit LeapYear_sin =0 ; //润年标志,1为润年,0为非润年
31 bit Timer_sin =0 ; //定时器响应标志,为1表示定时已到,正在响应
32 bit Timer_ON_OFF ; //定时器开/关标志。1开;0为关
33 bit Timer_Show_sin ; //定时器显示标志。为1表示正处于定时器显示状态
34 bit Speak_sin ; //报时标志,为1表示正在报时
35
36 unsigned char DATA[3] ; //存放两位十进制数的ASCII码
37 unsigned char Week_Str[4] ; //用于存放3个字符,表示星期,如Mon表示星期一
38 unsigned char Voice[4] ; //存放两位十进数的语音地址
39 unsigned char Speak[11] ; //存放将要报出的语音
40 /***0-10语音地址表******************************************************************/
41 unsigned char code VoiceTab[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24};
42
43 /***2000--2099年中的润年表**********************************************************/
44 unsigned char code Leap_YearTAB[]={4 ,8 ,12,16,20,24,28,32,36,40,44,48,
45 52,56,60,64,68,72,76,80,84,88,92,96};
46 /***计算润年************************************************************************/
47 void Leap_Year(unsigned char Years)
48 {
49 1 unsigned char i;
50 1 for(i=0;i<24;i++)
51 1 {
52 2 if(Years==Leap_YearTAB[i]) //用查表的方法确定是否为润年
53 2 {LeapYear_sin=1;break;}
54 2 else
55 2 LeapYear_sin=0;
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 2
56 2 }
57 1 }
58 /***计算每月的天数******************************************************************/
59 unsigned char Momth_Days(unsigned char Months)
60 {
61 1 switch(Months)
62 1 { case 2 :{if(LeapYear_sin==1) //二月份天数,润年为29天,非润年为28天
63 3 days=29;
64 3 else
65 3 days=28;
66 3 };break;
67 2 case 4 : //四、六、九、十一月份为30天
68 2 case 6 :
69 2 case 9 :
70 2 case 11 :days=30 ;break;
71 2 default :days=31 ; //其余月份为31天
72 2 }
73 1 days=days+1 ;
74 1 return(days); //返回值=某月的实际天数+1。
75 1 }
76 /***星期转换************************************************************************/
77 void WeekToStr( char n)
78 {
79 1 switch(n)
80 1 { case 1 :{Week_Str[0]='M' ; //星期一,Mon
81 3 Week_Str[1]='o' ;
82 3 Week_Str[2]='n' ;
83 3 Week_Str[3]='\0';
84 3 };break ;
85 2 case 2 :{Week_Str[0]='T' ; //星期二,Tue
86 3 Week_Str[1]='u' ;
87 3 Week_Str[2]='e' ;
88 3 Week_Str[3]='\0';
89 3 };break ;
90 2 case 3 :{Week_Str[0]='W' ; //星期三,Wen
91 3 Week_Str[1]='e' ;
92 3 Week_Str[2]='n' ;
93 3 Week_Str[3]='\0';
94 3 };break ;
95 2 case 4 :{Week_Str[0]='T' ; //星期四,Thu
96 3 Week_Str[1]='h' ;
97 3 Week_Str[2]='u' ;
98 3 Week_Str[3]='\0';
99 3 };break ;
100 2 case 5 :{Week_Str[0]='F' ; //星期五,Fri
101 3 Week_Str[1]='r' ;
102 3 Week_Str[2]='i' ;
103 3 Week_Str[3]='\0';
104 3 };break ;
105 2 case 6 :{Week_Str[0]='S' ; //星期六,Sat
106 3 Week_Str[1]='a' ;
107 3 Week_Str[2]='t' ;
108 3 Week_Str[3]='\0';
109 3 };break ;
110 2 case 7 :{Week_Str[0]='S' ; //星期日,Sun
111 3 Week_Str[1]='u' ;
112 3 Week_Str[2]='n' ;
113 3 Week_Str[3]='\0';
114 3 };break ;
115 2 }
116 1 }
117 /***类型转换(将字符型数据转换成相应的ASCII码****************************************/
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 3
118 void CharToStr(unsigned char t)
119 {
120 1 DATA[0]=(t/10)%10+'0' ; //取十位,并转换成相应的ASCII码
121 1 DATA[1]=t%10+'0' ; //取个位,并转换成相应的ASCII码
122 1 DATA[2]='\0' ; //字符串结束符
123 1 }
124 /***延时程序************************************************************************/
125 void Delay1ms(unsigned char n) //延时时间≈(4*n+996*n)us=n ms
126 {
127 1 unsigned char k=166;
128 1 while(--n)
129 1 { while(--k)
130 2 ;
131 2 }
132 1 }
133 /***键盘扫描程序********************************************************************/
134 unsigned char Key_Scan(void)
135 {
136 1 if((P2&0x0f)!=0x0f) //判断P.4--P2.7是否有键按下
137 1 { Delay1ms(10) ; //延时10ms,消抖动
138 2 if((P2&0x0f)!=0x0f)
139 2 { led_on=15 ; //LCD屏的背光灯亮的时间重新赋值
140 3 led=1 ; //只要有键按下,LCD屏的背光灯就亮
141 3 Timer_sin=0 ; //只要有键按下,闹铃停止
142 3 switch(P2&0x0f)
143 3 {case 0x0e :{while((P2&0x0f)!=0x0f) //等待按键释放
144 5 ;
145 5 return 1; //P2.4上的键按下,1号键
146 5 };break;
147 4 case 0x0d :{while((P2&0x0f)!=0x0f) //等待按键释放
148 5 ;
149 5 return 2; //P2.5上的键按下,2号键
150 5 };break;
151 4 case 0x0b :{while((P2&0x0f)!=0x0f) //等待按键释放
152 5 ;
153 5 return 3; //P2.6上的键按下,3号键
154 5 };break;
155 4 case 0x07 :{while((P2&0x0f)!=0x0f) //等待按键释放
156 5 ;
157 5 return 4; //P2.7上的键按下,4号键
158 5 };break;
159 4 default :return 0;
160 4 }
161 3 }
162 2 }
163 1 else
164 1 return 0;
165 1 }
166 /***数字——语音变换****************************************************************/
167 void NumberToVoice(unsigned char number)//将数字转换成相应的读音。(0≤number<60)
168 {
169 1 unsigned char a,b;
170 1 a=(number/10)%10 ; //取十位值
171 1 b=number%10 ; //取个位值
172 1 if(a==0) //0≤number<10时的读音,(一个音)
173 1 { Voice[0]=VoiceTab[b]; //
174 2 Voice[1]=0xff ; //
175 2 }
176 1 if(a!=0&&b==0) //number的个位为0,十位不为0时的读音
177 1 {if(a==1) //10的读音
178 2 {Voice[0]=0x28 ; //
179 3 Voice[1]=0xff ; //
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 4
180 3 }
181 2 Voice[0]=VoiceTab[a] ; //个位为0,十位不为0和1时的读音
182 2 Voice[1]=0x28 ; //
183 2 Voice[2]=0xff ; //
184 2 }
185 1 if(a==1&&b!=0) //10<number<20时的读音,(两个音)
186 1 {Voice[0]=0x28 ; //
187 2 Voice[1]=VoiceTab[b] ; //
188 2 Voice[2]=0xff ; //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -