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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2783|回復: 5
打印 上一主題 下一主題
收起左側(cè)

STC8H3K64S2單片機+oled12832+ds3231+usb時間校準,18b20-小巧時鐘時鐘帶溫度顯示

  [復制鏈接]
回帖獎勵 1 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:672765 發(fā)表于 2023-12-12 20:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
STC8H3K64S2單片機芯片+oled12832+ds3231+usb時間校準,18b20---小巧時鐘時鐘所有資料在附件,歡迎學習交流!

先看制作出來的實物:
可以插手機充電器,也可以插電腦USB,也可以插tpye-c手機數(shù)據(jù)線進行供電及時間校準。校準用串口助手。
有溫度,時間,日期,星期顯示。特點是小巧,可視角度大。亮度高,可以在代碼里設(shè)置時間關(guān)屏幕。
電路原理圖:
pcb:


部分單片機代碼:
  1. #include "STC8xxxx.H"
  2. #include "oled.h"
  3. #include "bmp.h"
  4. #include        "config.h"

  5. #include        "gpio.h"
  6. #include        "delay.h"

  7. #include<intrins.h>
  8. #include<stdlib.h>
  9.                                           
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. /*實物端口定義*/
  13. sbit DQ=P3^7;                                 //18b20
  14. sbit TSDA=P1^2;                             //ds32321            //模擬I2C數(shù)據(jù)傳送位SDA        
  15. sbit TSCL=P1^1;                                                                           //模擬I2C時鐘控制位SCL
  16. sbit SDA=P3^4;                             //OLED12832            //模擬I2C數(shù)據(jù)傳送位SDA        
  17. sbit SCL=P3^3;                                  //模擬I2C時鐘控制位SCL
  18. sbit bg=P3^2;    //控制OLED打開與關(guān)閉;                             
  19. //***按鍵功能****//
  20. ////***K1停止時間顯示****//
  21. ////***K2選擇修改位置****//
  22. ////***K3進行加1的修改****//
  23. ////***K4將修改寫入ds3231,同時啟動時間顯示****//
  24.         
  25.    sbit K1=P1^0;
  26.    sbit K2=P1^6;
  27.    sbit K3=P1^7;
  28.    sbit K4=P5^4;


  29. /*開發(fā)板端口定義*/
  30. //sbit LCD_RS=P3^5;
  31. //sbit LCD_RW=P3^6;
  32. //sbit LCD_EN=P3^4;
  33. //sbit LCD_PSB=P2^3;
  34. //sbit DQ=P2^2;                                 //18b20
  35. //sbit SDA=P1^0;                             //ds32321            //模擬I2C數(shù)據(jù)傳送位SDA        
  36. //sbit SCL=P1^1;
  37. //sbit bg=P2^4;                                  //模擬I2C時鐘控制位SCL
  38. ////***按鍵功能****//
  39. //////***K1停止時間顯示****//
  40. //////***K2選擇修改位置****//
  41. //////***K3進行加1的修改****//
  42. //////***K4將修改寫入ds3231,同時啟動時間顯示****//
  43. //sbit K1=P3^0;                          
  44. //sbit K2=P3^1;
  45. //sbit K3=P3^2;
  46. //sbit K4=P3^3;
  47. //定義變量               
  48. uchar numbr[10]="0123456789";                        //字模
  49. uchar i=0;                                                
  50. bit        flag=0,flag1=0;  //串口接收完成標志                                                                                                                        
  51. uchar dis4[]="   ";                                                           //          第四行顯示   自己添加
  52. uchar t[]="  . ℃" ;                                          //18b20
  53. uint  sdata,xiaoshu1,xiaoshu2;                                  //整數(shù)、小數(shù)1位、小數(shù)2位
  54. bit  fg=1;                                   //溫度正負標志
  55. uchar tempL=0,tempH=0;                                                           // 變量         
  56. uchar year,month,date,hour,min,sec,day;                                 //        ds3231
  57. uchar a[]="2021.01.31";
  58. uchar b[]="16時20分00秒";
  59. uchar c[]="周一周二周三周四周五周六周日";
  60. uchar ndate,nmonth,nyear;
  61. uchar buffer[21]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};  //設(shè)置數(shù)據(jù)串口接收緩存數(shù)組 7e開頭  0d結(jié)尾  一共有15個字節(jié)
  62.       /*農(nóng)歷、、、、*/
  63.           struct SPDATE {  //陰歷結(jié)構(gòu)體
  64.    uchar year;  //年
  65.     uchar mon;   //月
  66.     uchar day;   //日
  67. };

  68.           struct SPDATE SpDate;//陰歷
  69. /********陽歷轉(zhuǎn)換陰歷表************************************/
  70. code uchar year_code[597]={
  71.                     0x04,0xAe,0x53,    //1901 0
  72.                     0x0A,0x57,0x48,    //1902 3
  73.                     0x55,0x26,0xBd,    //1903 6
  74.                     0x0d,0x26,0x50,    //1904 9
  75.                     0x0d,0x95,0x44,    //1905 12
  76.                     0x46,0xAA,0xB9,    //1906 15
  77.                     0x05,0x6A,0x4d,    //1907 18
  78.                     0x09,0xAd,0x42,    //1908 21
  79.                     0x24,0xAe,0xB6,    //1909
  80.                     0x04,0xAe,0x4A,    //1910
  81.                     0x6A,0x4d,0xBe,    //1911
  82.                     0x0A,0x4d,0x52,    //1912
  83.                     0x0d,0x25,0x46,    //1913
  84.                     0x5d,0x52,0xBA,    //1914
  85.                     0x0B,0x54,0x4e,    //1915
  86.                     0x0d,0x6A,0x43,    //1916
  87.                     0x29,0x6d,0x37,    //1917
  88.                     0x09,0x5B,0x4B,    //1918
  89.                     0x74,0x9B,0xC1,    //1919
  90.                     0x04,0x97,0x54,    //1920
  91.                     0x0A,0x4B,0x48,    //1921
  92.                     0x5B,0x25,0xBC,    //1922
  93.                     0x06,0xA5,0x50,    //1923
  94.                     0x06,0xd4,0x45,    //1924
  95.                     0x4A,0xdA,0xB8,    //1925
  96.                     0x02,0xB6,0x4d,    //1926
  97.                     0x09,0x57,0x42,    //1927
  98.                     0x24,0x97,0xB7,    //1928
  99.                     0x04,0x97,0x4A,    //1929
  100.                     0x66,0x4B,0x3e,    //1930
  101.                     0x0d,0x4A,0x51,    //1931
  102.                     0x0e,0xA5,0x46,    //1932
  103.                     0x56,0xd4,0xBA,    //1933
  104.                     0x05,0xAd,0x4e,    //1934
  105.                     0x02,0xB6,0x44,    //1935
  106.                     0x39,0x37,0x38,    //1936
  107.                     0x09,0x2e,0x4B,    //1937
  108.                     0x7C,0x96,0xBf,    //1938
  109.                     0x0C,0x95,0x53,    //1939
  110.                     0x0d,0x4A,0x48,    //1940
  111.                     0x6d,0xA5,0x3B,    //1941
  112.                     0x0B,0x55,0x4f,    //1942
  113.                     0x05,0x6A,0x45,    //1943
  114.                     0x4A,0xAd,0xB9,    //1944
  115.                     0x02,0x5d,0x4d,    //1945
  116.                     0x09,0x2d,0x42,    //1946
  117.                     0x2C,0x95,0xB6,    //1947
  118.                     0x0A,0x95,0x4A,    //1948
  119.                     0x7B,0x4A,0xBd,    //1949
  120.                     0x06,0xCA,0x51,    //1950
  121.                     0x0B,0x55,0x46,    //1951
  122.                     0x55,0x5A,0xBB,    //1952
  123.                     0x04,0xdA,0x4e,    //1953
  124.                     0x0A,0x5B,0x43,    //1954
  125.                     0x35,0x2B,0xB8,    //1955
  126.                     0x05,0x2B,0x4C,    //1956
  127.                     0x8A,0x95,0x3f,    //1957
  128.                     0x0e,0x95,0x52,    //1958
  129.                     0x06,0xAA,0x48,    //1959
  130.                     0x7A,0xd5,0x3C,    //1960
  131.                     0x0A,0xB5,0x4f,    //1961
  132.                     0x04,0xB6,0x45,    //1962
  133.                     0x4A,0x57,0x39,    //1963
  134.                     0x0A,0x57,0x4d,    //1964
  135.                     0x05,0x26,0x42,    //1965
  136.                     0x3e,0x93,0x35,    //1966
  137.                     0x0d,0x95,0x49,    //1967
  138.                     0x75,0xAA,0xBe,    //1968
  139.                     0x05,0x6A,0x51,    //1969
  140.                     0x09,0x6d,0x46,    //1970
  141.                     0x54,0xAe,0xBB,    //1971
  142.                     0x04,0xAd,0x4f,    //1972
  143.                     0x0A,0x4d,0x43,    //1973
  144.                     0x4d,0x26,0xB7,    //1974
  145.                     0x0d,0x25,0x4B,    //1975
  146.                     0x8d,0x52,0xBf,    //1976
  147.                     0x0B,0x54,0x52,    //1977
  148.                     0x0B,0x6A,0x47,    //1978
  149.                     0x69,0x6d,0x3C,    //1979
  150.                     0x09,0x5B,0x50,    //1980
  151.                     0x04,0x9B,0x45,    //1981
  152.                     0x4A,0x4B,0xB9,    //1982
  153.                     0x0A,0x4B,0x4d,    //1983
  154.                     0xAB,0x25,0xC2,    //1984
  155.                     0x06,0xA5,0x54,    //1985
  156.                     0x06,0xd4,0x49,    //1986
  157.                     0x6A,0xdA,0x3d,    //1987
  158.                     0x0A,0xB6,0x51,    //1988
  159.                     0x09,0x37,0x46,    //1989
  160.                     0x54,0x97,0xBB,    //1990
  161.                     0x04,0x97,0x4f,    //1991
  162.                     0x06,0x4B,0x44,    //1992
  163.                     0x36,0xA5,0x37,    //1993
  164.                     0x0e,0xA5,0x4A,    //1994
  165.                     0x86,0xB2,0xBf,    //1995
  166.                     0x05,0xAC,0x53,    //1996
  167.                     0x0A,0xB6,0x47,    //1997
  168.                     0x59,0x36,0xBC,    //1998
  169.                     0x09,0x2e,0x50,    //1999 294
  170.                     0x0C,0x96,0x45,    //2000 297
  171.                     0x4d,0x4A,0xB8,    //2001
  172.                     0x0d,0x4A,0x4C,    //2002
  173.                     0x0d,0xA5,0x41,    //2003
  174.                     0x25,0xAA,0xB6,    //2004
  175.                     0x05,0x6A,0x49,    //2005
  176.                     0x7A,0xAd,0xBd,    //2006
  177.                     0x02,0x5d,0x52,    //2007
  178.                     0x09,0x2d,0x47,    //2008
  179.                     0x5C,0x95,0xBA,    //2009
  180.                     0x0A,0x95,0x4e,    //2010
  181.                     0x0B,0x4A,0x43,    //2011
  182.                     0x4B,0x55,0x37,    //2012
  183.                     0x0A,0xd5,0x4A,    //2013
  184.                     0x95,0x5A,0xBf,    //2014
  185.                     0x04,0xBA,0x53,    //2015
  186.                     0x0A,0x5B,0x48,    //2016
  187.                     0x65,0x2B,0xBC,    //2017
  188.                     0x05,0x2B,0x50,    //2018
  189.                     0x0A,0x93,0x45,    //2019
  190.                     0x47,0x4A,0xB9,    //2020
  191.                     0x06,0xAA,0x4C,    //2021
  192.                     0x0A,0xd5,0x41,    //2022
  193.                     0x24,0xdA,0xB6,    //2023
  194.                     0x04,0xB6,0x4A,    //2024
  195.                     0x69,0x57,0x3d,    //2025
  196.                     0x0A,0x4e,0x51,    //2026
  197.                     0x0d,0x26,0x46,    //2027
  198.                     0x5e,0x93,0x3A,    //2028
  199.                     0x0d,0x53,0x4d,    //2029
  200.                     0x05,0xAA,0x43,    //2030
  201.                     0x36,0xB5,0x37,    //2031
  202.                     0x09,0x6d,0x4B,    //2032
  203.                     0xB4,0xAe,0xBf,    //2033
  204.                     0x04,0xAd,0x53,    //2034
  205.                     0x0A,0x4d,0x48,    //2035
  206.                     0x6d,0x25,0xBC,    //2036
  207.                     0x0d,0x25,0x4f,    //2037
  208.                     0x0d,0x52,0x44,    //2038
  209.                     0x5d,0xAA,0x38,    //2039
  210.                     0x0B,0x5A,0x4C,    //2040
  211.                     0x05,0x6d,0x41,    //2041
  212.                     0x24,0xAd,0xB6,    //2042
  213.                     0x04,0x9B,0x4A,    //2043
  214.                     0x7A,0x4B,0xBe,    //2044
  215.                     0x0A,0x4B,0x51,    //2045
  216.                     0x0A,0xA5,0x46,    //2046
  217.                     0x5B,0x52,0xBA,    //2047
  218.                     0x06,0xd2,0x4e,    //2048
  219.                     0x0A,0xdA,0x42,    //2049
  220.                     0x35,0x5B,0x37,    //2050
  221.                     0x09,0x37,0x4B,    //2051
  222.                     0x84,0x97,0xC1,    //2052
  223.                     0x04,0x97,0x53,    //2053
  224.                     0x06,0x4B,0x48,    //2054
  225.                     0x66,0xA5,0x3C,    //2055
  226.                     0x0e,0xA5,0x4f,    //2056
  227.                     0x06,0xB2,0x44,    //2057
  228.                     0x4A,0xB6,0x38,    //2058
  229.                     0x0A,0xAe,0x4C,    //2059
  230.                     0x09,0x2e,0x42,    //2060
  231.                     0x3C,0x97,0x35,    //2061
  232.                     0x0C,0x96,0x49,    //2062
  233.                     0x7d,0x4A,0xBd,    //2063
  234.                     0x0d,0x4A,0x51,    //2064
  235.                     0x0d,0xA5,0x45,    //2065
  236.                     0x55,0xAA,0xBA,    //2066
  237.                     0x05,0x6A,0x4e,    //2067
  238.                     0x0A,0x6d,0x43,    //2068
  239.                     0x45,0x2e,0xB7,    //2069
  240.                     0x05,0x2d,0x4B,    //2070
  241.                     0x8A,0x95,0xBf,    //2071
  242.                     0x0A,0x95,0x53,    //2072
  243.                     0x0B,0x4A,0x47,    //2073
  244.                     0x6B,0x55,0x3B,    //2074
  245.                     0x0A,0xd5,0x4f,    //2075
  246.                     0x05,0x5A,0x45,    //2076
  247.                     0x4A,0x5d,0x38,    //2077
  248.                     0x0A,0x5B,0x4C,    //2078
  249.                     0x05,0x2B,0x42,    //2079
  250.                     0x3A,0x93,0xB6,    //2080
  251.                     0x06,0x93,0x49,    //2081
  252.                     0x77,0x29,0xBd,    //2082
  253.                     0x06,0xAA,0x51,    //2083
  254.                     0x0A,0xd5,0x46,    //2084
  255.                     0x54,0xdA,0xBA,    //2085
  256.                     0x04,0xB6,0x4e,    //2086
  257.                     0x0A,0x57,0x43,    //2087
  258.                     0x45,0x27,0x38,    //2088
  259.                     0x0d,0x26,0x4A,    //2089
  260.                     0x8e,0x93,0x3e,    //2090
  261.                     0x0d,0x52,0x52,    //2091
  262.                     0x0d,0xAA,0x47,    //2092
  263.                     0x66,0xB5,0x3B,    //2093
  264.                     0x05,0x6d,0x4f,    //2094
  265.                     0x04,0xAe,0x45,    //2095
  266.                     0x4A,0x4e,0xB9,    //2096
  267.                     0x0A,0x4d,0x4C,    //2097
  268.                     0x0d,0x15,0x41,    //2098
  269.                     0x2d,0x92,0xB5,    //2099
  270. };

  271. ///月份數(shù)據(jù)表
  272. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  273. code uint day_code2[3]={0x111,0x130,0x14e};

  274. /*
  275. 函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)
  276. 調(diào)用函數(shù)示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  277. 如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
  278. c_sun,year_sun,month_sun,day_sun均為BCD數(shù)據(jù),c_sun為世紀標志位,c_sun=0為21世
  279. 紀,c_sun=1為19世紀
  280. 調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
  281. */

  282. bit c_moon;
  283. //子函數(shù),用于讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0
  284. bit get_moon_day(uchar month_p,uint table_addr)
  285. {
  286.         uchar temp10;
  287.     switch (month_p){
  288.         case 1:{temp10=year_code[table_addr]&0x08;
  289.              if (temp10==0)return(0);else return(1);}
  290.         case 2:{temp10=year_code[table_addr]&0x04;
  291.              if (temp10==0)return(0);else return(1);}
  292.         case 3:{temp10=year_code[table_addr]&0x02;
  293.              if (temp10==0)return(0);else return(1);}
  294.         case 4:{temp10=year_code[table_addr]&0x01;
  295.              if (temp10==0)return(0);else return(1);}
  296.         case 5:{temp10=year_code[table_addr+1]&0x80;
  297.              if (temp10==0) return(0);else return(1);}
  298.         case 6:{temp10=year_code[table_addr+1]&0x40;
  299.              if (temp10==0)return(0);else return(1);}
  300.         case 7:{temp10=year_code[table_addr+1]&0x20;
  301.              if (temp10==0)return(0);else return(1);}
  302.         case 8:{temp10=year_code[table_addr+1]&0x10;
  303.              if (temp10==0)return(0);else return(1);}
  304.         case 9:{temp10=year_code[table_addr+1]&0x08;
  305.              if (temp10==0)return(0);else return(1);}
  306.         case 10:{temp10=year_code[table_addr+1]&0x04;
  307.              if (temp10==0)return(0);else return(1);}
  308.         case 11:{temp10=year_code[table_addr+1]&0x02;
  309.              if (temp10==0)return(0);else return(1);}
  310.         case 12:{temp10=year_code[table_addr+1]&0x01;
  311.              if (temp10==0)return(0);else return(1);}
  312.         case 13:{temp10=year_code[table_addr+2]&0x80;
  313.              if (temp10==0)return(0);else return(1);}
  314.                 default:return(2);
  315.     }
  316. }

  317. /*
  318. 函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)
  319. 調(diào)用函數(shù)示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  320. 如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
  321. c_sun,year_sun,month_sun,day_sun均為BCD數(shù)據(jù),c_sun為世紀標志位,c_sun=0為21世
  322. 紀,c_sun=1為19世紀
  323. 調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
  324. */

  325. void Conversion(bit c,uchar year,uchar month,uchar day)
  326. {                         //c=0 為21世紀,c=1 為19世紀 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
  327.     uchar temp1,temp2,temp3,month_p;
  328.     uint temp4,table_addr;
  329.     bit flag2,flag_y;
  330.     temp1=year/16;   //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進制
  331.     temp2=year%16;
  332.     year=temp1*10+temp2;
  333.         //year=temp1*16+temp2;
  334.     temp1=month/16;
  335.     temp2=month%16;
  336.     month=temp1*10+temp2;
  337.         //month=temp1*16+temp2;
  338.     temp1=day/16;
  339.     temp2=day%16;
  340.     day=temp1*10+temp2;
  341.         //day=temp1*16+temp2;
  342.     //定位數(shù)據(jù)表地址
  343.     if(c==0){                  
  344.         table_addr=(year+0x64-1)*0x3;
  345.     }
  346.     else {
  347.         table_addr=(year-1)*0x3;
  348.     }
  349.     //定位數(shù)據(jù)表地址完成
  350.     //取當年春節(jié)所在的公歷月份
  351.     temp1=year_code[table_addr+2]&0x60;
  352.     temp1=_cror_(temp1,5);
  353.     //取當年春節(jié)所在的公歷月份完成
  354.     //取當年春節(jié)所在的公歷日
  355.     temp2=year_code[table_addr+2]&0x1f;
  356.     //取當年春節(jié)所在的公歷日完成
  357.     // 計算當年春年離當年元旦的天數(shù),春節(jié)只會在公歷1月或2月
  358.     if(temp1==0x1){  
  359.         temp3=temp2-1;  
  360.     }  
  361.     else{
  362.         temp3=temp2+0x1f-1;        
  363.     }
  364.     // 計算當年春年離當年元旦的天數(shù)完成
  365.     //計算公歷日離當年元旦的天數(shù),為了減少運算,用了兩個表
  366.     //day_code1[9],day_code2[3]
  367.     //如果公歷月在九月或前,天數(shù)會少于0xff,用表day_code1[9],
  368.     //在九月后,天數(shù)大于0xff,用表day_code2[3]
  369.     //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
  370.     //如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為day_code2[11-10]+10-1
  371.     if (month<10){
  372.         temp4=day_code1[month-1]+day-1;
  373.     }
  374.     else{
  375.         temp4=day_code2[month-10]+day-1;
  376.     }
  377.     if ((month>0x2)&&(year%0x4==0)){  //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
  378.         temp4+=1;
  379.     }
  380.     //計算公歷日離當年元旦的天數(shù)完成
  381.     //判斷公歷日在春節(jié)前還是春節(jié)后
  382.     if (temp4>=temp3){ //公歷日在春節(jié)后或就是春節(jié)當日使用下面代碼進行運算
  383.         temp4-=temp3;
  384.         month=0x1;
  385.         month_p=0x1;  //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當日month_p指向首月
  386.         flag2=get_moon_day(month_p,table_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
  387.         flag_y=0;
  388.         if(flag2==0)temp1=0x1d; //小月29天
  389.         else temp1=0x1e; //大小30天
  390.         temp2=year_code[table_addr]&0xf0;
  391.         temp2=_cror_(temp2,4);  //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無閏月
  392.         while(temp4>=temp1){
  393.             temp4-=temp1;
  394.             month_p+=1;
  395.             if(month==temp2){
  396.             flag_y=~flag_y;
  397.             if(flag_y==0)month+=1;
  398.             }
  399.             else month+=1;
  400.             flag2=get_moon_day(month_p,table_addr);
  401.             if(flag2==0)temp1=0x1d;
  402.             else temp1=0x1e;
  403.         }
  404.         day=temp4+1;
  405.     }
  406.     else{  //公歷日在春節(jié)前使用下面代碼進行運算
  407.         temp3-=temp4;
  408.         if (year==0x0){year=0x63;c=1;}
  409.         else year-=1;
  410.         table_addr-=0x3;
  411.         month=0xc;
  412.         temp2=year_code[table_addr]&0xf0;
  413.         temp2=_cror_(temp2,4);
  414.         if (temp2==0)
  415.                         month_p=0xc;
  416.         else
  417.                         month_p=0xd; //

  418.                 //month_p為月份指向,如果當年有閏月,一年有十三個月,月指向13,無閏月指向12

  419.         flag_y=0;
  420.         flag2=get_moon_day(month_p,table_addr);
  421.         if(flag2==0)temp1=0x1d;
  422.         else temp1=0x1e;
  423.         while(temp3>temp1){
  424.             temp3-=temp1;
  425.             month_p-=1;
  426.             if(flag_y==0)month-=1;
  427.             if(month==temp2)flag_y=~flag_y;
  428.             flag2=get_moon_day(month_p,table_addr);
  429.             if(flag2==0)temp1=0x1d;
  430.             else temp1=0x1e;
  431.          }
  432.         day=temp1-temp3+1;
  433.     }
  434. //    c_moon=c;               
  435.               //HEX->BCD ,運算結(jié)束后,把數(shù)據(jù)轉(zhuǎn)換為BCD數(shù)據(jù)
  436.     temp1=year/10;
  437.     temp1=_crol_(temp1,4);
  438.     temp2=year%10;
  439.     SpDate.year=temp1|temp2;
  440.     temp1=month/10;
  441.     temp1=_crol_(temp1,4);
  442.     temp2=month%10;
  443.     SpDate.mon=temp1|temp2;
  444.     temp1=day/10;
  445.     temp1=_crol_(temp1,4);
  446.     temp2=day%10;
  447.     SpDate.day=temp1|temp2;
  448. }
  449.          
  450.                                     ///函數(shù)
  451. //******************延時子程序 *******************************

  452. //這個延時程序的具體延時時間是time=i*8+10,適用于小于2ms的延時

  453. //************************************************************
  454. void delay(unsigned int i)
  455. {
  456. for(i;i>0;i--);
  457. }
  458. //***********************************************************
  459. //                     延時子程序
  460. //************************************************************
  461. void delay1ms(uint j)
  462. {
  463. while(j!=0)
  464. {uchar i;
  465. for(i=124;i>0;i--);  //延時124*8+10=1002us
  466. j--;
  467. }
  468. }
  469. void Delayxms(uint ms)                        //@33.1776MHz   1ms
  470. {
  471.         unsigned char i, j;

  472.     while(ms--)
  473.            {
  474.                 unsigned char i, j;

  475.         _nop_();
  476.         _nop_();
  477.         i = 44;
  478.         j = 19;
  479.         do
  480.         {
  481.                 while (--j);
  482.         } while (--i);
  483.          }
  484. }



  485. /***************************************************************/

  486. /**********************************18b20************************************************/
  487. /**********************************18b20************************************************/


  488. void Init_DS18B20(void)                                                                                 //初始化
  489. {
  490. uchar x=0;
  491.          EA = 0;
  492. DQ=1; //DQ先置高
  493. delay(80); //稍延時
  494. DQ=0; //發(fā)送復位脈沖
  495. delay(2000); //延時(>480us)
  496. DQ=1; //拉高數(shù)據(jù)線
  497. delay(100); //等待(15~60us)
  498. x=DQ; //用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1
  499. delay(400);
  500.          EA = 1;
  501. }

  502. //**********讀一個字節(jié)************//

  503. ReadOneChar(void)  //主機數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號
  504. {
  505. unsigned char i=0; //每個讀周期最短的持續(xù)時間為60us,各個讀周期之間必須有1us以上的高電平恢復期
  506. unsigned char dat=0;
  507.         EA = 0;
  508. for (i=8;i>0;i--) //一個字節(jié)有8位
  509. {
  510. DQ=1;
  511. delay(30);
  512. DQ=0;
  513. dat>>=1;
  514. delay(3); //涉及單片機頻率
  515. DQ=1;
  516.   delay(1);         //讀取時間沒那么快,經(jīng)驗,33mhz的1t單片機都需要調(diào)整時序
  517. if(DQ)
  518. dat|=0x80;
  519. delay(120);
  520. }         EA = 1;
  521. return(dat);
  522. }
  523. //*********************** **寫一個字節(jié)**************************//

  524. void WriteOneChar(unsigned char dat)
  525. {
  526.   unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
  527.           EA = 0;
  528.   for(i=8;i>0;i--) //在15~60us之間對數(shù)據(jù)線進行采樣,如果是高電平就寫1,低寫0發(fā)生。
  529.   {
  530.    DQ=0; //在開始另一個寫周期前必須有1us以上的高電平恢復期。
  531.     delay(3);//涉及單片機頻率
  532.    DQ=dat&0x01;
  533.    delay(190);
  534.    DQ=1;
  535.    dat>>=1;         delay(1);
  536.   }         EA = 1;
  537.   delay(40);
  538. }

  539. void ReadTemperature(void)                                                                          //讀溫度值(低位放tempL;高位放tempH;)//
  540.         {
  541.          Init_DS18B20(); //初始化
  542.          WriteOneChar(0xcc); //跳過讀序列號的操作
  543.          WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
  544.          delay(2000); //轉(zhuǎn)換需要一點時間,延時
  545.          Init_DS18B20(); //初始化
  546.          WriteOneChar(0xcc); //跳過讀序列號的操作
  547.          WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
  548.          tempL=ReadOneChar(); //讀出溫度的低位LSB
  549.          tempH=ReadOneChar(); //讀出溫度的高位MSB

  550.                 if(tempH>0x7f)      //最高位為1時溫度是負
  551.                 {
  552.                  tempL=~tempL;         //補碼轉(zhuǎn)換,取反加一
  553.                  tempH=~tempH+1;      
  554.                  fg=0;      //讀取溫度為負時fg=0
  555.        }
  556.                 sdata = tempL/16+tempH*16;      //整數(shù)部分
  557.                 xiaoshu1 = (tempL&0x0f)*10/16; //小數(shù)第一位
  558.                 xiaoshu2 = (tempL&0x0f)*100/16%10;//小數(shù)第二位
  559.         
  560.         }
  561. /*****************************************ds3231********************************************/

  562. #define ADDRTW          0xD0    //器件寫地址
  563. #define ADDRTD          0xD1 //器件讀地址
  564. #define DS3231_SEC      0x00    //秒
  565. #define DS3231_MIN      0x01    //分
  566. #define DS3231_HOUR     0x02    //時
  567. #define DS3231_DAY      0x03    //星期
  568. #define DS3231_DATE     0x04    //日
  569. #define DS3231_MONTH    0x05    //月
  570. #define DS3231_YEAR     0x06    //年
  571. //鬧鈴1            
  572. #define DS3231_Al1SEC   0x07    //秒
  573. #define DS3231_AL1MIN   0x08    //分
  574. #define DS3231_AL1HOUR  0x09    //時
  575. #define DS3231_AL1DAY   0x0A    //星期/日
  576. //鬧鈴2
  577. #define DS3231_AL2MIN   0x0b    //分
  578. #define DS3231_AL2HOUR  0x0c    //時
  579. #define DS3231_AL2DAY   0x0d    //星期/日
  580. #define DS3231_CONTROL  0x0e    //控制寄存器
  581. #define DS3231_STATUS   0x0f    //狀態(tài)寄存器
  582. bit ack;


  583. uchar BCD2HEX(uchar val)           //BCD轉(zhuǎn)換為Byte         
  584. {        uchar i;
  585.     i= val&0x0f;
  586.     val >>= 4;
  587.     val &= 0x0f;
  588.     val *= 10;
  589.     i += val;

  590.     return i;
  591. }


  592. uchar HEX2BCD(uchar val)//B碼轉(zhuǎn)換為BCD碼
  593.         {
  594.         uchar i,j,k;
  595.         
  596.           i=val/10;
  597.           j=val%10;
  598.           k=j+(i<<4);
  599.           return k;
  600.         }

  601. void Start()        
  602. {
  603.     TSDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號
  604.     delay(1);
  605.     TSCL=1;
  606.     delay(5);             //起始條件建立時間大于4.7us,延時
  607.            TSDA=0;                  //發(fā)送起始信號
  608.     delay(5);             // 起始條件鎖定時間大于4μs
  609.     TSCL=0;                  //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
  610.     delay(2);
  611. }
  612. void Stop()
  613. {
  614.     TSDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號
  615.     delay(1);             //發(fā)送結(jié)束條件的時鐘信號
  616.     TSCL=1;                  //結(jié)束條件建立時間大于4us
  617.     delay(5);

  618.     TSDA=1;                  //發(fā)送I2C總線結(jié)束信號
  619.     delay(4);
  620. }
  621. /********************************************************/
  622. /*******************************************************************
  623.                   字節(jié)數(shù)據(jù)發(fā)送函數(shù)               
  624. 函數(shù)原型:     void   SendByte(uchar Dat);
  625. 功能:      將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  626.            此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
  627.            ack=1        發(fā)送數(shù)據(jù)正常,
  628.            ack=0        被控器無應(yīng)答或損壞。
  629. ********************************************************************/
  630. void SendByte(uchar Dat)
  631. {
  632. uchar BitCnt;

  633.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長度為8位
  634.     {
  635.         if((Dat<<BitCnt)&0x80)
  636.             TSDA=1;                          //判斷發(fā)送位
  637.         else
  638.             TSDA=0;               
  639.           delay(1);
  640.           TSCL=1;                            //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
  641.           delay(5);                       //保證時鐘高電平周期大于4μs   
  642.           TSCL=0;
  643.     }

  644.     delay(2);
  645.     TSDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應(yīng)答位
  646.     delay(2);  
  647.     TSCL=1;
  648.     delay(3);
  649.     if(TSDA==1)
  650.         ack=0;   
  651.     else
  652.         ack=1;                              //判斷是否接收到應(yīng)答信號
  653.     TSCL=0;
  654.     delay(2);
  655. }

  656. uchar RcvByte()                                                                        // 功能:      用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機。
  657. {
  658. uchar retc;
  659. uchar BitCnt;

  660.    retc=0;
  661.    TSDA=1;                           //置數(shù)據(jù)線為輸入方式
  662.    for(BitCnt=0;BitCnt<8;BitCnt++)
  663.    {
  664.         delay(1);  
  665.         TSCL=0;                      //置時鐘線為低,準備接收數(shù)據(jù)位

  666.         delay(5);                 //時鐘低電平周期大于4.7μs

  667.         TSCL=1;                      //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  668.         delay(3);
  669.         retc=retc<<1;
  670.         if(TSDA==1)
  671.             retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  672.         delay(2);
  673.    }
  674.    TSCL=0;
  675.    delay(2);
  676.    return(retc);
  677. }

  678. void I2CACK(bit a)                         // 功能:       主控器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  679. {

  680.     if(a==0)
  681.         TSDA=0;              //在此發(fā)出應(yīng)答或非應(yīng)答信號
  682.     else
  683.         TSDA=1;
  684.     delay(3);     
  685.     TSCL=1;

  686.     delay(5);             //時鐘低電平周期大于4μs

  687.     TSCL=0;                  //清時鐘線,鉗住I2C總線以便繼續(xù)接收
  688.     delay(2);   
  689. }



  690. uchar I2CRead()                                                                         /************從DS3231當前地址讀一個字節(jié)************/
  691. {
  692. uchar read_data;
  693.         Start();
  694.     SendByte(ADDRTD);                                       
  695.     if(ack==0)
  696.     {
  697.   return(0);
  698.     }
  699.     read_data = RcvByte();
  700.     I2CACK(1);
  701.     Stop();
  702.     return read_data;
  703. }


  704. uchar I2CReadAdd(uchar addr)                                                 /************從DS3231指定地址讀一個字節(jié)************/
  705.         {
  706.             Start();
  707.             SendByte(ADDRTW);                        
  708.             if(ack==0)
  709.             {        
  710.           return(0);
  711.             }
  712.             SendByte(addr);
  713.             if(ack==0)
  714.             {         
  715.           return(0);
  716.             }
  717.             return(I2CRead());
  718.         }
  719. void Readtime()                                                                                 /*********************讀取時間**********************/
  720.         {
  721.          uchar temp;
  722.          temp=I2CReadAdd(DS3231_SEC);//秒
  723.          sec=BCD2HEX(temp);
  724.         
  725.          temp=I2CReadAdd(DS3231_MIN);//分
  726.          min=BCD2HEX(temp);
  727.          
  728.          temp=I2CReadAdd(DS3231_HOUR);  //時                  
  729.          hour=BCD2HEX(temp);
  730.          
  731.          temp=I2CReadAdd(DS3231_DATE);  //日
  732.          date=BCD2HEX(temp);
  733.          
  734.          temp=I2CReadAdd(DS3231_MONTH); //月
  735.          month=BCD2HEX(temp);
  736.          
  737.          temp=I2CReadAdd(DS3231_YEAR);  //年
  738.          year=BCD2HEX(temp);
  739.          temp=I2CReadAdd(DS3231_DAY);
  740.          day=BCD2HEX(temp);//星期
  741.          }


  742.          void Readtimenongli()                                                                                 /*********************讀取時間為了陽歷轉(zhuǎn)農(nóng)歷**********************/
  743.         {
  744.          
  745.          
  746.          
  747.          ndate=I2CReadAdd(DS3231_DATE);  //日
  748.         // date=BCD2HEX(temp);
  749.          
  750.         nmonth=I2CReadAdd(DS3231_MONTH); //月
  751.          //month=BCD2HEX(temp);
  752.          
  753.         nyear=I2CReadAdd(DS3231_YEAR);  //年
  754.         
  755.          
  756.          }



  757. void InitDS3231()                                                                                                 //ds3231初始化
  758.         {TSCL=1;
  759.          delay(5);
  760.          TSDA=1;
  761.          delay(5);

  762.         }
  763. void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec)                                //時分秒數(shù)組賦值        
  764.         {        b[0]=(hour / 10)+'0';        // 時十位
  765.             b[1]=numbr[Dhour % 10];        // 時個位
  766.             b[4]=numbr[Dmin / 10];         // 分十位
  767.             b[5]=numbr[Dmin % 10];         // 分個位
  768.             b[8]=numbr[Dsec / 10];         // 秒十位
  769.             b[9]=numbr[Dsec % 10];         // 秒個位
  770.         }
  771. void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday)                        //年月天數(shù)組賦值         
  772.         {        a[2]=numbr[Dyear / 10];        // 年十位
  773.             a[3]=numbr[Dyear % 10];        // 年個位
  774.             a[5]=numbr[Dmonth / 10];       // 月十位
  775.             a[6]=numbr[Dmonth % 10];       // 月個位
  776.             a[8]=numbr[Dday / 10];         // 天十位
  777.             a[9]=numbr[Dday % 10];         // 天個位                                 
  778.         }


  779. void Start_I2C()
  780. {
  781.     TSDA=1;                  //發(fā)送起始條件的數(shù)據(jù)信號
  782.     delay(1);
  783.     TSCL=1;
  784.     delay(5);             //起始條件建立時間大于4.7us,延時

  785.     TSDA=0;                  //發(fā)送起始信號
  786.     delay(5);             // 起始條件鎖定時間大于4μs

  787.     TSCL=0;                  //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
  788.     delay(2);
  789. }

  790. void Stop_I2C()
  791. {
  792.     TSDA=0;                  //發(fā)送結(jié)束條件的數(shù)據(jù)信號
  793.     delay(1);             //發(fā)送結(jié)束條件的時鐘信號
  794.     TSCL=1;                  //結(jié)束條件建立時間大于4us
  795.     delay(5);

  796.     TSDA=1;                  //發(fā)送I2C總線結(jié)束信號
  797.     delay(4);
  798. }

  799. uchar write_byte(uchar addr, uchar write_data)
  800. {
  801.     Start_I2C();
  802.     SendByte(ADDRTW);                //////*******************************************************************///////////
  803.     if (ack == 0)
  804.         return 0;

  805.     SendByte(addr);   
  806.     if (ack == 0)
  807.         return 0;

  808.     SendByte(write_data);
  809.     if (ack == 0)
  810.         return 0;

  811.     Stop_I2C();
  812.      delay1ms(10);      
  813.     return 1;
  814. }

  815. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar w)          //函數(shù)功能:修改時間、日期和星期
  816. {          uchar temp=0;

  817.     temp=HEX2BCD(yea);
  818.     write_byte(DS3231_YEAR,temp);   //修改年

  819.     temp=HEX2BCD(mon);
  820.     write_byte(DS3231_MONTH,temp);  //修改月

  821.     temp=HEX2BCD(da);                                                                           /////////////////////
  822.     write_byte(DS3231_DATE,temp);    //修改日

  823.     temp=HEX2BCD(hou);
  824.     write_byte(DS3231_HOUR,temp);   //修改時

  825.     temp=HEX2BCD(min);
  826.     write_byte(DS3231_MIN,temp); //修改分

  827.     temp=HEX2BCD(sec);
  828.     write_byte(DS3231_SEC,temp); //修改秒
  829.          temp=HEX2BCD(w);
  830.     write_byte(DS3231_DAY,temp);  //修改星期

  831. }

  832. void nongli()
  833.     {  
  834.         
  835.           uchar SetDatyue,SetDat;

  836.           Readtimenongli();
  837.          Conversion(0,nyear,nmonth,ndate);
  838.           SetDatyue = BCD2HEX(SpDate.mon);
  839. //        if (SetDatyue==1){LCD1602_Dis_Str(3, 0, "正");}
  840. //        if (SetDatyue==2){LCD1602_Dis_Str(3, 0, "二");}
  841. //        if (SetDatyue==3){LCD1602_Dis_Str(3, 0, "三");}
  842. //        if (SetDatyue==4){LCD1602_Dis_Str(3, 0, "四");}
  843. //        if (SetDatyue==5){LCD1602_Dis_Str(3, 0, "五");}
  844. //        if (SetDatyue==6){LCD1602_Dis_Str(3, 0, "六");}
  845. //        if (SetDatyue==7){LCD1602_Dis_Str(3, 0, "七");}
  846. //        if (SetDatyue==8){LCD1602_Dis_Str(3, 0, "八");}  
  847. //        if (SetDatyue==9){LCD1602_Dis_Str(3, 0, "九");}
  848. //        if (SetDatyue==10){LCD1602_Dis_Str(3, 0, "十");}
  849. //        if (SetDatyue==11){LCD1602_Dis_Str(3, 0, "冬");}
  850. //        if (SetDatyue==12){LCD1602_Dis_Str(3, 0, "臘");}
  851. //        LCD1602_Dis_Str(3, 1, "月");
  852. //                  
  853.          SetDat = BCD2HEX(SpDate.day);
  854. //    if (SetDat==1){LCD1602_Dis_Str(3, 2, "初一");}
  855. //        if (SetDat==2){LCD1602_Dis_Str(3, 2, "初二");}
  856. //        if (SetDat==3){LCD1602_Dis_Str(3, 2, "初三");}
  857. //        if (SetDat==4){LCD1602_Dis_Str(3, 2, "初四");}
  858. //        if (SetDat==5){LCD1602_Dis_Str(3, 2, "初五");}
  859. //        if (SetDat==6){LCD1602_Dis_Str(3, 2, "初六");}
  860. //        if (SetDat==7){LCD1602_Dis_Str(3, 2, "初七");}
  861. //        if (SetDat==8){LCD1602_Dis_Str(3, 2, "初八");}  
  862. //        if (SetDat==9){LCD1602_Dis_Str(3, 2, "初九");}
  863. //        if (SetDat==10){LCD1602_Dis_Str(3, 2, "初十");}
  864. //        if (SetDat==11){LCD1602_Dis_Str(3, 2, "十一");}
  865. //        if (SetDat==12){LCD1602_Dis_Str(3, 2, "十二");}
  866. //        if (SetDat==13){LCD1602_Dis_Str(3, 2, "十三");}
  867. //        if (SetDat==14){LCD1602_Dis_Str(3, 2, "十四");}
  868. //        if (SetDat==15){LCD1602_Dis_Str(3, 2, "十五");}
  869. //        if (SetDat==16){LCD1602_Dis_Str(3, 2, "十六");}
  870. //        if (SetDat==17){LCD1602_Dis_Str(3, 2, "十七");}
  871. //        if (SetDat==18){LCD1602_Dis_Str(3, 2, "十八");}
  872. //        if (SetDat==19){LCD1602_Dis_Str(3, 2, "十九");}
  873. //        if (SetDat==20){LCD1602_Dis_Str(3, 2, "二十");}
  874. //        if (SetDat==21){LCD1602_Dis_Str(3, 2, "廿一");}
  875. //        if (SetDat==22){LCD1602_Dis_Str(3, 2, "廿二");}
  876. //        if (SetDat==23){LCD1602_Dis_Str(3, 2, "廿三");}
  877. //        if (SetDat==24){LCD1602_Dis_Str(3, 2, "廿四");}  
  878. //        if (SetDat==25){LCD1602_Dis_Str(3, 2, "廿五");}
  879. //        if (SetDat==26){LCD1602_Dis_Str(3, 2, "廿六");}
  880. //        if (SetDat==27){LCD1602_Dis_Str(3, 2, "廿七");}
  881. //        if (SetDat==28){LCD1602_Dis_Str(3, 2, "廿八");}
  882. //        if (SetDat==29){LCD1602_Dis_Str(3, 2, "廿九");}
  883. //        if (SetDat==30){LCD1602_Dis_Str(3, 2, "三十");}
  884.                                     //顯示到液晶上
  885. }
  886.         
  887.         
  888.         
  889.         
  890.         
  891.         
  892.                         
  893.                                          
  894.                                           



  895. void xianshi(void)
  896.      {
  897.                      OLED_ShowNum(48,0,hour,2,32); //顯示時               
  898.            if(sec%2==1) {OLED_ShowString(80,0,":",32);}
  899.         if(sec%2==0) {OLED_ShowString(80,0," ",32);}
  900.                  OLED_ShowNum(96,0,min/10,1,32);         //顯示分
  901.                                  OLED_ShowNum(112,0,min%10,1,32);         //顯示分   // OLED_ShowNum(97,0,sec,2,32);

  902.                                         /*顯示星期*/                        
  903.                      OLED_ShowString(0,2,"W",16);
  904.                     OLED_ShowNum(10,2,day,1,16);
  905.                         OLED_ShowString(0,0,"D",16);
  906.                     OLED_ShowNum(8,0,month,2,16);         //顯示月
  907.                            OLED_ShowString(24,0,".",16);
  908.                         OLED_ShowNum(32,0,date/10,1,16);
  909.                     OLED_ShowNum(40,0,date%10,1,16); //顯示日                                
  910.                                 ReadTemperature();                        //顯示溫度               
  911.                         OLED_ShowString(22,2,"T",16);
  912.                     OLED_ShowNum(32,2,sdata,2,16);                 
  913.                         }


  914. void shuaxin(void)
  915.         {               
  916.          
  917.                      OLED_ShowNum(48,0,hour,2,32); //顯示時               
  918.            if(sec%2==1) {OLED_ShowString(80,0,":",32);}
  919.         if(sec%2==0) {OLED_ShowString(80,0," ",32);}
  920.                  OLED_ShowNum(96,0,min/10,1,32);         //顯示分
  921.                                  OLED_ShowNum(112,0,min%10,1,32);         //顯示分   // OLED_ShowNum(97,0,sec,2,32);

  922.                                         /*顯示星期*/                        
  923.                      OLED_ShowString(0,2,"W",16);
  924.                     OLED_ShowNum(10,2,day,1,16);
  925.                         OLED_ShowString(0,0,"D",16);
  926.                     OLED_ShowNum(8,0,month,2,16);         //顯示月
  927.                            OLED_ShowString(24,0,".",16);
  928.                         OLED_ShowNum(32,0,date/10,1,16);
  929.                     OLED_ShowNum(40,0,date%10,1,16); //顯示日                                
  930.                                 ReadTemperature();                        //顯示溫度               
  931.                         OLED_ShowString(22,2,"T",16);
  932.                     OLED_ShowNum(32,2,sdata,2,16);         
  933.         }

  934.   void xiugai()           //設(shè)置時間
  935. {

  936.           if(flag==1&&flag1==1)        

  937.       {  ES=0;
  938.                   flag=0;
  939.                 flag1=0;
  940.                   
  941.            year=(buffer[1]-0x30)*10+(buffer[2]-0x30);
  942.            month=(buffer[3]-0x30)*10+(buffer[4]-0x30);
  943.            date=(buffer[5]-0x30)*10+(buffer[6]-0x30);
  944.            hour=(buffer[7]-0x30)*10+(buffer[8]-0x30);
  945.            min=(buffer[9]-0x30)*10+(buffer[10]-0x30);
  946.            sec=(buffer[11]-0x30)*10+(buffer[12]-0x30);
  947.            day=(buffer[13]-0x30);
  948.            ModifyTime(year,month,date,hour,min,sec,day);
  949.                   ES=1;
  950.            flag=0;
  951.            flag1=0;
  952.            }
  953.             
  954.           else
  955.            {           
  956.               //   Get_Current1();
  957.                                Readtime();
  958. //                         nongli();
  959.                      xianshi();
  960.                          shuaxin();
  961.                          flag=0;
  962.                  flag1=0;
  963.            }
  964. }

  965.   /*串口 函數(shù)*/

  966. void UartInit(void)                //9600bps@33.1776MHz
  967. {
  968.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  969.         AUXR |= 0x01;                //串口1選擇定時器2為波特率發(fā)生器
  970.         AUXR &= 0xFB;                //定時器時鐘12T模式
  971.         T2L = 0xB8;                        //設(shè)置定時初始值
  972.         T2H = 0xFF;                        //設(shè)置定時初始值
  973.         AUXR |= 0x10;                //定時器2開始計時
  974.                 EA=1;                        //打開總中斷
  975.             ES=1;                        //打開接收中斷
  976. }


  977. main()                                          /*主程序*/
  978. {         


  979.         bg=0;
  980.                            P3M1 = 0x00;
  981.             P3M0 = 0x00;
  982.                          P1M1 = 0x00;
  983.             P1M0 = 0x00;
  984.                          UartInit();
  985.                 InitDS3231();
  986.                  OLED_Init();//初始化OLED
  987.              OLED_ColorTurn(0);//0正常顯示,1 反色顯示
  988.          OLED_DisplayTurn(0);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示
  989.                OLED_Clear();
  990.                 // OLED_ShowString(0,0,"12:12:12",32);
  991.           //         ModifyTime(23,12,7,12,34,56,4)        ;
  992.          while(1)
  993.          {

  994.         Delayxms(200);
  995.     xiugai();        
  996.     Delayxms(200);
  997. }  }
  998. void Uart() interrupt 4 using 1        //串口1中斷處理
  999. {         
  1000.           buffer[i]=SBUF;

  1001.         if(buffer[i]==0x7E)          //接收的報文以#開頭(即0x7E)
  1002.                 {          flag1=1; //進入設(shè)置界面
  1003.                         i=0;
  1004.                         buffer[i]=SBUF;           //開始接收
  1005.                 }
  1006.         RI=0;                  
  1007.         i++;
  1008.         if(buffer[i-1]==0x21) //接收的報文以!結(jié)尾(即0x21)
  1009.         {
  1010.                 i=0;
  1011.                 flag=1;
  1012.         
  1013.     }
  1014. }
