DS1302时钟

news/2024/11/29 20:47:54/文章来源:https://www.cnblogs.com/javatiandi/p/18569315

一、使用的MCU为STC89C52RC

二、DS1302驱动

  1 #include <REGX52.H>
  2 #include "DS1302.h"
  3 #include "LCD1602.h"
  4 #include "Delay.h"
  5 #include "Timer0.h"
  6 #include "SKey.h"
  7 
  8 
  9 void setMode1();
 10 void setMode2();
 11 void Show_Time();
 12 void case0();
 13 void case1();
 14 void case2();
 15 void case3();
 16 void case4();
 17 void flashChoose();
 18 //启动设置时间的入口
 19 char times[] = {0x24, 0x11, 0x24 , 0x19,0x56,0x32, 0x07};
 20 //秒前面的冒号的显隐开关
 21 unsigned char SecondFlashFlag = 0x01;
 22 //修改时间时控制选择的位置的闪烁开关
 23 unsigned char chooseFlashFlag = 0x01;
 24 //模式: 0默认,1,显示模式 2,修改模式
 25 unsigned int MODE = 0;
 26 //通过独立键盘来控制时钟:1显示; 2修改 3加,4减。 
 27 unsigned char KeyN = 0;
 28 //选择要修改的位置: 年月日时分秒(1-6)
 29 char selectLoc = 0;
 30 //要修改时存放时间的临时数组。
 31 unsigned char tempArr[7] ;
 32 //标记是否修改的标志 0 未修改 1 修改了
 33 unsigned char modifyFlag = 0;
 34 void main()
 35 {
 36 
 37     LCD_Init();
 38     
 39     LCD_ShowString(1,1,"  -  -  ");
 40     LCD_ShowString(2,1,"  :  :  ");
 41     
 42     Timer0Init();
 43     //初始化DS1302
 44     DS1302_Init();
 45   //DS1302_SetTime2(times);
 46     DS1302_ReadTime();
 47  
 48     while(1){
 49         
 50         KeyN = getSKey();
 51         if(KeyN!=0){
 52                 if(KeyN == 1){ setMode1();}
 53                 if(KeyN == 2){ setMode2();}
 54               //LCD_ShowNum(2,12,KeyN,2);
 55 
 56         }
 57 
 58       switch(MODE){
 59                 case 0:  
 60                     case 1: case1(); break;
 61                     case 2: case2(); break;
 62 
 63      }
 64         
 65      switch(KeyN){
 66      
 67                      case 3: case3(); break;
 68                     case 4: case4(); break;
 69      
 70      }
 71      
 72 
 73         Delay(400);
 74 
 75     }
 76 
 77 }
 78 
 79 
 80 void case0(){
 81     Show_Time();
 82 }
 83 
 84 void case1(){
 85    selectLoc = 0;
 86      Show_Time();
 87    
 88 }
 89 
 90 void case2(){
 91     
 92    SecondFlashFlag = 1;
 93      chooseFlashFlag = !chooseFlashFlag;
 94    flashChoose();
 95 }
 96 
 97 
 98 /**
 99  *  @bref  对要修改的区域进行闪烁操作
100  *  @param 无
101  *  @retval 无
102  */
103 void  flashChoose(){
104           LCD_ShowString(1,1,"  -  -  ");
105           LCD_ShowString(2,1,"  :  :  ");
106                 LCD_ShowNum(1,1,tempArr[0]/16*10 + tempArr[0]%16, 2); 
107                 LCD_ShowNum(1,4,tempArr[1]/16*10 + tempArr[1]%16, 2); 
108                 LCD_ShowNum(1,7,tempArr[2]/16*10 + tempArr[2]%16, 2);  
109                 LCD_ShowNum(2,1,tempArr[3]/16*10 + tempArr[3]%16, 2); 
110                 LCD_ShowNum(2,4,tempArr[4]/16*10 + tempArr[4]%16, 2); 
111                 LCD_ShowNum(2,7,tempArr[5]/16*10 + tempArr[5]%16, 2);
112     
113     
114              switch(selectLoc){
115                case 1: {
116                          if(chooseFlashFlag){
117                             LCD_ShowString(1,1,"  ");
118                          }
119                          break;
120                  }
121                  case 2: {
122                          if(chooseFlashFlag){
123                                  LCD_ShowString(1,4,"  "); 
124                          }
125                          break;
126                  }
127                  case 3: {
128                          if(chooseFlashFlag){
129                                LCD_ShowString(1,7,"  "); 
130                          }
131                          break;
132                  }             
133                  case 4: {
134                          if(chooseFlashFlag){
135                                  LCD_ShowString(2,1,"  "); 
136                          }
137                          break;
138                  }
139                  case 5: {
140                          if(chooseFlashFlag){
141                                LCD_ShowString(2,4,"  ");         
142                          }
143                          break;
144                  }
145                  case 6: {
146                          if(chooseFlashFlag){
147                                   LCD_ShowString(2,7,"  "); 
148                          }
149                          break;
150                  }                 
151              
152              }
153 
154 }
155 
156 
157 
158 void case3(){
159     if(MODE == 2){
160         unsigned int temp = 0;
161        
162          switch(selectLoc){
163              case 1:{
164                         //
165                  temp = tempArr[0]/16*10 + tempArr[0]%16;
166                  temp++;
167                  if(temp>99){
168                     temp=1;
169                  } 
170                  tempArr[0] = (temp/10)<<4 | (temp%10);
171                  
172                  break;
173              }
174              case 2:{
175                         //
176                  temp = tempArr[1]/16*10 + tempArr[1]%16;
177                  temp++;
178                  if(temp>12){
179                     temp=1;
180                  }
181                  tempArr[1] = (temp/10)<<4 | (temp%10);
182         
183                  break;
184              }
185              case 3:{
186                         //
187                  temp = tempArr[2]/16*10 + tempArr[2]%16;
188                  temp++;
189                  if( tempArr[1]==0x01||tempArr[1]==0x03
190                      ||tempArr[1]==0x05||tempArr[1]==0x07
191                    ||tempArr[1]==0x08||tempArr[1]==0x10
192                    ||tempArr[1]==0x12){
193                          if(temp>31){
194                                 temp=1;
195                          }     
196                     }else if(tempArr[1]==0x04
197                      ||tempArr[1]==0x06||tempArr[1]==0x09||tempArr[1]==0x11){
198                     
199                          if(temp>30){
200                                 temp=1;
201                          }
202                     }else if(tempArr[1]==0x02){
203                     
204                         if((tempArr[0]/16*10 + tempArr[0]%16)%4==0){
205                                  if(temp>29){
206                                         temp=1;
207                                  }
208                         }else{
209                               if(temp>28){
210                                         temp=1;
211                                  }
212                         }
213                     
214                     }
215                  tempArr[2] = (temp/10)<<4 | (temp%10);
216                     
217                     
218                  break;
219              }
220              case 4:{
221                         //
222                  temp = tempArr[3]/16*10 + tempArr[3]%16;
223                  temp++;
224                  if(temp>23){
225                     temp=0;
226                  }
227                  
228                  tempArr[3] = (temp/10)<<4 | (temp%10);
229                  break;
230              }
231              case 5:{
232                         //
233                  temp = tempArr[4]/16*10 + tempArr[4]%16;
234                  temp++;
235                  if(temp>59){
236                     temp=0;
237                  }
238                  
239                  tempArr[4] = (temp/10)<<4 | (temp%10);
240                  break;
241              }
242              case 6:{
243                         //
244                  temp = tempArr[5]/16*10 + tempArr[5]%16;
245                  temp++;
246                  if(temp>59){
247                     temp=0;
248                  }
249                  tempArr[5] = (temp/10)<<4 | (temp%10);
250                  break;
251              }
252 
253          
254          }
255          //修改时间了
256          modifyFlag = 0x01;
257       
258     }
259     
260   
261     Delay(5);
262 }
263 
264 void case4(){
265     if(MODE == 2){
266         
267           unsigned int temp = 0;
268        
269          switch(selectLoc){
270              case 1:{
271                         //
272                  temp = tempArr[0]/16*10 + tempArr[0]%16;
273                  temp--;
274                  if(temp<0){
275                     temp=99;
276                  } 
277                  tempArr[0] = (temp/10)<<4 | (temp%10);
278                  
279                  break;
280              }
281              case 2:{
282                         //
283                  temp = tempArr[1]/16*10 + tempArr[1]%16;
284                  temp--;
285                  if(temp<1){
286                     temp=12;
287                  }
288                  tempArr[1] = (temp/10)<<4 | (temp%10);
289         
290                  break;
291              }
292              case 3:{
293                         //
294                  temp = tempArr[2]/16*10 + tempArr[2]%16;
295                  temp--;
296                  if( tempArr[1]==0x01||tempArr[1]==0x03
297                      ||tempArr[1]==0x05||tempArr[1]==0x07
298                    ||tempArr[1]==0x08||tempArr[1]==0x10
299                    ||tempArr[1]==0x12){
300                          if(temp<1){
301                                 temp=31;
302                          }     
303                     }else if(tempArr[1]==0x04
304                      ||tempArr[1]==0x06||tempArr[1]==0x09||tempArr[1]==0x11){
305                     
306                          if(temp<1){
307                                 temp=30;
308                          }
309                     }else if(tempArr[1]==0x02){
310                     
311                         if((tempArr[0]/16*10 + tempArr[0]%16)%4==0){
312                                  if(temp<1){
313                                         temp=29;
314                                  }
315                         }else{
316                               if(temp<1){
317                                         temp=28;
318                                  }
319                         }
320                     
321                     }
322                  tempArr[2] = (temp/10)<<4 | (temp%10);
323                     
324                     
325                  break;
326              }
327              case 4:{
328                         //
329                  temp = tempArr[3]/16*10 + tempArr[3]%16;
330                  temp--;
331                  if(temp<0){
332                     temp=23;
333                  }
334                  
335                  tempArr[3] = (temp/10)<<4 | (temp%10);
336                  break;
337              }
338              case 5:{
339                         //
340                  temp = tempArr[4]/16*10 + tempArr[4]%16;
341                  temp--;
342                  if(temp<0){
343                     temp=59;
344                  }
345                  
346                  tempArr[4] = (temp/10)<<4 | (temp%10);
347                  break;
348              }
349              case 6:{
350                         //
351                  temp = tempArr[5]/16*10 + tempArr[5]%16;
352                  temp--;
353                  if(temp<0){
354                     temp=59;
355                  }
356                  tempArr[5] = (temp/10)<<4 | (temp%10);
357                  break;
358              }
359 
360          
361          }
362          
363          //修改时间了
364          modifyFlag = 0x01;
365     }  
366     Delay(5);
367 }
368 
369 
370 
371 
372 
373 /**
374  *  @bref 显示时间
375  *  @param 无
376  *  @retval 无
377  */
378 void Show_Time(){
379 
380         DS1302_ReadTime();
381     
382         LCD_ShowNum(1,1,DS1302_TIME[0]/16*10 + DS1302_TIME[0]%16, 2);
383         LCD_ShowNum(1,4,DS1302_TIME[1]/16*10 + DS1302_TIME[1]%16, 2);
384         LCD_ShowNum(1,7,DS1302_TIME[2]/16*10 + DS1302_TIME[2]%16, 2);
385         LCD_ShowNum(2,1,DS1302_TIME[3]/16*10 + DS1302_TIME[3]%16, 2);
386         LCD_ShowNum(2,4,DS1302_TIME[4]/16*10 + DS1302_TIME[4]%16, 2);
387         LCD_ShowNum(2,7,DS1302_TIME[5]/16*10 + DS1302_TIME[5]%16, 2);
388         //LCD_ShowString(1,11,Cvt_Day(DS1302_TIME[6]));
389         if(SecondFlashFlag){
390 
391                 LCD_ShowString(2,6,":");
392         }else{
393 
394                 LCD_ShowString(2,6," ");
395         }
396         
397         if(MODE == 2){
398                 //选择年
399                 if(selectLoc == 1){
400                      LCD_ShowString(1,1,"  ");
401                 
402                 }
403                 //选择月
404                 if(selectLoc == 2){
405                      LCD_ShowString(1,4,"  ");
406                 
407                 }
408                         //选择日
409                 if(selectLoc == 3){
410                      LCD_ShowString(1,7,"  ");
411                 
412                 }
413                         //选择时
414                 if(selectLoc == 4){
415                    LCD_ShowString(2,1,"  ");
416                 
417                 }
418                         //选择分
419                 if(selectLoc == 5){
420                    LCD_ShowString(2,4,"  ");
421                 
422                 }
423                         //选择秒
424                 if(selectLoc == 6){
425                 
426                    LCD_ShowString(2,7,"  ");
427                 }
428         
429         
430         }
431         
432     
433     
434         
435 }
436 
437 /**
438  *  @bref 设置模式1
439  *  @param 无
440  *  @retval 无
441  */
442 void setMode1(){
443    if(MODE ==2){
444           // 先让MODE不等于2,不然chooseFlashFlag又变回1了
445           MODE = 0;
446           chooseFlashFlag = 0;
447           //修改时间了就设置,没有修改,就不设置。
448           if(modifyFlag){
449                  DS1302_SetTime2(tempArr);
450             } 
451           DS1302_ReadTime();
452           modifyFlag = 0;
453           
454      }
455    MODE ==1;
456 
457 }
458 
459 void setMode2(){
460     unsigned char i=0;
461     if(MODE!=2){
462        DS1302_ReadTime();
463          for(i=0;i<7;i++){
464         tempArr[i] = DS1302_TIME[i];
465          }
466     }
467   MODE = 2;
468   selectLoc++; 
469   if(selectLoc>6 || selectLoc<=0){
470         selectLoc=1;
471     
472     }
473 
474 }
475 
476 
477 /**
478  *  @bref timer0 中断函数,用于将秒前面的冒号做跳动。
479  *  @param 无
480  *  @retval 无
481  */
482 
483 void Timer0_Routine() interrupt 1
484 {
485       static    unsigned int Count;
486         TL0 = 0x18;        //设置定时初值
487         TH0 = 0xFC;        //设置定时初值
488         Count++;
489       if(Count == 1000)
490         {
491             SecondFlashFlag = !SecondFlashFlag;
492           Count=0;
493      
494         }
495     
496      
497  }
View Code

 

