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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10921|回復: 21
打印 上一主題 下一主題
收起左側

1寸數碼管時鐘+12C5A60S2單片機+自動亮度+時間溫度輪流顯示(實物+代碼)

  [復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 lids 于 2018-12-21 08:41 編輯

描述: 4位共陽1寸數碼管時鐘,顯示88:88樣式,正常走時的時候,“:”1秒亮滅1次;調時間的的時候冒號熄滅
       調時:按KEY1按鍵第1次分鐘位閃爍,再按KEY2一次分鐘加1,按KEY3一次分鐘減1,長按連加連減;
       按KEY1按鍵第2次小時位閃爍,再按KEY2一次小時加1,按KEY3一次小時減1,長按連加連減;
       按KEY1按鍵第3次,秒從零開始累加,時鐘回到正常走時;
       校時的時候先調好時、分,分鐘要比參考時間的分鐘加1分,
       再看參考時間的秒數到了59再按KEY1按鍵的第3次,這樣對時就比較準了,因為KEY1按鍵按第3次后秒會清零。
       加備用電池,掉電走時
                        
       KEY2鍵第2功能:非調時狀態,為光控開關;
       KEY3鍵第2功能:非調時狀態,為顯示切換開關;
       DS18B20做溫度檢測,       可顯示3個界面:1.實時時鐘與溫度輪流顯示、2.只顯示溫度、3.只顯示時間;
       溫度顯示范圍: -9.9℃~99.9℃;
       增加數碼管調亮度功能,自動10級亮度,P1.0接5.1K電阻上拉、光敏電阻下拉分壓;
       環境光線越亮,數碼管越亮,反之數碼管越暗,晚上看不刺眼。
實物通過.  
                         12MHz晶振,STC12C5A60S2+DS1302時鐘芯片+DS18B20,
                         P0口接段位,P2^4~P2^7接pnp三極管控制4個共陽極。

制作出來的實物圖如下:


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


  24. sbit TSCLK = P2^0;//時鐘線
  25. sbit TIO   = P2^1;//數據線
  26. sbit TRST  = P2^2;//使能端

  27. sbit key1 = P3^0;   //設置鍵
  28. sbit key2 = P3^1;   //加 /光控開關鍵(校時的時候做加鍵,反之為光控開關)
  29. sbit key3 = P3^2;   // 減/顯示切換鍵
  30. sbit DQ = P2^3;                //DS18B20數據口

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

  37. uchar xs=0; //顯示切換計數變量
  38. uchar knum,shan_cont;
  39. char shi,fen,miao;
  40. uchar ba=40;
  41. uint mh,mh_count,count;
  42. bit shan;           //校時閃爍標志位
  43. uchar s=0;                   //顯示負號
  44. uint temp;        //溫度值
  45. bit flag;                  //輪流顯示標志位
  46. bit flag_gk;          //光控標志位
  47. bit flag_js=0;          //自動校時標志
  48. bit flag_fm;          //蜂鳴器啟動標志
  49. uchar fm;                //蜂鳴器計時變量
  50. /***************************************定義轉換控制寄存器控制位*****************************************/
  51. #define ADC_POWER                   0X80            //電源控制位
  52. #define ADC_FLAG                    0X10            //轉換結束標志位
  53. #define ADC_START                   0X08            //轉換開始位
  54. /*********************************************定義AD轉換速度*********************************************/
  55. #define ADC_SPEEDLL_540         0X00           
  56. #define ADC_SPEEDLL_360                0X20
  57. #define ADC_SPEEDLL_180                0X40
  58. #define ADC_SPEEDLL_90                0X60


  59. /***********寫時分秒地址************/
  60. #define write_shi  0x84
  61. #define write_fen  0x82
  62. #define write_miao 0x80
  63. #define write_ram  0xc0
  64. /***********讀時分秒地址************/
  65. #define read_shi  0x85
  66. #define read_fen  0x83
  67. #define read_miao 0x81
  68. #define read_ram  0xc1

  69. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x46,0xbf};//共陽段碼 (0--9、黑屏、C、-)

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

  83. //void Delay_1(uint time)
  84. //{
  85. //        uint i,j;
  86. //        for(i = 0;i < time;i ++)
  87. //                for(j = 0;j < 600;j ++);
  88. //}



  89. /*********************************************************************************************************
  90. ** 函數功能 :延時函數
  91. ** 函數說明 :利用軟件延時,占用CPU,經調試最小單位大約為1us
  92. ** 入口參數 :time:需要延時的時間,單位us
  93. ** 出口參數 :無
  94. *********************************************************************************************************/
  95. void delay(uchar n)
  96. {
  97.     while (n--)
  98.     {
  99.         _nop_();
  100.         _nop_();
  101.     }
  102. }

  103. /*************蜂鳴器*****************/
  104. //void didi(uchar i)
  105. //{
  106. //        uchar x;
  107. //        for(x = i; x >0; x--)
  108. //        {
  109. //                dd = 0;
  110. //                Delay_1(200);
  111. //                dd = 1;
  112. //                Delay_1(200);
  113. //        }
  114. //}

  115. /*****************DS18B20******************/

  116. void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
  117. {
  118.         DQ = 1;                     //DQ復位,不要也可行。
  119.         delay(1);                  //稍做延時
  120.         DQ = 0;                    //單片機拉低總線
  121.         //delay(250);                //精確延時,維持至少480us
  122.         delay(240);
  123.         delay(240);
  124.         DQ = 1;                    //釋放總線,即拉高了總線
  125.         delay(240);                //此處延時有足夠,確保能讓DS18B20發出存在脈沖。
  126. }

  127. uchar Read_One_Byte()       //讀取一個字節的數據read a byte date
  128.                             //讀數據時,數據以字節的最低有效位先從總線移出
  129. {
  130.         uchar i   = 0;
  131.         uchar dat = 0;
  132.         for(i=8;i>0;i--)
  133.         {
  134.            DQ = 0;                  //將總線拉低,要在1us之后釋放總線
  135.                                    //單片機要在此下降沿后的15us內讀數據才會有效。
  136.            delay(1);                //至少維持了1us,表示讀時序開始
  137.            dat >>= 1;               //讓從總線上讀到的位數據,依次從高位移動到低位。
  138.            DQ = 1;                  //釋放總線,此后DS18B20會控制總線,把數據傳輸到總線上
  139.            delay(7);                 //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內的最后部分
  140.            if(DQ)                   //控制器進行采樣
  141.            {
  142.             dat |= 0x80;            //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
  143.            }        
  144.            delay(60);               //此延時不能少,確保讀時序的長度60us。
  145.         }
  146.         return (dat);
  147. }

  148. void Write_One_Byte(uchar dat)
  149. {
  150.         uchar i = 0;
  151.         for(i=8;i>0;i--)
  152.         {
  153.            DQ = 0;                        //拉低總線
  154.            delay(1);                       //至少維持了1us,表示寫時序(包括寫0時序或寫1時序)開始
  155.            DQ = dat&0x01;                 //從字節的最低位開始傳輸
  156.                                          //指令dat的最低位賦予給總線,必須在拉低總線后的15us內,
  157.                                          //因為15us后DS18B20會對總線采樣。
  158.            delay(60);                     //必須讓寫時序持續至少60us
  159.            DQ = 1;                        //寫完后,必須釋放總線,
  160.            dat >>= 1;
  161.            delay(1);
  162.         }
  163. }


  164. uint Get_Tmp()                   //獲取溫度get the temperature
  165. {
  166.         float tt;
  167.         uchar L,M;
  168.         Init_Ds18b20();                //初始化
  169.         Write_One_Byte(0xcc);          //忽略ROM指令
  170.         Write_One_Byte(0x44);          //溫度轉換指令
  171.         Init_Ds18b20();                 //初始化
  172.         Write_One_Byte(0xcc);          //忽略ROM指令
  173.         Write_One_Byte(0xbe);          //讀暫存器指令
  174.         L = Read_One_Byte();           //讀取到的第一個字節為溫度LSB
  175.         M = Read_One_Byte();           //讀取到的第一個字節為溫度MSB
  176.         //模擬顯示-0.5度,實際測溫需注解掉下面這兩句
  177. //        L = 0xf8;
  178. //        M = 0xff;
  179.         
  180.         //模擬顯示+0.5度,實際測溫需注解掉下面這兩句
  181. //        L = 0x08;
  182. //        M = 0x00;

  183.         temp = M;                      //先把高八位有效數據賦于temp
  184.         temp <<= 8;                    //把以上8位數據從temp低八位移到高八位
  185.         temp = temp|L;                //兩字節合成一個整型變量

  186.         if(M >= 0x08)        //判斷是否為負數
  187.         {
  188.                 temp = ~temp + 1;//負數是以補碼的形式存放的需要取反加1
  189.                 s = 0xbf;  //顯示負數符號
  190.         }
  191.         else s = 0;           //為正數則不顯示負數符號


  192.         tt = temp*0.0625;              //得到真實十進制溫度值
  193.                                         //因為DS18B20可以精確到0.0625度
  194.                                         //所以讀回數據的最低位代表的是0.0625度
  195.         temp = tt*10+0.5;               //放大十倍
  196.                                         //這樣做的目的將小數點后第一位也轉換為可顯示數字
  197.                                         //同時進行一個四舍五入操作。
  198.         return temp;
  199. }


  200. /****************溫度顯示函數**************/

  201. void Display_tem(uint temp)   //顯示程序
  202. {
  203.         uchar A1,A2,A3;
  204.         A1 = temp/100;    //百位
  205.         A2 = temp%100/10;   //十位
  206.         A3 = temp%10;    //個位
  207.         
  208.         if(A1 > 0 && s == 0 )
  209.         {
  210.                 P0 = 0xff;
  211.                 w2 = 1; w3 = 1; w4 = 1;
  212.                 Delay_ms(50-ba);
  213.                 P0 = table[A1];    //顯示百位
  214.                 w1 = 0;
  215.                 Delay_ms(ba);
  216.         }
  217.         else
  218.         {
  219.                 if(A1 == 0 && s == 0)
  220.                 {
  221.                         P0 = 0xff;
  222.                         w2 = 1; w3 = 1; w4 = 1;
  223.                         Delay_ms(50-ba);
  224.                         P0 = table[10];    //百位為0不顯
  225.                         w1 = 0;
  226.                         Delay_ms(ba);
  227.                 }
  228.                 else
  229.                 if(s != 0)
  230.                 {
  231.                         P0 = 0xff;
  232.                         w2 = 1; w3 = 1; w4 = 1;
  233.                         Delay_ms(50-ba);
  234.                         P0 = s;    //百位為負數顯示-
  235.                         w1 = 0;
  236.                         Delay_ms(ba);
  237.                 }
  238.                  
  239.         
  240.         }
  241.         
  242.         
  243.         P0 = 0xff;
  244.         w1 = 1; w3 = 1; w4 = 1;
  245.         Delay_ms(50-ba);
  246.         P0 = table[A2]&0X7F;   //顯示十位,使用的是有小數點的數組(因為temp值擴大了10倍,雖然是十位,實際為個位)
  247.         w2 = 0;
  248.         Delay_ms(ba);
  249.         
  250.         P0 = 0xff;
  251.         w1 = 1; w2 = 1;  w4 = 1;
  252.         Delay_ms(50-ba);
  253.         P0 = table[A3];
  254.         w3 = 0;   
  255.         Delay_ms(ba);        
  256.          
  257.         P0 = 0xff;
  258.         w1 = 1; w2 = 1; w3 = 1;
  259.         Delay_ms(50-ba);
  260.         P0 = 0x46;   //顯示C字樣
  261.         w4 = 0;
  262.         Delay_ms(ba);
  263.         
  264.         P0 = 0xff;
  265.         w1 = 1; w2 = 1; w3 = 1;
  266.         Delay_ms(50-ba);
  267.         P0 = 0xff;   
  268.         w5 = 0;
  269.         P0 = 0xff;
  270.         Delay_ms(ba);        
  271. }



  272. void display( uchar shi,uchar fen)           //時間顯示函數
  273. {

  274. /*****正常顯示******/
  275.         if(knum == 0)
  276.         {
  277.                 if(shi/10 > 0)
  278.                 {
  279.                         w2 = 1; w3 = 1; w4 = 1;
  280.                         Delay_ms(50-ba);
  281.                         P0 = table[shi/10];    //顯示小時十位
  282.                         w1 = 0;
  283.                         Delay_ms(ba);
  284.                 }
  285.                 else
  286.                 {
  287.                         w2 = 1; w3 = 1; w4 = 1;
  288.                         Delay_ms(50-ba);
  289.                         P0 = table[10];    //小時十位為0不顯示
  290.                         w1 = 0;
  291.                         Delay_ms(ba);
  292.                
  293.                 }
  294.         
  295.                 P0 = 0xff;
  296.                 w1 = 1; w3 = 1; w4 = 1;
  297.                 Delay_ms(50-ba);
  298.                 if(mh_count>=50)
  299.                 P0 = table[shi%10]&0x7f;    //顯示小時個位
  300.                 else
  301.                 P0 = table[shi%10];
  302.                 w2 = 0;
  303.                 Delay_ms(ba);
  304.                  
  305.                 P0 = 0xff;
  306.                 w1 = 1; w2 = 1; w4 = 1;
  307.                 Delay_ms(50-ba);
  308.                 if(mh_count>=50)
  309.                 P0 = table[fen/10]&0x7f;    //顯示分鐘十位
  310.                 else
  311.                 P0 = table[fen/10];
  312.                 w3 = 0;
  313.                 Delay_ms(ba);
  314.         
  315.                 P0 = 0xff;
  316.                 w2 = 1; w3 = 1; w1 = 1;
  317.                 Delay_ms(50-ba);
  318.                 P0 = table[fen%10];    //顯示分鐘個位
  319.                 w4 = 0;
  320.                 Delay_ms(ba);
  321.         
  322.                 P0 = 0xff;
  323.                 w1 = 1; w2 = 1; w3 = 1;
  324.                 Delay_ms(50-ba);
  325.                 P0 = 0xff;   
  326.                 w5 = 0;                  //這里掃描一個空位,數碼管前4位亮度就均勻了,第4位與前3位亮度一致,不然第4位要比前3位亮
  327.                 P0 = 0xff;
  328.                 Delay_ms(ba);        
  329.         }

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

  331. //        P0 = 0xff;
  332.         if(knum==1)
  333.         {
  334.                  if( shan==0 )
  335.                 {
  336.                 w2 = 1; w3 = 1; w4 = 1;
  337.                 Delay_ms(50-ba);
  338.                 P0 = 0xff;    //顯示小時十位
  339.                 w1 = 0;
  340.                 Delay_ms(ba);

  341.                 P0 = 0xff;
  342.                 w1 = 1; w3 = 1; w4 = 1;
  343.                 Delay_ms(50-ba);
  344.                 P0 = 0xff;;
  345.                 w2 = 0;
  346.                 Delay_ms(ba);
  347.                 }
  348.         

  349.                 else
  350.                 {
  351.                         w2 = 1; w3 = 1; w4 = 1;
  352.                         Delay_ms(50-ba);
  353.                         P0 = table[shi/10];    //顯示小時十位
  354.                         w1 = 0;
  355.                         Delay_ms(ba);
  356.                  
  357.                         P0 = 0xff;
  358.                         w1 = 1; w3 = 1; w4 = 1;
  359.                         Delay_ms(50-ba);
  360.                         P0 = table[shi%10];
  361.                         w2 = 0;
  362.                         Delay_ms(ba);
  363.                 }         
  364.                 P0 = 0xff;
  365.                 w1 = 1; w2 = 1; w4 = 1;
  366.                 Delay_ms(50-ba);
  367.                 P0 = table[fen/10];
  368.                 w3 = 0;
  369.                 Delay_ms(ba);
  370.         
  371.                 P0 = 0xff;
  372.                 w2 = 1; w3 = 1; w1 = 1;
  373.                 Delay_ms(50-ba);
  374.                 P0 = table[fen%10];    //顯示分鐘個位
  375.                 w4 = 0;
  376.                 Delay_ms(ba);
  377.         
  378.                 P0 = 0xff;
  379.                 w1 = 1; w2 = 1; w3 = 1;
  380.                 Delay_ms(50-ba);
  381.                 P0 = 0xff;   
  382.                 w5 = 0;                  //這里掃描一個空位,數碼管前4位亮度就均勻了,第4位與前3位亮度一致,不然第4位要比前3位亮
  383.                 P0 = 0xff;
  384.                 Delay_ms(ba);
  385.         }        
  386. /*******校時分鐘位閃爍*******/

  387.         if(knum==2 )
  388.         {
  389.                 if(shan==0)
  390.                 {
  391.                 w2 = 1; w1 = 1; w4 = 1;
  392.                 Delay_ms(50-ba);
  393.                 P0 = 0xff;    //顯示小時十位
  394.                 w3 = 0;
  395.                 Delay_ms(ba);

  396.                 P0 = 0xff;
  397.                 w1 = 1; w3 = 1; w2 = 1;
  398.                 Delay_ms(50-ba);
  399.                 P0 = 0xff;;
  400.                 w4 = 0;
  401.                 Delay_ms(ba);
  402.                 }
  403.                 else
  404.                 {
  405.                         w2 = 1; w1 = 1; w4 = 1;
  406.                         Delay_ms(50-ba);
  407.                         P0 = table[fen/10];    //顯示小時十位
  408.                         w3 = 0;
  409.                         Delay_ms(ba);
  410.                  
  411.                         P0 = 0xff;
  412.                         w1 = 1; w3 = 1; w3 = 1;
  413.                         Delay_ms(50-ba);
  414.                         P0 = table[fen%10];
  415.                         w4 = 0;
  416.                         Delay_ms(ba);
  417.                 }         

  418.                 P0 = 0xff;
  419.                 w3 = 1; w2 = 1; w4 = 1;
  420.                 Delay_ms(50-ba);
  421.                 P0 = table[shi/10];
  422.                 w1 = 0;
  423.                 Delay_ms(ba);
  424.         
  425.                 P0 = 0xff;
  426.                 w4 = 1; w3 = 1; w1 = 1;
  427.                 Delay_ms(50-ba);
  428.                 P0 = table[shi%10];    //顯示分鐘個位
  429.                 w2 = 0;
  430.                 Delay_ms(ba);


  431.         
  432.                 P0 = 0xff;
  433.                 w1 = 1; w2 = 1; w3 = 1;
  434.                 Delay_ms(50-ba);
  435.                 P0 = 0xff;   
  436.                 w5 = 0;                  //這里掃描一個空位,數碼管前4位亮度就均勻了,第4位與前3位亮度一致,不然第4位要比前3位亮
  437.                 P0 = 0xff;
  438.                 Delay_ms(ba);
  439.         }               
  440.         
  441. }


  442. void t0_init()
  443. {
  444. //        TMOD |= 0x02;  //定時器0,8位自動重裝模式
  445. //        TH0=TL0= 0X9c;  //100微秒初值 @12MHz
  446. //        TH0=TL0= 0Xce;  //50微秒初值 @12MHz
  447.         TMOD |= 0x01;  //定時器0,16位模式
  448.         TL0 = 0xF0;                //設置定時初值 10毫秒初值 @12MHz
  449.         TH0 = 0xD8;                //設置定時初值
  450.         EA=1;
  451.         ET0=1;
  452.         TR0 = 1;
  453. //        EADC=1;        
  454. }

  455. //void InitADC()
  456. //{
  457. //        P1ASF =        0x01;//使能P1.0口ADC功能
  458. //        ADC_RES = 0;   //初始AD轉換結果為零
  459. //        ADC_CONTR = 0xc8; //1100 1000  ,打開AD轉換電源,轉換速度180個時鐘周期,ADC_FLAG清零,ADC_START置1啟動AD,選擇P1.0為AD輸入通道
  460. //        Delay_ms(1);
  461. //}            



  462. /*********************************************************************************************************
  463. ** 函數功能 :內置ADC的初始化配置
  464. ** 函數說明 :使用內置ADC時需要先配置對應的P1口的管腳為模擬輸入
  465. ** 入口參數 :port:需要配置為模擬輸入的通道,使用或運算可以同時配置多個管腳
  466. **                          如:ADC_Init(ADC_PORT0 | ADC_PORT1 | ADC_PORT2)調用此函數后可以同時配置P1^0,P1^1,P1^2為模擬輸入
  467. ** 出口參數 :無
  468. *********************************************************************************************************/
  469. void ADC_Init()
  470. {
  471.         P1ASF=0x01;//設置AD轉換通道 P1.0
  472.         ADC_RES=0;//清空轉換結果
  473.         ADC_CONTR=ADC_POWER | ADC_SPEEDLL_540;//打開AD轉化器電源
  474. //        IE=0XA0;//開啟總中斷,ADC中斷
  475.         _nop_();
  476.         _nop_();
  477.         _nop_();
  478.         _nop_();
  479. }
  480. /*********************************************************************************************************
  481. ** 函數功能 :獲取ADC對應通道的值,查詢法
  482. ** 函數說明 :每次只能獲取一個通道的值,不同通道需要分別調用該函數獲取
  483. ** 入口參數 :
  484. ** 出口參數 :
  485. *********************************************************************************************************/
  486. uchar GetADCResult()//讀取通道ch的電壓值
  487. {
  488. //        unsigned int ADC_RESULT = 0;//用來存放結果
  489. //        float result;
  490.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL_540 | ADC_START;//開始轉換,并設置測量通道為P1^0
  491.         _nop_();//需經過四個CPU時鐘延時,上述值才能保證被設進ADC_CONTR控制寄存器
  492.         _nop_();
  493.         _nop_();
  494.         _nop_();
  495.         while(!(ADC_CONTR & ADC_FLAG));//等待轉換結束
  496.         ADC_CONTR &= ~ADC_FLAG;//軟件清除中斷控制位
  497. //        ADC_RESULT = ADC_RES;
  498. //        ADC_RESULT = (ADC_RESULT << 2) | (0x02 & ADC_RESL);        //默認數據存儲方式:高八位在ADC_RES,低二位在ADC_RESL低二位
  499. //        result = ADC_RESULT * 5.0 / 1024.0 ;  //基準電壓為電源電壓5V,10的分辨率,即1024
  500. //        return result;
  501.         return         ADC_RES;
  502. }




  503. void timer0() interrupt 1

  504. {

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

  507.         
  508.         mh_count++;                  //冒號閃爍變量
  509.         if(mh_count==100) //1秒時間到
  510.         {
  511.                 mh_count=0;
  512.                 count++;
  513.                 if(count==5)
  514.                 {
  515.                         count=0;
  516.                         flag = !flag;
  517.                 }
  518.         }


  519.         if(knum != 0)  //調時間的時候,閃爍的位表示為調節的位
  520.     {
  521.                 shan_cont++;
  522.         if(shan_cont==30)  //設置時,300ms閃爍時間,可根據實際效果調整
  523.         {
  524.                 shan_cont=0;
  525.                 shan = !shan;
  526.         }
  527.     }

  528.         if(flag_fm)         //如果蜂鳴器啟動標志為1
  529.         {
  530.                 dd = 0;           //蜂鳴器響
  531.                 fm++;           //計時變量自加
  532.                 if(fm == 30) //到300ms,蜂鳴器停
  533.                 {
  534.                         fm = 0;         //計時變量清零
  535.                         dd = 1;        // 蜂鳴器停
  536.                         flag_fm = 0;//啟動標志清零
  537.                 }

  538.         }
  539. }  


  540. //寫DS1302數據
  541. void Write_DS1302_DAT(uchar cmd, uchar dat)
  542. {
  543.         uchar i;
  544.         TRST = 0; //拉低使能端
  545.         TSCLK = 0;//拉低數據總線
  546.         TRST = 1; //拉高使能端,產生上升沿開始寫數據
  547.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  548.         {
  549.                 TSCLK = 0;                  //拉低時鐘總線
  550.                 TIO = cmd & 0x01; //寫1位數據,從最低位開始寫
  551.                 TSCLK = 1;                  //拉高時鐘總線,產生上升沿數據被DS1302讀走
  552.                 cmd >>=1;                  //右移一位
  553.         }
  554.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  555.         {
  556.                 TSCLK = 0;                  //拉低時鐘總線
  557.                 TIO = dat & 0x01; //寫1位數據,從最低位開始寫
  558.                 TSCLK = 1;                  //拉高時鐘總線,產生上升沿數據被DS1302讀走
  559.                 dat >>= 1;                  //右移一位
  560.         }
  561. }
  562. //讀DS1302數據
  563. uchar Read_DS1302_DAT(uchar cmd)
  564. {
  565.         uchar i, dat;
  566.         TRST = 0;  //拉低使能端
  567.         TSCLK = 0; //拉低數據總線
  568.         TRST = 1;  //拉高使能端,產生上升沿開始寫數據
  569.         for(i = 0; i < 8; i++)//每次寫1位,寫8次
  570.         {
  571.                 TSCLK = 0;                 //拉低時鐘總線
  572.                 TIO = cmd & 0x01;//寫1位數據,從最低位開始寫
  573.                 TSCLK = 1;                 //拉高時鐘總線,產生上升沿數據被DS1302讀走
  574.                 cmd >>=1;                 //右移一位
  575.         }
  576.         for(i = 0; i < 8; i++)//每次讀1位,讀8次
  577.         {
  578.                 TSCLK = 0;                  //拉低時鐘總線,產生下降沿,DS1302把數據放到TIO上
  579.                 dat >>= 1;                  //右移一位
  580.                 if(TIO)        dat |= 0x80;//讀取數據,從最低位開始
  581.                 TSCLK = 1;                        //拉高時鐘總線,以備下一次產生下降沿
  582.         }
  583.         return dat;        //返回讀出數據
  584. }


  585. //數據轉BCD碼
  586. uchar Dat_Chg_BCD(uchar dat)
  587. {
  588.         uchar dat1, dat2;
  589.         dat1 = dat / 10;
  590.         dat2 = dat % 10;
  591.         dat2 = dat2 + dat1 * 16;
  592.         return dat2;
  593. }        


  594. //BCD碼轉換為數據
  595. uchar BCD_Chg_Dat(uchar dat)
  596. {
  597.         uchar dat1, dat2;
  598.         dat1 = dat / 16;
  599.         dat2 = dat % 16;
  600.         dat2 = dat2 + dat1 * 10;
  601.         return dat2;
  602. }



  603. void init_1302()                //初始化函數 設置時間
  604. {                                                //加備用電池,掉電走時

  605. //        if((Read_DS1302_DAT(0x81)& 0x80) != 0)        //讀出秒數據,再跟80h(0x80)與運算看結果,結果是0則不需要初始化1302;是80h就要初始化!
  606.         
  607.         if(Read_DS1302_DAT(read_ram) != 0xaa) //如果第00個RAM位置不等于0xaa,就初始化1302
  608.         {
  609.                 Write_DS1302_DAT(0x8e, 0);//清除寫保護
  610.                 Write_DS1302_DAT(write_miao, Dat_Chg_BCD(58));//58秒(并且進行BCD碼轉換)
  611.                 Write_DS1302_DAT(write_fen, Dat_Chg_BCD(10));//10分
  612.                 Write_DS1302_DAT(write_shi, Dat_Chg_BCD(9));//9時
  613.                 Write_DS1302_DAT(write_ram,0xaa);//寫入初始化標志RAM(第00個RAM位置)
  614.                 Write_DS1302_DAT(0x8e, 0x80);//開寫保護
  615.         }

  616. }         


  617. void read_sf()
  618. {

  619.         miao = BCD_Chg_Dat(Read_DS1302_DAT(0x81));//讀秒寄存器(并且進行BCD碼轉換)
  620.         fen        = BCD_Chg_Dat(Read_DS1302_DAT(0x83));//讀分寄存器
  621.         shi = BCD_Chg_Dat(Read_DS1302_DAT(0x85));//讀時寄存器

  622. //        display(shi,fen);

  623. }


  624. void zdjs()                                                          //自動校時,這方法測試可行,每天減去快出的秒數
  625. {
  626.          if((shi==7)&&(fen==30)&&(miao==6))        //   時鐘每天快6秒
  627.            {
  628.                            if(flag_js==0)
  629.                         {
  630.                                 Write_DS1302_DAT(0x8e,0x00);           //寫保護取消
  631.                                 Write_DS1302_DAT(write_miao,0x00); //寫秒0,這里是假如每天快6秒,每到這個時候就減去6秒
  632.                             Write_DS1302_DAT(0x8e,0x80);           //啟動寫保護
  633.                                 flag_js=1;                                                           //標志位置1,不然這里會成一個死循環
  634.                         }
  635.             }

  636.           if((shi==7)&&(fen==35)&&(miao==0))
  637.                           flag_js=0;                                   //標志位清零,準備第二天校時
  638. }



  639. void keysan()
  640. {
  641.     static bit kf1=0, kf3=0,kf2=0;  //自鎖標志,這里一定要加static(或者用全局變量),否則按鍵不靈
  642.     static uint i=0,j=0,k=0,m=0,n=0;        //消抖延時變量
  643.                
  644.         if(key1==1)                //設置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位
  645.         {        
  646.         i=0;           //按鍵消抖計時變量清零
  647.         kf1=0;           //按鍵自鎖標志清零
  648.         }
  649.         else if(kf1 == 0)        //有按鍵按下,且是第一次被按下
  650.         {        
  651.         flag_fm = 1;         //啟動蜂鳴器
  652.                 ++i;
  653.         if(i>10)                   //i>10  ADC查詢方式用
  654.         {
  655.             i=0;
  656.             kf1=1;         //自鎖按鍵置位,避免一直觸發
  657.             knum++;
  658.                         if(knum==1)
  659.                         {
  660.                                 Write_DS1302_DAT(0x8e,0x00);                //寫保護取消
  661.                                 Write_DS1302_DAT(write_miao,0x80); //  寫秒80,時鐘停止走時;
  662.                         
  663.                         }
  664.             if(knum==3)
  665.                         {
  666.                                  knum = 0;

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

  669.                         }
  670.         }        
  671.         }
  672. /************顯示和光控切換****************/
  673.         if(knum == 0)
  674.         {
  675.                 if(key3==1)                //設置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位
  676.                 {        
  677.                 m=0;           //按鍵消抖計時變量清零
  678.                 kf3=0;           //按鍵自鎖標志清零
  679.                 }
  680.                 else if(kf3 == 0)        //有按鍵按下,且是第一次被按下
  681.                 {        flag_fm = 1;         //啟動蜂鳴器
  682.                 ++m;
  683.                 if(m>10)                   //i>10  ADC查詢方式用
  684.                 {
  685.                     m=0;
  686.                     kf3=1;         //自鎖按鍵置位,避免一直觸發
  687.                     xs++;
  688.                    if(xs==3)
  689.                                 {
  690.                                          xs = 0;
  691.         
  692.                                 }
  693.                 }        
  694.                 }

  695.                 if(key2==1)                //設置         //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標志位
  696.                 {
  697.                 n=0;           //按鍵消抖計時變量清零
  698.                 kf2=0;           //按鍵自鎖標志清零
  699.                 }
  700.                 else if(kf2 == 0)        //有按鍵按下,且是第一次被按下
  701.                 {        flag_fm = 1;         //啟動蜂鳴器
  702.                 ++n;
  703.                 if(n>10)                   //i>10  ADC查詢方式用
  704.                 {
  705.                     n=0;
  706.                     kf2=1;         //自鎖按鍵置位,避免一直觸發
  707.                                 flag_gk = !flag_gk;
  708.                 }        
  709.                 }


  710.         }



  711. ///-------加--------///
  712.         if(knum != 0)
  713.         {
  714.                 if(key2==0)                //加
  715.             {  
  716.                         
  717.                 j++;
  718.         //        if(j >= 5000)           //長按連加 ADC中斷方式用
  719.                 if(j >= 100)           //長按連加 ADC查詢方式用
  720.         
  721.                 {   //flag_fm = 0;                                    
  722.                     if(knum==2)
  723.                     {
  724.                                 fen++;
  725.                                 fen=fen/10*16+fen%10;                //轉為16進制
  726.                                 if(fen==0x60)
  727.                                             fen=0x00;
  728.                                         Write_DS1302_DAT(write_fen,fen);
  729.                                 read_sf();                                        //讀出時間,然后顯示
  730.                     }
  731.         
  732.                     if(knum==1)
  733.                     {
  734.                                         shi++;
  735.                                         shi=shi/10*16+shi%10;                //轉為16進制
  736.                                         if(shi==0x24)
  737.                                                 shi=0x00;
  738.                                         Write_DS1302_DAT(write_shi,shi);
  739.                                         read_sf();
  740.                     }
  741.         
  742.                     j=90;           //這里j的值可以設置連加的快慢,j的值越大就越快
  743.                                                         //因為初值越大,加到100的時間就越短
  744.                                 flag_fm = 1;  //啟動蜂鳴器
  745.                         }                           
  746.             }        
  747.         
  748.             else
  749.             {
  750.                 if(j>10 && j<100) //短按
  751.                 {
  752.                     flag_fm = 1;         //啟動蜂鳴器   
  753.                     if(knum==2)
  754.                     {
  755.                                 fen++;
  756.                                 fen=fen/10*16+fen%10;                //轉為16進制
  757.                                 if(fen==0x60)
  758.                                     fen=0x00;
  759.                                         Write_DS1302_DAT(write_fen,fen);
  760.                                 read_sf();                                        //讀出時間,然后顯示
  761.                     }
  762.         
  763.                     if(knum==1)
  764.                     {
  765.                                         shi++;
  766.                                         shi=shi/10*16+shi%10;                //轉為16進制
  767.                                         if(shi==0x24)
  768.                                                 shi=0x00;
  769.                                        
  770.                                         Write_DS1302_DAT(write_shi,shi);
  771.                                         read_sf();
  772.                     }
  773.         
  774.                         j=0;
  775.                     }
  776.                 }        
  777.    
  778. //----------減-----------//   
  779.         if(key3==0)                //減
  780.     {           flag_fm = 1;         //啟動蜂鳴器
  781.             k++;
  782.             if(k >= 100)           //長按
  783.             {
  784.                     if(knum==2)
  785.                     {
  786.                                                 fen--;
  787.                                                 fen=fen/10*16+fen%10;                //轉為16進制
  788.                                                 if(fen==-1)
  789.                                                 fen=0x59;
  790.                                                 Write_DS1302_DAT(write_fen,fen);
  791.                                                 read_sf();
  792.                     }

  793.                     if(knum==1)
  794.                     {
  795.                                                 shi--;
  796.                                                 shi=shi/10*16+shi%10;                //轉為16進制
  797.                                                 if(shi==-1)
  798.                                                 shi=0x23;
  799.                                                 Write_DS1302_DAT(write_shi,shi);
  800.                                                 read_sf();
  801.                     }

  802.                     k=90;
  803.             }
  804.     }        

  805.     else
  806.     {
  807.             if(k>10 && k<100) //短按
  808.             {
  809.                     flag_fm = 1;         //啟動蜂鳴器        
  810.                     if(knum==2)
  811.                     {
  812.                                                 fen--;
  813.                                                 fen=fen/10*16+fen%10;                //轉為16進制
  814.                                                 if(fen==-1)
  815.                                                 fen=0x59;
  816.                                                 Write_DS1302_DAT(write_fen,fen);
  817.                                                 read_sf();
  818.                     }

  819.                     if(knum==1)
  820.                     {
  821.                                                 shi--;
  822.                                                 shi=shi/10*16+shi%10;                //轉為16進制
  823.                                                 if(shi==-1)
  824.                                                 shi=0x23;
  825.                                                 Write_DS1302_DAT(write_shi,shi);
  826.                                                 read_sf();
  827.                     }

  828.             }
  829.             k=0;        //消抖變量清零,為下次按鍵做準備        
  830.         }
  831.         }                 
  832. }


  833. void main()
  834. {        
  835. //        uchar i;
  836.         t0_init();
  837.         init_1302();
  838. //        InitADC();
  839.         ADC_Init();
  840.         flag_fm = 1;         //啟動蜂鳴器
  841.         while(1)
  842.         {
  843.            read_sf();
  844.            switch(xs)
  845.            {
  846.                         case 0:if(flag==0 && knum == 0)         //時間、溫度輪流顯示,5秒切換一次
  847.                                            {Display_tem(Get_Tmp());}
  848.                                            else        
  849.                                            display( shi,fen);        break;
  850.                         case 1: display( shi,fen);  break;         //顯示時間
  851.                         case 2: Display_tem(Get_Tmp()); break;//顯示溫度
  852.                         default: break;
  853.            }
  854.            keysan();
  855.            zdjs();//自動校時

  856. //                if(shi>=5 && shi<=21) //5~21 亮度最大
  857. //                ba=20;
  858. //                else ba=1;                          //22~4 亮度最小
  859. //                if(ADC_RES>5 && ADC_RES<25) ba=40;
  860. //                if(ADC_RES>25 && ADC_RES<50) ba=39; //10級亮度,ba值越大,LED越亮
  861. //                if(ADC_RES>50 && ADC_RES<80) ba=35;
  862. //                if(ADC_RES>80 && ADC_RES<100) ba=30;
  863. //                if(ADC_RES>100 && ADC_RES<130) ba=25;
  864. //                if(ADC_RES>130 && ADC_RES<150) ba=20;
  865. //                if(ADC_RES>150 && ADC_RES<180) ba=15;
  866. //                if(ADC_RES>180 && ADC_RES<200) ba=10;
  867. //                if(ADC_RES>200 && ADC_RES<230) ba=5;
  868. //                if(ADC_RES>230 && ADC_RES<250) ba=1;

  869. /**************************/
  870.                 if(!flag_gk)                //如果光控標志為0,就為自動亮度        ;默認為自動亮度
  871.                 {
  872.                         if(GetADCResult()>5 && GetADCResult()<25) ba=40;
  873.                         if(GetADCResult()>25 && GetADCResult()<50) ba=39; //10級亮度,ba值越大,LED越亮
  874.                         if(GetADCResult()>50 && GetADCResult()<80) ba=35;
  875.                         if(GetADCResult()>80 && GetADCResult()<100) ba=30;
  876.                         if(GetADCResult()>100 && GetADCResult()<130) ba=25;
  877.                         if(GetADCResult()>130 && GetADCResult()<150) ba=20;
  878.                         if(GetADCResult()>150 && GetADCResult()<180) ba=15;
  879.                         if(GetADCResult()>180 && GetADCResult()<200) ba=10;
  880.                         if(GetADCResult()>200 && GetADCResult()<230) ba=5;
  881.                         if(GetADCResult()>230 && GetADCResult()<250) ba=1;
  882.                 }
  883.                 else ba = 40; // 否則為最大亮度
  884. /*********************/
  885.                 if((shi>=5 && shi<=21) && fen ==0 && miao == 0) //整點報時
  886.                 {
  887.                         flag_fm = 1;
  888.                 }

  889.         }
  890. }

  891. /*------------------------------------------------
  892.                 ADC中斷處理函數
  893. ------------------------------------------------*/
  894. //void adc_isr() interrupt 5 using 1
  895. //{
  896. ////        unsigned int temp;
  897. ////        temp=ADC_RES;                         //AD取8位結果
  898. ////        result=temp*0.01953125*1000;   //ad結果換算成電壓值, 將5V分成256份,每份5v/256=0.01953125v        ,再擴大1000倍
  899. ////        ge=result/1000;
  900. ////        shifen=result%1000/100;
  901. ////        baifen=result%100/10;
  902. //         
  903. //        ADC_CONTR = 0xc8;//開啟轉換
  904. //}


