找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5005|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于DS1302的可調(diào)時(shí)數(shù)碼管電子鐘制作 已做出成品

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
從前,利用51單片機(jī)自帶的時(shí)鐘做的電子鐘時(shí)差太大,不停地在程序里去寫時(shí)間矯正程序,之后發(fā)現(xiàn)了DS1302這個(gè)芯片,那時(shí)候是新手,不太了解,所以一直擱置,現(xiàn)在有了時(shí)間,把這個(gè)芯片詳細(xì)研究了一下,之后發(fā)現(xiàn)開(kāi)發(fā)板上程序只能讀,不能寫,專門挑了半天來(lái)研究這個(gè)芯片的驅(qū)動(dòng),果然功夫不負(fù)有心人,終于把這個(gè)做了出來(lái),成品如下



原理圖:



現(xiàn)在把代碼發(fā)一下
  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
復(fù)制代碼
  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. }
復(fù)制代碼


這邊是核心的驅(qū)動(dòng)
  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. }



復(fù)制代碼

里面有一些沒(méi)用的代碼,本來(lái)是要加上溫度顯示功能,結(jié)果沒(méi)加,現(xiàn)在把文件發(fā)了:
相關(guān)工程文件.rar (2.07 MB, 下載次數(shù): 50)


評(píng)分

參與人數(shù) 2黑幣 +112 收起 理由
zlgmo + 12 絕世好帖!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表