第十五屆藍橋杯單片機省賽程序設計試題

同時也是積分賽——測量NE555輸出脈沖頻率

第十五屆 藍橋杯 單片機設計與開發項目 省賽1

第二部分 程序設計試題(85 分)

(大學組)

?基本要求


1、使用大賽組委會統一提供的四梯單片機競賽實訓平臺,完成本試題程序設計與調試。

2、參考資料:選手在程序設計與調試過程中,可參考組委會提供的“資源數據包”。

3、提交要求:程序編寫、調試完成后,選手應通過考試系統提交完整、可編譯的 Keil工程壓縮包,壓縮包以準考證號命名。選手提交的工程應是最終版本,工程文件夾內應包含以準考證號命名的?hex?文件,該 hex 文件是成績評審的依據。請勿上傳與作品工程文件無關的其他文件,不符合文件提交和命名要求的作品將被評為零分,最終上傳的壓縮文件大小控制在?30MB?以內。

4、硬件配置

① 將 IAP15F2K61S2 單片機內部振蕩器頻率設定為 12MHz。

② 鍵盤工作模式跳線 J5 配置為矩陣鍵盤(KBD)模式。

③ 擴展方式跳線 J13 配置為 IO 模式。

選手需嚴格按照以上要求配置競賽板,編寫和調試程序不符合以上配置要求的作品將被評為零分。

注意:以上提交要求為第十五屆藍橋杯正式比賽提交要求。

本次評審提交要求:程序編寫、調試完成后,選手需通過考試系統提交以準考證號命名的hex文件。

?硬件框圖


圖 1 系統硬件框圖

?功能描述


3.1 功能概述

1、通過單片機 P34 引腳測量 NE555 輸出的脈沖信號頻率。

2、支持頻率數據校準功能。

3、支持頻率超限報警功能。

4、通過讀取 DS1302 RTC 芯片,獲取時間數據。

5、通過數碼管完成題目要求的數據顯示功能。

6、通過鍵盤實現界面切換、參數設定等功能。

7、通過 PCF8591 實現 DAC 輸出功能。

8、通過 LED 指示燈完成題目要求的輸出指示和狀態反饋功能。

3.2 性能要求

1、頻率測量精度:±8%。

2、按鍵動作響應時間:≤0.1 秒。

3、指示燈動作響應時間:≤0.1 秒。

4、數碼管動態掃描周期、位選通間隔均勻,顯示效果清晰、穩定,無閃爍、過暗、亮度不均等明顯缺陷。

3.3 顯示功能

1、頻率界面

頻率界面如圖 2 所示,顯示內容包括界面編號(F)和頻率數據,頻率數據單位為 Hz,整數。

圖 2 頻率界面

通過 5 位數碼管顯示頻率數據,當數據長度不足 5 位時高位(左側)熄滅。

2、參數界面

超限參數界面如圖 3 所示,顯示內容包括界面編號(P1)和超限參數 PF,單位為 Hz,整數。

圖 3 超限參數界面

校準值參數界面如圖 4-1/3 所示,顯示內容包括界面編號(P2)和校準值參數,單位為 Hz,整數。

圖 4-1 校準值參數界面(正數)

圖 4-2 校準值參數界面(負數)

圖 4-3 校準值參數界面(0)

通過 4 位數碼管顯示校準值參數,負數顯示符號。

3、時間界面

時間界面如圖 5 所示,顯示內容包括時、分、秒數據和間隔符“-”,時、分、秒數據固定使用 2 位數碼管顯示,不足 2 位補 0。

圖 5 時間界面

4、回顯界面

頻率回顯界面如圖 6-1 所示,由界面編號(hF)和最大頻率值組成。

圖 6-1 回顯界面(頻率)

通過 5 位數碼管顯示最大頻率數據,當數據長度不足 5 位時高位(左側)熄滅。

時間回顯界面如圖 6-2 所示,由界面編號(hA)和最大頻率發生的時間組成。

