找回密码
 立即注册

QQ登录

只需一步,快速开始

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

通过单片机DS12C887时钟做一个定时器程序,设置了两个响应点

[复制链接]
跳转到指定楼层
楼主
ID:389070 发表于 2019-7-29 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用AT89C52开发,通过DS12C887实时时钟芯片可以保持千年无误差计算。断电也不会归零,而是和电脑一样,给一次数据就好。时间的设置可以通过按键调节,不知道怎么调节的问我就好。加入了四个逻辑设置定时,控制开和关。24小时一个循环,有1602数码管显示。即插即用,   

单片机源程序如下:
  1. /******************************************************************************/
  2. /* 项目名称  :  DS12C887实时时钟                                   */
  3. /* 主控芯片  : STC89C52                                                       */
  4. /* 文件名称  :设置定时器                                                      */
  5. /* 文件功能  : DS12C887实时时钟操作设置定时器                                 */
  6. /******************************************************************************/
  7. /**********************************包含头文件**********************************/
  8. #include<reg52.h>
  9. #include<define.h>
  10. sbit LED=P2^4;

  11. void delay(uint z)//延时函数
  12. {
  13.         uint x,y;
  14.         for(x=z;x>0;x--)
  15.                 for(y=110;y>0;y--);
  16. }

  17. //闹钟1的时间判断开
  18. void shijiankai1_Time(void)
  19. {
  20. if(shi==0&&fen==0&&miao==05)         //判断开的时间,如果为真打开LED
  21.         {
  22.          LED=0;                                      //LED开
  23.         }                 
  24. }

  25. //闹钟1的时间判断关
  26. void shijianguan1_Time(void)
  27. {
  28. if(shi==0&&fen==0&&miao==10)         //判断关的时间,如果为真打开LED
  29.         {
  30.          LED=1;                                      //LED开
  31.         }                 
  32. }

  33. //闹钟2的时间判断开
  34. void shijiankai2_Time(void)
  35. {
  36. if(shi==0&&fen==0&&miao==15)         //判断开的时间,如果为真打开LED
  37.         {
  38.          LED=0;                                      //LED开
  39.         }                 
  40. }

  41. //闹钟2的时间判断关
  42. void shijianguan2_Time(void)
  43. {
  44. if(shi==0&&fen==0&&miao==20)         //判断关的时间,如果为真打开LED
  45.         {
  46.          LED=1;                                      //LED开
  47.         }                 
  48. }


  49. void di() //蜂鸣器报警声音
  50. {
  51.         beep=0;
  52.         delay(100);
  53.         beep=1;
  54. }
  55. void write_com(uchar com)
  56. {//写液晶命令函数
  57.         rs=0;
  58.         lcden=0;
  59.         P0=com;
  60.         delay(3);
  61.         lcden=1;
  62.         delay(3);
  63.         lcden=0;       
  64. }
  65. void write_date(uchar date)
  66. {//写液晶数据函数
  67.         rs=1;
  68.         lcden=0;
  69.         P0=date;
  70.         delay(3);
  71.         lcden=1;
  72.         delay(3);
  73.         lcden=0;       
  74. }
  75. void init()
  76. {//初始化函数
  77.         uchar num;
  78.         EA=1;//打开总中断
  79.         EX1=1;//开外部中断1
  80.         IT1=1;//设置负跳变沿触发中断
  81.         flag1=0;//变量初始化
  82.         t0_num=0;
  83.         s1num=0;
  84.         week=1;
  85.         dula=0;//关闭数码管显示
  86.         wela=0;
  87.         lcden=0;
  88.         rd=0;
  89. /*以下几行在首次设置DS12C887时使用,以后不必再写入*/
  90.         write_ds(0x0A,0x20);//打开振荡器
  91.         write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式
  92. //-----------------------------------------------------
  93.         write_com(0x38);//1602液晶初始化
  94.         write_com(0x0c);
  95.         write_com(0x06);
  96.         write_com(0x01);
  97.         write_com(0x80);
  98.         for(num=0;num<15;num++)//写入液晶固定部分显示
  99.                 {
  100.                         write_date(table[num]);
  101.                         delay(1);
  102.                 }
  103.         write_com(0x80+0x40);
  104.         for(num=0;num<11;num++)
  105.                 {
  106.                         write_date(table1[num]);
  107.                         delay(1);
  108.                 }
  109. }
  110. void write_sfm(uchar add,char date)
  111. {//1602液晶刷新时分秒函数4为时,7为分,10为秒
  112.         char shi,ge;
  113.         shi=date/10;
  114.         ge=date%10;
  115.         write_com(0x80+0x40+add);
  116.         write_date(0x30+shi);
  117.         write_date(0x30+ge);
  118. }
  119. void write_nyr(uchar add,char date)
  120. {//1602液晶刷新年月日函数3为年,6为分,9为秒
  121.         char shi,ge;
  122.         shi=date/10;
  123.         ge=date%10;
  124.         write_com(0x80+add);
  125.         write_date(0x30+shi);
  126.         write_date(0x30+ge);
  127. }
  128. void write_week(char we)
  129. {//写液晶星期显示函数
  130.         write_com(0x80+12);
  131.         switch(we)
  132.         {
  133.                 case 1:        write_date('M');delay(5);
  134.                                 write_date('O');delay(5);
  135.                                 write_date('N');
  136.                                 break;
  137.                 case 2:        write_date('T');delay(5);
  138.                                 write_date('U');delay(5);
  139.                                 write_date('E');
  140.                                 break;
  141.                 case 3:        write_date('W');delay(5);
  142.                                 write_date('E');delay(5);
  143.                                 write_date('D');
  144.                                 break;
  145.                 case 4:        write_date('T');delay(5);
  146.                                 write_date('H');delay(5);
  147.                                 write_date('U');
  148.                                 break;
  149.                 case 5:        write_date('F');delay(5);
  150.                                 write_date('R');delay(5);
  151.                                 write_date('I');
  152.                                 break;
  153.                 case 6:        write_date('S');delay(5);
  154.                                 write_date('A');delay(5);
  155.                                 write_date('T');
  156.                                 break;
  157.                 case 7:        write_date('S');delay(5);
  158.                                 write_date('U');delay(5);
  159.                                 write_date('N');
  160.                                 break;
  161.         }
  162. }

  163. void write_ds(uchar add,uchar date)
  164. {//写12C887函数
  165.         dscs=0;
  166.         dsas=1;
  167.         dsds=1;
  168.         dsrw=1;
  169.         P0=add;//先写地址
  170.         dsas=0;
  171.         dsrw=0;
  172.         P0=date;//再写数据
  173.         dsrw=1;
  174.         dsas=1;
  175.         dscs=1;                               
  176. }

  177. uchar read_ds(uchar add)
  178. {//读12C887函数
  179.         uchar ds_date;
  180.         dsas=1;
  181.         dsds=1;
  182.         dsrw=1;
  183.         dscs=0;
  184.         P0=add;//先写地址
  185.         dsas=0;
  186.         dsds=0;
  187.         P0=0xff;
  188.         ds_date=P0;//再读数据
  189.         dsds=1;
  190.         dsas=1;
  191.         dscs=1;
  192.         return ds_date;       
  193. }

  194. void main()//主函数
  195. {
  196.         init();//调用初始化函数
  197.         while(1)
  198.         {
  199.                         year=read_ds(9);//读取12C887数据
  200.                         month=read_ds(8);       
  201.                         day=read_ds(7);
  202.                         week=read_ds(6);
  203.                         shi=read_ds(4);
  204.                         fen=read_ds(2);
  205.                         miao=read_ds(0);       
  206.                         write_sfm(10,miao);//送液晶显示
  207.                         write_sfm(7,fen);
  208.                         write_sfm(4,shi);
  209.                         write_week(week);
  210.                         write_nyr(3,year);
  211.                         write_nyr(6,month);
  212.                         write_nyr(9,day);
  213.                 }

  214.                     shijiankai1_Time();         //闹钟时间设置开
  215.                  shijianguan1_Time();         //闹钟时间设置关
  216.                     shijiankai2_Time();         //闹钟时间设置开
  217.                  shijianguan2_Time();         //闹钟时间设置关
  218. }

  219. void exter() interrupt 2//外部中断1服务程序
  220. {        uchar c; //进入中断表示闹钟时间到,
  221.         flag_ri=1; //设置标志位,用以大程序中报警提示
  222.         c=read_ds(0x0c);//读取12C887的C寄存器表示响应了中断
  223. }
复制代码

所有资料51hei提供下载:
资料夹.zip (5.41 KB, 下载次数: 28)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:676699 发表于 2020-1-2 18:27 来自手机 | 只看该作者
你好,请问怎么通过按键设置时间呢?
回复

使用道具 举报

板凳
ID:378116 发表于 2020-4-20 13:58 | 只看该作者
没有电路图吗?
回复

使用道具 举报

地板
ID:378116 发表于 2020-4-20 13:59 | 只看该作者
没有电路图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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