找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機1.2寸數(shù)碼管時鐘程序 帶溫度 光控 含源碼電路原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:378402 發(fā)表于 2023-6-30 18:34 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
首先感謝論壇中提供”1寸數(shù)碼管時鐘+12C5A60S2單片機+自動亮度+時間溫度輪流顯示(實物+代碼)“作者,
本人在原作者基礎(chǔ)上,根據(jù)現(xiàn)有元器件,成功制作了1.2寸數(shù)碼管時鐘,由于首次使用嘉立創(chuàng)繪制原理圖和PCB,
由于使用雙面板制作PCB

線徑較細和過孔處理技術(shù)不行改為單面板制作,制作中DS1302不計時,后增加了C3和C4
濾波電容解決了問題。

制作出來的實物圖如下:


單片機源程序如下:
  1. /********************************************************************************
  2.            本人在原作者基礎(chǔ)上,根據(jù)現(xiàn)有元器件,成功制作了1.2寸數(shù)碼管時鐘,由于首次使用嘉立創(chuàng)繪制原理圖和PCB,
  3.            使用雙面板制作PCB,由于線徑較細和過孔處理技術(shù)不行改為單面板制作,制作中DS1302不計時,后增加了C3和C4
  4.            濾波電容解決了問題。

  5. 描述: 4位共陽數(shù)碼管時鐘,顯示88:88樣式,正常走時的時候,“:”1秒閃爍2次;調(diào)時間的的時候冒號熄滅
  6.        調(diào)時:按KEY1按鍵第1次小時位閃爍,再按KEY2一次小時加1,按KEY3一次小時減1,長按連加連減;
  7.                          按KEY1按鍵第2次分鐘位閃爍,再按KEY2一次分鐘加1,按KEY3一次分鐘減1,長按連加連減;
  8.                          按KEY1按鍵第3次,秒從零開始累加,時鐘回到正常走時;
  9.                          校時的時候先調(diào)好時、分,分鐘要比參考時間的分鐘加1分,
  10.                          再看參考時間的秒數(shù)到了59再按KEY1按鍵的第3次,這樣對時就比較準(zhǔn)了。
  11.                          加備用電池,掉電走時
  12.                         
  13.                          KEY2鍵第2功能:非調(diào)時狀態(tài),為光控開關(guān);
  14.                          KEY3鍵第2功能:非調(diào)時狀態(tài),為顯示切換開關(guān);
  15.                          DS18B20做溫度檢測,實時時鐘與溫度輪流顯示;
  16.                          溫度顯示范圍: -9.9℃~99.9℃;
  17.                          增加數(shù)碼管調(diào)亮度功能,按鍵10級亮度P1.0接10K電阻上拉、光敏電阻下拉分壓;
  18.                          環(huán)境光線越亮,數(shù)碼管越亮,反之?dāng)?shù)碼管越暗。
  19. 實物通過.  
  20.                          12MHz晶振,STC15F2K60S2+DS1302時鐘芯片+DS18B20,
  21.                          P0口接段位,P2^4~P2^7接pnp三極管控制4個共陽極。
  22. **********************************************************************************/
  23. //#include <STC12C5A60S2.h>
  24. #include <STC15F2K60S2.h>
  25. #include <intrins.h>
  26. #define uchar unsigned char
  27. #define uint unsigned int


  28. sbit TSCLK = P2^2;//時鐘線
  29. sbit TIO   = P2^1;//數(shù)據(jù)線
  30. sbit TRST  = P2^0;//使能端

  31. sbit key1 = P3^4;   //設(shè)置鍵
  32. sbit key2 = P3^3;   //加 /光控開關(guān)鍵(校時的時候做加鍵,反之為光控開關(guān))
  33. sbit key3 = P3^2;   // 減/顯示切換鍵
  34. sbit DQ = P2^3;                //DS18B20數(shù)據(jù)口

  35. sbit w1 = P2^4;          //設(shè)置位驅(qū)動口
  36. sbit w2 = P2^5;
  37. sbit w3 = P2^6;
  38. sbit w4 = P2^7;
  39. sbit w5 = P3^7;         //此位不顯示
  40. sbit dd = P1^4;         //蜂鳴器控制端        

  41. uchar xs=0; //顯示切換計數(shù)變量
  42. uchar tian=0;
  43. uchar knum,shan_cont;
  44. char shi,fen,miao;
  45. uchar ba=40;
  46. uint mh,mh_count,count;
  47. bit shan;           //校時閃爍標(biāo)志位
  48. uchar s=0;                   //顯示負號
  49. uint temp;        //溫度值
  50. bit flag;                  //輪流顯示標(biāo)志位
  51. bit flag_gk;          //光控標(biāo)志位
  52. bit flag_js=0;          //自動校時標(biāo)志
  53. bit flag_fm;          //蜂鳴器啟動標(biāo)志
  54. uchar fm;                //蜂鳴器計時變量
  55. /***************************************定義轉(zhuǎn)換控制寄存器控制位*****************************************/
  56. #define ADC_POWER                   0X80            //電源控制位
  57. #define ADC_FLAG                    0X10            //轉(zhuǎn)換結(jié)束標(biāo)志位
  58. #define ADC_START                   0X08            //轉(zhuǎn)換開始位
  59. /*********************************************定義AD轉(zhuǎn)換速度*********************************************/
  60. #define ADC_SPEEDLL_540         0X00           
  61. #define ADC_SPEEDLL_360                0X20
  62. #define ADC_SPEEDLL_180                0X40
  63. #define ADC_SPEEDLL_90                0X60
  64. /***********寫時分秒地址************/
  65. #define write_shi  0x84
  66. #define write_fen  0x82
  67. #define write_miao 0x80
  68. #define write_ram  0xc0
  69. /***********讀時分秒地址************/
  70. #define read_shi  0x85
  71. #define read_fen  0x83
  72. #define read_miao 0x81
  73. #define read_ram  0xc1
  74. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x46,0xbf};//共陽段碼 (0--9、黑屏、C、-)


  75. ...............程序已在2樓更新...........
