久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5189|回復: 5
收起左側

工藝品時鐘制作 高精度

[復制鏈接]
ID:156124 發表于 2017-4-30 16:38 | 顯示全部樓層 |閱讀模式
很久沒發帖了,那么來一貼,這個項目歷時3個半月,因為剛開始也就做著玩。先上圖。
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數據傳送位SDA           
  28. sbit SCL=P2^5;     //模擬I2C時鐘控制位SCL

  29. #define ADDRTW          0xD0    //器件寫地址
  30. #define ADDRTD          0xD1 //器件讀地址
  31. #define DS3231_SEC      0x00   //秒
  32. #define DS3231_MIN      0x01   //分
  33. #define DS3231_HOUR     0x02   //時
  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   //時
  42. #define DS3231_AL1DAY   0x0A   //星期/日
  43. //鬧鈴2
  44. #define DS3231_AL2MIN   0x0b   //分
  45. #define DS3231_AL2HOUR  0x0c   //時
  46. #define DS3231_AL2DAY   0x0d   //星期/日
  47. #define DS3231_CONTROL  0x0e   //控制寄存器
  48. #define DS3231_STATUS   0x0f   //狀態寄存器
  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--);  //延時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轉換為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轉換為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轉換為Byte           
  114. {  uchar i;
  115.    i= val&0x03;  
  116.    return i;
  117. }
  118. uchar HEX2BCD(uchar val)//B碼轉換為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碼轉換為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;                  //發送起始條件的數據信號
  138.    delay1(1);
  139.    SCL=1;
  140.    delay1(5);             //起始條件建立時間大于4.7us,延時
  141.      SDA=0;                  //發送起始信號
  142.    delay1(5);             // 起始條件鎖定時間大于4μs
  143.    SCL=0;                  //鉗住I2C總線,準備發送或接收數據
  144.    delay1(2);
  145. }
  146. void Stop()
  147. {
  148.    SDA=0;                  //發送結束條件的數據信號
  149.    delay1(1);             //發送結束條件的時鐘信號
  150.    SCL=1;                  //結束條件建立時間大于4us
  151.     delay1(5);
  152.    SDA=1;                  //發送I2C總線結束信號
  153.    delay1(4);
  154. }
  155. /********************************************************/
  156. /*******************************************************************
  157.                   字節數據發送函數               
  158. 函數原型:     void  SendByte(uchar Dat);
  159. 功能:      將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  160.           此狀態位進行操作.(不應答或非應答都使ack=0)
  161.           ack=1        發送數據正常,
  162.           ack=0        被控器無應答或損壞。
  163. ********************************************************************/
  164. void SendByte(uchar Dat)
  165. {
  166. uchar BitCnt;
  167.    for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數據長度為8位
  168.     {
  169.        if((Dat<<BitCnt)&0x80)
  170.            SDA=1;                          //判斷發送位
  171.        else
  172.            SDA=0;               
  173.          delay1(1);
  174.          SCL=1;                            //置時鐘線為高,通知被控器開始接收數據位
  175.          delay1(5);                       //保證時鐘高電平周期大于4μs   
  176.          SCL=0;
  177.     }
  178.    delay1(2);
  179.    SDA=1;                                 //8位發送完后釋放數據線,準備接收應答位
  180.    delay1(2);  
  181.    SCL=1;
  182.     delay1(3);
  183.    if(SDA==1)
  184.        ack=0;   
  185.    else
  186.        ack=1;                             //判斷是否接收到應答信號
  187.    SCL=0;
  188.    delay1(2);
  189. }
  190. uchar RcvByte()                                                                                  //功能:     用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),發完后請用應答函數應答從機。
  191. {
  192. uchar retc;
  193. uchar BitCnt;
  194.   retc=0;
  195.   SDA=1;                          //置數據線為輸入方式
  196.   for(BitCnt=0;BitCnt<8;BitCnt++)
  197.    {
  198.        delay1(1);  
  199.        SCL=0;                      //置時鐘線為低,準備接收數據位
  200.        delay1(5);                 //時鐘低電平周期大于4.7μs
  201.        SCL=1;                      //置時鐘線為高使數據線上數據有效
  202.        delay1(3);
  203.        retc=retc<<1;
  204.        if(SDA==1)
  205.            retc=retc+1;            //讀數據位,接收的數據位放入retc中
  206.        delay1(2);
  207.    }
  208.   SCL=0;
  209.   delay1(2);
  210.   return(retc);
  211. }
  212. void I2CACK(bit a)                       // 功能:       主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
  213. {
  214.    if(a==0)
  215.        SDA=0;              //在此發出應答或非應答信號
  216.    else
  217.        SDA=1;
  218.    delay1(3);     
  219.    SCL=1;
  220.    delay1(5);             //時鐘低電平周期大于4μs
  221.    SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
  222.    delay1(2);   
  223. }
  224. uchar I2CRead()                                                                                  /************從DS3231當前地址讀一個字節************/
  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指定地址讀一個字節************/
  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()                                                                                            /*********************讀取時間**********************/
  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);  //時                  
  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)                                     //時分秒數組賦值
  291.          {
  292.       b[0]=numbr[Dhour / 10];        // 時十位
  293.              b[1]=numbr[Dhour % 10];        // 時個位
  294.              b[4]=numbr[Dmin / 10];         // 分十位
  295.              b[5]=numbr[Dmin % 10];         // 分個位
  296.              b[8]=numbr[Dsec / 10];         // 秒十位
  297.              b[9]=numbr[Dsec % 10];         // 秒個位
  298.       
  299.          }
  300.      */
  301.      /*
  302. void DateDisplay(uchar Dyear,ucharDmonth,uchar Dday)                       //年月天數組賦值   
  303.          {
  304.      
  305.       a[2]=numbr[Dyear / 10];        // 年十位
  306.              a[3]=numbr[Dyear % 10];        // 年個位
  307.              a[6]=numbr[Dmonth / 10];       // 月十位
  308.              a[7]=numbr[Dmonth % 10];       // 月個位
  309.              a[10]=numbr[Dday / 10];         // 天十位
  310.              a[11]=numbr[Dday % 10];         // 天個位     
  311.      
  312.          }
  313.      */
  314. void Start_I2C()
  315. {
  316.    SDA=1;                  //發送起始條件的數據信號
  317.    delay1(1);
  318.    SCL=1;
  319.    delay1(5);             //起始條件建立時間大于4.7us,延時
  320.    SDA=0;                  //發送起始信號
  321.    delay1(5);             // 起始條件鎖定時間大于4μs
  322.    SCL=0;                  //鉗住I2C總線,準備發送或接收數據
  323.    delay1(2);
  324. }
  325. void Stop_I2C()
  326. {
  327.     SDA=0;                  //發送結束條件的數據信號
  328.    delay1(1);             //發送結束條件的時鐘信號
  329.    SCL=1;                  //結束條件建立時間大于4us
  330.    delay1(5);
  331.    SDA=1;                  //發送I2C總線結束信號
  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);   //修改時
  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);   //年月白時分秒星期
  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. }