復制代碼
json文件: json文件.7z (89.92 KB, 下載次數(shù): 30)
仿真: 無
代碼: 程序12832液晶 DS3231程序20231208已實現(xiàn)時鐘顯示 串口同步時間.zip (339.25 KB, 下載次數(shù): 48)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:16255 發(fā)表于 2023-12-14 08:36 | 只看該作者
12832對我來說還是小了點。我要顯示更多內(nèi)容。

回復

使用道具 舉報

板凳
ID:672765 發(fā)表于 2024-1-17 13:32 | 只看該作者
mengsiu 發(fā)表于 2023-12-14 08:36
12832對我來說還是小了點。我要顯示更多內(nèi)容。

那我新做的串口屏比較適合你,

回復

使用道具 舉報

地板
ID:275111 發(fā)表于 2024-3-30 20:44 | 只看該作者
這個真的很不錯 留言支持。
回復

使用道具 舉報

5#
ID:267349 發(fā)表于 2024-4-19 20:09 | 只看該作者
大佬
新制作的這個能否發(fā)一下資料
回復

使用道具 舉報

6#
ID:1074827 發(fā)表于 2024-5-12 12:17 | 只看該作者
做的不錯,可惜我的LCD屛不支持。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久国 | 手机在线一区二区三区 | 在线免费亚洲视频 | 久在线 | 夜夜骚视频 | 国产精品高潮呻吟久久久久 | av影音资源 | 91精品欧美久久久久久久 | 一区二区三区日 | 日韩精品一区二区三区第95 | jav成人av免费播放 | 欧美黄色一区 | 欧美日韩在线精品 | 成人亚洲精品久久久久软件 | 日韩欧美网 | 免费麻豆视频 | 久久99精品久久久久婷婷 | 日韩精品一区二区三区在线 | 99精品视频免费观看 | 91精品国产一区二区在线观看 | 大陆一级毛片免费视频观看 | 欧美色综合一区二区三区 | 玖玖国产 | 成人精品视频 | 国产精品精品视频一区二区三区 | 日本天天色 | 一级黄片一级毛片 | 人人做人人澡人人爽欧美 | 国产高清在线精品 | 黄色大片视频 | 91在线影院 | 国产日韩欧美91 | 亚洲大片一区 | 久久一| 欧美黑人狂野猛交老妇 | 综合伊人| 欧美成人自拍视频 | 中文字幕三区 | 国产激情一区二区三区 | 2021天天躁夜夜看 | 亚洲一区中文字幕 |