找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于DS1302的可调时数码管电子钟制作 已做出成品

[复制链接]
跳转到指定楼层
楼主
从前,利用51单片机自带的时钟做的电子钟时差太大,不停地在程序里去写时间矫正程序,之后发现了DS1302这个芯片,那时候是新手,不太了解,所以一直搁置,现在有了时间,把这个芯片详细研究了一下,之后发现开发板上程序只能读,不能写,专门挑了半天来研究这个芯片的驱动,果然功夫不负有心人,终于把这个做了出来,成品如下



原理图:



现在把代码发一下
  1. /***temp.h***/
  2. #ifndef _temp_h_
  3. #define _temp_h_

  4. #include"reg52.h"
  5. #include"intrins.h"

  6. #define uint unsigned int
  7. #define uchar unsigned char
  8.         
  9. extern uchar shuzu[7];

  10. sbit sclk=P3^2;
  11. sbit dsio=P3^3;
  12. sbit dir=P3^4;
  13. sbit dq=P3^5;

  14. sbit sb1=P1^0;
  15. sbit sb2=P1^1;
  16. sbit sb3=P1^2;

  17. //void delay(uint z);
  18. void dee(uint z);
  19. void csh1302();
  20. void dq1302();
  21. void xzl1302(uchar add,uchar dar);
  22. uchar kzzsc(uchar ram,uchar temp,uchar wd);


  23. #endif
复制代码
  1. /***main.c***/
  2. #include"temp.h"

  3. uchar dtt,drr;
  4. uchar smgshuzu[4];
  5. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. uint et0time=(65535-50000);

  7. void zhdq1302(uchar i)
  8. {
  9.                 uchar ge,shi,miao;
  10.                 if(i==0){dq1302();}
  11.                 smgshuzu[0]=table[shuzu[2]/16];
  12.                 smgshuzu[1]=dtt+table[shuzu[2]%16];
  13.                 smgshuzu[2]=table[shuzu[1]/16];
  14.                 smgshuzu[3]=table[shuzu[1]%16];
  15.                 shi=shuzu[0]/16;
  16.                 ge=shuzu[0]%16;
  17.                 miao=ge+shi*10;
  18.                 if(miao!=drr)
  19.                 {
  20.                                 drr=miao;
  21.                                 if(dtt==0x00){dtt=0x80;}
  22.                                 else {dtt=0x00;}
  23.                 }
  24. }

  25. void smgxs()
  26. {
  27.                 uchar i;
  28.                 P0=0xfe;
  29.                 for(i=0;i<4;i++)
  30.                 {
  31.                                 P2=smgshuzu[i];
  32.                                 dee(100);
  33.                                 P2=0x00;
  34.                                 P0=_crol_(P0,1);
  35.                 }
  36. }

  37. void szcsh()
  38. {
  39.                 TCON=1;
  40.                 TH0=et0time/256;
  41.                 TL0=et0time%256;
  42.                 TR0=1;
  43.                 EA=1;
  44.                 ET0=1;
  45. }

  46. void main()
  47. {
  48.                 uchar i,k;
  49.                 uint l;
  50.                 csh1302();
  51.                 szcsh();
  52.                 while(1)
  53.                 {
  54.                                 zhdq1302(0);
  55.                                 if(sb1==0)
  56.                                 {
  57.                                                 dee(100);
  58.                                                 if(sb1==0)
  59.                                                 {
  60.                                                                 while(sb1==0){l++,dee(110);if(l==1000){k=1;l=0;}}
  61.                                                                 dee(100);
  62.                                                                 xzl1302(0x8e,0x00);
  63.                                                                 xzl1302(kzzsc(0,1,1),0x80);
  64.                                                                 while(sb1!=0 && k!=1)
  65.                                                                 {
  66.                                                                                 zhdq1302(1);
  67.                                                                                 smgxs();
  68.                                                                                 if(sb2==0){while(sb2==0);dee(100);shuzu[1]++;}
  69.                                                                                 if(sb3==0){while(sb3==0);dee(100);shuzu[2]++;}
  70.                                                                                 
  71.                                                                                 if(shuzu[1]%16==10){shuzu[1]-=10;shuzu[1]+=16;}
  72.                                                                                 
  73.                                                                                 if(shuzu[1]/16==6){shuzu[1]=0;shuzu[2]++;}
  74.                                                                                 
  75.                                                                                 if(shuzu[2]%16==10){shuzu[2]-=10;shuzu[2]+=16;}
  76.                                                                                 
  77.                                                                                 if(shuzu[2]%16==4&&shuzu[2]/16==2){shuzu[0]=shuzu[1]=shuzu[2]=0;}
  78.                                                                                                 
  79.                                                                 }
  80.                                                                 while(sb1==0);
  81.                                                                 if(k==0)
  82.                                                                 {
  83.                                                                                 for(i=0;i<7;i++)
  84.                                                                                 {
  85.                                                                                                 xzl1302(kzzsc(0,i,0),shuzu[i]);
  86.                                                                                 }
  87.                                                                                 xzl1302(0x8e,0x80);
  88.                                                                 }
  89.                                                                 k=0;
  90.                                                 }
  91.                                 }
  92.                 }
  93. }

  94. void zhong1() interrupt 1
  95. {
  96.                 uint i;
  97.         
  98.                 TH0=et0time/256;
  99.                 TL0=et0time%256;
  100.         
  101.                 smgxs();
  102.         
  103.                 i++;
  104.         
  105.                 if(i==200)
  106.                 {
  107.                                 i=0;
  108.                 }
  109. }