復(fù)制代碼

下載: 程序和PDF格式原理圖.7z (96.29 KB, 下載次數(shù): 44)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:378402 發(fā)表于 2023-7-2 18:05 | 只看該作者

RE: 1.2寸數(shù)碼管時鐘_溫度_光控_含源碼_原理圖

首先感謝論壇中提供”1寸數(shù)碼管時鐘+12C5A60S2單片機+自動亮度+時間溫度輪流顯示(實物+代碼)“作者,
           本人在原作者基礎(chǔ)上,根據(jù)現(xiàn)有元器件,成功制作了1.2寸數(shù)碼管時鐘,由于首次使用嘉立創(chuàng)繪制原理圖和PCB,
           使用雙面板制作PCB,由于線徑較細和過孔處理技術(shù)不行改為單面板制作,制作中DS1302不計時,后增加了C3和C4
           濾波電容解決了問題。
  1. /*********************************************************************************
  2. 描述: 4位共陽數(shù)碼管時鐘,顯示88:88樣式,正常走時的時候,“:”1秒閃爍2次;調(diào)時間的的時候冒號熄滅
  3.        調(diào)時:按KEY1按鍵第1次小時位閃爍,再按KEY2一次小時加1,按KEY3一次小時減1,長按連加連減;
  4.                          按KEY1按鍵第2次分鐘位閃爍,再按KEY2一次分鐘加1,按KEY3一次分鐘減1,長按連加連減;
  5.                          按KEY1按鍵第3次,秒從零開始累加,時鐘回到正常走時;
  6.                          校時的時候先調(diào)好時、分,分鐘要比參考時間的分鐘加1分,
  7.                          再看參考時間的秒數(shù)到了59再按KEY1按鍵的第3次,這樣對時就比較準(zhǔn)了。
  8.                          加備用電池,掉電走時
  9.                          
  10.                          KEY2鍵第2功能:非調(diào)時狀態(tài),為光控開關(guān);
  11.                          KEY3鍵第2功能:非調(diào)時狀態(tài),為顯示切換開關(guān);
  12.                          DS18B20做溫度檢測,實時時鐘與溫度輪流顯示;
  13.                          溫度顯示范圍: -9.9℃~99.9℃;
  14.                          增加數(shù)碼管調(diào)亮度功能,按鍵10級亮度P1.0接10K電阻上拉、光敏電阻下拉分壓;
  15.                          環(huán)境光線越亮,數(shù)碼管越亮,反之?dāng)?shù)碼管越暗。
  16. 實物通過.  
  17.                          12MHz晶振,STC15F2K60S2+DS1302時鐘芯片+DS18B20,
  18.                          P0口接段位,P2^4~P2^7接pnp三極管控制4個共陽極。
  19. **********************************************************************************/
  20. //#include <STC12C5A60S2.h>
  21. #include <STC15F2K60S2.h>
  22. #include <intrins.h>
  23. #define uchar unsigned char
  24. #define uint unsigned int


  25. sbit TSCLK = P2^2;//時鐘線
  26. sbit TIO   = P2^1;//數(shù)據(jù)線
  27. sbit TRST  = P2^0;//使能端

  28. sbit key1 = P3^4;   //設(shè)置鍵
  29. sbit key2 = P3^3;   //加 /光控開關(guān)鍵(校時的時候做加鍵,反之為光控開關(guān))
  30. sbit key3 = P3^2;   // 減/顯示切換鍵
  31. sbit DQ = P2^3;                //DS18B20數(shù)據(jù)口

  32. sbit w1 = P2^4;          //設(shè)置位驅(qū)動口
  33. sbit w2 = P2^5;
  34. sbit w3 = P2^6;
  35. sbit w4 = P2^7;
  36. sbit w5 = P3^7;         //此位不顯示
  37. sbit dd = P1^4;         //蜂鳴器控制端       

  38. uchar xs=0; //顯示切換計數(shù)變量
  39. uchar tian=0;
  40. uchar knum,shan_cont;
  41. char shi,fen,miao;
  42. uchar ba=40;
  43. uint mh,mh_count,count;
  44. bit shan;           //校時閃爍標(biāo)志位
  45. uchar s=0;                   //顯示負號
  46. uint temp;        //溫度值
  47. bit flag;                  //輪流顯示標(biāo)志位
  48. bit flag_gk;          //光控標(biāo)志位
  49. bit flag_js=0;          //自動校時標(biāo)志
  50. bit flag_fm;          //蜂鳴器啟動標(biāo)志
  51. uchar fm;                //蜂鳴器計時變量
  52. /***************************************定義轉(zhuǎn)換控制寄存器控制位*****************************************/
  53. #define ADC_POWER                   0X80            //電源控制位
  54. #define ADC_FLAG                    0X10            //轉(zhuǎn)換結(jié)束標(biāo)志位
  55. #define ADC_START                   0X08            //轉(zhuǎn)換開始位
  56. /*********************************************定義AD轉(zhuǎn)換速度*********************************************/
  57. #define ADC_SPEEDLL_540         0X00           
  58. #define ADC_SPEEDLL_360                0X20
  59. #define ADC_SPEEDLL_180                0X40
  60. #define ADC_SPEEDLL_90                0X60
  61. /***********寫時分秒地址************/
  62. #define write_shi  0x84
  63. #define write_fen  0x82
  64. #define write_miao 0x80
  65. #define write_ram  0xc0
  66. /***********讀時分秒地址************/
  67. #define read_shi  0x85
  68. #define read_fen  0x83
  69. #define read_miao 0x81
  70. #define read_ram  0xc1
  71. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x46,0xbf};//共陽段碼 (0--9、黑屏、C、-)

  72. /*********************************************************************************************************
  73. ** 函數(shù)功能 :延時函數(shù)
  74. ** 函數(shù)說明 :利用軟件延時,占用CPU
  75. ** 入口參數(shù) :time:需要延時的時間,
  76. ** 出口參數(shù) :無
  77. *********************************************************************************************************/
  78. void Delay_ms(uint time)
  79. {
  80.         uint i,j;
  81.         for(i = 0;i < time;i ++)
  82.                 for(j = 0;j < 45;j ++);
  83. }

  84. /*********************************************************************************************************
  85. ** 函數(shù)功能 :延時函數(shù)
  86. ** 函數(shù)說明 :利用軟件延時,占用CPU,經(jīng)調(diào)試最小單位大約為1us
  87. ** 入口參數(shù) :time:需要延時的時間,單位us
  88. ** 出口參數(shù) :無
  89. *********************************************************************************************************/
  90. void delay(uchar n)
  91. {
  92.     while (n--)
  93.     {
  94.         _nop_();
  95.         _nop_();
  96.     }
  97. }

  98. /*****************DS18B20******************/

  99. void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
  100. {
  101.         DQ = 1;                     //DQ復(fù)位,不要也可行。
  102.         delay(1);                  //稍做延時
  103.         DQ = 0;                    //單片機拉低總線
  104.         //delay(250);                //精確延時,維持至少480us
  105.         EA=0;
  106.         delay(170);
  107.         EA=1;
  108.         DQ = 1;
  109.         EA=0;                    //釋放總線,即拉高了總線
  110.         delay(170);                //此處延時有足夠,確保能讓DS18B20發(fā)出存在脈沖。
  111.         EA=1;
  112. }

  113. uchar Read_One_Byte()       //讀取一個字節(jié)的數(shù)據(jù)read a byte date
  114.                             //讀數(shù)據(jù)時,數(shù)據(jù)以字節(jié)的最低有效位先從總線移出
  115. {
  116.         uchar i   = 0;
  117.         uchar dat = 0;
  118.         for(i=8;i>0;i--)
  119.         {
  120.            DQ = 0;                  //將總線拉低,要在1us之后釋放總線                       //單片機要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。
  121.            delay(1);                //至少維持了1us,表示讀時序開始
  122.            dat >>= 1;               //讓從總線上讀到的位數(shù)據(jù),依次從高位移動到低位。
  123.            DQ = 1;                  //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩上
  124.            delay(7);                //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內(nèi)的最后部分
  125.            if(DQ)                   //控制器進行采樣
  126.            {
  127.             dat |= 0x80;            //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
  128.            }
  129.            EA=0;        
  130.            delay(40);              //此延時不能少,確保讀時序的長度60us。
  131.            EA=1;
  132.         }
  133.         return (dat);
  134. }

  135. void Write_One_Byte(uchar dat)
  136. {
  137.         uchar i = 0;
  138.         for(i=8;i>0;i--)
  139.         {
  140.            DQ = 0;                        //拉低總線
  141.            delay(1);                       //至少維持了1us,表示寫時序(包括寫0時序或?qū)?時序)開始
  142.            DQ = dat&0x01;                 //從字節(jié)的最低位開始傳輸
  143.                                          //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),                              //因為15us后DS18B20會對總線采樣。
  144.            delay(60);                     //必須讓寫時序持續(xù)至少60us
  145.            DQ = 1;                        //寫完后,必須釋放總線,
  146.            dat >>= 1;
  147.            delay(1);
  148.         }
  149. }


  150. uint Get_Tmp()                   //獲取溫度get the temperature
  151. {
  152.         float tt;
  153.         uchar L,M;
  154. EA=0;
  155.         Init_Ds18b20();                //初始化
  156.         Write_One_Byte(0xcc);          //忽略ROM指令
  157.         Write_One_Byte(0x44);          //溫度轉(zhuǎn)換指令
  158.         Init_Ds18b20();                 //初始化
  159.         Write_One_Byte(0xcc);          //忽略ROM指令
  160.         Write_One_Byte(0xbe);          //讀暫存器指令
  161.         L = Read_One_Byte();           //讀取到的第一個字節(jié)為溫度LSB
  162.         M = Read_One_Byte();           //讀取到的第一個字節(jié)為溫度MSB
  163.         temp = M;                      //先把高八位有效數(shù)據(jù)賦于temp
  164.         temp <<= 8;                    //把以上8位數(shù)據(jù)從temp低八位移到高八位
  165.         temp = temp|L;                //兩字節(jié)合成一個整型變量
  166. EA=1;
  167.         if(M >= 0x08)        //判斷是否為負數(shù)
  168.         {
  169.                 temp = ~temp + 1;//負數(shù)是以補碼的形式存放的需要取反加1
  170.                 s = 0xbf;  //顯示負數(shù)符號
  171.         }
  172.         else s = 0;           //為正數(shù)則不顯示負數(shù)符號

  173.         tt = temp*0.0625;              //得到真實十進制溫度值
  174.                                         //因為DS18B20可以精確到0.0625度
  175.                                         //所以讀回數(shù)據(jù)的最低位代表的是0.0625度
  176.         temp = tt*10+0.5;               //放大十倍
  177.                                         //這樣做的目的將小數(shù)點后第一位也轉(zhuǎn)換為可顯示數(shù)字
  178.                                //同時進行一個四舍五入操作。
  179.         return temp;
  180. }


  181. /****************溫度顯示函數(shù)**************/

  182. void Display_tem(uint temp)   //顯示程序
  183. {
  184.         uchar A1,A2,A3;
  185.         A1 = temp/100;    //百位
  186.         A2 = temp%100/10;   //十位
  187.         A3 = temp%10;    //個位
  188.        
  189.         if(A1 > 0 && s == 0 )
  190.         {
  191.                 P0 = 0xff;
  192.                 w2 = 1; w3 = 1; w4 = 1;
  193.                 Delay_ms(50-ba);
  194.                 P0 = table[A1];    //顯示百位
  195.                 w1 = 0;
  196.                 Delay_ms(ba);
  197.         }
  198.         else
  199.         {
  200.                 if(A1 == 0 && s == 0)
  201.                 {
  202.                         P0 = 0xff;
  203.                         w2 = 1; w3 = 1; w4 = 1;
  204.                         Delay_ms(50-ba);
  205.                         P0 = table[10];    //百位為0不顯
  206.                         w1 = 0;
  207.                         Delay_ms(ba);
  208.                 }
  209.                 else
  210.                 if(s != 0)
  211.                 {
  212.                         P0 = 0xff;
  213.                         w2 = 1; w3 = 1; w4 = 1;
  214.                         Delay_ms(50-ba);
  215.                         P0 = s;    //百位為負數(shù)顯示-
  216.                         w1 = 0;
  217.                         Delay_ms(ba);
  218.                 }
  219.                  
  220.        
  221.         }
  222.        
  223.        
  224.         P0 = 0xff;
  225.         w1 = 1; w3 = 1; w4 = 1;
  226.         Delay_ms(50-ba);
  227.         P0 = table[A2]&0X7F;   //顯示十位,使用的是有小數(shù)點的數(shù)組(因為temp值擴大了10倍,雖然是十位,實際為個位)
  228.         w2 = 0;
  229.         Delay_ms(ba);
  230.        
  231.         P0 = 0xff;
  232.         w1 = 1; w2 = 1;  w4 = 1;
  233.         Delay_ms(50-ba);
  234.         P0 = table[A3];
  235.         w3 = 0;   
  236.         Delay_ms(ba);       
  237.          
  238.         P0 = 0xff;
  239.         w1 = 1; w2 = 1; w3 = 1;
  240.         Delay_ms(50-ba);
  241.         P0 = 0x46;   //顯示C字樣
  242.         w4 = 0;
  243.         Delay_ms(ba);
  244.        
  245.         P0 = 0xff;
  246.         w1 = 1; w2 = 1; w3 = 1;
  247.         Delay_ms(50-ba);
  248.         P0 = 0xff;   
  249.         w5 = 0;
  250.         P0 = 0xff;
  251.         Delay_ms(ba);       
  252. }



  253. void display( uchar shi,uchar fen)           //時間顯示函數(shù)
  254. {

  255. /*****正常顯示******/
  256.         if(knum == 0)
  257.         {
  258.                 if(shi/10 > 0)
  259.                 {
  260.                         w2 = 1; w3 = 1; w4 = 1;
  261.                         Delay_ms(50-ba);
  262.                         P0 = table[shi/10];    //顯示小時十位
  263.                         w1 = 0;
  264.                         Delay_ms(ba);
  265.                 }
  266.                 else
  267.                 {
  268.                         w2 = 1; w3 = 1; w4 = 1;
  269.                         Delay_ms(50-ba);
  270.                         P0 = table[10];    //小時十位為0不顯示
  271.                         w1 = 0;
  272.                         Delay_ms(ba);
  273.                
  274.                 }
  275.        
  276.                 P0 = 0xff;
  277.                 w1 = 1; w3 = 1; w4 = 1;
  278.                 Delay_ms(50-ba);
  279.                 if(mh_count>=50)
  280.                 P0 = table[shi%10]&0x7f;    //顯示小時個位
  281.                 else
  282.                 P0 = table[shi%10];
  283.                 w2 = 0;
  284.                 Delay_ms(ba);
  285.                  
  286.                 P0 = 0xff;
  287.                 w1 = 1; w2 = 1; w4 = 1;
  288.                 Delay_ms(50-ba);
  289.                 if(mh_count>=50)
  290.                 P0 = table[fen/10]&0x7f;    //顯示分鐘十位
  291.                 else
  292.                 P0 = table[fen/10];
  293.                 w3 = 0;
  294.                 Delay_ms(ba);
  295.        
  296.                 P0 = 0xff;
  297.                 w2 = 1; w3 = 1; w1 = 1;
  298.                 Delay_ms(50-ba);
  299.                 P0 = table[fen%10];    //顯示分鐘個位
  300.                 w4 = 0;
  301.                 Delay_ms(ba);
  302.        
  303.                 P0 = 0xff;
  304.                 w1 = 1; w2 = 1; w3 = 1;
  305.                 Delay_ms(50-ba);
  306.                 P0 = 0xff;   
  307.                 w5 = 0;                  //這里掃描一個空位,數(shù)碼管前4位亮度就均勻了,第4位與前3位亮度一致,不然第4位要比前3位亮
  308.                 P0 = 0xff;
  309.                 Delay_ms(ba);       
  310.         }

  311. /********校時小時位閃爍************/

  312.         if(knum==1)
  313.         {
  314.                  if( shan==0 )
  315.                 {
  316.                 w2 = 1; w3 = 1; w4 = 1;
  317.                 Delay_ms(50-ba);
  318.                 P0 = 0xff;    //顯示小時十位
  319.                 w1 = 0;
  320.                 Delay_ms(ba);

  321.                 P0 = 0xff;
  322.                 w1 = 1; w3 = 1; w4 = 1;
  323.                 Delay_ms(50-ba);
  324.                 P0 = 0xff;;
  325.                 w2 = 0;
  326.                 Delay_ms(ba);
  327.                 }
  328.        

  329.                 else
  330.                 {
  331.                         w2 = 1; w3 = 1; w4 = 1;
  332.                         Delay_ms(50-ba);
  333.                         P0 = table[shi/10];    //顯示小時十位
  334.                         w1 = 0;
  335.                         Delay_ms(ba);
  336.                  
  337.                         P0 = 0xff;
  338.                         w1 = 1; w3 = 1; w4 = 1;
  339.                         Delay_ms(50-ba);
  340.                         P0 = table[shi%10];
  341.                         w2 = 0;
  342.                         Delay_ms(ba);
  343.                 }         
  344.                 P0 = 0xff;
  345.                 w1 = 1; w2 = 1; w4 = 1;
  346.                 Delay_ms(50-ba);
  347.                 P0 = table[fen/10];
  348.                 w3 = 0;
  349.                 Delay_ms(ba);
  350.        
  351.                 P0 = 0xff;
  352.                 w2 = 1; w3 = 1; w1 = 1;
  353.                 Delay_ms(50-ba);
  354.                 P0 = table[fen%10];    //顯示分鐘個位
  355.                 w4 = 0;
  356.                 Delay_ms(ba);
  357.        
  358.                 P0 = 0xff;
  359.                 w1 = 1; w2 = 1; w3 = 1;
  360.                 Delay_ms(50-ba);
  361.                 P0 = 0xff;   
  362.                 w5 = 0;                  //這里掃描一個空位,數(shù)碼管前4位亮度就均勻了,第4位與前3位亮度一致,不然第4位要比前3位亮
  363.                 P0 = 0xff;
  364.                 Delay_ms(ba);
  365.         }       
  366. /*******校時分鐘位閃爍*******/

  367.         if(knum==2 )
  368.         {
  369.                 if(shan==0)
  370.                 {
  371.                 w2 = 1; w1 = 1; w4 = 1;
  372.                 Delay_ms(50-ba);
  373.                 P0 = 0xff;    //顯示小時十位
  374.                 w3 = 0;
  375.                 Delay_ms(ba);

  376.                 P0 = 0xff;
  377.                 w1 = 1; w3 = 1; w2 = 1;
  378.                 Delay_ms(50-ba);
  379.                 P0 = 0xff;;
  380.                 w4 = 0;
  381.                 Delay_ms(ba);
  382.                 }
  383.                 else
  384.                 {
  385.                         w2 = 1; w1 = 1; w4 = 1;
  386.                         Delay_ms(50-ba);
  387.                         P0 = table[fen/10];    //顯示小時十位
  388.                         w3 = 0;
  389.                         Delay_ms(ba);
  390.                  
  391.                         P0 = 0xff;
  392.                         w1 = 1; w3 = 1; w3 = 1;
  393.                         Delay_ms(50-ba);
  394.                         P0 = table[fen%10];
  395.                         w4 = 0;
  396.                         Delay_ms(ba);
  397.                 }         

  398.                 P0 = 0xff;
  399.                 w3 = 1; w2 = 1; w4 = 1;
  400.                 Delay_ms(50-ba);
  401.                 P0 = table[shi/10];
  402.                 w1 = 0;
  403.                 Delay_ms(ba);
  404.        
  405.                 P0 = 0xff;
  406.                 w4 = 1; w3 = 1; w1 = 1;
  407.                 Delay_ms(50-ba);
  408.                 P0 = table[shi%10];    //顯示分鐘個位
  409.                 w2 = 0;
  410.                 Delay_ms(ba);


  411.        
  412.                 P0 = 0xff;
  413.                 w1 = 1; w2 = 1; w3 = 1;
  414.                 Delay_ms(50-ba);
  415.                 P0 = 0xff;   
  416.                 w5 = 0;                  //這里掃描一個空位,數(shù)碼管前4位亮度就均勻了,第4位與前3位亮度一致,不然第4位要比前3位亮
  417.                 P0 = 0xff;
  418.                 Delay_ms(ba);
  419.         }               
  420.        
  421. }


  422. void t0_init()
  423. {
  424.         TMOD |= 0x01;  //定時器0,16位模式
  425.         TL0 = 0xF0;                //設(shè)置定時初值 10毫秒初值 @12MHz
  426.         TH0 = 0xD8;                //設(shè)置定時初值
  427.         EA=1;
  428.         ET0=1;
  429.         TR0 = 1;
  430. }





  431. /*********************************************************************************************************
  432. ** 函數(shù)功能 :內(nèi)置ADC的初始化配置
  433. ** 函數(shù)說明 :使用內(nèi)置ADC時需要先配置對應(yīng)的P1口的管腳為模擬輸入
  434. ** 入口參數(shù) :port:需要配置為模擬輸入的通道,使用或運算可以同時配置多個管腳
  435. **                          如:ADC_Init(ADC_PORT0 | ADC_PORT1 | ADC_PORT2)調(diào)用此函數(shù)后可以同時配置P1^0,P1^1,P1^2為模擬輸入
  436. ** 出口參數(shù) :無
  437. *********************************************************************************************************/

  438. void ADC_Init()
  439. {
  440.         P1ASF=0x01;//設(shè)置AD轉(zhuǎn)換通道 P1.0
  441.         ADC_RES=0;//清空轉(zhuǎn)換結(jié)果
  442.         ADC_CONTR=ADC_POWER | ADC_SPEEDLL_540;//打開AD轉(zhuǎn)化器電源
  443.         _nop_();
  444.         _nop_();
  445.         _nop_();
  446.         _nop_();
  447. }
  448. /*********************************************************************************************************
  449. ** 函數(shù)功能 :獲取ADC對應(yīng)通道的值,查詢法
  450. ** 函數(shù)說明 :每次只能獲取一個通道的值,不同通道需要分別調(diào)用該函數(shù)獲取
  451. ** 入口參數(shù) :
  452. ** 出口參數(shù) :
  453. *********************************************************************************************************/
  454. uchar GetADCResult()//讀取通道ch的電壓值
  455. {
  456.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL_540 | ADC_START;//開始轉(zhuǎn)換,并設(shè)置測量通道為P1^0
  457.         _nop_();//需經(jīng)過四個CPU時鐘延時,上述值才能保證被設(shè)進ADC_CONTR控制寄存器
  458.         _nop_();
  459.         _nop_();
  460.         _nop_();
  461.         while(!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
  462.         ADC_CONTR &= ~ADC_FLAG;//軟件清除中斷控制位
  463.         return         ADC_RES;
  464. }
  465. void timer0() interrupt 1

  466. {

  467.         TL0 = 0xF0;                //重裝定時初值 10毫秒初值 @12MHz
  468.         TH0 = 0xD8;                //重裝定時初值

  469.        
  470.         mh_count++;                  //冒號閃爍變量
  471.         if(mh_count==100) //1秒時間到
  472.         {
  473.                 mh_count=0;
  474.                 count++;
  475.                 if(count==5)
  476.                 {
  477.                         count=0;
  478.                         flag = !flag;
  479.                 }
  480.         }


  481.         if(knum != 0)  //調(diào)時間的時候,閃爍的位表示為調(diào)節(jié)的位
  482.     {
  483.                 shan_cont++;
  484.         if(shan_cont==30)  //設(shè)置時,300ms閃爍時間,可根據(jù)實際效果調(diào)整
  485.         {
  486.                 shan_cont=0;
  487.                 shan = !shan;
  488.         }
  489.     }

  490.         if(flag_fm)         //如果蜂鳴器啟動標(biāo)志為1
  491.         {
  492.                 dd = 0;           //蜂鳴器響
  493.                 fm++;           //計時變量自加
  494.                 if(fm == 30) //到300ms,蜂鳴器停
  495.                 {
  496.                         fm = 0;         //計時變量清零
  497.                         dd = 1;        // 蜂鳴器停
  498.                         flag_fm = 0;//啟動標(biāo)志清零
  499.                 }

  500.         }
  501. }  


  502. //寫DS1302數(shù)據(jù)
  503. void Write_DS1302_DAT(uchar cmd, uchar dat)
  504. {
  505. uchar i;
  506. /****************************************/               
  507.         TSCLK = 1;                         //把復(fù)位線拿高
  508.         for(i=0;i<8;i++)
  509.         {                                     //低位在前
  510.                 TRST = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
  511.                 TIO = cmd & 0x01;           
  512.                 cmd >>= 1;                 //把地址右移一位
  513.                 TRST = 1;                 //時鐘線拿高
  514.         }       
  515.         for(i=0;i<8;i++)
  516.         {
  517.                 TRST = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
  518.                 TIO = dat & 0x01;
  519.                 dat >>= 1;                 //把數(shù)據(jù)右移一位
  520.                 TRST = 1;                 //時鐘線拿高
  521.         }
  522.         TSCLK = 0;                         //復(fù)位線合低
  523.         TRST = 0;
  524.         TIO = 0;
  525. /**************************************/
  526. }
  527. //讀DS1302數(shù)據(jù)
  528. uchar Read_DS1302_DAT(uchar cmd)
  529. {
  530.         uchar i, dat;
  531. /*************************************************/

  532.         TSCLK = 1; //拉低數(shù)據(jù)總線
  533.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  534.         {
  535.                 TRST = 0;                 //拉低時鐘總線
  536.                 TIO = cmd & 0x01;//寫1位數(shù)據(jù),從最低位開始寫
  537.                 cmd >>=1;                 //右移一位
  538.                 TRST = 1;                 //拉高時鐘總線,產(chǎn)生上升沿數(shù)據(jù)被DS1302讀走

  539.         }
  540.         for(i = 0; i < 8; i++)//每次讀1位,讀8次
  541.         {
  542.                 TRST = 0;                  //拉低時鐘總線,產(chǎn)生下降沿,DS1302把數(shù)據(jù)放到TIO上
  543.                 dat >>= 1;                  //右移一位
  544.                 if(TIO==1)        dat |= 0x80;//讀取數(shù)據(jù),從最低位開始
  545.                 TRST = 1;                        //拉高時鐘總線,以備下一次產(chǎn)生下降沿
  546.         }
  547.         TSCLK=0;
  548.         TRST=0;
  549.         TIO=0;

  550.         return dat;        //返回讀出數(shù)據(jù)

  551. /************************************************/


  552. }


  553. //數(shù)據(jù)轉(zhuǎn)BCD碼
  554. uchar Dat_Chg_BCD(uchar dat)
  555. {
  556.         uchar dat1, dat2;
  557.         dat1 = dat / 10;
  558.         dat2 = dat % 10;
  559.         dat2 = dat2 + dat1 * 16;
  560.         return dat2;
  561. }       


  562. //BCD碼轉(zhuǎn)換為數(shù)據(jù)
  563. uchar BCD_Chg_Dat(uchar dat)
  564. {
  565.         uchar dat1, dat2;
  566.         dat1 = dat / 16;
  567.         dat2 = dat % 16;
  568.         dat2 = dat2 + dat1 * 10;
  569.         return dat2;
  570. }


  571. void init_1302()                //初始化函數(shù) 設(shè)置時間
  572. {                                                //加備用電池,掉電走時

  573.         if(Read_DS1302_DAT(read_ram) != 0xaa) //如果第00個RAM位置不等于0xaa,就初始化1302
  574.         {
  575.                 Write_DS1302_DAT(0x8e, 0);//清除寫保護
  576.         Write_DS1302_DAT(write_miao, Dat_Chg_BCD(Read_DS1302_DAT(0x81)));//調(diào)時鐘芯片秒(并且進行BCD碼轉(zhuǎn)換)
  577.                 Write_DS1302_DAT(write_fen, Dat_Chg_BCD(Read_DS1302_DAT(0x83)));//調(diào)時鐘芯片分
  578.                 Write_DS1302_DAT(write_shi, Dat_Chg_BCD(Read_DS1302_DAT(0x85)));//調(diào)時鐘芯片時
  579.                 Write_DS1302_DAT(write_ram,0xaa);//寫入初始化標(biāo)志RAM(第00個RAM位置)
  580.                 Write_DS1302_DAT(0x8e, 0x80);//開寫保護
  581.         }
  582. }

  583. void read_sf()
  584. {

  585.         miao = BCD_Chg_Dat(Read_DS1302_DAT(0x81));//讀秒寄存器(并且進行BCD碼轉(zhuǎn)換)
  586.         fen        = BCD_Chg_Dat(Read_DS1302_DAT(0x83));//讀分寄存器
  587.         shi = BCD_Chg_Dat(Read_DS1302_DAT(0x85));//讀時寄存器
  588. }

  589. void keysan()
  590. {
  591.     static bit kf1=0, kf3=0,kf2=0;  //自鎖標(biāo)志,這里一定要加static(或者用全局變量),否則按鍵不靈
  592.     static uint i=0,j=0,k=0,m=0,n=0;        //消抖延時變量
  593.                
  594.         if(key1==1)                //設(shè)置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
  595.         {       
  596.         i=0;           //按鍵消抖計時變量清零
  597.         kf1=0;           //按鍵自鎖標(biāo)志清零
  598.         }
  599.         else if(kf1 == 0)        //有按鍵按下,且是第一次被按下
  600.         {       
  601.         flag_fm = 1;         //啟動蜂鳴器
  602.                 ++i;
  603.         if(i>10)                   //i>10  ADC查詢方式用
  604.         {
  605.             i=0;
  606.             kf1=1;         //自鎖按鍵置位,避免一直觸發(fā)
  607.             knum++;
  608.                         if(knum==1)
  609.                         {
  610.                                 Write_DS1302_DAT(0x8e,0x00);                //寫保護取消
  611.                                 Write_DS1302_DAT(write_miao,0x80); //  寫秒80,時鐘停止走時;
  612.                        
  613.                         }
  614.             if(knum==3)
  615.                         {
  616.                                  knum = 0;

  617.                                 Write_DS1302_DAT(write_miao,0x00);
  618.                                 Write_DS1302_DAT(0x8e,0x80);                //保護啟動

  619.                         }
  620.         }        
  621.         }
  622. /************顯示和光控切換****************/
  623.         if(knum == 0)
  624.         {
  625.                 if(key3==1)                //設(shè)置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
  626.                 {       
  627.                 m=0;           //按鍵消抖計時變量清零
  628.                 kf3=0;           //按鍵自鎖標(biāo)志清零
  629.                 }
  630.                 else if(kf3 == 0)        //有按鍵按下,且是第一次被按下
  631.                 {        flag_fm = 1;         //啟動蜂鳴器
  632.                 ++m;
  633.                 if(m>10)                   //i>10  ADC查詢方式用
  634.                 {
  635.                     m=0;
  636.                     kf3=1;         //自鎖按鍵置位,避免一直觸發(fā)
  637.                     xs++;
  638.                    if(xs==3)
  639.                                 {
  640.                                          xs = 0;
  641.        
  642.                                 }
  643.                 }        
  644.                 }

  645.                 if(key2==1)                //設(shè)置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
  646.                 {
  647.                 n=0;           //按鍵消抖計時變量清零
  648.                 kf2=0;           //按鍵自鎖標(biāo)志清零
  649.                 }
  650.                 else if(kf2 == 0)        //有按鍵按下,且是第一次被按下
  651.                 {        flag_fm = 1;         //啟動蜂鳴器
  652.                 ++n;
  653.                 if(n>10)                   //i>10  ADC查詢方式用
  654.                 {
  655.                     n=0;
  656.                     kf2=1;         //自鎖按鍵置位,避免一直觸發(fā)
  657.                                 flag_gk = !flag_gk;
  658.                 }        
  659.                 }


  660.         }



  661. ///-------加--------///
  662.         if(knum != 0)
  663.         {
  664.                 if(key2==0)                //加
  665.             {  
  666.                        
  667.                 j++;
  668.         //        if(j >= 5000)           //長按連加 ADC中斷方式用
  669.                 if(j >= 100)           //長按連加 ADC查詢方式用
  670.        
  671.                 {   //flag_fm = 0;                                    
  672.                     if(knum==2)
  673.                     {
  674.                                 fen++;
  675.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進制
  676.                                 if(fen==0x60)
  677.                                             fen=0x00;
  678.                                         Write_DS1302_DAT(write_fen,fen);
  679.                                 read_sf();                                        //讀出時間,然后顯示
  680.                     }
  681.        
  682.                     if(knum==1)
  683.                     {
  684.                                         shi++;
  685.                                         shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進制
  686.                                         if(shi==0x24)
  687.                                                 shi=0x00;
  688.                                         Write_DS1302_DAT(write_shi,shi);
  689.                                         read_sf();
  690.                     }
  691.        
  692.                     j=90;           //這里j的值可以設(shè)置連加的快慢,j的值越大就越快
  693.                                                         //因為初值越大,加到100的時間就越短
  694.                                 flag_fm = 1;  //啟動蜂鳴器
  695.                         }                           
  696.             }        
  697.        
  698.             else
  699.             {
  700.                 if(j>10 && j<100) //短按
  701.                 {
  702.                     flag_fm = 1;         //啟動蜂鳴器   
  703.                     if(knum==2)
  704.                     {
  705.                                 fen++;
  706.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進制
  707.                                 if(fen==0x60)
  708.                                     fen=0x00;
  709.                                         Write_DS1302_DAT(write_fen,fen);
  710.                                 read_sf();                                        //讀出時間,然后顯示
  711.                     }
  712.        
  713.                     if(knum==1)
  714.                     {
  715.                                         shi++;
  716.                                         shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進制
  717.                                         if(shi==0x24)
  718.                                                 shi=0x00;
  719.                                        
  720.                                         Write_DS1302_DAT(write_shi,shi);
  721.                                         read_sf();
  722.                     }
  723.        
  724.                         j=0;
  725.                     }
  726.                 }        
  727.    
  728. //----------減-----------//   
  729.         if(key3==0)                //減
  730.     {           flag_fm = 1;         //啟動蜂鳴器
  731.             k++;
  732.             if(k >= 100)           //長按
  733.             {
  734.                     if(knum==2)
  735.                     {
  736.                                                 fen--;
  737.                                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進制
  738.                                                 if(fen==-1)
  739.                                                 fen=0x59;
  740.                                                 Write_DS1302_DAT(write_fen,fen);
  741.                                                 read_sf();
  742.                     }

  743.                     if(knum==1)
  744.                     {
  745.                                                 shi--;
  746.                                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進制
  747.                                                 if(shi==-1)
  748.                                                 shi=0x23;
  749.                                                 Write_DS1302_DAT(write_shi,shi);
  750.                                                 read_sf();
  751.                     }

  752.                     k=90;
  753.             }
  754.     }        

  755.     else
  756.     {
  757.             if(k>10 && k<100) //短按
  758.             {
  759.                     flag_fm = 1;         //啟動蜂鳴器        
  760.                     if(knum==2)
  761.                     {
  762.                                                 fen--;
  763.                                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進制
  764.                                                 if(fen==-1)
  765.                                                 fen=0x59;
  766.                                                 Write_DS1302_DAT(write_fen,fen);
  767.                                                 read_sf();
  768.                     }

  769.                     if(knum==1)
  770.                     {
  771.                                                 shi--;
  772.                                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進制
  773.                                                 if(shi==-1)
  774.                                                 shi=0x23;
  775.                                                 Write_DS1302_DAT(write_shi,shi);
  776.                                                 read_sf();
  777.                     }

  778.             }
  779.             k=0;        //消抖變量清零,為下次按鍵做準(zhǔn)備        
  780.         }
  781.         }                
  782. }


  783. void main()
  784. {       
  785.         t0_init();
  786.         read_sf();
  787.         init_1302();
  788.         ADC_Init();
  789.         flag_fm = 1;         //啟動蜂鳴器
  790.         while(1)
  791.         {

  792.            read_sf();
  793.            switch(xs)
  794.            {
  795.                         case 0:if(flag==0 && knum == 0)         //時間、溫度輪流顯示,5秒切換一次
  796.                                            {Display_tem(Get_Tmp());}
  797.                                            else       
  798.                                            display( shi,fen);        break;
  799.                         case 1: display( shi,fen);  break;         //顯示時間
  800.                         case 2: Display_tem(Get_Tmp()); break;//顯示溫度
  801.                         default: break;
  802.            }
  803.            keysan();
  804.                 if(shi>=5 && shi<=21) ba=20;else ba=1;//5~21 亮度最大,22~4 亮度最小
  805.                 if(!flag_gk)                //如果光控標(biāo)志為0,就為自動亮度        ;默認為自動亮度
  806.                 {
  807.                         if(GetADCResult()>5 && GetADCResult()<25) ba=40;
  808.                         if(GetADCResult()>25 && GetADCResult()<50) ba=39; //10級亮度,ba值越大,LED越亮
  809.                         if(GetADCResult()>50 && GetADCResult()<80) ba=35;
  810.                         if(GetADCResult()>80 && GetADCResult()<100) ba=30;
  811.                         if(GetADCResult()>100 && GetADCResult()<130) ba=25;
  812.                         if(GetADCResult()>130 && GetADCResult()<150) ba=20;
  813.                         if(GetADCResult()>150 && GetADCResult()<180) ba=15;
  814.                         if(GetADCResult()>180 && GetADCResult()<200) ba=10;
  815.                         if(GetADCResult()>200 && GetADCResult()<230) ba=5;
  816.                         if(GetADCResult()>230 && GetADCResult()<250) ba=1;
  817.                 }
  818.                 else ba = 40; // 否則為最大亮度
  819.                 if((shi>=5 && shi<=21) && fen ==0 && miao == 0) //整點報時
  820.                 {
  821.                         flag_fm = 1;
  822.                 }
  823.          
  824.         }
  825. }


  826. char shifen,baifen,ge,result;

  827. void adc_isr() interrupt 5 using 1
  828. {
  829.         unsigned int temp;
  830.         temp=ADC_RES;                         //AD取8位結(jié)果
  831.         result=temp*0.01953125*1000;   //ad結(jié)果換算成電壓值, 將5V分成256份,每份5v/256=0.01953125v        ,再擴大1000倍
  832.         ge=result/1000;
  833.         shifen=result%1000/100;
  834.         baifen=result%100/10;
  835.         
  836.        ADC_CONTR = 0xc8;//開啟轉(zhuǎn)換
  837. }
復(fù)制代碼



IMG_20230702_1.jpg (1.02 MB, 下載次數(shù): 104)

IMG_20230702_1.jpg

IMG_20230702_2.jpg (1.08 MB, 下載次數(shù): 112)

IMG_20230702_2.jpg

IMG_20230702_3.jpg (1.21 MB, 下載次數(shù): 120)

IMG_20230702_3.jpg

1.2寸數(shù)碼管時鐘_溫度_光控_雙面制版上傳20230702修改版.rar

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

回復(fù)

使用道具 舉報

板凳
ID:378402 發(fā)表于 2023-7-2 18:52 | 只看該作者
程序調(diào)整后,原理圖未調(diào)整,圖片發(fā)不了,只能文字?jǐn)⑹。USB的D+連接單片機的P3.1;USB的D-連接單片機的P3.2不變,調(diào)整SW2原連接P3.1改為連接P3.3;調(diào)整SW1原連接P3.0改為連接P3.4,主要解決下載程序問題。另一處需要調(diào)整的是:時鐘芯片的SCLK原連接P2.0改為連接P2.2;RST原連接P2.2改為連接P2.0。
回復(fù)

