找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4622|回复: 0
收起左侧

用DS12R887芯片开发电子表

[复制链接]
ID:70941 发表于 2014-12-26 00:03 | 显示全部楼层 |阅读模式
一.DS12R887  写命令时序图


二.DS12R887  读命令时序图


.

三.电子表程序源码如下
            这里用到12864LCD。独立式按按三个
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit dula=P2^6;
  5. sbit wela=P2^7;  //这个是为了防止数码管参合进来

  6. sbit rs=P3^5;
  7. sbit lcden=P3^4;
  8. sbit s1=P3^0;
  9. sbit s2=P3^1;
  10. sbit s3=P3^2;
  11. sbit rd=P3^7;     //这些是独立式按键与扬声器 液晶屏引脚链接定义
  12. sbit beep=P2^3;

  13. sbit dscs=P1^4;
  14. sbit dsas=P1^5;
  15. sbit dsrw=P1^6;
  16. sbit dsds=P1^7;
  17. sbit dsirq=P3^3;  //这些都是DS12R887各引脚与89C52的链接

  18. uchar count,s1num,flag,flag1;
  19. char miao,shi,fen;
  20. uchar code table[]="  2007-7-30 MON";
  21. uchar code table1[]="      :  :  ";
  22. void write_ds(uchar,uchar);
  23. void set_alarm(uchar,uchar,uchar);
  24. uchar read_ds(uchar);void set_time();

  25. void delay(uint z)
  26. {
  27. uint x,y;
  28. for(x=z;x>0;x--)
  29.   for(y=110;y>0;y--);
  30. }



  31. void didi()     //闹钟铃声
  32. {
  33. beep=0;
  34. delay(50);
  35. beep=1;
  36. delay(100);
  37. beep=0;
  38. delay(50);
  39. beep=1;
  40. }



  41. void write_com(uchar com)   //液晶屏写命令子程式。时序参考其它日志
  42. {
  43. rs=0;
  44. lcden=0;
  45. P0=com;
  46. delay(5);
  47. lcden=1;
  48. delay(5);
  49. lcden=0;
  50. }

  51. void write_date(uchar date)  //液晶屏写数据子程式。时序参考其它日志                  
  52. {
  53. rs=1;
  54. lcden=0;
  55. P0=date;
  56. delay(5);
  57. lcden=1;
  58. delay(5);
  59. lcden=0;
  60. }

  61. void init()
  62. {
  63. uchar num;
  64. EA=1;
  65. EX0=1;
  66. IT0=1;   \\开中断。。找开外部中断0

  67. dula=0;
  68. wela=0;    \\防止数据管参合。其它电路可以不要

  69. lcden=0;
  70. // set_time();
  71. set_alarm(14,13,10);
  72. write_ds(0x0B,0x26);
  73. read_ds(0x0c);
  74. // fen=59;
  75. // miao=53;
  76. // shi=23;
  77. write_com(0x38);
  78. write_com(0x0c);
  79. write_com(0x06);
  80. write_com(0x01);
  81. write_com(0x80);   \\初始化液晶屏
  82. for(num=0;num<15;num++)
  83.   {
  84.    write_date(table[num]);
  85.    delay(5);
  86.   }
  87. write_com(0x80+0x40);
  88. for(num=0;num<12;num++)
  89.   {
  90.    write_date(table1[num]);
  91.    delay(5);
  92.   }

  93. }

  94. void write_sfm(uchar add,uchar date)  \\用于向液晶屏写时间数据的子程式
  95. {
  96. uchar shi,ge;
  97. shi=date/10;
  98. ge=date%10;
  99. write_com(0x80+0x40+add);
  100. write_date(0x30+shi);
  101. write_date(0x30+ge);
  102. }

  103. void keyscan()             \\独立式按接扫描子程序
  104. {
  105. rd=0;
  106. if(flag1==1)
  107. {
  108.   if(s2==0)
  109.   {
  110.    delay(5);
  111.    if(s2==0)
  112.    {
  113.     while(!s2);
  114.     flag1=0;
  115.    }
  116.      
  117.   }
  118.   if(s3==0)
  119.   {
  120.    delay(5);
  121.    if(s3==0)
  122.    {
  123.     while(!s3);
  124.     flag1=0;
  125.    }
  126.      
  127.   }
  128. }
  129.   
  130. if(s1==0)
  131. {
  132.   delay(5);
  133.   if(s1==0)
  134.   { s1num++;
  135.    flag=1;
  136.    flag1=0;
  137.    while(!s1);
  138.    if(s1num==1)
  139.    {
  140.     TR0=0;
  141.     write_com(0x80+0x40+10);
  142.     write_com(0x0f);
  143.    }
  144. }
  145.    if(s1num==2)
  146.    {
  147.     write_com(0x80+0x40+7);
  148.    }
  149.    if(s1num==3)
  150.    {
  151.     write_com(0x80+0x40+4);
  152.    }
  153.    if(s1num==4)
  154.    {
  155.     s1num=0;
  156.     write_com(0x0c);
  157.     flag=0;
  158.     write_ds(0,miao);
  159.     write_ds(2,fen);
  160.     write_ds(4,shi);                     \\按键设定时间处理过程
  161.    }

  162.    
  163.   }
  164.   if(s1num!=0)
  165.   {
  166.    if(s2==0)
  167.    {
  168.     delay(1);
  169.     if(s2==0)
  170.     {
  171.      while(!s2);
  172.      if(s1num==1)
  173.      {
  174.       miao++;
  175.       if(miao==60)
  176.        miao=0;
  177.       write_sfm(10,miao);
  178.       write_com(0x80+0x40+10);
  179.       
  180.       
  181.      }
  182.      if(s1num==2)
  183.      {
  184.       fen++;
  185.       if(fen==60)
  186.        fen=0;
  187.       write_sfm(7,fen);
  188.       write_com(0x80+0x40+7);
  189.      }
  190.      if(s1num==3)
  191.      {
  192.       shi++;
  193.       if(shi==24)
  194.        shi=0;
  195.       write_sfm(4,shi);
  196.       write_com(0x80+0x40+4);
  197.      }
  198.     }
  199.    }
  200.    if(s3==0)
  201.    {
  202.     delay(1);
  203.     if(s3==0)
  204.     {
  205.      while(!s3);
  206.      if(s1num==1)
  207.      {
  208.      /* if(miao==0)
  209.       {
  210.        miao=59;
  211.        write_sfm(10,miao);
  212.        write_com(0x80+0x40+10);
  213.       }*/
  214.       miao--;
  215.       if(miao==-1)
  216.        miao=59;
  217.       write_sfm(10,miao);
  218.       write_com(0x80+0x40+10);
  219.      }
  220.      if(s1num==2)
  221.      {
  222.       fen--;
  223.       if(fen==-1)
  224.        fen=59;
  225.       write_sfm(7,fen);
  226.       write_com(0x80+0x40+7);
  227.      }
  228.      if(s1num==3)
  229.      {
  230.       shi--;
  231.       if(shi==-1)
  232.        shi=23;
  233.       write_sfm(4,shi);
  234.       write_com(0x80+0x40+4);
  235.      }
  236.     }
  237.    }
  238.   }
  239. }

  240. void write_ds(uchar add,uchar date)   \\DS12R887写数据。。可以户写入设定好的时间  每次写一个地址的数据。时序参看上图
  241. {
  242. dscs=0;
  243. dsas=1;
  244. dsds=1;
  245. dsrw=1;
  246. P0=add;
  247. dsas=0;
  248. dsrw=0;
  249. P0=date;
  250. dsrw=1;
  251. dsas=1;
  252. dscs=1;   
  253. }

  254. uchar read_ds(uchar add)              \\用于读取DS12R887的内部时间。。。。只能读一个地址的数据。时序参看上图
  255. {
  256.   uchar ds_date;
  257. dsas=1;
  258. dsds=1;
  259. dsrw=1;
  260. dscs=0;
  261. P0=add;
  262. dsas=0;
  263. dsds=0;
  264. P0=0xff;
  265. ds_date=P0;
  266. dsds=1;
  267. dsas=1;
  268. dscs=1;
  269. return ds_date;
  270. }

  271. void set_time()
  272. {
  273. write_ds(4,10);
  274. write_ds(2,32);

  275. }

  276. void set_alarm(uchar ashi,uchar afen,uchar amiao)
  277. {
  278. write_ds(1,amiao);
  279. write_ds(3,afen);
  280. write_ds(5,ashi);
  281. }
  282. void main()           //主函数很简单。就是把。DS12R887的时间值读取出来送到液晶屏显示就ok了
  283. {
  284. init();
  285. while(1)
  286. {
  287.   keyscan();
  288.   if(flag1==1)
  289.    didi();
  290.   if(flag==0)
  291.   {
  292.    miao=read_ds(0);
  293.    fen=read_ds(2);
  294.    shi=read_ds(4);
  295.    write_sfm(10,miao);
  296.    write_sfm(7,fen);
  297.    write_sfm(4,shi);
  298.   }
  299. }
  300. }

  301. void exter() interrupt 0               \\外部中断0服务处理程式。。。。。用于启动闹钟响铃。。
  302. { uchar c;
  303. flag1=1;
  304. c=read_ds(0x0c);
  305. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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