找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1098|回复: 4
打印 上一主题 下一主题
收起左侧

STC8H3K64S2单片机+oled12832+ds3231+usb时间校准,18b20-小巧时钟时钟带温度显示

  [复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
STC8H3K64S2单片机芯片+oled12832+ds3231+usb时间校准,18b20---小巧时钟时钟所有资料在附件,欢迎学习交流!

先看制作出来的实物:
可以插手机充电器,也可以插电脑USB,也可以插tpye-c手机数据线进行供电及时间校准。校准用串口助手。
有温度,时间,日期,星期显示。特点是小巧,可视角度大。亮度高,可以在代码里设置时间关屏幕。
电路原理图:
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数据传送位SDA        
  15. sbit TSCL=P1^1;                                                                           //模拟I2C时钟控制位SCL
  16. sbit SDA=P3^4;                             //OLED12832            //模拟I2C数据传送位SDA        
  17. sbit SCL=P3^3;                                  //模拟I2C时钟控制位SCL
  18. sbit bg=P3^2;    //控制OLED打开与关闭;                             
  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. /*开发板端口定义*/
  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数据传送位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;                                  //整数、小数1位、小数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};  //设置数据串口接收缓存数组 7e开头  0d结尾  一共有15个字节
  62.       /*农历、、、、*/
  63.           struct SPDATE {  //阴历结构体
  64.    uchar year;  //年
  65.     uchar mon;   //月
  66.     uchar day;   //日
  67. };

  68.           struct SPDATE SpDate;//阴历
  69. /********阳历转换阴历表************************************/
  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. ///月份数据表
  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. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  276. 调用函数示例: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数据,c_sun为世纪标志位,c_sun=0为21世
  279. 纪,c_sun=1为19世纪
  280. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  281. */

  282. bit c_moon;
  283. //子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回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. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  319. 调用函数示例: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数据,c_sun为世纪标志位,c_sun=0为21世
  322. 纪,c_sun=1为19世纪
  323. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  324. */

  325. void Conversion(bit c,uchar year,uchar month,uchar day)
  326. {                         //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  327.     uchar temp1,temp2,temp3,month_p;
  328.     uint temp4,table_addr;
  329.     bit flag2,flag_y;
  330.     temp1=year/16;   //BCD->hex 先把数据转换为十六进制
  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.     //定位数据表地址
  343.     if(c==0){                  
  344.         table_addr=(year+0x64-1)*0x3;
  345.     }
  346.     else {
  347.         table_addr=(year-1)*0x3;
  348.     }
  349.     //定位数据表地址完成
  350.     //取当年春节所在的公历月份
  351.     temp1=year_code[table_addr+2]&0x60;
  352.     temp1=_cror_(temp1,5);
  353.     //取当年春节所在的公历月份完成
  354.     //取当年春节所在的公历日
  355.     temp2=year_code[table_addr+2]&0x1f;
  356.     //取当年春节所在的公历日完成
  357.     // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
  358.     if(temp1==0x1){  
  359.         temp3=temp2-1;  
  360.     }  
  361.     else{
  362.         temp3=temp2+0x1f-1;        
  363.     }
  364.     // 计算当年春年离当年元旦的天数完成
  365.     //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  366.     //day_code1[9],day_code2[3]
  367.     //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  368.     //在九月后,天数大于0xff,用表day_code2[3]
  369.     //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  370.     //如输入公历日为11月10日,则公历日离元旦天数为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月为闰月,天数加1
  378.         temp4+=1;
  379.     }
  380.     //计算公历日离当年元旦的天数完成
  381.     //判断公历日在春节前还是春节后
  382.     if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算
  383.         temp4-=temp3;
  384.         month=0x1;
  385.         month_p=0x1;  //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
  386.         flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回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);  //从数据表中取该年的闰月月份,如为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{  //公历日在春节前使用下面代码进行运算
  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 ,运算结束后,把数据转换为BCD数据
  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.                                     ///函数
  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; //发送复位脉冲
  495. delay(2000); //延时(>480us)
  496. DQ=1; //拉高数据线
  497. delay(100); //等待(15~60us)
  498. x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  499. delay(400);
  500.          EA = 1;
  501. }

  502. //**********读一个字节************//

  503. ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
  504. {
  505. unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
  506. unsigned char dat=0;
  507.         EA = 0;
  508. for (i=8;i>0;i--) //一个字节有8位
  509. {
  510. DQ=1;
  511. delay(30);
  512. DQ=0;
  513. dat>>=1;
  514. delay(3); //涉及单片机频率
  515. DQ=1;
  516.   delay(1);         //读取时间没那么快,经验,33mhz的1t单片机都需要调整时序
  517. if(DQ)
  518. dat|=0x80;
  519. delay(120);
  520. }         EA = 1;
  521. return(dat);
  522. }
  523. //*********************** **写一个字节**************************//

  524. void WriteOneChar(unsigned char dat)
  525. {
  526.   unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  527.           EA = 0;
  528.   for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
  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); //启动温度转换
  544.          delay(2000); //转换需要一点时间,延时
  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;         //补码转换,取反加一
  553.                  tempH=~tempH+1;      
  554.                  fg=0;      //读取温度为负时fg=0
  555.        }
  556.                 sdata = tempL/16+tempH*16;      //整数部分
  557.                 xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
  558.                 xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
  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    //状态寄存器
  582. bit ack;


  583. uchar BCD2HEX(uchar val)           //BCD转换为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码转换为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;                  //发送起始条件的数据信号
  604.     delay(1);
  605.     TSCL=1;
  606.     delay(5);             //起始条件建立时间大于4.7us,延时
  607.            TSDA=0;                  //发送起始信号
  608.     delay(5);             // 起始条件锁定时间大于4μs
  609.     TSCL=0;                  //钳住I2C总线,准备发送或接收数据
  610.     delay(2);
  611. }
  612. void Stop()
  613. {
  614.     TSDA=0;                  //发送结束条件的数据信号
  615.     delay(1);             //发送结束条件的时钟信号
  616.     TSCL=1;                  //结束条件建立时间大于4us
  617.     delay(5);

  618.     TSDA=1;                  //发送I2C总线结束信号
  619.     delay(4);
  620. }
  621. /********************************************************/
  622. /*******************************************************************
  623.                   字节数据发送函数               
  624. 函数原型:     void   SendByte(uchar Dat);
  625. 功能:      将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  626.            此状态位进行操作.(不应答或非应答都使ack=0)
  627.            ack=1        发送数据正常,
  628.            ack=0        被控器无应答或损坏。
  629. ********************************************************************/
  630. void SendByte(uchar Dat)
  631. {
  632. uchar BitCnt;

  633.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
  634.     {
  635.         if((Dat<<BitCnt)&0x80)
  636.             TSDA=1;                          //判断发送位
  637.         else
  638.             TSDA=0;               
  639.           delay(1);
  640.           TSCL=1;                            //置时钟线为高,通知被控器开始接收数据位
  641.           delay(5);                       //保证时钟高电平周期大于4μs   
  642.           TSCL=0;
  643.     }

  644.     delay(2);
  645.     TSDA=1;                                  //8位发送完后释放数据线,准备接收应答位
  646.     delay(2);  
  647.     TSCL=1;
  648.     delay(3);
  649.     if(TSDA==1)
  650.         ack=0;   
  651.     else
  652.         ack=1;                              //判断是否接收到应答信号
  653.     TSCL=0;
  654.     delay(2);
  655. }

  656. uchar RcvByte()                                                                        // 功能:      用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
  657. {
  658. uchar retc;
  659. uchar BitCnt;

  660.    retc=0;
  661.    TSDA=1;                           //置数据线为输入方式
  662.    for(BitCnt=0;BitCnt<8;BitCnt++)
  663.    {
  664.         delay(1);  
  665.         TSCL=0;                      //置时钟线为低,准备接收数据位

  666.         delay(5);                 //时钟低电平周期大于4.7μs

  667.         TSCL=1;                      //置时钟线为高使数据线上数据有效
  668.         delay(3);
  669.         retc=retc<<1;
  670.         if(TSDA==1)
  671.             retc=retc+1;            //读数据位,接收的数据位放入retc中
  672.         delay(2);
  673.    }
  674.    TSCL=0;
  675.    delay(2);
  676.    return(retc);
  677. }

  678. void I2CACK(bit a)                         // 功能:       主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
  679. {

  680.     if(a==0)
  681.         TSDA=0;              //在此发出应答或非应答信号
  682.     else
  683.         TSDA=1;
  684.     delay(3);     
  685.     TSCL=1;

  686.     delay(5);             //时钟低电平周期大于4μs

  687.     TSCL=0;                  //清时钟线,钳住I2C总线以便继续接收
  688.     delay(2);   
  689. }



  690. uchar I2CRead()                                                                         /************从DS3231当前地址读一个字节************/
  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指定地址读一个字节************/
  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()                                                                                 /*********************读取时间为了阳历转农历**********************/
  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)                                //时分秒数组赋值        
  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)                        //年月天数组赋值         
  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;                  //发送起始条件的数据信号
  782.     delay(1);
  783.     TSCL=1;
  784.     delay(5);             //起始条件建立时间大于4.7us,延时

  785.     TSDA=0;                  //发送起始信号
  786.     delay(5);             // 起始条件锁定时间大于4μs

  787.     TSCL=0;                  //钳住I2C总线,准备发送或接收数据
  788.     delay(2);
  789. }

  790. void Stop_I2C()
  791. {
  792.     TSDA=0;                  //发送结束条件的数据信号
  793.     delay(1);             //发送结束条件的时钟信号
  794.     TSCL=1;                  //结束条件建立时间大于4us
  795.     delay(5);

  796.     TSDA=1;                  //发送I2C总线结束信号
  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)          //函数功能:修改时间、日期和星期
  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()           //设置时间
  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.   /*串口 函数*/

  966. void UartInit(void)                //9600bps@33.1776MHz
  967. {
  968.         SCON = 0x50;                //8位数据,可变波特率
  969.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  970.         AUXR &= 0xFB;                //定时器时钟12T模式
  971.         T2L = 0xB8;                        //设置定时初始值
  972.         T2H = 0xFF;                        //设置定时初始值
  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 屏幕翻转显示
  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; //进入设置界面
  1003.                         i=0;
  1004.                         buffer[i]=SBUF;           //开始接收
  1005.                 }
  1006.         RI=0;                  
  1007.         i++;
  1008.         if(buffer[i-1]==0x21) //接收的报文以!结尾(即0x21)
  1009.         {
  1010.                 i=0;
  1011.                 flag=1;
  1012.         
  1013.     }
  1014. }
复制代码
json文件: json文件.7z (89.92 KB, 下载次数: 20)
仿真: 无
代码: 程序12832液晶 DS3231程序20231208已实现时钟显示 串口同步时间.zip (339.25 KB, 下载次数: 34)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:16255 发表于 2023-12-14 08:36 | 只看该作者
12832对我来说还是小了点。我要显示更多内容。

回复

使用道具 举报

板凳
ID:672765 发表于 2024-1-17 13:32 | 只看该作者
mengsiu 发表于 2023-12-14 08:36
12832对我来说还是小了点。我要显示更多内容。

那我新做的串口屏比较适合你,

回复

使用道具 举报

地板
ID:275111 发表于 2024-3-30 20:44 | 只看该作者
这个真的很不错 留言支持。
回复

使用道具 举报

5#
ID:267349 发表于 2024-4-19 20:09 | 只看该作者
大佬
新制作的这个能否发一下资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表