1 #include<reg52.h>
  2 #include"define.h" //difine的头文件在后面
  3 void delay(uint z)
  4 {
  5     uint x,y;
  6     for(x=z;x>0;x--)
  7         for(y=110;y>0;y--);
  8 }
  9
 10 void didi()  //进入这个函数后,就是让蜂鸣器以 滴 滴滴 滴 滴滴的方式不停地响
 11 {
 12     beep=0;
 13     delay(50);
 14     beep=1;
 15     delay(100);
 16     beep=0;
 17     delay(50);
 18     beep=1;
 19 }
 20 void write_com(uchar com)
 21 {
 22     rs=0;
 23     lcden=0;
 24     P0=com;
 25     delay(5);
 26     lcden=1;
 27     delay(5);
 28     lcden=0;
 29 }
 30
 31 void write_date(uchar date)
 32 {
 33     rs=1;
 34     lcden=0;
 35     P0=date;
 36     delay(5);
 37     lcden=1;
 38     delay(5);
 39     lcden=0;
 40 }
 41
 42 void init()
 43 {
 44     uchar num;
 45     EA=1;
 46     EX0=1;
 47     IT0=1;
 48
 49     dula=0;
 50     wela=0;
 51     lcden=0;
 52 //    set_time();
 53     set_alarm(14,13,10);
 54     write_ds(0x0B,0x26);
 55     read_ds(0x0c);
 56 //    fen=59;
 57 //    miao=53;
 58 //    shi=23;
 59     write_com(0x38);
 60     write_com(0x0c);
 61     write_com(0x06);
 62     write_com(0x01);
 63     write_com(0x80);
 64     for(num=0;num<15;num++)
 65         {
 66             write_date(table[num]);
 67             delay(5);
 68         }
 69     write_com(0x80+0x40);
 70     for(num=0;num<12;num++)
 71         {
 72             write_date(table1[num]);
 73             delay(5);
 74         }
 75
 76 }
 77
 78 void write_sfm(uchar add,uchar date)
 79 {
 80     uchar shi,ge;
 81     shi=date/10;
 82     ge=date%10;
 83     write_com(0x80+0x40+add);
 84     write_date(0x30+shi);
 85     write_date(0x30+ge);
 86 }
 87
 88 void keyscan()
 89 {
 90     rd=0;
 91     if(flag1==1)// 当标志位为1时,按s2,或者按s3都可以令标志位 flag1 清零
 92     {
 93         if(s2==0)
 94         {
 95             delay(5);
 96             if(s2==0)
 97             {
 98                 while(!s2);
 99                 flag1=0;
100             }
101
102         }
103         if(s3==0)
104         {
105             delay(5);
106             if(s3==0)
107             {
108                 while(!s3);
109                 flag1=0;
110             }
111
112         }
113     }
114
115     if(s1==0)
116     {
117         delay(5);
118         if(s1==0)
119         {    s1num++;
120             flag=1;
121             flag1=0;
122             while(!s1);
123             if(s1num==1)
124             {
125                 TR0=0;
126                 write_com(0x80+0x40+10);
127                 write_com(0x0f);
128             }
129     }
130             if(s1num==2)
131             {
132                 write_com(0x80+0x40+7);
133             }
134             if(s1num==3)
135             {
136                 write_com(0x80+0x40+4);
137             }
138             if(s1num==4)
139             {
140                 s1num=0;
141                 write_com(0x0c);
142                 flag=0;
143                 write_ds(0,miao);
144                 write_ds(2,fen);
145                 write_ds(4,shi);
146             }
147
148
149         }
150         if(s1num!=0)
151         {
152             if(s2==0)
153             {
154                 delay(1);
155                 if(s2==0)
156                 {
157                     while(!s2);
158                     if(s1num==1)
159                     {
160                         miao++;
161                         if(miao==60)
162                             miao=0;
163                         write_sfm(10,miao);
164                         write_com(0x80+0x40+10);
165
166
167                     }
168                     if(s1num==2)
169                     {
170                         fen++;
171                         if(fen==60)
172                             fen=0;
173                         write_sfm(7,fen);
174                         write_com(0x80+0x40+7);
175                     }
176                     if(s1num==3)
177                     {
178                         shi++;
179                         if(shi==24)
180                             shi=0;
181                         write_sfm(4,shi);
182                         write_com(0x80+0x40+4);
183                     }
184                 }
185             }
186             if(s3==0)
187             {
188                 delay(1);
189                 if(s3==0)
190                 {
191                     while(!s3);
192                     if(s1num==1)
193                     {
194                     /*    if(miao==0)
195                         {
196                             miao=59;
197                             write_sfm(10,miao);
198                             write_com(0x80+0x40+10);
199                         }*/
200                         miao--;
201                         if(miao==-1)
202                             miao=59;
203                         write_sfm(10,miao);
204                         write_com(0x80+0x40+10);
205                     }
206                     if(s1num==2)
207                     {
208                         fen--;
209                         if(fen==-1)
210                             fen=59;
211                         write_sfm(7,fen);
212                         write_com(0x80+0x40+7);
213                     }
214                     if(s1num==3)
215                     {
216                         shi--;
217                         if(shi==-1)
218                             shi=23;
219                         write_sfm(4,shi);
220                         write_com(0x80+0x40+4);
221                     }
222                 }
223             }
224         }
225 }
226 /*给时钟芯片中写程序的时候,要传入两个参数,一个地址、一个数据,
227 因为先要确定那一个寄存器才可以将其数据正确的存入其中*/
228 void write_ds(uchar add,uchar date)
229 {
230     dscs=0;     //片选为0才可以工作
231     dsas=1;    //
232     dsds=1;
233     dsrw=1;
234     P0=add;     //    将数据送到P0口
235     dsas=0;//as为下降沿时锁存,将add送到它的内部
236     dsrw=0;     //将rw拉低之后或者拉低之前,再送数据都可以
237     P0=date;//将数据送到P0口
238     dsrw=1;//在rw的上升沿将数据写入到寄存器中
239     dsas=1;
240     dscs=1;
241 }
242 /*而在读时钟数据时,只需要传入它的地址,
243 就可以直接读取,因为要都会数据,故而有返回值*/
244 uchar read_ds(uchar add)
245 {
246      uchar ds_date; //因为要有变量最后接受数据
247     dsas=1;
248     dsds=1;
249     dsrw=1;
250     dscs=0;
251     P0=add;
252     dsas=0;
253     dsds=0;
254     P0=0xff;//再给给数据之前,先全为高
255     ds_date=P0;
256     dsds=1;
257     dsas=1;
258     dscs=1;
259     return ds_date;
260 }
261
262 void set_time()
263 {
264     write_ds(4,10);
265     write_ds(2,32);
266
267 }
268
269 void set_alarm(uchar ashi,uchar afen,uchar amiao)
270 {
271     write_ds(1,amiao);
272     write_ds(3,afen);
273     write_ds(5,ashi);
274 }
275 void main()
276 {
277     init();
278     while(1)
279     {
280         keyscan(); //先进行扫描,如果flag1没有置1时,蜂鸣器就不会响,只有P3^2有了跳变沿变化而进入到外部0中令flag置1才会进入到蜂鸣器想的函数中
281         if(flag1==1)
282             didi();
283         if(flag==0)
284         {
285             miao=read_ds(0);
286             fen=read_ds(2);
287             shi=read_ds(4);
288             write_sfm(10,miao);
289             write_sfm(7,fen);
290             write_sfm(4,shi);
291         }
292     }
293 }
294
295 void exter() interrupt 0
296 {    uchar c;
297     flag1=1;  //进入外部中断0后,令flag1标志位置1
298     c=read_ds(0x0c);  //将寄存器C读取一下,不需要干其他的事情,只是为了将闹钟中断位清零
299 }
300
301
302
303 #define uchar unsigned char
304 #define uint unsigned int
305 sbit dula=P2^6;
306 sbit wela=P2^7;
307 sbit rs=P3^5;
308 sbit lcden=P3^4;
309 sbit s1=P3^0;
310 sbit s2=P3^1;
311 sbit s3=P3^2;
312 sbit rd=P3^7;
313 sbit beep=P2^3;
314 sbit dscs=P1^4;
315 sbit dsas=P1^5;
316 sbit dsrw=P1^6;
317 sbit dsds=P1^7;
318 sbit dsirq=P3^3;
319 uchar count,s1num,flag,flag1;
320 char miao,shi,fen;
321 uchar code table[]="  2007-7-30 MON";
322 uchar code table1[]="      :  :  ";
323 void write_ds(uchar,uchar);
324 void set_alarm(uchar,uchar,uchar);
325 uchar read_ds(uchar);void set_time();

