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

QQ登錄

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

帖子
查看: 5073|回復(fù): 5
收起左側(cè)

工藝品時(shí)鐘制作 高精度

[復(fù)制鏈接]
ID:156124 發(fā)表于 2017-4-30 16:38 | 顯示全部樓層 |閱讀模式
很久沒(méi)發(fā)帖了,那么來(lái)一貼,這個(gè)項(xiàng)目歷時(shí)3個(gè)半月,因?yàn)閯傞_(kāi)始也就做著玩。先上圖。
155726.jpg
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include<string.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ulong unsigned long
  7. P4SW=0xff;
  8. uchar sec, min, hour, day, month,counter,xingqi,AL1SEC,AL1MIN,AL1HOUR,AL1DAY,AL2MIN,AL2HOUR,AL2DAY,AMZT;
  9. uchar EDA=7;
  10. uint year;
  11. bit ack;
  12. uint cnt = 0;
  13. uchar i = 0;
  14. uchar j = 10;
  15. sbit leden1 = P0^1;
  16. sbit leden2 = P0^3;
  17. sbit leden3 = P0^7;
  18. sbit leden4 = P2^7;
  19. sbit leden5 = P0^6;
  20. sbit led1 = P0^0;
  21. sbit led2 = P0^2;
  22. sbit led3 = P0^4;
  23. sbit led4 = P4^4;
  24. sbit led5 = P2^6;
  25. sbit led6 = P2^2;
  26. sbit led7 = P2^0;


  27. sbit SDA=P2^4;     //模擬I2C數(shù)據(jù)傳送位SDA           
  28. sbit SCL=P2^5;     //模擬I2C時(shí)鐘控制位SCL

  29. #define ADDRTW          0xD0    //器件寫(xiě)地址
  30. #define ADDRTD          0xD1 //器件讀地址
  31. #define DS3231_SEC      0x00   //秒
  32. #define DS3231_MIN      0x01   //分
  33. #define DS3231_HOUR     0x02   //時(shí)
  34. #define DS3231_DAY      0x03   //星期
  35. #define DS3231_DATE     0x04   //日
  36. #define DS3231_MONTH    0x05   //月
  37. #define DS3231_YEAR     0x06   //年
  38. //鬧鈴1            
  39. #define DS3231_Al1SEC   0x07   //秒
  40. #define DS3231_AL1MIN   0x08   //分
  41. #define DS3231_AL1HOUR  0x09   //時(shí)
  42. #define DS3231_AL1DAY   0x0A   //星期/日
  43. //鬧鈴2
  44. #define DS3231_AL2MIN   0x0b   //分
  45. #define DS3231_AL2HOUR  0x0c   //時(shí)
  46. #define DS3231_AL2DAY   0x0d   //星期/日
  47. #define DS3231_CONTROL  0x0e   //控制寄存器
  48. #define DS3231_STATUS   0x0f   //狀態(tài)寄存器
  49. bit ack;




  50. void ledyinshe( ulong  j )   
  51. {  led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;

  52. switch(j)
  53. {
  54.    case 0: led1=0;led2=0;led3=0;led4=1;led5=0;led6=0;led7=0; break;
  55.   case 1: led1=1;led2=0;led3=1;led4=1;led5=0;led6=1;led7=1; break;
  56.   case 2: led1=0;led2=1;led3=0;led4=0;led5=0;led6=1;led7=0; break;
  57.   case 3: led1=0;led2=0;led3=1;led4=0;led5=0;led6=1;led7=0; break;
  58.   case 4: led1=1;led2=0;led3=1;led4=0;led5=0;led6=0;led7=1; break;
  59.   case 5: led1=0;led2=0;led3=1;led4=0;led5=1;led6=0;led7=0; break;
  60.   case 6: led1=0;led2=0;led3=0;led4=0;led5=1;led6=0;led7=0; break;
  61.   case 7: led1=1;led2=0;led3=1;led4=1;led5=0;led6=0;led7=0; break;
  62.   case 8: led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0; break;
  63.   case 9: led1=0;led2=0;led3=1;led4=0;led5=0;led6=0;led7=0; break;
  64.   case 10:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=0; break;
  65.   case 11:led1=1;led2=1;led3=1;led4=0;led5=1;led6=1;led7=1; break;
  66.   case 12:led1=0;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1; break;
  67.   case 13:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1; break;
  68.   default:break;
  69. }
  70. }
  71. void Delay100us()  [url=]//@11.0592MHz[/url]
  72. {
  73. unsigned char i, j;
  74. _nop_();
  75. _nop_();
  76. i = 2;
  77. j = 15;
  78. do
  79. {
  80.   while (--j);
  81. } while (--i);
  82. }
  83. void delay1ms(uchar j)
  84. {
  85. while(j!=0)
  86. {uchar i;
  87. for(i=124;i>0;i--);  //延時(shí)124*8+10=1002us
  88. j--;
  89. }
  90. }
  91. void delay1(unsigned char i)
  92. {
  93. for(i;i>0;i--);
  94. }
  95. uchar BCD2HEX(uchar val)           //BCD轉(zhuǎn)換為Byte           
  96. {  uchar i;
  97.    i= val&0x0f;
  98.    val >>= 4;
  99.    val &= 0x0f;
  100.    val *= 10;
  101.     i+= val;
  102.    return i;
  103. }
  104. uchar BCD2HEX2(uchar val)           //BCD轉(zhuǎn)換為Byte           
  105. {  uchar i;
  106.    i= val&0x0f;
  107.    val >>= 4;
  108.    val &= 0x07;
  109.    val *= 10;
  110.     i+= val;
  111.    return i;
  112. }

  113. uchar BCD2HEXAM(uchar val)           //BCD轉(zhuǎn)換為Byte           
  114. {  uchar i;
  115.    i= val&0x03;  
  116.    return i;
  117. }
  118. uchar HEX2BCD(uchar val)//B碼轉(zhuǎn)換為BCD碼
  119.          {
  120.          uchar i,j,k;
  121.            i=val/10;
  122.            j=val%10;
  123.            k=j+(i<<4);
  124.            return k;
  125.          }
  126.    uchar HEX2BCDAM(uchar val)//B碼轉(zhuǎn)換為BCD碼
  127.          {
  128.          uchar i,j,k;
  129.            i=val/10;
  130.            j=val%10;
  131.            k=j+(i<<4);
  132.      k|=0x80;
  133.            return k;
  134.          }
  135. void Start()      
  136. {
  137.    SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號(hào)
  138.    delay1(1);
  139.    SCL=1;
  140.    delay1(5);             //起始條件建立時(shí)間大于4.7us,延時(shí)
  141.      SDA=0;                  //發(fā)送起始信號(hào)
  142.    delay1(5);             // 起始條件鎖定時(shí)間大于4μs
  143.    SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  144.    delay1(2);
  145. }
  146. void Stop()
  147. {
  148.    SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
  149.    delay1(1);             //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
  150.    SCL=1;                  //結(jié)束條件建立時(shí)間大于4us
  151.     delay1(5);
  152.    SDA=1;                  //發(fā)送I2C總線結(jié)束信號(hào)
  153.    delay1(4);
  154. }
  155. /********************************************************/
  156. /*******************************************************************
  157.                   字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  158. 函數(shù)原型:     void  SendByte(uchar Dat);
  159. 功能:      將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
  160.           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
  161.           ack=1        發(fā)送數(shù)據(jù)正常,
  162.           ack=0        被控器無(wú)應(yīng)答或損壞。
  163. ********************************************************************/
  164. void SendByte(uchar Dat)
  165. {
  166. uchar BitCnt;
  167.    for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長(zhǎng)度為8位
  168.     {
  169.        if((Dat<<BitCnt)&0x80)
  170.            SDA=1;                          //判斷發(fā)送位
  171.        else
  172.            SDA=0;               
  173.          delay1(1);
  174.          SCL=1;                            //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位
  175.          delay1(5);                       //保證時(shí)鐘高電平周期大于4μs   
  176.          SCL=0;
  177.     }
  178.    delay1(2);
  179.    SDA=1;                                 //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
  180.    delay1(2);  
  181.    SCL=1;
  182.     delay1(3);
  183.    if(SDA==1)
  184.        ack=0;   
  185.    else
  186.        ack=1;                             //判斷是否接收到應(yīng)答信號(hào)
  187.    SCL=0;
  188.    delay1(2);
  189. }
  190. uchar RcvByte()                                                                                  //功能:     用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。
  191. {
  192. uchar retc;
  193. uchar BitCnt;
  194.   retc=0;
  195.   SDA=1;                          //置數(shù)據(jù)線為輸入方式
  196.   for(BitCnt=0;BitCnt<8;BitCnt++)
  197.    {
  198.        delay1(1);  
  199.        SCL=0;                      //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
  200.        delay1(5);                 //時(shí)鐘低電平周期大于4.7μs
  201.        SCL=1;                      //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  202.        delay1(3);
  203.        retc=retc<<1;
  204.        if(SDA==1)
  205.            retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  206.        delay1(2);
  207.    }
  208.   SCL=0;
  209.   delay1(2);
  210.   return(retc);
  211. }
  212. void I2CACK(bit a)                       // 功能:       主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)
  213. {
  214.    if(a==0)
  215.        SDA=0;              //在此發(fā)出應(yīng)答或非應(yīng)答信號(hào)
  216.    else
  217.        SDA=1;
  218.    delay1(3);     
  219.    SCL=1;
  220.    delay1(5);             //時(shí)鐘低電平周期大于4μs
  221.    SCL=0;                  //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
  222.    delay1(2);   
  223. }
  224. uchar I2CRead()                                                                                  /************從DS3231當(dāng)前地址讀一個(gè)字節(jié)************/
  225. {
  226. uchar read_data;
  227.          Start();
  228.    SendByte(ADDRTD);                                             
  229.    if(ack==0)
  230.     {
  231. return(0);
  232.     }
  233.    read_data = RcvByte();
  234.    I2CACK(1);
  235.    Stop();
  236.    return read_data;
  237. }
  238. uchar I2CReadAdd(uchar addr)                                                      /************從DS3231指定地址讀一個(gè)字節(jié)************/
  239.          {
  240.              Start();
  241.              SendByte(ADDRTW);                           
  242.              if(ack==0)
  243.              {        
  244.            return(0);
  245.              }
  246.              SendByte(addr);
  247.              if(ack==0)
  248.              {        
  249.            return(0);
  250.              }
  251.              return(I2CRead());
  252.          }
  253. void Readtime()                                                                                            /*********************讀取時(shí)間**********************/
  254.          {
  255.           uchar temp;
  256.           temp=I2CReadAdd(DS3231_SEC);//秒
  257.           sec=BCD2HEX(temp);
  258.           temp=I2CReadAdd(DS3231_MIN);//分
  259.           min=BCD2HEX(temp);
  260.           temp=I2CReadAdd(DS3231_HOUR);  //時(shí)                  
  261.           hour=BCD2HEX(temp);
  262.           temp=I2CReadAdd(DS3231_DATE);  //日
  263.           day=BCD2HEX(temp);
  264.           temp=I2CReadAdd(DS3231_MONTH); //月
  265.           month=BCD2HEX(temp);
  266.           temp=I2CReadAdd(DS3231_YEAR);  //年
  267.           year=BCD2HEX(temp);
  268.     year+=2000;
  269.     temp=I2CReadAdd(DS3231_DAY);  //星期
  270.     xingqi = BCD2HEX(temp);
  271.      temp=I2CReadAdd(DS3231_AL1MIN );  //星期
  272.     AL1MIN = BCD2HEX2(temp);
  273.      temp=I2CReadAdd(DS3231_AL1HOUR);  //星期
  274.     AL1HOUR= BCD2HEX2(temp);
  275.     temp=I2CReadAdd(DS3231_AL2MIN );  //星期
  276.     AL2MIN = BCD2HEX2(temp);
  277.      temp=I2CReadAdd(DS3231_AL2HOUR);  //星期
  278.     AL2HOUR= BCD2HEX2(temp);

  279.     temp=I2CReadAdd(DS3231_STATUS );  //星期
  280.     AMZT= BCD2HEXAM(temp);
  281.    
  282.           }
  283. void InitDS3231()                                                                                                            //ds3231初始化
  284.          {SCL=1;
  285.           delay1(5);
  286.           SDA=1;
  287.           delay1(5);
  288.          }
  289. /*  
  290. void TimeDisplay(uchar Dhour,ucharDmin,uchar Dsec)                                     //時(shí)分秒數(shù)組賦值
  291.          {
  292.       b[0]=numbr[Dhour / 10];        // 時(shí)十位
  293.              b[1]=numbr[Dhour % 10];        // 時(shí)個(gè)位
  294.              b[4]=numbr[Dmin / 10];         // 分十位
  295.              b[5]=numbr[Dmin % 10];         // 分個(gè)位
  296.              b[8]=numbr[Dsec / 10];         // 秒十位
  297.              b[9]=numbr[Dsec % 10];         // 秒個(gè)位
  298.       
  299.          }
  300.      */
  301.      /*
  302. void DateDisplay(uchar Dyear,ucharDmonth,uchar Dday)                       //年月天數(shù)組賦值   
  303.          {
  304.      
  305.       a[2]=numbr[Dyear / 10];        // 年十位
  306.              a[3]=numbr[Dyear % 10];        // 年個(gè)位
  307.              a[6]=numbr[Dmonth / 10];       // 月十位
  308.              a[7]=numbr[Dmonth % 10];       // 月個(gè)位
  309.              a[10]=numbr[Dday / 10];         // 天十位
  310.              a[11]=numbr[Dday % 10];         // 天個(gè)位     
  311.      
  312.          }
  313.      */
  314. void Start_I2C()
  315. {
  316.    SDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號(hào)
  317.    delay1(1);
  318.    SCL=1;
  319.    delay1(5);             //起始條件建立時(shí)間大于4.7us,延時(shí)
  320.    SDA=0;                  //發(fā)送起始信號(hào)
  321.    delay1(5);             // 起始條件鎖定時(shí)間大于4μs
  322.    SCL=0;                  //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
  323.    delay1(2);
  324. }
  325. void Stop_I2C()
  326. {
  327.     SDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
  328.    delay1(1);             //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
  329.    SCL=1;                  //結(jié)束條件建立時(shí)間大于4us
  330.    delay1(5);
  331.    SDA=1;                  //發(fā)送I2C總線結(jié)束信號(hào)
  332.    delay1(4);
  333. }
  334. uchar write_byte(uchar addr, uchar write_data)
  335. {
  336.    Start_I2C();
  337.    SendByte(ADDRTW);                //////*******************************************************************///////////
  338.    if (ack == 0)
  339.        return 0;
  340.    SendByte(addr);   
  341.    if (ack == 0)
  342.        return 0;
  343.    SendByte(write_data);
  344.    if (ack == 0)
  345.        return 0;
  346.    Stop_I2C();
  347.     delay1ms(10);      
  348.    return 1;
  349. }
  350. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar xq,uchar AL1DAY,uchar A1HOUR,uchar A1MIN,uchar AL1SEC,uchar AL2DAY,uchar A2HOUR,uchar AL2MIN)
  351. {     uchar temp=0;
  352.    temp=HEX2BCD(yea);                 
  353.    write_byte(DS3231_YEAR,temp);   //修改年
  354.    temp=HEX2BCD(mon);
  355.    write_byte(DS3231_MONTH,temp);  //修改月
  356.    temp=HEX2BCD(da);                                                                                     /////////////////////
  357.    write_byte(DS3231_DATE,temp);   //修改日
  358.    temp=HEX2BCD(hou);
  359.    write_byte(DS3231_HOUR,temp);   //修改時(shí)
  360.    temp=HEX2BCD(min);
  361.    write_byte(DS3231_MIN,temp); //修改分
  362.    temp=HEX2BCD(sec);
  363.    write_byte(DS3231_SEC,temp); //修改秒

  364.   temp=HEX2BCD(xq);
  365.    write_byte(DS3231_DAY,temp); //修改星期
  366.    
  367.    temp=HEX2BCD(AL1SEC);
  368.    write_byte(DS3231_Al1SEC,temp); //修改星期
  369.     temp=HEX2BCD(A1MIN);
  370.    write_byte(DS3231_AL1MIN,temp); //修改星期
  371.     temp=HEX2BCD(A1HOUR);
  372.    write_byte(DS3231_AL1HOUR,temp); //修改星期
  373.     temp=HEX2BCDAM(AL1DAY);
  374.   write_byte(DS3231_AL1DAY ,temp); //修改星期
  375.    

  376. temp=HEX2BCD(AL2MIN);
  377.    write_byte(DS3231_AL2MIN,temp); //修改星期
  378.     temp=HEX2BCD(A2HOUR);
  379.    write_byte(DS3231_AL2HOUR,temp); //修改星期
  380.    temp=HEX2BCDAM(AL2DAY);
  381.    write_byte(DS3231_AL2DAY,temp); //修改星期


  382. }

  383. unsigned char str[17] ;
  384. void main()
  385. {
  386. TMOD = 0x01;
  387. TH0 = 0xFC;
  388. TL0 = 0x67;
  389. TR0 = 1;
  390. EA = 1;
  391. ET0 = 1;
  392. InitDS3231();            

  393.    ModifyTime(17,2,25,14,43,0,6,7,13,19,30,7,13,19);   //年月白時(shí)分秒星期
  394.   delay1ms(100);
  395.      Readtime();

  396.   EDA=HEX2BCD(7);
  397.   write_byte(DS3231_CONTROL ,EDA);
  398.   EDA=HEX2BCD(8);
  399.   write_byte(DS3231_STATUS ,EDA);
  400.   
  401.   delay1ms(100);
  402.   while(1)      
  403. {
  404.      
  405.   Readtime();
  406.    if(cnt >= 1000)
  407.   {
  408.    cnt = 0;
  409.    if(j<=11)j++;else j=10;
  410.    
  411.   
  412.   }
  413.   
  414.   

  415.   }  
  416. }
  417. void jianduan1()
  418. {
  419.   if(leden1==1)
  420.   {
  421. leden1=0;
  422. Delay100us();Delay100us();Delay100us();Delay100us();
  423. Delay100us(); Delay100us();Delay100us();Delay100us();
  424. Delay100us(); Delay100us();Delay100us();Delay100us();
  425.   }
  426.   else
  427.   {
  428.    leden1=1;
  429.   }
  430. }
  431. void jianduan2()
  432. {
  433.   if(leden2==1)
  434.   {
  435. leden2=0;
  436. Delay100us(); Delay100us();Delay100us();Delay100us();
  437. Delay100us(); Delay100us();Delay100us();Delay100us();
  438. Delay100us(); Delay100us();Delay100us();Delay100us();
  439.   }
  440.   else
  441.   {
  442.    leden2=1;
  443.   }
  444.   }
  445. void InterruptTimer0()  interrupt 1   
  446. {              
  447. TH0 = 0xFC;
  448. TL0 = 0x67;
  449. cnt++;

  450. led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;
  451. switch(i)
  452. {
  453.   case 0:jianduan1(); leden2=0; leden3=0;leden4=0;leden5=0;i++; ledyinshe(min%10 );break;
  454.   case 1: leden1=0;jianduan2(); leden3=0;leden4=0;leden5=0;i++; ledyinshe(min/10%10 );break;
  455.   case 2: leden1=0; leden2=0; leden3=1;leden4=0;leden5=0;i++; ledyinshe(j);break;
  456.   case 3: leden1=0; leden2=0; leden3=0;leden4=1;leden5=0;i++; ledyinshe(hour%10);break;
  457.   case 4: leden1=0; leden2=0; leden3=0;leden4=0;leden5=1;i=0; ledyinshe(hour/10%10);break;

  458.   default:;break;

  459. }
  460. }