1. 使用LCD1602显示时钟。

2. 使用Timer0来做时钟跳动的刷新。

3. 通过K1~K4四个独立键位来操作时钟的显示和修改。

 

                                                                                                                                                                                                                                                                                             

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841494.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计图纸外发安全:从源头到终端的全方位保护!

很多企业都会涉及到设计图纸外发的场景,通常与企业的业务需求和合作模式密切相关。比如汽车行业、基建行业、航空航天行业、科技行业、军工行业等,在传输设计图纸时都面临着设计图纸安全收发、合规有效等方面的挑战和需求。具体如下: 1.汽车行业:除了汽车制造,汽车行业还包…

个人图床配置,实现博客园图片上传自由

在平时编写Markdown文档上传博客园时,图片都是个大问题。由于本地图片无法直接上传博客园,所以就希望制作一个图床,把图片自动上传到云端,这样只需要有个正确的下载链接,就能在任何地方浏览图片。 长话短说,下面是简单的个人图床制作过程: 第一步:Gitee注册、创建仓库、…

360评估参评人胡乱打分搅局怎么办?

在平常协助客户实施360度评估过程中,有时候会遇到参评人不认真对待,胡乱评分搅局情况。 上期提到这种情况我们可以设置得分分布控制,由于得分分布控制是针对所有参评人,如果不想使用全部范围的干预控制,有没有影响范围小的快捷的办法解决某个人的评分失真情况呢? 简简人…