圖 6-2 回顯界面(時間)

5、顯示功能設計要求

① 按照題目要求的界面格式和切換方式進行設計。

② 數碼管顯示穩定、清晰,無重影、閃爍、過暗、亮度不均勻等嚴重影響顯示效果的設計缺陷。

③ 數碼管顯示內容刷新率≤0.1 秒。

④ 切換不同的數碼管顯示界面,不影響頻率采集和 DAC 輸出功能。

3.4 頻率測量功能

1、頻率測量:測量 NE555 輸出信號的頻率。

2、頻率校準:系統內置頻率校準值參數,取值范圍-900 到 900Hz ,直接測量到的頻率數據加校準值參數,作為頻率數據的最終結果。若校準后頻率為負數,頻率界面數碼管顯示 LL,表示此狀態錯誤。

3、頻率最大值統計:統計最大頻率值和發生時間,并可以在回顯界面顯示。

3.5 DAC 輸出功能

通過 PCF8591 實現 DAC 輸出功能,DAC 輸出與測量頻率關系如圖 7 所示。

圖 7 DAC 輸出與頻率數據的對應關系

PF代指超限參數,單位為 Hz。

** 若頻率狀態錯誤(校準后為負),DAC 固定輸出 0V。

3.6 按鍵功能

1、功能說明

使用 S4、S5、S8、S9 完成界面切換與設置功能。

S4:定義為“界面”按鍵,按下 S4 按鍵,切換頻率、參數、時間和回顯四個界面,切換模式如圖 8 所示。

圖 8 界面切換模式

S4:按鍵在任意界面下有效。

S5:定義為“選擇”按鍵,在參數和回顯界面下有效。

① 參數界面下,按下 S5 按鍵,切換超限參數(圖 3)和校準值參數(圖 4-1/3)兩個子界面,切換模式如圖 9 所示。

圖 9 參數子界面切換模式

要求:每次從頻率界面切換到參數界面時,處于超限參數子界面。

② 回顯界面下,按下 S5 按鍵,切換頻率回顯(圖 6-1)和時間回顯(圖 6-2)兩個子界面,切換模式如圖 10 所示。

圖 10 回顯子界面切換模式

要求:每次從時間界面切換到回顯界面時,處于頻率回顯子界面。

S8、S9?分別定義為 “加”和“減”按鍵,在參數界面的兩個子界面下有效。

① 超限參數界面下,按下 S8 按鍵,超限參數增加 1000Hz,按下 S9 按鍵,超限參數減小 1000Hz。

② 校準值參數界面下,按下 S8 按鍵,校準值參數增加 100Hz, 按下S9 按鍵,校準值參數減小 100Hz。

2、按鍵功能設計要求

① 按鍵應做好消抖處理,避免出現一次按鍵動作導致功能多次觸發。

② 按鍵動作不影響數據采集和數碼管顯示等其他功能。

③ 參數調整時,考慮邊界值范圍,不出現無效參數。

④ S5超限參數可調整范圍:1000Hz ~ 9000Hz

⑤ 校準值參數可調整范圍:-900Hz ~ 900Hz

3.7 LED 指示燈功能

1、界面指示燈

頻率界面下指示燈 L1 以 0.2 秒為間隔切換亮、滅狀態,其它界面下熄滅。

2、報警指示燈

當前頻率數據大于超限參數時,指示燈 L2 以 0.2 秒為間隔切換亮、滅狀態,否則熄滅。

** 若頻率狀態錯誤(校準后為負),L2 指示燈點亮。

3、其余試題未涉及的指示燈均處于熄滅狀態。

?初始狀態


請嚴格按照以下要求設計作品的上電初始狀態。

1) 處于頻率界面。

2) 頻率超限參數:2000Hz。

3) 頻率校準值參數:0。

代碼實現

sys.h