復制代碼
全部資料51hei下載地址:
1寸數碼管時鐘資料.rar (283.97 KB, 下載次數: 265)



評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

22#
ID:53978 發表于 2021-10-18 14:56 | 只看該作者
這個用共陰數碼管需要改什么代碼呢
回復

使用道具 舉報

21#
ID:53978 發表于 2021-10-7 17:58 | 只看該作者
感謝無私分享 下載學習學習
回復

使用道具 舉報

20#
ID:64253 發表于 2020-8-12 10:48 | 只看該作者
這位大師,牛逼啊,無私代碼都快貼完了,贊一個
回復

使用道具 舉報

19#
ID:476064 發表于 2019-5-13 00:43 來自手機 | 只看該作者
那位大神修改下給stc89c52用,手里沒有這個。
回復

使用道具 舉報

18#
ID:345426 發表于 2019-3-23 22:45 | 只看該作者
自動校時這個好辦法
回復

使用道具 舉報

17#
ID:84492 發表于 2019-3-14 15:47 | 只看該作者
lids 發表于 2019-1-22 09:26
這些功能看個人喜好增減,我做自動亮度是為了晚上看不刺眼

自動亮度很實用,對于產品本身來說也是對人比較友好的。
回復

使用道具 舉報

16#
ID:84492 發表于 2019-3-14 15:45 | 只看該作者
51hei團團 發表于 2018-12-21 14:53
自動亮度這個功能很有創意,有時間我在樓主的基礎再改造一下接入天貓精靈做語言控制亮度的功能.