使用道具 舉報

地板
ID:1131746 發(fā)表于 2024-12-13 11:33 | 只看該作者
樓主,單片機需要加上晶振電路嗎?我按原理做出來,電源加有濾波,時間不走時,找不到問題了。
回復(fù)

使用道具 舉報

5#
ID:1048675 發(fā)表于 2025-3-20 09:22 | 只看該作者
wbc520 發(fā)表于 2024-12-13 11:33
樓主,テ枰由暇д竦緶仿穡課野叢磣齔隼,悼澊加有滤波,时间不走时,找矇霓I侍飭恕?/blockquote>

單片機一定要加上晶振電路,單片機沒有晶振電路單片機不工作的。
回復(fù)

使用道具 舉報

6#
ID:1110477 發(fā)表于 2025-3-21 04:59 | 只看該作者
泰興電子 發(fā)表于 2025-3-20 09:22
單片機一定要加上晶振電路,單片機沒有晶振電路單片機不工作的。

STC15系列的單片機內(nèi)部有RC振蕩器,可以不加晶振
回復(fù)

使用道具 舉報

7#
ID:1110477 發(fā)表于 2025-3-21 05:04 | 只看該作者
剛一看還以為數(shù)碼管安裝反了,仔細一看確實反了,再一琢磨,啊哦是故意的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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