復制代碼


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

電子時鐘源碼.rar

68.56 KB, 下載次數: 29, 下載積分: 黑幣 -5

回復

使用道具 舉報

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

使用道具 舉報

ID:162238 發表于 2017-5-3 12:44 | 顯示全部樓層
創意挺好的 , 個人感覺架子換成黑色的或者白色的綠色的應該會更好看
回復

使用道具 舉報

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

使用道具 舉報

ID:476271 發表于 2019-7-25 10:09 | 顯示全部樓層
個人感覺架子換成黑色的或者白色的綠色的應該會更好
回復

使用道具 舉報

ID:25899 發表于 2019-7-26 21:28 | 顯示全部樓層
這自己做數碼管有創意
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区在线观看视频 | 国产 91 视频| 国产精品日日夜夜 | 久在线 | 久久丝袜 | 日日夜夜精品 | 成人国内精品久久久久一区 | 日韩av免费看 | 国产综合精品一区二区三区 | 成人免费淫片aa视频免费 | 蜜桃五月天| 日韩欧美国产一区二区三区 | 日韩中文一区 | 免费激情av | 国产激情视频网站 | 国产一区二区在线视频 | 97伦理电影网 | 亚洲第一福利网 | 中文字幕在线观看一区 | 日韩乱码一二三 | 久久精品99久久 | 亚洲欧洲色视频 | 成在线人视频免费视频 | 美女在线视频一区二区三区 | 求毛片| 免费在线观看av网站 | 激情视频中文字幕 | 天堂av中文在线 | 成人免费观看男女羞羞视频 | 久久久毛片 | 激情av | 国产成人jvid在线播放 | 日韩精品成人免费观看视频 | 欧美一二三四成人免费视频 | 久久在线| 91麻豆精品国产91久久久更新资源速度超快 | www.日本精品| 欧美午夜精品久久久久久浪潮 | 久久中文视频 | 婷婷激情综合 | 成人在线观看免费 |