#ifndef __SYS_H__
#define __SYS_H__#include <STC15F2K60S2.H>//ds1302.c
extern unsigned char time[3];
void w_ds1302();
void r_ds1302();//iic.c
void dac(unsigned char date);//sys.c
extern bit ui1_choose;
extern bit ui3_choose;
extern bit flag_error;
extern int st_ne555;
extern unsigned char UI;
extern unsigned int ne555;
extern unsigned int max_ne555;
extern unsigned int line_ne555;
extern unsigned int time_max[3];
void init74hc138(unsigned char n);
void led(unsigned char n);
void ne555_dac();
void no_led();
void init();//seg_key.c
extern unsigned char Seg_Buff[8];
void Seg_Loop();
void Key_Loop();
void seg_ui();#endif

main.c

#include "sys.h"	
bit flag_seg=0;
bit flag_key=0;
bit flag_time=0;
bit flag_ne555=0;
bit flag_more=0;
void Timer0_Init(void)		//用作計數器
{TMOD &= 0xF0;			//設置定時器模式TMOD |= 0x05;			//設置為計數器模式TL0 = 0x00;				//設置定時初始值TH0 = 0x00;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時ET0 = 0;//關中斷
}
void Timer1_Init(void)		//100微秒@12.000MHz
{AUXR |= 0x40;			//定時器時鐘1T模式TMOD &= 0x0F;			//設置定時器模式TL1 = 0x50;				//設置定時初始值TH1 = 0xFB;				//設置定時初始值TF1 = 0;				//清除TF1標志TR1 = 1;				//定時器1開始計時ET1 = 1;				//使能定時器1中斷EA = 1;
}
unsigned int get_ne555(){unsigned int temp;temp=TH0<<8|TL0;TH0=0X00;TL0=0X00;if(TF0){return 0xffff;}else{if(st_ne555<0&&(-st_ne555)>temp)flag_error=1;else flag_error=0;return temp+st_ne555;}
}
void catch_max(){if(max_ne555<ne555){max_ne555=ne555;time_max[0]=time[0];time_max[1]=time[1];time_max[2]=time[2];}
}
void main(){init();Timer0_Init();Timer1_Init();w_ds1302();while(1){if(flag_seg){flag_seg=0;Seg_Loop();}if(flag_key){flag_key=0;Key_Loop();seg_ui();}if(flag_time){flag_time=0;r_ds1302();}if(flag_ne555){flag_ne555=0;ne555=get_ne555();ne555_dac();seg_ui();}//記錄頻率最大值及其時間catch_max();//錯誤狀態指示if(flag_error) led(2);else no_led();//報警指示,當前頻率大于超限參數if(ne555>line_ne555) flag_more=1;else flag_more=0;}
}
void Timer1_Isr(void) interrupt 3
{static unsigned char count1=0;static unsigned char count2=0;static unsigned int count3=0;static unsigned int count_ne555;static unsigned int count_line=0;static unsigned int count_led1=0;count1++;count2++;count3++;count_ne555++;if(count1==2){count1=0;flag_seg=1;}if(count2==50){count2=0;flag_key=1;}if(count3==5000){count3=0;flag_time=1;}if(count_ne555==10000){count_ne555=0;flag_ne555=1;}if(flag_more){count_line++;if(count_line<=2000) led(2);else if(count_line<=4000) no_led();else{ count_line=0; led(2); }}else{ count_line=0; no_led(); }if(UI==0){count_led1++;if(count_led1<=2000) led(1);else if(count_led1<=4000) no_led();else{ count_led1=0; led(1); }}else{ count_led1=0; no_led(); }
}

sys.c

#include "sys.h"	
unsigned char UI=0;//s4控制
//界面標志位:0為頻率界面;1為參數界面;2為時間界面;3為回顯界面bit ui1_choose=0;							//參數界面下,0為超限參數;1為校準值
bit ui3_choose=0;							//回顯界面下,0為頻率回顯;1為時間回顯
//以上選擇由s5控制
bit flag_error=0;							//界面錯誤狀態標志int st_ne555=0;								//校準值參數 -900HZ~900HZ
unsigned int ne555;						//經校準后的頻率
unsigned int max_ne555;				//記錄頻率最大值
unsigned int time_max[3];			//記錄頻率最大時的時間
unsigned int line_ne555=2000;	//超限參數 1000HZ~9000HZvoid init74hc138(unsigned char n){P2=(P2&0x1f)|(n<<5);P2&=0x1f;
}
void init(){P0=0x00;init74hc138(5);P0=0xff;init74hc138(4);
}
unsigned char v_num_dac(float num){return (unsigned char)(num/5.0*255);
}
//看曲線寫函數
void ne555_dac(){unsigned char temp;if(flag_error){temp=v_num_dac(0.0);}else if(ne555<500){temp=v_num_dac(1.0);}else if(ne555<line_ne555){temp=v_num_dac(1.0+(ne555-500)*(4.0/(line_ne555-500)));}else{temp=v_num_dac(5.0);}dac(temp);
}
void led(unsigned char n){P0=~(0x01<<(n-1));init74hc138(4);
}
void no_led(){P0=0xff;init74hc138(4);
}