你好,天貓精靈控制很新穎,能簡單回復下怎么實現嗎?或者什么模塊可以?
回復

使用道具 舉報

15#
ID:140489 發表于 2019-1-22 09:26 | 只看該作者
風158 發表于 2019-1-21 21:11
調光功能我認為用途不大,一定要用的話,使用模擬電路更簡單。這樣可以用沒有A/D轉換的更廉價的芯片,節省 ...

這些功能看個人喜好增減,我做自動亮度是為了晚上看不刺眼
回復

使用道具 舉報

14#
ID:343102 發表于 2019-1-21 21:11 | 只看該作者
調光功能我認為用途不大,一定要用的話,使用模擬電路更簡單。這樣可以用沒有A/D轉換的更廉價的芯片,節省的內存可以增加紅外遙控,還可以增加自動閏秒功能以大幅提高走時精度,這樣實用性會更強。
個人觀點。
回復

使用道具 舉報

13#
ID:229361 發表于 2019-1-21 13:29 | 只看該作者
謝謝樓主的分享
回復

使用道具 舉報

12#
ID:315554 發表于 2018-12-26 17:06 | 只看該作者
調光功能很好,學習了,謝謝!
回復

使用道具 舉報

11#
ID:326489 發表于 2018-12-26 07:42 | 只看該作者
謝謝樓主分享!很好的程序!
回復

