找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2269|回复: 3
收起左侧

DS12C887+LCD1602+89C51单片机程序

[复制链接]
ID:877522 发表于 2021-3-2 16:47 | 显示全部楼层 |阅读模式
1.jpg

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char //无符号型变量0-255
  4. //sbit dula=P2^6;
  5. //sbit wela=P2^7;
  6. sbit lcden=P3^4;
  7. sbit lcdrs=P3^5;
  8. sbit s1=P3^0;
  9. sbit s2=P3^1;
  10. sbit s3=P3^2;
  11. sbit s4=P3^3;
  12. sbit rd=P3^7;
  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;
  18. void keyscan();
  19. uchar num,count,s1num,flag,i;
  20. char miao,shi,fen,Year,Month,Date,Week;    //char 有符号型变量-128-127
  21. uchar code table3[7][3]={"MON","TUE","WED","THU","FRI","STA","SUN"}; //星期的编码
  22. uchar code table[]="  21-03-05 5";
  23. uchar code table1[]="   00:00:00";
  24. void delay(uint z)
  25.     {
  26.                 uint x,y;
  27.                 for(x=z;x>0;x--)
  28.                 for(y=110;y>0;y--);        
  29.     }

  30. void write_com(uchar com)   //LCD 写指令
  31.         {
  32.         lcdrs=0;     //RS 低电平写指令
  33.         P0=com;
  34.         delay(5);
  35.         lcden=1;
  36.         delay(5);   
  37.         lcden=0;   
  38.         }   

  39. void write_data(uchar date)   //LCD 写数据
  40.         {
  41.         lcdrs=1;     //RS 高电平写数据
  42.         P0=date;
  43.         delay(5);
  44.         lcden=1;     //E=H给高脉冲
  45.         delay(5);    //E=H延时
  46.         lcden=0;     //关闭脉冲
  47.         }

  48. //void  set_time();  

  49. void init()           //初始化  
  50.     {     
  51.          uchar num;
  52. //       dula=0;
  53. //       wela=0;
  54.          lcden=0;
  55. //       set_time();
  56.         dsds=0; dsds=0; dsds=0;
  57.         write_com(0x38);
  58.         write_com(0x0c);
  59.         write_com(0x06);
  60.         write_com(0x01);

  61.         write_com(0x80);     //指针位置
  62.         for(num=0;num<15;num++)    //LCD写第一行数据
  63.         {
  64.         write_data(table[num]);
  65.         delay(5);  
  66.         }

  67. //        write_com(0x80+11);   //星期位置
  68. //        for(i=0;i<3;i++)   
  69. //        {
  70. //        write_data(table3[Week][i]);  //写入星期
  71. //        delay(5);  
  72. //        }

  73.         write_com(0x80+0x40);    //指针位置
  74.         for(num=0;num<12;num++)    //LCD写第二行数据
  75.         {
  76.        write_data(table1[num]);    //lcd写入 时分秒
  77.         delay(5);
  78.         }                 
  79.     }  
  80. void write_sfm1(uchar add,uchar date1)   // 年月日   写地址+数据
  81.     {
  82.         uchar shi,ge;
  83.         shi=date1/10;                    //  整数
  84.         ge=date1%10;                     //  余数
  85.         write_com(add+0x80);
  86.         write_data(0x30+shi);               //写入LCD 数据
  87.         write_data(0x30+ge);
  88.     }

  89. void write_sfm(uchar add,uchar date)   //十分秒     写地址+数据
  90.     {
  91.     uchar shi,ge;
  92.     shi=date/10;
  93.     ge=date%10;   
  94.     write_com(0x80+0x40+add);
  95.     write_data(0x30+shi);
  96.     write_data(0x30+ge);   
  97.     }   
  98. void write_ds(uchar add,uchar date)  //DS12C887 写地址+数据  接入P2口
  99. {
  100. dscs=0;
  101. dsds=1;
  102. dsrw=1;
  103. dsas=1;
  104. P2=add;

  105. dsas=0;   
  106. dsrw=0;
  107. P2=date;  
  108. dsrw=1;  
  109. dsas=1;
  110. dscs=1;   
  111. }   
  112. uchar read_ds(uchar add)    //DS12C887 读数据   接入P2口
  113. {
  114.         uchar z;
  115.         dscs=0;
  116.   dsrw=1;
  117.         dsds=1;
  118.   dsas=1;
  119.         P2=add;
  120.         dsas=0;
  121.   dsds=0;
  122.   P2=0xff;
  123.         z=P2;
  124.         dsds=1;
  125.   dsas=1;
  126.         dscs=1;
  127.         return z;
  128. }

  129. //void set_time()
  130. //{
  131. ////   write_ds(3,10);
  132. ////   write_ds(6,32);
  133. //}
  134. void main()
  135. {
  136.         init();
  137.         write_ds(0x0a,0x20);         //DS12CR887寄存器A功能设置,开启时钟振荡器
  138.         write_ds(0x0b,0x06);         //寄存器B功能设置,不开启闹钟中断使能,数据模式为二进制,24小时模式。
  139.         write_ds(0x0a,0x00);     //开始调时,DS12CR887关闭时钟振荡器
  140.     write_ds(0,55);          // 初始化秒 写入55   
  141.     write_ds(2,59);         //  初始化分 写入55
  142.     write_ds(4,23);          //  初始化时 写入23


  143.     write_ds(6,7);                 //初始化星期
  144.         write_ds(7,02);          //初始化日
  145.         write_ds(8,03);          //初始化月
  146.         write_ds(9,21);          //初始化年

  147.         while(1)
  148.         {
  149.                 keyscan();
  150.         if(flag==0)
  151.         {
  152.                 miao=read_ds(0);    //读秒
  153.                 fen=read_ds(2);     //读分
  154.                 shi=read_ds(4);     //读时
  155.                
  156.                 write_sfm(9,miao);        //LCD 写入秒
  157.                 write_sfm(6,fen);   //LCD 写入分
  158.                 write_sfm(3,shi);   //LCD 写入时

  159.         Year=read_ds(9);    //读年
  160.         Month=read_ds(8);   //读月
  161.         Date=read_ds(7);    //读日
  162.        Week=read_ds(6);   //读星期  取消使用字母星期

  163.        write_sfm1(11,Week);    //LCD 写入周  取消使用字母星期
  164.         write_sfm1(8,Date);     //LCD 写入日
  165.         write_sfm1(5,Month);    //LCD 写入月
  166.         write_sfm1(2,Year);     //LCD 写入年
  167.         }   
  168.         }   
  169. }
  170. void keyscan()
  171. {
  172.    rd=0;
  173.    if(s1==0)
  174.    {
  175.    delay(5);
  176.   if(s1==0)
  177.     {
  178.     s1num++;  
  179.     flag=1;   // flag=1 时钟停止 开始调时      
  180.     while(!s1);
  181.   if(s1num==1)
  182.     {   
  183. // TR0=0;
  184.     write_com(0x80+0x40+9);
  185.     write_com(0x0f);
  186.     }
  187.   if(s1num==2)
  188.     {  
  189.     write_com(0x80+0x40+6);
  190.     }  
  191.   if(s1num==3)
  192.     {  
  193.     write_com(0x80+0x40+3);
  194.     }  
  195.   if(s1num==4)
  196.     {  
  197.     write_com(0x80+11);
  198.     }
  199.   if(s1num==5)
  200.     {  
  201.     write_com(0x80+8);
  202.     }
  203.   if(s1num==6)
  204.     {  
  205.     write_com(0x80+5);
  206.     }
  207.   if(s1num==7)
  208.     {  
  209.     write_com(0x80+2);
  210.     }
  211.   if(s1num==8)
  212.     {  
  213.     s1num=0;
  214.     write_com(0x0c);
  215.     flag=0;             //此时时钟开始启动
  216.     }  
  217.    }   
  218. }

  219.     if(s1num!=0)
  220.     {   
  221.       if(s2==0)
  222.       {
  223.          delay(5);
  224.          if(s2==0)
  225.           {
  226.           while(!s2);
  227.           if(s1num==1)
  228.           {
  229.              miao++;
  230.              if(miao==60)
  231.              miao=0;
  232.              write_sfm(9,miao);
  233.              write_com(0x80+0x40+9);  
  234.              write_ds(0,miao);
  235.           }
  236.           if(s1num==2)
  237.           {
  238.             fen++;
  239.             if(fen==60)
  240.             fen=0;
  241.             write_sfm(6,fen);
  242.             write_com(0x80+0x40+6);
  243.             write_ds(2,fen);
  244.           }
  245.           if(s1num==3)
  246.           {
  247.             shi++;
  248.             if(shi==24)
  249.             shi=0;
  250.             write_sfm(3,shi);
  251.             write_com(0x80+0x40+3);
  252.             write_ds(4,shi);
  253.           }
  254.            if(s1num==4)
  255.           {
  256.             Week++;
  257.             if(Week==8)
  258.             Week=1;
  259.             write_sfm1(11,Week);
  260.             write_com(0x80+11);
  261.             write_ds(6,Week);   
  262.           }
  263.            if(s1num==5)
  264.           {
  265.             Date++;
  266.             if(Date==32)
  267.             Date=1;
  268.             write_sfm1(8,Date);
  269.             write_com(0x80+8);
  270.             write_ds(7,Date);   
  271.           }
  272.            if(s1num==6)
  273.           {
  274.             Month++;
  275.             if(Month==13)
  276.             Month=1;
  277.             write_sfm1(5,Month);
  278.             write_com(0x80+5);
  279.             write_ds(8,Month);   
  280.           }
  281.             if(s1num==7)
  282.           {
  283.             Year++;
  284.             if(Year==29)
  285.             Year=18;
  286.             write_sfm1(2,Year);
  287.             write_com(0x80+2);
  288.             write_ds(9,Year);   
  289.           }


  290.         }               
  291.       }


  292.        if(s3==0)
  293.         {
  294.           delay(5);
  295.           if(s3==0)
  296.           {
  297.             while(!s3);
  298.              if(s1num==1)
  299.              {   
  300.               miao--;
  301.               if(miao==-1)
  302.               miao=59;
  303.               write_sfm(9,miao);
  304.               write_com(0x80+0x40+9);
  305.               write_ds(0,miao);               
  306.              }
  307.              if(s1num==2)
  308.              {
  309.               fen--;
  310.               if(fen==-1)
  311.               fen=59;
  312.               write_sfm(6,fen);
  313.               write_com(0x80+0x40+6);
  314.               write_ds(2,fen);
  315.              }   
  316.               if(s1num==3)
  317.              {
  318.               shi--;
  319.               if(shi==-1)
  320.               shi=23;
  321.               write_sfm(3,shi);
  322.               write_com(0x80+0x40+3);
  323.               write_ds(4,shi);
  324.              }
  325.         if(s1num==4)
  326.           {
  327.             Week--;
  328.             if(Week==0)
  329.             Week=7;
  330.             write_sfm1(11,Week);
  331.             write_com(0x80+11);
  332.             write_ds(6,Week);   
  333.           }
  334.            if(s1num==5)
  335.           {
  336.             Date--;
  337.             if(Date==0)
  338.             Date=31;
  339.             write_sfm1(8,Date);
  340.             write_com(0x80+8);
  341.             write_ds(7,Date);   
  342.           }
  343.            if(s1num==6)
  344.           {
  345.             Month--;
  346.             if(Month==0)
  347.             Month=12;
  348.             write_sfm1(5,Month);
  349.             write_com(0x80+5);
  350.             write_ds(8,Month);   
  351.           }
  352.             if(s1num==7)
  353.           {
  354.             Year--;
  355.             if(Year==18)
  356.             Year=29;
  357.             write_sfm1(2,Year);
  358.             write_com(0x80+2);
  359.             write_ds(9,Year);   
  360.           }            
  361.            }
  362.         }  
  363.     }  
  364. }  


  365. //调节星期的程序
  366. //                    Week++;
  367. //                                    switch(Week)
  368. //                                                {
  369. //                                                        case 0:write_com(0x80+11);
  370. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  371. //                                                        case 1:write_com(0x80+11);
  372. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  373. //                                                        case 2:write_com(0x80+11);
  374. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  375. //                                                        case 3:write_com(0x80+11);
  376. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  377. //                                                        case 4:write_com(0x80+11);
  378. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  379. //                                                        case 5:write_com(0x80+11);
  380. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  381. //                                                        case 6:write_com(0x80+11);
  382. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  383. //                                                        case 7:write_com(0x80+11); Week=0;
  384. //                                                        for(i=0;i<3;i++) write_data(table3[Week][i]);   break;
  385. //                                                }

  386. //DS12887  写时钟
复制代码


回复

使用道具 举报

ID:328014 发表于 2021-3-9 19:22 | 显示全部楼层
回复

使用道具 举报

ID:591930 发表于 2021-3-13 22:01 | 显示全部楼层
按照你的做仿真,复制你的程序,,为什么没有显示
回复

使用道具 举报

ID:877522 发表于 2021-3-16 09:04 | 显示全部楼层
高占国 发表于 2021-3-13 22:01
按照你的做仿真,复制你的程序,,为什么没有显示

是不是 接线有问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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