seg_key.c

#include "sys.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
0x88, //A 10
0x8e, //F 11
0x89, //H 12
0xc7, //L 13
0x8c, //P 14
0xbf, //- 15
0xff  //熄滅 16 
};
unsigned char Seg_Buff[8]={16,16,16,16,16,16,16,16};
unsigned char keyval,keyold,keyup,keydown;
void seg(unsigned char addr,num){P0=0xff;init74hc138(7);P0=0x01<<addr;init74hc138(6);P0=Seg_Table[num];init74hc138(7);
}
void Seg_Loop(){static unsigned char i=0;seg(i,Seg_Buff[i]);i++;if(i==8)i=0;
}
unsigned char key_scan(){P44=0;P42=1;if(P33==0)return 4;if(P32==0)return 5;P44=1;P42=0;if(P33==0)return 8;if(P32==0)return 9;return 0;
}
void Key_Loop(){keyval=key_scan();keydown=keyval&(keyold^keyval);keyup=~keyval&(keyold^keyval);//s4為界面按鍵,在任意界面下有效if(keyval==4&&keyold!=4){UI++;if(UI==4)UI=0;ui1_choose=0;ui3_choose=0;}//s5為選擇按鍵,在參數(1)和回顯(3)界面下有效if(keyval==5&&keyold!=5){if(UI==1)ui1_choose=!ui1_choose;if(UI==3)ui3_choose=!ui3_choose;}//s8為加按鍵if(keyval==8&&keyold!=8){if(UI==1){if(ui1_choose){//在校準值參數界面,校準值參數加100HZif(st_ne555<900)st_ne555+=100;}else{//在超限參數界面,超限參數加1000HZif(line_ne555<9000)line_ne555+=1000;}}}//s9為減按鍵if(keyval==9&&keyold!=9){if(UI==1){if(ui1_choose){//在校準值參數界面,校準值參數減100HZif(st_ne555>-900)st_ne555-=100;}else{//在超限參數界面,超限參數減1000HZif(line_ne555>1000)line_ne555-=1000;}}}keyold=keyval;
}
//頻率界面顯示
void ui0(){Seg_Buff[0]=11;	//FSeg_Buff[1]=16;	//熄滅Seg_Buff[2]=16;	//熄滅if(flag_error==0){Seg_Buff[7]=ne555%10;if(ne555>=10)Seg_Buff[6]=ne555/10%10;elseSeg_Buff[6]=16;if(ne555>=100)Seg_Buff[5]=ne555/100%10;elseSeg_Buff[5]=16;if(ne555>=1000)Seg_Buff[4]=ne555/1000%10;elseSeg_Buff[4]=16;if(ne555>=10000)Seg_Buff[3]=ne555/10000%10;elseSeg_Buff[3]=16;}else{//校準后的頻率小于0,進入錯誤狀態Seg_Buff[7]=13;Seg_Buff[6]=13;Seg_Buff[5]=16;Seg_Buff[4]=16;Seg_Buff[3]=16;Seg_Buff[2]=16;Seg_Buff[1]=16;}
}
//參數界面_超限參數顯示
void ui1_0(){Seg_Buff[0]=14;	//PSeg_Buff[1]=1;	//1Seg_Buff[2]=16;	//熄滅Seg_Buff[3]=16;	//熄滅Seg_Buff[7]=line_ne555%10;if(line_ne555>=10)Seg_Buff[6]=line_ne555/10%10;elseSeg_Buff[6]=16;if(line_ne555>=100)Seg_Buff[5]=line_ne555/100%10;elseSeg_Buff[5]=16;if(line_ne555>=1000)Seg_Buff[4]=line_ne555/1000%10;elseSeg_Buff[4]=16;
}
//參數界面_校準值參數顯示
void ui1_1(){unsigned int tst_ne555;Seg_Buff[0]=14;	//PSeg_Buff[1]=2;	//2Seg_Buff[2]=16;	//熄滅Seg_Buff[3]=16;	//熄滅if(st_ne555<0) tst_ne555=-st_ne555;else tst_ne555=st_ne555;Seg_Buff[7]=tst_ne555%10;if(tst_ne555>=10)Seg_Buff[6]=tst_ne555/10%10;elseSeg_Buff[6]=16;if(tst_ne555>=100)Seg_Buff[5]=tst_ne555/100%10;elseSeg_Buff[5]=16;if(st_ne555<0)Seg_Buff[4]=15;//-號elseSeg_Buff[4]=16;
}
//時間界面
void ui2(){//秒Seg_Buff[7]=time[0]%10;Seg_Buff[6]=time[0]/10;Seg_Buff[5]=15;//分Seg_Buff[4]=time[1]%10;Seg_Buff[3]=time[1]/10;Seg_Buff[2]=15;//時Seg_Buff[1]=time[2]%10;Seg_Buff[0]=time[2]/10;
}
//回顯界面_頻率回顯顯示
void ui3_0(){Seg_Buff[0]=12;	//HSeg_Buff[1]=11;	//FSeg_Buff[2]=16;	//熄滅Seg_Buff[7]=max_ne555%10;if(max_ne555>=10)Seg_Buff[6]=max_ne555/10%10;elseSeg_Buff[6]=16;if(max_ne555>=100)Seg_Buff[5]=max_ne555/100%10;elseSeg_Buff[5]=16;if(max_ne555>=1000)Seg_Buff[4]=max_ne555/1000%10;elseSeg_Buff[4]=16;if(max_ne555>=10000)Seg_Buff[3]=max_ne555/10000%10;elseSeg_Buff[3]=16;
}
//回顯界面_時間回顯顯示
void ui3_1(){Seg_Buff[0]=12;	//HSeg_Buff[1]=10;	//ASeg_Buff[7]=time_max[0]%10;Seg_Buff[6]=time_max[0]/10;Seg_Buff[5]=time_max[1]%10;Seg_Buff[4]=time_max[1]/10;Seg_Buff[3]=time_max[2]%10;Seg_Buff[2]=time_max[2]/10;
}
void seg_ui(){switch(UI){case 0:ui0();break;case 1:if(ui1_choose) ui1_1();else ui1_0();break;case 2:ui2();break;case 3:if(ui3_choose) ui3_1();else ui3_0();break;}
}