使用道具 舉報

10#
ID:60026 發表于 2018-12-24 16:19 | 只看該作者

謝謝分享!不錯!
回復

使用道具 舉報

9#
ID:171111 發表于 2018-12-23 20:16 | 只看該作者
謝謝分享 這個 很不錯
回復

使用道具 舉報

8#
ID:70614 發表于 2018-12-23 09:00 | 只看該作者
有鬧鐘功能嗎加個鬧鐘功能更完美
回復

使用道具 舉報

7#
ID:328014 發表于 2018-12-21 14:53 | 只看該作者
自動亮度這個功能很有創意,有時間我在樓主的基礎再改造一下接入天貓精靈做語言控制亮度的功能.
回復

使用道具 舉報

6#
ID:140489 發表于 2018-12-19 09:39 | 只看該作者
數碼管連接圖

微信圖片編輯_20181219093629.jpg (62.21 KB, 下載次數: 135)

微信圖片編輯_20181219093629.jpg

評分

參與人數 1黑幣 +70 收起 理由
admin + 70 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:140489 發表于 2018-12-19 09:11 | 只看該作者
PCB板上留有熱敏電阻的位置,也可以熱敏電阻測溫
回復

使用道具 舉報

地板
ID:140489 發表于 2018-12-19 08:58 | 只看該作者
原理圖里面,供電有兩種方式可選,一種是用三端穩壓器,一種是USB供電,安卓手機線就可以
回復

