第十五屆藍橋杯單片機組4T模擬賽三(第二套)

本套試題在4T平臺中的名字為第15屆藍橋杯單片機組模擬考試三,不知道哪套是4T的模擬賽,所以兩套都敲一遍練練手感。

為了代碼呈現美觀,本文章前面的各個模塊在main函數中的處理函數均未添加退出處理,在最后給出的完整代碼中體現。

附件:第15屆藍橋杯單片機組模擬考試三
在這里插入圖片描述

一、準備工作

1.閱讀系統框架

由系統框架圖得知,等會創建工程時需要編寫的底層模塊有:

  • 初始化模塊(Init.h,Init.c)
  • 指示燈模塊(Led.h,Led.c)
  • 數碼管模塊(Seg.h,Seg.c)
  • 溫度傳感器模塊(ds18b20.h,ds18b20.c)
  • 按鍵模塊(key.h,key.c)
    這些底層函數在作者的專欄《藍橋杯單片機模板搭建系列》中都詳細地講解了怎么去實現,如果讀者有不懂的可以點擊下面的鏈接。
    藍橋杯單片機模板搭建系列

2.閱讀題目了解題意

  • 按鍵只使用了S4、S5和S8,并且沒有錯誤按鍵次數的判斷,所以寫按鍵時可以只寫S4、S5和S8的。
  • 數碼管顯示字母用到PC的段碼,在數碼管底層函數記得添加。
  • 頁面顯示只有兩個頁面,所以為了更簡單地實現頁面流轉,可以定義bit型變量SegMode控制頁面流轉(為0時對應信號界面,為1時對應溫度界面)
  • 由于涉及NE555,所以需要使用定時器0去計數,定時器1去計時,同時屏蔽掉按鍵模塊中對P34的賦值

二、數碼管模塊

1.Seg.h

#ifndef __Seg_H__
#define __Seg_H__void SegDisp(unsigned char wela, unsigned char dula, unsigned char point);#endif

2.Seg.c

#include <STC15F2K60S2.H>code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xff, //空
0x8c, //P
0xc6, //C
};void SegDisp(unsigned char wela, unsigned char dula, unsigned char point)
{P0 = 0xff;P2 = P2 & 0x1f | 0xe0;P2 &= 0x1f;P0 = (0x01 << wela);P2 = P2 & 0x1f | 0xc0;P2 &= 0x1f;P0 = Seg_Table[dula];if(point)P0 &= 0x7f;P2 = P2 & 0x1f | 0xe0;P2 &= 0x1f;
}

3.NE555

NE555在底層搭建系列也已經講過了,這邊直接給出代碼

void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;			//定時器時鐘12T模式TMOD &= 0xF0;			//設置定時器模式TMOD |= 0x05;			//設置定時器模式TL0 = 0;				//設置定時初始值TH0 = 0;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時
}void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定時器時鐘12T模式TMOD &= 0x0F;			//設置定時器模式TL1 = 0x18;				//設置定時初始值TH1 = 0xFC;				//設置定時初始值TF1 = 0;				//清除TF1標志TR1 = 1;				//定時器1開始計時ET1 = 1;				//使能定時器1中斷EA = 1;
}void Timer1_Isr(void) interrupt 3
{//systick++;調度器使用if(++SegPos == 8)SegPos = 0;SegDisp(SegPos,SegBuf[SegPos],SegPoint[SegPos]);if(++Time_1s == 1000){Time_1s = 0;f = (TH0 << 8) | TL0;TH0 = TL0 = 0;}
}

4.main.c中的數碼管處理函數SegProc

在這里插入圖片描述

信號界面

用bit型變量SegMode來控制頁面流轉,當SegMode等于0時,對應顯示界面為NE555頻率測量,NE555的上限值大概在31000多,所以第一位和第二位數碼管直接熄滅即可(最左邊的數碼管為第零位數碼管),顯示界面還需要進行高位為0熄滅的判斷,這個也是很簡單的,代碼如下:

void SegProc()
{unsigned char i;if(!SegMode){SegBuf[0] = 11;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = f / 10000 % 10;SegBuf[4] = f / 1000 % 10;SegBuf[5] = f / 100 % 10;SegBuf[6] = f / 10 % 10;SegPoint[6] = 0;SegBuf[7] = f % 10;//高位熄滅處理i = 3;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}
}

溫度界面

ds18b20底層代碼
#ifndef __ds18b20_H__
#define __ds18b20_H__float TemRead();#endif
#include <STC15F2K60S2.H>sbit DQ = P1^4;void Delay_OneWire(unsigned int t)  
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}	    Delay_OneWire(5);}return dat;
}//
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}float TemRead()
{idata unsigned char tem_low, tem_hig;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);tem_low = Read_DS18B20();tem_hig = Read_DS18B20();return ((tem_hig << 8) | tem_low) / 16.0;
}

SegMode為1時,對應溫度讀取界面,由于作者個人習慣不喜歡使用float型變量,所以在這邊使用的是unsigned int型變量Tem_10x(將溫度放大10倍),這邊也是給出兩種寫法。
寫法一:定義float型變量

//取余變量聲明、函數聲明、頭文件引用均省略
idata float Tem;void SegProc()
{if(!SegMode){//省略}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = (unsigned char)Tem / 10;SegBuf[6] = (unsigned char)Tem % 10;SegPoint[6] = 1;SegBuf[7] = (unsigned char)(Tem * 10) % 10;}
}void TemProc()
{Tem = TemRead();
}

寫法二:定義unsigned int型變量

idata unsigned int Tem;void SegProc()
{if(!SegMode){//省略}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}
}void TemProc()
{Tem_10x = TemRead() * 10;
}

采集頻率

  • 在信號頁面按下S5為頻率數據采集,此時數碼管顯示周期。
  • 周期 = 1 頻率 \frac{1}{頻率} 頻率1? * 10 6 ^6 6(1s=10 6 u s ^6us 6us
    定義bit型變量FreMode控制信號頁面的數據顯示
  • FreMode為0時,顯示頻率,為1時,顯示周期。
  • 如果頻率值為1時,周期為100 0000us,所以高位熄滅的判斷要從數碼管第一位開始判斷。
void SegProc()
{unsigned char i;if(!SegMode){SegBuf[0] = 11;if(!FreMode){//頻率顯示頁面}else{T = 1000000 / f;SegBuf[1] = T / 1000000 % 10;SegBuf[2] = T / 100000 % 10;SegBuf[3] = T / 10000 % 10;SegBuf[4] = T / 1000 % 10;SegBuf[5] = T / 100 % 10;SegBuf[6] = T / 10 % 10;SegPoint[6] = 0;SegBuf[7] = T % 10;//高位數據為0熄滅判斷i = 1;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}}
}

溫度取整

  • 溫度界面按下S5時將溫度保留整數后在數碼管中顯示,這個時候應在數碼管的低二位(最右邊兩個數碼管)顯示溫度數據。
  • 同樣的,定義bit型變量TemMode來控制溫度顯示頁面的數據顯示。
else//溫度頁面{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;/*if(!TemMode){SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}*/else//溫度整數顯示{SegBuf[5] = 10;SegBuf[6] = Tem_10x / 100;SegBuf[7] = Tem_10x / 10 % 10;SegPoint[6] = 0;}}

5.數碼管模塊完整代碼

void SegProc()
{unsigned char i;if(!SegMode){SegBuf[0] = 11;if(!FreMode){SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = f / 10000 % 10;SegBuf[4] = f / 1000 % 10;SegBuf[5] = f / 100 % 10;SegBuf[6] = f / 10 % 10;SegPoint[6] = 0;SegBuf[7] = f % 10;i = 3;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}else{T = 1000000 / f;SegBuf[1] = T / 1000000 % 10;SegBuf[2] = T / 100000 % 10;SegBuf[3] = T / 10000 % 10;SegBuf[4] = T / 1000 % 10;SegBuf[5] = T / 100 % 10;SegBuf[6] = T / 10 % 10;SegPoint[6] = 0;SegBuf[7] = T % 10;i = 1;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;if(!TemMode){SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}else{SegBuf[5] = 10;SegBuf[6] = Tem_10x / 100;SegBuf[7] = Tem_10x / 10 % 10;SegPoint[6] = 0;}}
}

三、按鍵模塊

1.按鍵底層代碼

#ifndef __Key_H__
#define __Key_H__unsigned char KeyDisp();#endif
#include <STC15F2K60S2.H>unsigned char KeyDisp()
{unsigned char temp = 0x00;P44 = 0;P42 = 1;P35 = 1;if(P32 == 0) temp = 5;if(P33 == 0) temp = 4;P44 = 1;P42 = 0;P35 = 1;if(P32 == 0) temp = 9;return temp;
}

2.按鍵實現

在這里插入圖片描述
按鍵模塊特別簡單,直接給出代碼
這邊注意的是,SegMode、FreMode、TemMode在前文中都已經定義成bit型變量,bit型變量是嵌入式系統設計中特有的變量,它的取值只有0和1,所以在按鍵S4、S5的變量取反可以使用下面兩種方法實現:

SegMode = !SegMode;
SegMode ^= 1;

3.按鍵模塊完整代碼:

void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyDown = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:SegMode ^= 1;break;case 5:if(!SegMode){/*在下文的Led模塊實現if(!FreMode)CountFlag = 1;*/FreMode ^= 1;}elseTemMode ^= 1;break;case 9:SegMode = 0;FreMode = 0;TemMode = 0;break;}
}

四、Led模塊

1.Led底層代碼

#ifndef __Led_H__
#define __Led_H__void LedDisp(unsigned char *ucLed);#endif
#include <STC15F2K60S2.H>void LedDisp(unsigned char *ucLed)
{unsigned char i, temp = 0x00;static unsigned char temp_old = 0xff;for(i = 0; i < 8; i++)temp |= (ucLed[i] << i);if(temp != temp_old){P0 = ~temp;P2 = P2 & 0x1f | 0x80;P2 &= 0x1f;temp_old = temp;}
}

在這里插入圖片描述

2.L1、L2

L1、L2的點亮邏輯很簡單
讀者可以使用下面的代碼也可以使用if-else語句或者三目運算符。

void LedProc()
{ucLed[0] = !SegMode;ucLed[1] = SegMode;
}

3.L3

  • L3的點亮邏輯是在信號頁面激活采集功能后,L3點亮1s后熄滅,這邊要注意的是,L3點亮是當采集功能激活后點亮的,而且1s后就要熄滅,沒有進行其他操作時不能重復點亮。
  • 定時點亮、定時熄滅邏輯:定義時間變量以及指示燈標志位,時間變量在定時器內計時,當時間變量達到指定時間時,時間變量復位,指示燈標志位開啟/關閉。
  • 本題實現方法有很多,下面給出我能想到的最簡單的方法,如果讀者有更簡單的方法,歡迎評論區討論。
/*有關于L3的變量定義*/
idata unsigned int Time_1s_Led;/*
*CountFlag兩個作用:
*1.CountFlag置1時,Time_1s_Led開始計時
*CountFlag置0時,Time_1s_Led復位
*2.ucLed[2] = CountFlag,即L3是否點亮決定于CountFlag
*/
idata bit CountFlag;//CountFlag激活地
void KeyProc()
{switch(KeyDown){case 5:if(!SegMode){if(!FreMode)CountFlag = 1;//只有跳轉到采集界面才激活CountFlagFreMode ^= 1;}}
}//Led
void LedProc()
{ucLed[2] = CountFlag;
}//定時器1中斷服務函數
void Timer1_Isr(void) interrupt 3
{//其它省略if(CountFlag)//開燈計時{if(++Time_1s_Led == 1000){Time_1s_Led = 0;//復位CountFlag = 0;//關燈}}
}

4.L4

  • L4的點亮邏輯是實時溫度超過40°時L4以100ms為間隔閃爍
  • 指示燈閃爍的邏輯很簡單,定義一個計時變量和一個Led點亮標志位,定時器中斷中計時變量達到特定時間時,將Led點亮標志位取反,讓ucLed[2] = Led點亮標志位,這樣就可以實現指示燈閃爍
idata unsigned char Time_100ms;idata bit LedFlah;//當實時溫度>40°時,標志位置1
idata bit LedFlash;//L4使能標志位void TemProc()
{Tem_10x = TemRead() * 10;LedFlag = (Tem_10x > 300);
}void LedProc()
{ucLed[7] = LedFlash;
}void Timer1_Isr(void) interrupt 3
{if(LedFlag){if(++Time_100ms == 100){Time_100ms = 0;LedFlash ^= 1;}}else{Time_100ms = 0;LedFlash = 0;}
}

五、完整代碼

完整代碼的思路是沒有問題的,已經通過4T評測了,完整代碼是根據以上代碼片段拼湊起來的,如果讀者用以下代碼搭建的工程不能完整實現工程或者報錯,請及時聯系我。

#include <STC15F2K60S2.H>
#include "Init.h"
#include "Key.h"
#include "Seg.h"
#include "Led.h"
#include "ds18b20.h"typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;idata u8 Key_Slow; //按鍵減速變量 10ms 
idata u8 Seg_Slow; //數碼管減速變量 500ms
idata u8 SegPos;
idata u8 KeyVal, KeyDown, KeyUp, KeyOld;
idata u8 Time_100ms;pdata u8 SegBuf[8] = {10,10,10,10,10,10,10,10};
pdata u8 SegPoint[8] = {0,0,0,0,0,0,0,0};
pdata u8 ucLed[8] = {0,0,0,0,0,0,0,0};idata u16 Time_1s, f;
idata u16 Tem_10x;
idata u16 T;
idata u16 Time_1s_Led;idata bit SegMode;
idata bit FreMode;
idata bit TemMode;
idata bit CountFlag;
idata bit LedFlag;
idata bit LedFlash;void KeyProc()
{if(Key_Slow) return;Key_Slow = 1; //按鍵減速KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyDown = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:SegMode ^= 1;break;case 5:if(!SegMode){if(!FreMode)CountFlag = 1;FreMode ^= 1;}elseTemMode ^= 1;break;case 9:SegMode = 0;FreMode = 0;TemMode = 0;break;}
}void SegProc()
{unsigned char i;if(Seg_Slow) return;Seg_Slow = 1; //數碼管減速Tem_10x = TemRead() * 10;LedFlag = (Tem_10x > 300);if(!SegMode){SegBuf[0] = 11;if(!FreMode){SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = f / 10000 % 10;SegBuf[4] = f / 1000 % 10;SegBuf[5] = f / 100 % 10;SegBuf[6] = f / 10 % 10;SegPoint[6] = 0;SegBuf[7] = f % 10;i = 3;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}else{T = 1000000 / f;SegBuf[1] = T / 1000000 % 10;SegBuf[2] = T / 100000 % 10;SegBuf[3] = T / 10000 % 10;SegBuf[4] = T / 1000 % 10;SegBuf[5] = T / 100 % 10;SegBuf[6] = T / 10 % 10;SegPoint[6] = 0;SegBuf[7] = T % 10;i = 1;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;if(!TemMode){SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}else{SegBuf[5] = 10;SegBuf[6] = Tem_10x / 100;SegBuf[7] = Tem_10x / 10 % 10;SegPoint[6] = 0;}}
}void LedProc()
{ucLed[0] = !SegMode;ucLed[1] = SegMode;ucLed[2] = CountFlag;ucLed[7] = LedFlash;LedDisp(ucLed);
}void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;			//定時器時鐘12T模式TMOD &= 0xF0;			//設置定時器模式TMOD |= 0x05;			//設置定時器模式TL0 = 0;				//設置定時初始值TH0 = 0;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時
}void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定時器時鐘12T模式TMOD &= 0x0F;			//設置定時器模式TL1 = 0x18;				//設置定時初始值TH1 = 0xFC;				//設置定時初始值TF1 = 0;				//清除TF1標志TR1 = 1;				//定時器1開始計時ET1 = 1;				//使能定時器1中斷EA = 1;
}void Timer1_Isr(void) interrupt 3
{if(++Key_Slow == 10) Key_Slow = 0; //按鍵延遲if(++Seg_Slow == 200) Seg_Slow = 0; //數碼管延遲if(++SegPos == 8) SegPos = 0;SegDisp(SegPos,SegBuf[SegPos],SegPoint[SegPos]);if(++Time_1s == 1000){Time_1s = 0;f = (TH0 << 8) | TL0;TH0 = TL0 = 0;}if(CountFlag){if(++Time_1s_Led == 1000){Time_1s_Led = 0;CountFlag = 0;}}if(LedFlag){if(++Time_100ms == 100){Time_100ms = 0;LedFlash ^= 1;}}else{Time_100ms = 0;LedFlash = 0;}
}void main()
{SystemInit();Timer0_Init();Timer1_Init();while(1){KeyProc();SegProc();LedProc();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70921.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CT技術變遷史——CT是如何誕生的?

第一代CT(平移-旋轉) X線球管為固定陽極,發射X線為直線筆形束,一個探測器,采用直線和旋轉掃描相結合,即直線掃描后,旋轉1次,再行直線掃描,旋轉180完成一層面掃描,掃描時間3~6分鐘。矩陣象素256256或320320。僅用于顱腦檢查。 第二代CT (平移-旋轉) 與第一代無質…

Virtual Box虛擬機安裝蘋果Monterey和big sur版本實踐

虛擬機安裝蘋果實踐&#xff0c;在Windows10系統&#xff0c;安裝Virtual Box7.1.6&#xff0c;安裝虛擬蘋果Monterey版本Monterey (macOS 12) 。碰到的主要問題是安裝光盤不像Windows那么容易拿到&#xff0c;而且根據網上很多文章制作的光盤&#xff0c;在viritualBox里都無法…

dify基礎之prompts

摘要&#xff1a;在大型語言模型&#xff08;LLM&#xff09;應用中&#xff0c;Prompt&#xff08;提示詞&#xff09;是連接用戶意圖與模型輸出的核心工具。本文從概念、組成、設計原則到實踐案例&#xff0c;系統講解如何通過Prompt解鎖LLM的潛能&#xff0c;提升生成內容的…

【學寫LibreCAD】0 仿寫LibreCAD簡介

一、LibreCAD 核心模塊&#xff1a; 核心模塊&#xff08;Core&#xff09; 功能&#xff1a;處理 CAD 的核心邏輯&#xff0c;如幾何計算、圖形對象管理、坐標系轉換等。關鍵組件&#xff1a; 圖形對象&#xff1a;如直線、圓、圓弧、多段線等。數學工具&#xff1a;向量、矩…

HTML元素,標簽到底指的哪塊部分?單雙標簽何時使用?

1. 標簽&#xff08;Tag&#xff09; vs 元素&#xff08;Element&#xff09; 標簽&#xff08;Tag&#xff09; 標簽是 HTML 中用于定義元素的符號&#xff0c;用尖括號 < > 包裹。例如 <img> 是標簽。元素&#xff08;Element&#xff09; 元素是由 標簽 內容…

Android APK組成編譯打包流程詳解

Android APK&#xff08;Android Package&#xff09;是 Android 應用的安裝包文件&#xff0c;其組成和打包流程涉及多個步驟和文件結構。以下是詳細的說明&#xff1a; 一、APK 的組成 APK 是一個 ZIP 格式的壓縮包&#xff0c;包含應用運行所需的所有文件。解壓后主要包含以…

Token相關設計

文章目錄 1. 雙Token 機制概述1.1 訪問令牌&#xff08;Access Token&#xff09;1.2 刷新令牌&#xff08;Refresh Token&#xff09; 2. 雙Token 認證流程3. Spring Boot 具體實現3.1 生成 Token&#xff08;使用 JWT&#xff09;3.2 解析 Token3.3 登錄接口&#xff08;返回…

HTTP 請求時傳遞多部分表單數據

HTTP 請求時傳遞多部分表單數據&#xff08;multipart/form-data&#xff09; --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基礎關鍵_013_日期處理

目 錄 一、傳統 API 1.System.currentTimeMillis() &#xff08;1&#xff09;說明 &#xff08;2&#xff09;實例 2.構造方法 &#xff08;1&#xff09;說明 &#xff08;2&#xff09;無參構造 &#xff08;3&#xff09;有參構造 3.日期格式化 &#xff08;1&am…

51單片機中reg52.h與regx52.h在進行位操作時的不同

reg52.h中不能使用例如 P2_0;這樣的定義 而只能使用 P2^0;這樣的定義 但是都不可以對位進行直接賦值操作&#xff1b; 而 regx52.h中可以使用 P2_0和P2^0&#xff1b;但是只有使用下劃線的才可以對位進行賦值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 語言中&#xff0c;…

基于Rook的Ceph云原生存儲部署與實踐指南(上)

#作者&#xff1a;任少近 文章目錄 1 Ceph環境準備2 rook部署ceph群集2.1 Rook 幫助地址2.2 安裝ceph2.3 獲取csi鏡像2.4 Master參加到osd2.5 設置默認存儲 3 Rook部署云原生RBD塊存儲3.1 部署storageclass資源3.2 部署WordPress使用RBD3.3 WordPress訪問 4 Rook部署云原生RGW…

FastExcel與Reactor響應式編程深度集成技術解析

一、技術融合背景與核心價值 在2025年企業級應用開發中&#xff0c;大規模異步Excel處理與響應式系統架構的結合已成為技術剛需。FastExcel與Reactor的整合方案&#xff0c;通過以下技術協同實現突破性性能&#xff1a; 內存效率革命&#xff1a;FastExcel的流式字節操作與Re…

DeepSeek R1/V3滿血版——在線體驗與API調用

前言&#xff1a;在人工智能的大模型發展進程中&#xff0c;每一次新模型的亮相都宛如一顆投入湖面的石子&#xff0c;激起層層波瀾。如今&#xff0c;DeepSeek R1/V3 滿血版強勢登場&#xff0c;為大模型應用領域帶來了全新的活力與變革。 本文不但介紹在線體驗 DeepSeek R1/…

Spring Data JPA 中的分頁實現:從 BasePage 到 Pageable

文章目錄 Spring Data JPA 中的分頁實現&#xff1a;從 BasePage 到 Pageable背景&#xff1a;為什么需要分頁&#xff1f;認識 BasePage 類深入 toPageable() 方法1. 處理頁碼和頁面大小2. 處理排序方向3. 處理排序字段4. 生成 Pageable 對象 實戰&#xff1a;如何使用 BasePa…

Android Studio 新版本Gradle發布本地Maven倉庫示例

發布代碼到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 倉庫發布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…

python量化交易——金融數據管理最佳實踐——qteasy創建本地數據源

文章目錄 qteasy金融歷史數據管理總體介紹本地數據源——DataSource對象默認數據源查看數據表查看數據源的整體信息最重要的數據表其他的數據表 從數據表中獲取數據向數據表中添加數據刪除數據表 —— 請盡量小心&#xff0c;刪除后無法恢復&#xff01;&#xff01;總結 qteas…

Android中使用Robolectric測試點擊事件(不需要手機)

文章目錄 一、前言二、簡單示例三、參考文檔 一、前言 Robolectric 是一個由 Google 維護的開源 Android 測試框架&#xff0c;它允許你以 Android 運行時環境運行單元測試。 Robolectric 提供了一個模擬 Android 運行時環境&#xff0c;允許你測試你的代碼是否正確地使用 And…

Spring Boot 接口 JSON 序列化優化:忽略 Null 值的九種解決方案詳解

一、針對特定接口null的處理&#xff1a; 方法一&#xff1a;使用 JsonInclude 注解 1.1 類級別&#xff1a;在接口返回的 ?DTO 類或字段? 上添加 JsonInclude 注解&#xff0c;強制忽略 null 值&#xff1a; 類級別&#xff1a;所有字段為 null 時不返回 JsonInclude(Js…

ds回答-開源llm應用開發平臺

以下是幾個著名的開源 LLM 應用開發平臺&#xff0c;涵蓋不同場景和技術特點&#xff1a; 1. Dify 特點&#xff1a;低代碼 / 無代碼開發、支持 RAG 檢索、Agent 智能體、模型管理、LLMOps 全流程優化。核心功能&#xff1a;可視化工作流編排、數百種模型兼容&#xff08;如 GP…

LDR6020 PD3.1 協議芯片在特定設備中的應用

在電子設備互聯互通的時代&#xff0c;芯片技術成為提升設備性能與功能的關鍵驅動力。LDR6020 PD3.1 協議芯片以其出色的性能&#xff0c;在 TYPE-C 臺式顯示器 / 便攜顯示器、一拖二快充線以及手機電腦轉接器等設備中展現出獨特價值&#xff0c;為用戶帶來更便捷、高效的使用體…