ds1302.c

#include "sys.h"							
#include "intrins.h"
sbit RST=P1^3;
sbit SDA=P2^3;
sbit SCK=P1^7;
unsigned char time[3]={5,3,13};
void Write_Ds1302(unsigned  char temp) 
{unsigned char i;for (i=0;i<8;i++)     	{ SCK = 0;SDA = temp&0x01;temp>>=1; SCK=1;}
}   
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{RST=0;	_nop_();SCK=0;	_nop_();RST=1; 	_nop_();  Write_Ds1302(address);	Write_Ds1302(dat/10*16|dat%10);		RST=0; 
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;unsigned char dat1,dat2;RST=0;	_nop_();SCK=0;	_nop_();RST=1;	_nop_();Write_Ds1302(address);for (i=0;i<8;i++) 	{		SCK=0;temp>>=1;	if(SDA)temp|=0x80;	SCK=1;} RST=0;	_nop_();SCK=0;	_nop_();SCK=1;	_nop_();SDA=0;	_nop_();SDA=1;	_nop_();dat1=temp/16;dat2=temp%16;temp=dat1*10+dat2;return (temp);			
}
void w_ds1302(){unsigned char i,addr=0x80;Write_Ds1302_Byte(0x8e,0x00);for(i=0;i<3;i++){Write_Ds1302_Byte(addr,time[i]);addr+=2;}Write_Ds1302_Byte(0x8e,0x80);
}
void r_ds1302(){unsigned char i,addr=0x81;for(i=0;i<3;i++){time[i]=Read_Ds1302_Byte(addr);addr+=2;}
}

