• 51单片机-DS1302可调时钟(实现代码)


    目录

    一、介绍

    1.DS1302介绍

    2.引脚定义和应用电路

    3.内部结构框图

    4. 寄存器定义

     5.时序定义

    6.BCD码

     二、文件内容

    a.代码功能

    1.代码实现功能

    2.工程文件内容

    b.代码详细内容

    1.main.c

    2.DS1302.c

    3.DS1302.h

    4. Delay.c

    5. Delay.h

    6.Key.c

    7.Key.h

    8.LCD1602.c

    9.LCD1602.h

    10.Timer0.c

    11.Timer0.h


    一、介绍

    1.DS1302介绍

            DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时且具有闰年补偿等多种功能
            RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片

    2.引脚定义和应用电路

                       

    引脚名

    作用

    引脚名

    作用

    VCC2

    主电源

    CE

    芯片使能

    VCC1

    备用电池

    IO

    数据输入/输出

    GND

    电源地

    SCLK

    串行时钟

    X1X2

    32.768KHz晶振

    3.内部结构框图

    4. 寄存器定义

     5.时序定义

    6.BCD码

            BCD码(Binary Coded Decimal):用4位二进制数来表示1位十进制数

            例:0001 0011表示13,1000 0101表示85,0001 1010不合法

            在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法

            BCD码转十进制:DEC=BCD/16*10+ BCD%16;(2位BCD)

            十进制转BCD码: BCD=DEC/10+16+DEC%10;(2位BCD)

     二、文件内容

    a.代码功能

    1.代码实现功能

            显示年月日、时分秒

            按下按键1选择模式【显示/更改】,按下按键2选择要更改的数,按键3【+】,按键4【-】

    2.工程文件内容

    b.代码详细内容

    1.main.c

    1. #include <REGX52.H>
    2. #include "LCD1602.h"
    3. #include "DS1302.h"
    4. #include "Key.h"
    5. #include "Timer0.h"
    6. unsigned char KeyNumber,MODE,TimeSetSelect,TimeSetFlashFlag;
    7. unsigned char YEAR(unsigned char year,month);
    8. void TimeShow();
    9. void TimeSet();
    10. void main(){
    11. LCD_Init();
    12. DS1302_Init();
    13. Timer0_Init();
    14. DS1302_SetTime();
    15. LCD_ShowString(1,1," - - ");
    16. LCD_ShowString(2,1," : : ");
    17. while(1){
    18. KeyNumber = Key();
    19. if(KeyNumber==1){
    20. if(MODE==0)MODE=1;
    21. else if(MODE==1){MODE=0;DS1302_SetTime();}
    22. }
    23. switch(MODE)
    24. {
    25. case 0: TimeShow();break;
    26. case 1: TimeSet();break;
    27. }
    28. }
    29. }
    30. //显示
    31. void TimeShow(){
    32. DS1302_ReadTime();
    33. LCD_ShowNum(1,1,DS1302_Time[0],2);
    34. LCD_ShowNum(1,4,DS1302_Time[1],2);
    35. LCD_ShowNum(1,7,DS1302_Time[2],2);
    36. LCD_ShowNum(2,1,DS1302_Time[3],2);
    37. LCD_ShowNum(2,4,DS1302_Time[4],2);
    38. LCD_ShowNum(2,7,DS1302_Time[5],2);
    39. }
    40. //修改
    41. void TimeSet(){
    42. //选择需要更改的位
    43. if(KeyNumber == 2)
    44. {
    45. TimeSetSelect++;
    46. TimeSetSelect%=6;
    47. }
    48. //增加更改位的数,并判断是否越界
    49. if(KeyNumber == 3)
    50. {
    51. DS1302_Time[TimeSetSelect]++;
    52. if(DS1302_Time[0]>99){DS1302_Time[0]=0;}
    53. if(DS1302_Time[1]>12){DS1302_Time[1]=1;}
    54. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31)
    55. {
    56. if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
    57. }
    58. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30)
    59. {
    60. if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
    61. }
    62. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29)
    63. {
    64. if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
    65. }
    66. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28)
    67. {
    68. if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
    69. }
    70. if(DS1302_Time[3]>24){DS1302_Time[3]=0;}
    71. if(DS1302_Time[4]>59){DS1302_Time[4]=0;}
    72. if(DS1302_Time[5]>59){DS1302_Time[5]=0;}
    73. }
    74. //减小更改位的数,并判断是否越界
    75. if(KeyNumber == 4)
    76. {
    77. DS1302_Time[TimeSetSelect]--;
    78. if(DS1302_Time[0]>100){DS1302_Time[0]=99;}
    79. if(DS1302_Time[1]<1){DS1302_Time[1]=12;}
    80. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31)
    81. {
    82. if(DS1302_Time[2]<1){DS1302_Time[2]=31;}
    83. if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
    84. }
    85. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30)
    86. {
    87. if(DS1302_Time[2]<1){DS1302_Time[2]=30;}
    88. if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
    89. }
    90. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29)
    91. {
    92. if(DS1302_Time[2]<1){DS1302_Time[2]=29;}
    93. if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
    94. }
    95. if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28)
    96. {
    97. if(DS1302_Time[2]<1){DS1302_Time[2]=28;}
    98. if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
    99. }
    100. if(DS1302_Time[3]>100){DS1302_Time[3]=24;}
    101. if(DS1302_Time[4]>100){DS1302_Time[4]=59;}
    102. if(DS1302_Time[5]>100){DS1302_Time[5]=59;}
    103. }
    104. //显示更改后的数据
    105. if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1," ");}
    106. else{LCD_ShowNum(1,1,DS1302_Time[0],2);}
    107. if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4," ");}
    108. else{LCD_ShowNum(1,4,DS1302_Time[1],2);}
    109. if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7," ");}
    110. else{LCD_ShowNum(1,7,DS1302_Time[2],2);}
    111. if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1," ");}
    112. else{LCD_ShowNum(2,1,DS1302_Time[3],2);}
    113. if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4," ");}
    114. else{LCD_ShowNum(2,4,DS1302_Time[4],2);}
    115. if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7," ");}
    116. else{LCD_ShowNum(2,7,DS1302_Time[5],2);}
    117. /*LCD_ShowNum(2,10,TimeSetSelect,2);
    118. LCD_ShowNum(2,13,TimeSetFlashFlag,2);*/
    119. }
    120. //闰年判断,月份天数判断
    121. unsigned char YEAR(unsigned char year,month){
    122. if(year%400==0||year%4==0&&year%100!=0)
    123. {
    124. if(month==2)
    125. return 29;
    126. }
    127. else
    128. {
    129. if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
    130. return 31;
    131. else if(month==4||month==6||month==9||month==11)
    132. return 30;
    133. else
    134. return 28;
    135. }
    136. return 0;
    137. }
    138. //定时器
    139. void Timer0_Routine() interrupt 1
    140. {
    141. static unsigned int count0 = 0;
    142. TL0 = 0x18; //设置定时初值
    143. TH0 = 0xFC; //设置定时初值
    144. count0++;
    145. if(count0 == 300){
    146. count0 = 0;
    147. TimeSetFlashFlag=!TimeSetFlashFlag;
    148. }
    149. }

    2.DS1302.c

    1. #include <REGX52.H>
    2. #define DS1302_SECOND 0x80
    3. #define DS1302_MINUTE 0x82
    4. #define DS1302_HOUR 0x84
    5. #define DS1302_DATE 0x86
    6. #define DS1302_MONTH 0x88
    7. #define DS1302_DAY 0x8A
    8. #define DS1302_YEAR 0x8C
    9. #define DS1302_WP 0x8E
    10. sbit DS1302_SCLK=P3^6;
    11. sbit DS1302_IO=P3^4;
    12. sbit DS1302_CE=P3^5;
    13. unsigned char DS1302_Time[]={22,12,31,23,59,58,2};
    14. /**
    15. * @brief BCD转10进制
    16. * @param
    17. * @retval
    18. */
    19. unsigned char BCD_10(unsigned char Num){
    20. unsigned char Temp;
    21. Temp = Num/10*16+Num%10;
    22. return Temp;
    23. }
    24. /**
    25. * @brief 10进制转BCD码
    26. * @param
    27. * @retval
    28. */
    29. unsigned char Ten_BCD(unsigned char Num){
    30. unsigned char Temp;
    31. Temp = Num/16*10+Num%16;
    32. return Temp;
    33. }
    34. /**
    35. * @brief 初始化DS1302
    36. * @param
    37. * @retval
    38. */
    39. void DS1302_Init(){
    40. DS1302_SCLK=0;
    41. DS1302_CE=0;
    42. }
    43. /**
    44. * @brief 写入字节
    45. * @param
    46. * @retval
    47. */
    48. void DS1302_WriteByte(unsigned char Command,Data){
    49. unsigned char i;
    50. DS1302_CE=1;
    51. for(i=0;i<8;i++){
    52. DS1302_IO=Command&(0x01<<i);
    53. DS1302_SCLK=1;
    54. DS1302_SCLK=0;
    55. }
    56. for(i=0;i<8;i++){
    57. DS1302_IO=Data&(0x01<<i);
    58. DS1302_SCLK=1;
    59. DS1302_SCLK=0;
    60. }
    61. DS1302_CE=0;
    62. }
    63. /**
    64. * @brief 读取字节
    65. * @param
    66. * @retval
    67. */
    68. unsigned char DS1302_ReadByte(unsigned char Command){
    69. unsigned char i,Data=0x00;
    70. Command|=0x01;
    71. DS1302_CE=1;
    72. for(i=0;i<8;i++){
    73. DS1302_IO=Command&(0x01<<i);
    74. DS1302_SCLK=0;
    75. DS1302_SCLK=1;
    76. }
    77. for(i=0;i<8;i++){
    78. DS1302_SCLK=1;
    79. DS1302_SCLK=0;
    80. if(DS1302_IO){Data|=(0x01<<i);}
    81. }
    82. DS1302_CE=0;
    83. DS1302_IO=0;
    84. return Data;
    85. }
    86. /**
    87. * @brief 将数组内容写入
    88. * @param
    89. * @retval
    90. */
    91. void DS1302_SetTime(){
    92. DS1302_WriteByte(DS1302_WP,0x00);
    93. DS1302_WriteByte(DS1302_YEAR,BCD_10(DS1302_Time[0]));
    94. DS1302_WriteByte(DS1302_MONTH,BCD_10(DS1302_Time[1]));
    95. DS1302_WriteByte(DS1302_DATE,BCD_10(DS1302_Time[2]));
    96. DS1302_WriteByte(DS1302_HOUR,BCD_10(DS1302_Time[3]));
    97. DS1302_WriteByte(DS1302_MINUTE,BCD_10(DS1302_Time[4]));
    98. DS1302_WriteByte(DS1302_SECOND,BCD_10(DS1302_Time[5]));
    99. DS1302_WriteByte(DS1302_DAY,BCD_10(DS1302_Time[6]));
    100. DS1302_WriteByte(DS1302_WP,0x80);
    101. }
    102. /**
    103. * @brief 读出数组内容
    104. * @param
    105. * @retval
    106. */
    107. void DS1302_ReadTime(){
    108. DS1302_Time[0]=Ten_BCD(DS1302_ReadByte(DS1302_YEAR));
    109. DS1302_Time[1]=Ten_BCD(DS1302_ReadByte(DS1302_MONTH));
    110. DS1302_Time[2]=Ten_BCD(DS1302_ReadByte(DS1302_DATE));
    111. DS1302_Time[3]=Ten_BCD(DS1302_ReadByte(DS1302_HOUR));
    112. DS1302_Time[4]=Ten_BCD(DS1302_ReadByte(DS1302_MINUTE));
    113. DS1302_Time[5]=Ten_BCD(DS1302_ReadByte(DS1302_SECOND));
    114. DS1302_Time[6]=Ten_BCD(DS1302_ReadByte(DS1302_DAY));
    115. }

    3.DS1302.h

    1. #ifndef __SD1302_H__
    2. #define __SD1302_H__
    3. extern unsigned char DS1302_Time[];
    4. void DS1302_Init();
    5. void DS1302_ReadTime();
    6. void DS1302_SetTime();
    7. #endif

    4. Delay.c

    1. void Delay(unsigned int t) //延时函数
    2. {
    3. unsigned char i, j;
    4. while(t){
    5. i = 2;
    6. j = 239;
    7. do
    8. {
    9. while (--j);
    10. } while (--i);
    11. t--;
    12. }
    13. }

    5. Delay.h

    1. #ifndef __DELAY_H__
    2. #define __DELAY_H__
    3. void Delay(unsigned int t);
    4. #endif

    6.Key.c

    1. #include <REGX52.H>
    2. #include "Delay.h"
    3. /**
    4. * @brief 获取独立按键键码
    5. * @param 无
    6. * @retval KeyNumber 键码
    7. */
    8. unsigned char Key(){
    9. unsigned char KeyNumber = 0;
    10. if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber = 1;}
    11. if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber = 2;}
    12. if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber = 3;}
    13. if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber = 4;}
    14. return KeyNumber;
    15. }

    7.Key.h

    1. #ifndef __KEY_H__
    2. #define __KEY_H__
    3. unsigned char Key();
    4. #endif

    8.LCD1602.c

    1. #include <REGX52.H>
    2. //引脚配置:
    3. sbit LCD_RS=P2^6;
    4. sbit LCD_RW=P2^5;
    5. sbit LCD_EN=P2^7;
    6. #define LCD_DataPort P0
    7. //函数定义:
    8. /**
    9. * @brief LCD1602延时函数,12MHz调用可延时1ms
    10. * @param 无
    11. * @retval 无
    12. */
    13. void LCD_Delay()
    14. {
    15. unsigned char i, j;
    16. i = 2;
    17. j = 239;
    18. do
    19. {
    20. while (--j);
    21. } while (--i);
    22. }
    23. /**
    24. * @brief LCD1602写命令
    25. * @param Command 要写入的命令
    26. * @retval 无
    27. */
    28. void LCD_WriteCommand(unsigned char Command)
    29. {
    30. LCD_RS=0;
    31. LCD_RW=0;
    32. LCD_DataPort=Command;
    33. LCD_EN=1;
    34. LCD_Delay();
    35. LCD_EN=0;
    36. LCD_Delay();
    37. }
    38. /**
    39. * @brief LCD1602写数据
    40. * @param Data 要写入的数据
    41. * @retval 无
    42. */
    43. void LCD_WriteData(unsigned char Data)
    44. {
    45. LCD_RS=1;
    46. LCD_RW=0;
    47. LCD_DataPort=Data;
    48. LCD_EN=1;
    49. LCD_Delay();
    50. LCD_EN=0;
    51. LCD_Delay();
    52. }
    53. /**
    54. * @brief LCD1602设置光标位置
    55. * @param Line 行位置,范围:1~2
    56. * @param Column 列位置,范围:1~16
    57. * @retval 无
    58. */
    59. void LCD_SetCursor(unsigned char Line,unsigned char Column)
    60. {
    61. if(Line==1)
    62. {
    63. LCD_WriteCommand(0x80|(Column-1));
    64. }
    65. else if(Line==2)
    66. {
    67. LCD_WriteCommand(0x80|(Column-1+0x40));
    68. }
    69. }
    70. /**
    71. * @brief LCD1602初始化函数
    72. * @param 无
    73. * @retval 无
    74. */
    75. void LCD_Init()
    76. {
    77. LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    78. LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
    79. LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
    80. LCD_WriteCommand(0x01);//光标复位,清屏
    81. }
    82. /**
    83. * @brief 在LCD1602指定位置上显示一个字符
    84. * @param Line 行位置,范围:1~2
    85. * @param Column 列位置,范围:1~16
    86. * @param Char 要显示的字符
    87. * @retval 无
    88. */
    89. void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
    90. {
    91. LCD_SetCursor(Line,Column);
    92. LCD_WriteData(Char);
    93. }
    94. /**
    95. * @brief 在LCD1602指定位置开始显示所给字符串
    96. * @param Line 起始行位置,范围:1~2
    97. * @param Column 起始列位置,范围:1~16
    98. * @param String 要显示的字符串
    99. * @retval 无
    100. */
    101. void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
    102. {
    103. unsigned char i;
    104. LCD_SetCursor(Line,Column);
    105. for(i=0;String[i]!='\0';i++)
    106. {
    107. LCD_WriteData(String[i]);
    108. }
    109. }
    110. /**
    111. * @brief 返回值=X的Y次方
    112. */
    113. int LCD_Pow(int X,int Y)
    114. {
    115. unsigned char i;
    116. int Result=1;
    117. for(i=0;i<Y;i++)
    118. {
    119. Result*=X;
    120. }
    121. return Result;
    122. }
    123. /**
    124. * @brief 在LCD1602指定位置开始显示所给数字
    125. * @param Line 起始行位置,范围:1~2
    126. * @param Column 起始列位置,范围:1~16
    127. * @param Number 要显示的数字,范围:0~65535
    128. * @param Length 要显示数字的长度,范围:1~5
    129. * @retval 无
    130. */
    131. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    132. {
    133. unsigned char i;
    134. LCD_SetCursor(Line,Column);
    135. for(i=Length;i>0;i--)
    136. {
    137. LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
    138. }
    139. }
    140. /**
    141. * @brief 在LCD1602指定位置开始以有符号十进制显示所给数字
    142. * @param Line 起始行位置,范围:1~2
    143. * @param Column 起始列位置,范围:1~16
    144. * @param Number 要显示的数字,范围:-32768~32767
    145. * @param Length 要显示数字的长度,范围:1~5
    146. * @retval 无
    147. */
    148. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
    149. {
    150. unsigned char i;
    151. unsigned int Number1;
    152. LCD_SetCursor(Line,Column);
    153. if(Number>=0)
    154. {
    155. LCD_WriteData('+');
    156. Number1=Number;
    157. }
    158. else
    159. {
    160. LCD_WriteData('-');
    161. Number1=-Number;
    162. }
    163. for(i=Length;i>0;i--)
    164. {
    165. LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
    166. }
    167. }
    168. /**
    169. * @brief 在LCD1602指定位置开始以十六进制显示所给数字
    170. * @param Line 起始行位置,范围:1~2
    171. * @param Column 起始列位置,范围:1~16
    172. * @param Number 要显示的数字,范围:0~0xFFFF
    173. * @param Length 要显示数字的长度,范围:1~4
    174. * @retval 无
    175. */
    176. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    177. {
    178. unsigned char i,SingleNumber;
    179. LCD_SetCursor(Line,Column);
    180. for(i=Length;i>0;i--)
    181. {
    182. SingleNumber=Number/LCD_Pow(16,i-1)%16;
    183. if(SingleNumber<10)
    184. {
    185. LCD_WriteData(SingleNumber+'0');
    186. }
    187. else
    188. {
    189. LCD_WriteData(SingleNumber-10+'A');
    190. }
    191. }
    192. }
    193. /**
    194. * @brief 在LCD1602指定位置开始以二进制显示所给数字
    195. * @param Line 起始行位置,范围:1~2
    196. * @param Column 起始列位置,范围:1~16
    197. * @param Number 要显示的数字,范围:0~1111 1111 1111 1111
    198. * @param Length 要显示数字的长度,范围:1~16
    199. * @retval 无
    200. */
    201. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    202. {
    203. unsigned char i;
    204. LCD_SetCursor(Line,Column);
    205. for(i=Length;i>0;i--)
    206. {
    207. LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
    208. }
    209. }

    9.LCD1602.h

    1. #ifndef __LCD1602_H__
    2. #define __LCD1602_H__
    3. //用户调用函数:
    4. void LCD_Init();
    5. void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
    6. void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
    7. void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
    8. void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
    9. void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
    10. void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
    11. #endif

    10.Timer0.c

    1. #include <REGX52.H>
    2. void Timer0_Init(void) //1毫秒@12.000MHz
    3. {
    4. TMOD &= 0xF0; //设置定时器模式
    5. TMOD |= 0x01; //设置定时器模式
    6. TL0 = 0x18; //设置定时初值
    7. TH0 = 0xFC; //设置定时初值
    8. TF0 = 0; //清除TF0标志
    9. TR0 = 1; //定时器0开始计时
    10. ET0 = 1;
    11. EA = 1;
    12. PT0 = 0;
    13. }
    14. /* 定时器中断函数模板
    15. void Timer0_Routine() interrupt 1
    16. {
    17. static unsigned int count0 = 0;
    18. TL0 = 0x18; //设置定时初值
    19. TH0 = 0xFC; //设置定时初值
    20. count0++;
    21. if(count0 == 1000){
    22. count0 = 0;
    23. }
    24. }
    25. */

    11.Timer0.h

    1. #ifndef __TIMER0_H__
    2. #define __TIMER0_H__
    3. void Timer0_Init(void);
    4. #endif

    模块化编程

  • 相关阅读:
    Ribbon负载均衡算法
    若依前后端分离,ruoyi-vue jar包更改成war包发布 Websocket 配置
    打破JSON的束缚:探寻Spring @JsonComponent的灵活性和扩展性
    【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数
    Spring Boot 实现各种参数校验,建议收藏!
    GRADIENT BASED THRESHOLD FREE COLOR FILTER ARRAY INTERPOLATION
    Pytorch里的manual_seed()
    Python软件无线电(1):概述
    【机器学习】——驱动智能制造的青春力量,优化生产、预见故障、提升质量
    C++ 【模板】
  • 原文地址:https://blog.csdn.net/qq_61228493/article/details/127281198