找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机高精度DS12C887可调闹钟制作(附程序 多图)

[复制链接]
跳转到指定楼层
楼主
又来51hei论坛逛逛,看看有什么新东西, 顺便发个最近的单片机作品.








实验材料:
DIP40脚座一个
杜邦线 单头带帽 40根
单排针 两排
小电路板一块
DS12C887一片(旧10元,新22元)
焊锡
电烙铁
烙铁架
万用表

实验操作:
1.stc89c52
DS12C887
2.LCD1602液晶显示:
4脚--P25;5脚--P26;6脚--P27
3.4x4矩阵键盘:
key=P10;key=0;
s1=P14;
s2=P15;
s3=P16;
s4=P17;
4.蜂鸣器:
buzz=P23.
(具体接线视单片机电路板情况而定)


源程序:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit rs=P2^5;
  5. sbit rw=P2^6;
  6. sbit en=P2^7;
  7. sbit s1=P1^4;
  8. sbit s2=P1^5;
  9. sbit s3=P1^6;
  10. //sbit s4=P1^7;
  11. sbit s4=P3^2;
  12. sbit s5=P3^3;
  13. sbit s6=P3^4;
  14. sbit key1=P1^0;
  15. sbit beep=P2^3;
  16. sbit dscs=P2^0;
  17. sbit dsas=P2^1;
  18. sbit dsrw=P2^2;
  19. sbit dsds=P2^4;
  20. sbit dsirq=P3^2;
  21. uchar code table[]="  20  -  -      ";
  22. uchar code table1[]="      :  :  ";
  23. uchar miao,shi,fen,day,month,year,week,s1num,flag,flag1;
  24. void delay(uint z);
  25. void set_time();
  26. void set_alarm(uchar,uchar,uchar);
  27. void write_ds(uchar,uchar);
  28. uchar read_ds(uchar);

  29. void write_com(uchar com)
  30. {
  31. rs=0;
  32. rw=0;
  33. P0=com;
  34. delay(5);
  35. en=1;
  36. delay(5);
  37. en=0;
  38. }
  39. void write_data(uchar date)
  40. {
  41. rs=1;
  42. rw=0;
  43. P0=date;
  44. delay(5);
  45. en=1;
  46. delay(5);
  47. en=0;
  48. }
  49. void init()
  50. {
  51. uchar num;
  52. en=0;
  53. EA=1;
  54. EX0=1;
  55. IT0=1;
  56. set_time();
  57. set_alarm(18,50,0);
  58. write_ds(0x0B,0x26);
  59. read_ds(0x0c);
  60. write_com(0x38);
  61. write_com(0x0c);
  62. write_com(0x06);
  63. write_com(0x01);
  64. write_com(0x80);
  65.   for(num=0;num<16;num++)
  66.       {
  67.        write_data(table[num]);
  68.         delay(5);
  69.        }
  70. write_com(0x80+0x40);
  71.   for(num=0;num<12;num++)
  72.       {
  73.        write_data(table1[num]);
  74.         delay(5);
  75.        }
  76. }
  77. void write_nyr(uchar add,uchar date)
  78. {
  79. uchar shi,ge;
  80. shi=date/10;
  81. ge=date%10;
  82. write_com(0x80+add);
  83. write_data(0x30+shi);
  84. write_data(0x30+ge);
  85. }
  86. void write_sfm(uchar add,uchar date)
  87. {
  88. uchar shi,ge;
  89. shi=date/10;
  90. ge=date%10;
  91. write_com(0x80+0x40+add);
  92. write_data(0x30+shi);
  93. write_data(0x30+ge);
  94. }
  95. void write_week(uchar week)
  96. {
  97. write_com(0x80+13);
  98. switch(week)
  99.   {
  100.    case 1:write_data('M');delay(5);
  101.            write_data('O');delay(5);
  102.            write_data('N');
  103.            break;
  104.     case 2:write_data('T');delay(5);
  105.            write_data('U');delay(5);
  106.            write_data('E');
  107.            break;
  108.     case 3:write_data('W');delay(5);
  109.            write_data('E');delay(5);
  110.            write_data('D');
  111.            break;
  112.     case 4:write_data('T');delay(5);
  113.            write_data('H');delay(5);
  114.            write_data('U');
  115.            break;
  116.      case 5:write_data('F');delay(5);
  117.            write_data('R');delay(5);
  118.            write_data('I');
  119.            break;
  120.      case 6:write_data('S');delay(5);
  121.            write_data('A');delay(5);
  122.            write_data('T');
  123.            break;
  124.      case 7:write_data('S');delay(5);
  125.            write_data('U');delay(5);
  126.            write_data('N');
  127.            break;
  128.   }
  129. }

  130. void write_ds(uchar add,uchar date)
  131. {
  132. dscs=0;
  133. dsas=1;
  134. dsds=1;
  135. dsrw=1;
  136. P0=add;
  137. dsas=0;
  138. dsrw=0;
  139. P0=date;
  140. dsrw=1;
  141. dsas=1;
  142. dscs=1;
  143. }
  144. uchar read_ds(uchar add)
  145. {
  146. uchar ds_date;
  147. dscs=0;
  148. dsas=1;
  149. dsds=1;
  150. dsrw=1;

  151. P0=add;
  152. dsas=0;
  153. dsds=0;
  154. P0=0xff;
  155. ds_date=P0;
  156. dsas=1;
  157. dsds=1;
  158. dscs=1;
  159. return ds_date;
  160. }
  161. void set_time()
  162. {
  163. //write_ds(4,11);
  164. //write_ds(2,17);
  165. write_ds(7,28);
  166. write_ds(8,8);
  167. write_ds(9,12);
  168. write_ds(6,2);
  169. }
  170. void set_alarm(uchar ashi,uchar afen,uchar amiao)
  171. {
  172. //write_ds(9,ayear);
  173. //write_ds(8,amonth);
  174. //write_ds(7,aday);
  175. write_ds(1,amiao);
  176. write_ds(3,afen);
  177. write_ds(5,ashi);
  178. }
  179. void keyscan()
  180. {
  181. key1=0;
  182. if(flag1==1)
  183. {
  184. if(s2==0)
  185.    {
  186.     delay(5);
  187.      if(s2==0)
  188.        {
  189.         while(!s2);
  190.         flag1=0;
  191.        }
  192.    }
  193. if(s3==0)
  194.    {
  195.     delay(5);
  196.      if(s3==0)
  197.        {
  198.         while(!s3);
  199.         flag1=0;
  200.        }
  201.    }
  202. }
  203. if(s1==0)
  204.     {
  205.      delay(5);
  206.        if(s1==0)
  207.          {
  208.           s1num++;
  209.               flag=1;
  210.               flag1=0;
  211.               while(!s1);
  212.             if(s1num==1)
  213.               {
  214.                
  215.                write_com(0x80+0x40+10);
  216.                write_com(0x0f);
  217.               }
  218.             if(s1num==2)
  219.               {
  220.               write_com(0x80+0x40+7);
  221.               }
  222.            if(s1num==3)
  223.               {
  224.               write_com(0x80+0x40+4);
  225.               }
  226.               if(s1num==4)
  227.               {
  228.                
  229.                write_com(0x80+10);
  230.                //write_com(0x0f);
  231.               }
  232.             if(s1num==5)
  233.               {
  234.               write_com(0x80+7);
  235.               }
  236.            if(s1num==6)
  237.               {
  238.               write_com(0x80+4);
  239.               }
  240.             if(s1num==7)
  241.               {
  242.               write_com(0x80+13);
  243.               }
  244.             if(s1num==8)
  245.               {
  246.               s1num=0;
  247.              write_com(0x0c);
  248.                flag=0;
  249.               write_ds(0,miao);
  250.               write_ds(2,fen);
  251.               write_ds(4,shi);
  252.               write_ds(7,day);
  253.               write_ds(8,month);
  254.               write_ds(9,year);
  255.                write_ds(6,week);
  256.               }
  257.           }
  258.     }
  259. if(s1num!=0)
  260.    {
  261.     if(s2==0)
  262.       {
  263.        delay(5);
  264.         if(s2==0)
  265.           {
  266.           while(!s2);
  267.            if(s1num==1)
  268.             {
  269.             miao++;
  270.              if(miao==60)
  271.                 miao=0;
  272.              write_sfm(10,miao);
  273.             write_com(0x80+0x40+10);
  274.            }
  275.            if(s1num==2)
  276.             {
  277.             fen++;
  278.              if(fen==60)
  279.                 fen=0;
  280.             
  281.             write_sfm(7,fen);
  282.             write_com(0x80+0x40+7);
  283.             }
  284.            if(s1num==3)
  285.             {
  286.             shi++;
  287.              if(shi==24)
  288.                 shi=0;
  289.            
  290.             write_sfm(4,shi);
  291.              write_com(0x80+0x40+4);
  292.             }
  293.             if(s1num==4)
  294.             {
  295.             day++;
  296.              if(day==32)
  297.                 day=1;
  298.            
  299.             write_nyr(10,day);
  300.              write_com(0x80+10);
  301.           }
  302.             if(s1num==5)
  303.             {
  304.             month++;
  305.              if(month==13)
  306.               month=1;
  307.            
  308.             write_nyr(7,month);
  309.              write_com(0x80+7);
  310.           }
  311.           if(s1num==6)
  312.             {
  313.             year++;
  314.              if(year==99)
  315.                 year=0;
  316.            
  317.             write_nyr(4,year);
  318.              write_com(0x80+4);
  319.           }
  320.          if(s1num==7)
  321.             {
  322.             week++;
  323.              if(week==8)
  324.                 week=1;
  325.            
  326.             write_week(week);
  327.              write_com(0x80+13);
  328.           }
  329.             
  330.       }
  331.    }
  332. }
  333. if(s1num!=0)
  334.    {
  335.     if(s3==0)
  336.       {
  337.        delay(5);
  338.         if(s3==0)
  339.           {
  340.           while(!s3);
  341.            if(s1num==1)
  342.             {
  343.             miao--;
  344.              if(miao==-1)
  345.                 miao=59;
  346.              write_sfm(10,miao);
  347.             write_com(0x80+0x40+10);
  348.            }
  349.            if(s1num==2)
  350.             {
  351.             fen--;
  352.              if(fen==-1)
  353.                 fen=59;
  354.             
  355.             write_sfm(7,fen);
  356.             write_com(0x80+0x40+7);
  357.             }
  358.            if(s1num==3)
  359.             {
  360.             shi--;
  361.              if(shi==-1)
  362.                 shi=23;
  363.            
  364.             write_sfm(4,shi);
  365.              write_com(0x80+0x40+4);
  366.             }
  367.             
  368.            if(s1num==4)
  369.             {
  370.            day--;
  371.              if(day==0)
  372.                 shi=31;
  373.            
  374.             write_nyr(10,day);
  375.              write_com(0x80+10);
  376.             }
  377.            if(s1num==5)
  378.             {
  379.             month--;
  380.              if(month==0)
  381.                 month=12;
  382.            
  383.             write_nyr(7,month);
  384.              write_com(0x80+7);
  385.             }
  386.             if(s1num==6)
  387.             {
  388.             year--;
  389.              if(year==-1)
  390.                year=99;
  391.            
  392.             write_nyr(4,year);
  393.              write_com(0x80+4);
  394.             }
  395.            if(s1num==7)
  396.             {
  397.             week--;
  398.              if(week==0)
  399.                week=7;
  400.            
  401.             write_week(week);
  402.              write_com(0x80+13);
  403.             }
  404.           }
  405.       }
  406.    }


  407. }
  408. void didi()
  409. {
  410. beep=0;
  411. delay(50);
  412. beep=1;
  413. delay(100);
  414. beep=0;
  415. delay(50);
  416. beep=1;
  417. }
  418. void main()
  419. {
  420. init();
  421. while(1)
  422.     {
  423.      keyscan();
  424.       if(flag1==1)
  425.          didi();
  426.       if(flag==0)
  427.       {
  428.        miao=read_ds(0);
  429.        fen=read_ds(2);
  430.        shi=read_ds(4);
  431.        day=read_ds(7);
  432.        month=read_ds(8);
  433.         year=read_ds(9);
  434.          week=read_ds(6);
  435.        write_sfm(10,miao);
  436.        write_sfm(7,fen);
  437.        write_sfm(4,shi);
  438.        write_nyr(10,day);
  439.        write_nyr(7,month);
  440.         write_nyr(4,year);
  441.         write_week(week);
  442.         }
  443.    
  444.     }
  445. }
  446. void delay(uint z)
  447. {
  448. uchar x,y;
  449. for(x=z;x>0;x--)
  450.    for(y=110;y>0;y--);
  451. }
  452. void exter0() interrupt 0
  453. {
  454. uchar c;
  455. flag1=1;
  456. c=read_ds(0x0c);
  457. }
复制代码







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

使用道具 举报

沙发
ID:70614 发表于 2014-12-19 10:14 | 只看该作者
好东西我也要制作
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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