iic.c

#include "sys.h"							
#include "intrins.h"
#define DELAY_TIME	5
sbit sda=P2^1;
sbit scl=P2^0;static void I2C_Delay(unsigned char n)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();		}while(n--);      	
}
void I2CStart(void)
{sda = 1;scl = 1;I2C_Delay(DELAY_TIME);sda = 0;I2C_Delay(DELAY_TIME);scl = 0;    
}
void I2CStop(void)
{sda = 0;scl = 1;I2C_Delay(DELAY_TIME);sda = 1;I2C_Delay(DELAY_TIME);
}
void I2CSendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){scl = 0;I2C_Delay(DELAY_TIME);if(byt & 0x80){sda = 1;}else{sda = 0;}I2C_Delay(DELAY_TIME);scl = 1;byt <<= 1;I2C_Delay(DELAY_TIME);}scl = 0;  
}
//unsigned char I2CReceiveByte(void)
//{
//	unsigned char da;
//	unsigned char i;
//	for(i=0;i<8;i++){   
//		scl = 1;
//		I2C_Delay(DELAY_TIME);
//		da <<= 1;
//		if(sda) 
//			da |= 0x01;
//		scl = 0;
//		I2C_Delay(DELAY_TIME);
//	}
//	return da;    
//}
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl = 1;I2C_Delay(DELAY_TIME);ackbit = sda; scl = 0;I2C_Delay(DELAY_TIME);return ackbit;
}
//void I2CSendAck(unsigned char ackbit)
//{
//    scl = 0;
//    sda = ackbit; 
//	I2C_Delay(DELAY_TIME);
//    scl = 1;
//	I2C_Delay(DELAY_TIME);
//    scl = 0; 
//	sda = 1;
//	I2C_Delay(DELAY_TIME);
//}
void dac(unsigned char date){I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x43);I2CWaitAck();I2CSendByte(date);I2CWaitAck();I2CStop();
}

待解決的問題

指示燈頻率的問題一直沒有做正確過,絞盡腦汁也沒辦法解決啊啊啊啊啊啊

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

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

相關文章

JavaScript智能對話機器人——企業知識庫自動化

引言 內部知識管理常面臨信息分散、查找困難的問題。本文將使用Node.js和虎躍辦公的智能對話API&#xff0c;構建企業級知識問答機器人&#xff0c;支持自然語言查詢和自動學習。 核心技術 自然語言處理&#xff08;NLP&#xff09;意圖識別機器學習模型微調REST API集成 代…