Go进阶21:Goland 6条Tips让编程更有效率

作为一个重度使用Jetbrains IDE 全家桶的用户. 这里我有几条可以加速您开发速度,减少您Paste/Copy敲打键盘的Tips. 1.快速实现 Interface 操作步骤:光标移动到struct 名称上 Alt/Option + Enter 选择Implement Interface … Control+I 搜索您需要实现的interface2.快速抽象 Int…

【SPSS 26 软件下载与安装教程】

1、安装包 SPSS 26:下载地址2、安装教程 1) 解压下载安装包,点击setup.exe 可执行文件2) 弹窗安装对话框,选择安装IBM SPSS 263) 读取安装进度条,选择下一步4) 选择我接受,点击下一步5) 选择是,点击下一步6) 选择我接受,点击…

大模型微调—海南小百科(一)

语言大模型是通过大规模数据集训练而来可以帮我们进行文本生成、内容总结,但对于一些小众知识、内部数据模型不一定知道怎么回答,这时候可能会胡言乱语。目前要想在特定领域小众知识或私密数据时模型能够表现出比较好的水平目前主要有两种方式可以实现:模型微调、外挂知识库…

dotnet 麒麟 Kylin 的 X11 应用开发记录

本文记录我在麒麟 Kylin 的 X11 应用开发过程的经验系统版本信息 本文面向的麒麟系统版本信息如下: $ cat /etc/os-release NAME="Kylin" VERSION="银河麒麟桌面操作系统(教育版)V10" VERSION_US="Kylin Linux Desktop EDU V10" ID=kylin ID_…

VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7.0U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链…

Redis中的分布式锁(步步为营)

分布式锁 概述 分布式锁指的是,所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。 分布式锁是可以跨越多个实例,多个进程的锁分布式锁具备的条件:互斥性:任意时刻,只能有一个客户端持有…

【宝兰德中间件】单实例分离安装部署

#BES中间件 #宝兰德 一、安装环境二、安装步骤2.1 创建用户以及用户组2.2 配置目录权限2.3 上传安装包以及JDK2.4 JDK安装配置2.5 实例创建一、安装环境二、安装步骤 2.1 创建用户以及用户组 [root@mysql-20 data]# groupadd mw [root@mysql-20 data]# useradd -g mw -d /data/…

【政策解析】公共数据授权运营的六大关键参与主体:角色、责任与实践

1. 数据提供方 1.1 角色定位与责任 数据提供方在公共数据授权运营体系中扮演着基础且关键的角色。它们通常是政府部门或公共机构,负责收集、生成和维护原始数据。作为数据的源头,数据提供方的主要职责是确保所提供数据的合法性、准确性和时效性。根据《公共数据授权运营管理暂…

从架构到成本,SQL Server 和 PostgreSQL 四大区别全方位解析!

从架构到成本,SQL Server 和 PostgreSQL 四大区别全方位解析!今天我想分享 SQL Server 和 PostgreSQL 之间的四大关键区别。 在比较 SQL Server 和 PostgreSQL 这两种最常用的关系数据库管理系统(RDBMS)时,它们在架构、日志机制、并发模型、索引策略和许可方式等方面存在根…