View Code

转载于:https://www.cnblogs.com/wises/p/9539542.html

DS12C887时钟芯片 程序理解相关推荐

  1. 基于微型计算机系统的实时时钟设计,基于单片机的DS12C887时钟芯片应用研究

    摘 要: 新型时钟芯片DS12C887具有计时精确.断电情况下运行十年以上不丢失资料等优点,在单片机计时系统中有着广泛应用.本文分析了DS12C887的功能特性,介绍了DS12C887与AT89C51 ...

  2. DS12C887时钟芯片

    单片机上的DS12C887时钟芯片,设置12小时制,怎么显示上午  和下午.怎么读取.

  3. 100脚的STM32F103VE单片机通过FSMC接口读写DS12C887时钟芯片中的寄存器

    STM32F1系列的单片机本身自带的RTC实时时钟外设只是一个单纯的32位计数器,没有分立为年月日.小时.分钟.秒等寄存器,使用起来不是很方便.这时可以考虑使用外部RTC芯片,比如使用SPI接口的双向 ...

  4. 51单片机DS12C887时钟芯片和1602液晶显示完善前人例程版本

    1.实现显示年月日,星期,时间 2.功能键,调整加,调整减,闹钟设置键4个按键 3.改进按键误入时钟或闹钟调整界面 ,时钟会停止计时. 改进后,如果不发生实际调整,时间不会停止计时. 4.改进闹钟没打 ...

  5. 利用51单片机和DS12C887时钟芯片制作万年历

    半个学期51的学习之后在终于动手敲了人生中第一个模块,期间出现了很多的bug,但还好的是最后都改正了 希望对大家有一点用处. (单片机小白一个,欢迎大佬指点.如果有大佬碰巧看见的话能不能帮我找一下相关 ...

  6. 使用DS12C887时钟芯片设计高精度时钟(单片机)

    一.项目要求 **1.**在1602液晶上显示年.月.日.星期.时.分.秒,并且按秒实时更新显示. **2.**具有闹铃设定及到时报警功能 **3.**能够使用板上的按键调节各个参数. **4.**每 ...

  7. STC89C516驱动DS12C887时钟模块

    DS12C887 DS12C887时钟芯片能输出世纪.年.月.日.时.分.秒等时间信息 集成电池, 外部掉电时, 时间不会丢失. 有12小时和24小时两种模式. 在12小时制模式中, 用AM和PM区分 ...

  8. ds12c887c语言程序,时钟芯片ds12c887的C51驱动程序

    文件名称:ds12c887.c 适用范围:时钟芯片ds12c887的驱动程序 ************************************************************* ...

  9. 基于AT89S52芯片+LCD1602液晶显示+DS12C887时钟模块的数字时钟

    文章目录 1. 前提 2. 目标 3. 代码 1. 前提 51单片机,通过实验箱实现实时数字时钟,这里选用DS12C887时钟模块进行实验内容. 2. 目标 使用更为精准的DS12C887时钟模块进行 ...

最新文章

  1. Android 跳转Activity 的时候出现闪屏问题处理
  2. CSDN开源夏令营 百度数据可视化实践 ECharts(8)
  3. 直线拟合的实现步骤和相关算子
  4. React 15.5带来重大修改
  5. 宋体配置JAVA j2ee (一) 轻松入门
  6. 第76节:Java中的基础知识
  7. numpy产生一个大于0的随机数_Numpy中常用随机函数的总结
  8. 八数码深度优先搜索_树的深度优先搜索(上)
  9. WAS7.0安装补丁升级程序无法替换文件 java/docs/autorun.inf解决办法
  10. CommandName与CommandArgument
  11. c++实现解释器模式完整源代码
  12. 解决gns3连接不上本地的几种情况
  13. ckplayer解析php源码,zblogphp视频主题使用ckplayer播放器说明
  14. 基于Python3.6实现Java版murmurhash算法
  15. Java、JSP基于Web的师生互动系统的设计与实现
  16. 500套求职简历模板
  17. 这款开源的人脸生成器,我爱了!
  18. 快速理解Lambda表达式
  19. linux系统python生成so_Python 项目转化为so文件实例
  20. 研控步进电机Canopen通讯测试

热门文章

  1. Tapdata PDK 生态共建计划启动 MongoDB、Doris、OceanBase、PolarDB等十余家厂商首批加入
  2. Apollo星火计划学习笔记——第四讲Part2 Apollo定位模块详解与实践
  3. 【C++】libwebsockets库的简易教程
  4. libwebsockets 记录
  5. 最新12篇区块链论文
  6. 淘宝整店商品列表查询API接口(店铺所有商品API接口)
  7. gawk linux,精通awk系列(1):安装新版本的gawk
  8. Android studio 使用JDK11无法生成javadoc问题解决
  9. 深度学习机器学习思维导图
  10. Python中的and、or及not