元宇宙浪潮下,前端開發如何“乘風破浪”?

一、元宇宙對前端開發的新要求 元宇宙的興起&#xff0c;為前端開發領域帶來了全新的挑戰與機遇。元宇宙作為一個高度集成、多維互動的虛擬世界&#xff0c;要求前端開發不僅具備傳統網頁開發的能力&#xff0c;還需要掌握虛擬現實&#xff08;VR&#xff09;、增強現實&#…

Spring Boot 3.4.3 基于 Caffeine 實現本地緩存

在現代企業級應用中,緩存是提升系統性能和響應速度的關鍵技術。通過減少數據庫查詢或復雜計算的頻率,緩存可以顯著優化用戶體驗。Spring Boot 3.4.3 提供了強大的緩存抽象支持,而 Caffeine 作為一款高性能的本地緩存庫,因其優異的吞吐量和靈活的配置,成為許多開發者的首選…

QT Quick(C++)跨平臺應用程序項目實戰教程 6 — 彈出框

目錄 1. Popup組件介紹 2. 使用 上一章內容完成了音樂播放器程序的基本界面框架設計。本小節完成一個簡單的功能。單擊該播放器頂部菜單欄的“關于”按鈕&#xff0c;彈出該程序的相關版本信息。我們將使用Qt Quick的Popup組件來實現。 1. Popup組件介紹 Qt 中的 Popup 組件…

DuckDB系列教程:如何分析Parquet文件

Parquet 是一種強大的、基于列的存儲格式&#xff0c;適用于實現更快捷和更高效的數據分析。您可以使用 DuckDB 這種內存型分析數據庫來處理 Parquet 文件并運行查詢以對其進行分析。 在這篇文章中&#xff0c;我們將逐步介紹如何使用 DuckDB 對存儲在 Parquet 文件中的餐廳訂單…

異步框架使用loguru和contextvars實現日志按Id輸出

需求闡述 工作中使用fastStream模塊消費kafka事件的時候&#xff0c;遇到以下問題。1. 由于main.py模塊要用到許多其他模塊 &#xff0c;main模塊&#xff0c;和其他模塊都有日志輸出。2. 要實現異步消費事件&#xff0c;但是又不希望日志打印的很亂。3. 想著在每次消費事件的…

【HTTPS協議】

文章目錄 一、HTTPS二、HTTPS協議五種加密方案1.只使用對稱加密2.只使用非對稱加密3.雙方都使用非對稱加密4.對稱加密非對稱加密中間人攻擊理解數字簽名CA機構和證書 5. 對稱加密非對稱加密證書認證中間人篡改證書&#xff1f;中間人調包整個證書&#xff1f; 常見問題總結 一、…

算法設計學習8

實驗目的及要求&#xff1a; 通過深入學習樹&#xff08;Tree&#xff09;和二叉樹&#xff08;Binary Tree&#xff09;這兩種重要的數據結構&#xff0c;掌握它們的基本概念、性質和操作&#xff0c;提高對樹形結構的理解和應用能力。通過本實驗&#xff0c;學生將深化對樹和…

P17_ResNeXt-50

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、模型結構 ResNeXt-50由多個殘差塊&#xff08;Residual Block&#xff09;組成&#xff0c;每個殘差塊包含三個卷積層。以下是模型的主要結構&#xff1…

【YOLO系列(V5-V12)通用數據集-剪刀石頭布手勢檢測數據集】

YOLO格式的剪刀石頭布手勢檢測數據集&#xff0c;適用于YOLOv5-v11所有版本&#xff0c;可以用于本科畢設、發paper、做課設等等&#xff0c;有需要的在這里獲取&#xff1a; 【YOLO系列&#xff08;V5-V12&#xff09;通用數據集-剪刀石頭布手勢檢測數據集】 數據集專欄地址&a…

基于連接池與重試機制的高效TDengine寫入方案