復(fù)制代碼


160108.jpg
160109.jpg
160105.jpg
160104.jpg
160102.jpg
160059.jpg
160041.jpg
160042.jpg
160055.jpg
160057.jpg
160040.jpg
160037.jpg
160035.jpg
160031.jpg
160011.jpg
160013.jpg
160016.jpg
160023.jpg
160009.jpg
160007.jpg
160005.jpg
160003.jpg
155802.jpg
155807.jpg
155810.jpg
160000.jpg
155758.jpg
155753.jpg
155751.jpg
155743.jpg
155728.jpg
155730.jpg
155739.jpg
155741.jpg
155721.jpg
155720.jpg
1.jpg
155719.jpg

電子時(shí)鐘源碼.rar

68.56 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:146089 發(fā)表于 2017-5-2 09:56 | 顯示全部樓層
棚子搭的歪歪扭扭不美觀
回復(fù)

使用道具 舉報(bào)

ID:162238 發(fā)表于 2017-5-3 12:44 | 顯示全部樓層
創(chuàng)意挺好的 , 個(gè)人感覺(jué)架子換成黑色的或者白色的綠色的應(yīng)該會(huì)更好看
回復(fù)

使用道具 舉報(bào)

ID:182887 發(fā)表于 2017-5-3 19:50 | 顯示全部樓層
還是挺好看的
回復(fù)

使用道具 舉報(bào)

ID:476271 發(fā)表于 2019-7-25 10:09 | 顯示全部樓層
個(gè)人感覺(jué)架子換成黑色的或者白色的綠色的應(yīng)該會(huì)更好
回復(fù)

使用道具 舉報(bào)

ID:25899 發(fā)表于 2019-7-26 21:28 | 顯示全部樓層
這自己做數(shù)碼管有創(chuàng)意
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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