复制代码


这边是核心的驱动
  1. /***ds1302.c***/
  2. #include"temp.h"

  3. uchar shuzu[7]={0,0,0x12,0x07,0x05,0x06,0x16};

  4. void dee(uint z)
  5. {
  6.                 while(z--);
  7. }

  8. /*void delay(uint z)
  9. {
  10.                 uint x,y;
  11.                 for(x=z;x>0;x--)
  12.                                 for(y=110;y>0;y--);
  13. }*/

  14. void xzl1302(uchar add,uchar dar)
  15. {
  16.                 uchar i;
  17.                 sclk=0;
  18.                 _nop_();
  19.                 dir=1;
  20.                 _nop_();
  21.         
  22.                 for(i=0;i<8;i++)
  23.                 {
  24.                                 dsio=add&0x01;
  25.                                 add>>=1;
  26.                                 _nop_();
  27.                                 sclk=1;
  28.                                 _nop_();
  29.                                 sclk=0;
  30.                                 _nop_();
  31.                 }
  32.                 _nop_();
  33.                 for(i=0;i<8;i++)
  34.                 {
  35.                                 dsio=dar&0x01;
  36.                                 dar>>=1;
  37.                                 _nop_();
  38.                                 sclk=1;
  39.                                 _nop_();
  40.                                 sclk=0;
  41.                                 _nop_();
  42.                 }
  43.                 _nop_();
  44.                 dir=0;
  45. }

  46. uchar dsj1302(uchar dar)
  47. {
  48.                 uchar bi,temp,i;
  49.                 sclk=0;
  50.                 _nop_();
  51.                 dir=1;
  52.                 _nop_();
  53.                
  54.                 for(i=0;i<8;i++)
  55.                 {
  56.                                 dsio=dar&0x01;
  57.                                 dar>>=1;
  58.                                 _nop_();
  59.                                 sclk=1;
  60.                                 _nop_();
  61.                                 sclk=0;
  62.                                 _nop_();
  63.                 }
  64.                 _nop_();
  65.                 for(i=0;i<8;i++)
  66.                 {
  67.                                 bi=dsio;
  68.                                 temp=(temp>>=1)|(bi<<=7);
  69.                                 _nop_();
  70.                                 sclk=1;
  71.                                 _nop_();
  72.                                 sclk=0;
  73.                                 _nop_();
  74.                 }
  75.                
  76.                 dir=0;
  77.                 _nop_();
  78.                 sclk=1;
  79.                 _nop_();
  80.                 dsio=0;
  81.                 _nop_();
  82.                 dsio=1;
  83.                 _nop_();
  84.                 return temp;
  85. }

  86. uchar kzzsc(uchar ram,uchar temp,uchar wd)
  87. {
  88.                 uchar drr;
  89.                 drr=1;
  90.                 drr<<=1;
  91.                 drr=drr|ram;
  92.                 drr<<=5;
  93.                 drr+=temp;
  94.                 drr<<=1;
  95.                 drr+=wd;
  96.                 return drr;
  97. }

  98. void dq1302()
  99. {
  100.                 uchar i;
  101.                 for(i=0;i<7;i++)
  102.                 {
  103.                                 shuzu[i]=dsj1302(kzzsc(0,i,1));
  104.                                 _nop_();
  105.                 }
  106. }

  107. void csh1302()
  108. {
  109.                 uchar i;
  110.                 xzl1302(0x8e,0x00);
  111.                 for(i=0;i<7;i++)
  112.                 {
  113.                                 xzl1302(kzzsc(0,i,0),shuzu[i]);
  114.                                 _nop_();
  115.                 }
  116.                 xzl1302(0x8e,0x80);
  117. }



复制代码

里面有一些没用的代码,本来是要加上温度显示功能,结果没加,现在把文件发了:
相关工程文件.rar (2.07 MB, 下载次数: 48)


评分

参与人数 2黑币 +112 收起 理由
zlgmo + 12 绝世好帖!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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