摘要 在時序數據庫應用場景中,如何構建穩定高效的寫入機制是核心挑戰。本文基于提供的Python代碼實現,解析一種結合連接池管理、智能重試策略和事務控制的TDengine寫入方案,并分析其技術優勢與優化方向。 一、代碼 from dbutils.pooled_db import PooledDB import timede…

抖音熱點視頻識別與分片處理機制解析

抖音作為日活數億的短視頻平臺,其熱點視頻識別和分片處理機制是支撐高并發訪問的核心技術。以下是抖音熱點視頻識別與分片的實現方案: 熱點視頻識別機制 1. 實時行為監控系統 用戶行為聚合:監控點贊、評論、分享、完播率等指標的異常增長曲線內容特征分析:通過AI識別視頻…

基于RDK X3的“校史通“機器人:SLAM導航+智能交互,讓校史館活起來!

視頻標題&#xff1a; 【校史館の新晉頂流】RDK X3機器人&#xff1a;導覽員看了直呼內卷 視頻文案&#xff1a; 跑得賊穩團隊用RDK X3整了個大活——給校史館造了個"社牛"機器人&#xff01; 基于RDK X3開發板實現智能導航與語音交互SLAM技術讓機器人自主避障不…

Metal學習筆記十三:陰影

在本章中&#xff0c;您將了解陰影。陰影表示表面上沒有光。當另一個表面或對象使對象與光線相遮擋時&#xff0c;您會看到對象上的陰影。在項目中添加陰影可使您的場景看起來更逼真&#xff0c;并提供深度感。 陰影貼圖 陰影貼圖是包含場景陰影信息的紋理。當光線照射到物體…

Matplotlib:數據可視化的藝術與科學

引言&#xff1a;讓數據開口說話 在數據分析與機器學習領域&#xff0c;可視化是理解數據的重要橋梁。Matplotlib 作為 Python 最流行的繪圖庫&#xff0c;提供了從簡單折線圖到復雜 3D 圖表的完整解決方案。本文將通過實際案例&#xff0c;帶您從基礎繪圖到高級定制全面掌握 …

Python數據可視化-第4章-圖表樣式的美化

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容&#xff0c;本章為第4章 圖表樣式的美化 本章主要介紹了圖表樣式的美化&#xff0c;包括圖表樣式概述、使用顏色、選擇線型、添加數據標記、設置字體…

嵌入式海思Hi3861連接華為物聯網平臺操作方法

1.1 實驗目的 快速演示 1、認識輕量級HarmonyOS——LiteOS-M 2、初步掌握華為云物聯網平臺的使用 3、快速驅動海思Hi3861 WIFI芯片,連接互聯網并登錄物聯網平臺

如何在Redis容量限制下保持熱點數據

如何在Redis容量限制下保持熱點數據 當數據庫有100萬條數據但Redis只能保存10萬條時,需要智能的策略來確保Redis中存儲的都是最常訪問的熱點數據。以下是幾種有效的解決方案: 一、內存淘汰策略 Redis提供了多種內存淘汰機制,當內存不足時會自動刪除部分數據: 策略命令/配…

cv2.fillPoly()和cv2.polylines()

參數解釋 cv2.fillPoly() 和 cv2.polylines() 都是 OpenCV 的函數。功能是繪制多邊形&#xff0c;cv2.fillPoly()可繪制實心多邊形&#xff0c; cv2.polylines() 可繪制空心多邊形 cv2.fillPoly()用途&#xff1a;提取ROI 可在黑色圖像上&#xff0c;填充白色&#xff0c;作為…

數據庫--SQL

SQL&#xff1a;Structured Query Language&#xff0c;結構化查詢語言 SQL是用于管理關系型數據庫并對其中的數據進行一系列操作&#xff08;包括數據插入、查詢、修改刪除&#xff09;的一種語言 分類&#xff1a;數據定義語言DDL、數據操縱語言DML、數據控制語言DCL、事務處…