使用道具 舉報

板凳
ID:140489 發表于 2018-12-19 08:46 | 只看該作者
附件里面有原理圖的,PDF格式的,原理圖連接多數用的網絡標號,這樣看起來簡潔
回復

使用道具 舉報

沙發
ID:1 發表于 2018-12-18 22:02 | 只看該作者
好東東 原理圖是怎么連接的?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费视频网站 | 久久精品中文 | 免费a v网站 | 天天草狠狠干 | 久草在线青青草 | 欧美videosex性极品hd | 精品国产久 | 久草免费在线视频 | 在线视频中文字幕 | hitomi一区二区三区精品 | 中文字幕乱码一区二区三区 | 精品久久久久久久人人人人传媒 | 日本成人三级电影 | 中日韩欧美一级片 | 国产精品久久久久久久久 | 精品视频一区二区三区四区 | 不卡一区二区三区四区 | 美国一级片在线观看 | 久久777 | japanhdxxxx裸体 | 免费h视频| 国内自拍偷拍视频 | 亚洲视频在线观看 | 国产在线一区二区三区 | 亚洲一区视频在线 | 国产日本精品视频 | 一区二区三区视频在线免费观看 | 在线国产欧美 | 成人精品一区二区 | 日韩一区中文字幕 | 中文字幕成人 | 日本久草 | 欧美另类视频在线 | 欧美aⅴ片 | 国产精品欧美一区二区三区 | 97色在线视频 | 美女久久| 国产欧美精品一区 | 成人欧美一区二区三区黑人孕妇 | 国产在线观看一区二区三区 | 亚洲欧美日韩中文字幕一区二区三区 |