第16屆藍橋杯單片機4T模擬賽三

本次模擬賽涉及的模塊:基礎三件套(Led&Relay,按鍵、數碼管)+ 進階單件套(pcf8591的AD模塊)

附件:
在這里插入圖片描述

各模塊底層代碼在文章的結尾

一、數碼管部分

1.頁面1

頁面1要顯示的格式是:
最左邊的數碼管顯示字母C,最后兩位顯示濕度的十位和個位(不足兩位十位熄滅)

01234567
C30

在這里插入圖片描述

濕度是由pcf8591的AD模塊讀取通道3的電壓值轉換來的,他們的關系是(從圖轉換成函數)
h u m i d i t y = { 10 , U ≤ 1 0.266 ? U ? 16.666 , 1 ≤ U ≤ 4 90 , U ≥ 4 humidity = \begin{cases} 10,U\le1\\ 0.266*U-16.666,\,\,1\le U \le 4\\ 90,U\ge 4\\ \end{cases} humidity=? ? ??10,U10.266?U?16.666,1U490,U4?
所以在AD的處理函數就可以先將通道3的電壓讀出來后直接進行濕度轉換。下面給出的是用float型變量接收未放大的電壓值。

  • pcf8591.c底層代碼
#include <STC15F2K60S2.H>
#include <intrins.h>#define DELAY_TIME	5
sbit scl = P2^0;
sbit sda = P2^1;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);
}unsigned char ADRead()
{unsigned char temp = 0;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x03);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return temp;
}
  • main.c中調用
/*濕度*/
idata u8 humidity;//電壓轉換濕度void ADProc()
{float RB2 = ADRead() / 51.0;//讀取RB2的電壓//濕度轉換if(RB2 <= 1.0)humidity = 10;else if(RB2 >= 4.0)humidity = 90;elsehumidity = 80/3.0*RB2+10-80/3.0;
}
  • void SegProc()
    由于數碼管緩存區初始化時設置為8個數碼管均熄滅,所以只需對索引為0,6,7的數碼管賦值即可。
idata u8 SegPos;
pdata u8 SegBuf[8] = {10,10,10,10,10,10,10,10};void SegProc()
{switch(SegMode){case 0:SegBuf[0] = 11;//CSegBuf[6] = humidity / 10 ? humidity / 10 : 10;SegBuf[7] = humidity % 10;break;}
}void Timer0_Isr(void) interrupt 1
{if(++SegPos == 8)	SegPos = 0;SegDisp(SegPos, SegBuf[SegPos]);
}

2.頁面2

頁面2要顯示的格式是:
最左邊的數碼管顯示字母E,最后兩位顯示濕度參數的十位和個位(不足兩位十位熄滅)

濕度參數默認值為50

01234567
E50

這個就特別簡單了,頁面1的代碼直接復制下來就可以了,唯一要改的地方就是頁面2的顯示要對濕度參數的十位進行判斷,為0時熄滅。

idata u8 humidity_set = 50;void SegProc()
{switch(SegMode){case 1:SegBuf[0] = 12;//ESegBuf[6] = humidity_set / 10 ? humidity_set / 10 : 10;SegBuf[7] = humidity_set % 10;break;}
}

3. 頁面3

頁面3要顯示的格式是:
最左邊的數碼管顯示字母H,最后兩位顯示時間間隔的十位和個位(不足兩位十位熄滅)

時間間隔默認值為3。
時間間隔是繼電器點亮的間隔,跟數碼管沒關系,直接顯示即可。

01234567
E3
idata u8 time = 3;//時間間隔void SegProc()
{switch(SegMode){case 2:SegBuf[0] = 13;//HSegBuf[6] = time / 10 ? time / 10 : 10;SegBuf[7] = time % 10;break;}
}

二、按鍵部分

按鍵只用到了按鍵S4、S5、S8、S9。
按鍵S4是切換頁面,實現也很簡單。
按鍵5是繼電器啟動標志位,在任何界面按一次標志位取反。
在這里插入圖片描述

idata bit relay_work; //繼電器工作 0-停止 1-開始void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4://頁面流轉if(++SegMode == 3)SegMode = 0;break;case 5://切換繼電器工作模式relay_work = !relay_work;break;case 8://參數-if(SegMode == 1){humidity_set -= 5;if(humidity_set == 25)humidity_set = 90;}else if(SegMode == 2){if(--time == 0)time = 10;}break;case 9://參數+if(SegMode == 1){humidity_set += 5;if(humidity_set == 95)humidity_set = 30;}else if(SegMode == 2){if(++time == 11)time = 1;}break;}
}

三、繼電器部分

第一次寫繼電器的時候理解錯了,題目也沒有明確提到,根據第一次提交的測評分析這道題目的意思是繼電器工作模式下觸發吸合條件后繼電器吸合,經過一定時間間隔后斷開,持續處于該狀態不重復吸合,直到經過一次濕度>濕度參數后再次觸發條件(濕度<濕度參數),繼電器才吸合。

idata bit relay_work; //繼電器工作 0-停止 1-開始
idata bit relay_flag; //繼電器使能標志位
idata u16 TimeCount;  //定時器計時變量 
idata bit humidity_flag; //0-濕度值不小于參數 
idata bit humidity_has_flag;//0-繼電器未重復吸合 1-繼電器已重復吸合過
void LedProc()
{/*Relay*/if(!relay_work)//繼電器不工作{relay_flag = 0;//關閉繼電器humidity_has_flag = 0;//繼電器重復吸合標志位清零}else//繼電器工作{humidity_flag = (humidity < humidity_set);//如果濕度小于濕度參數,humidity_flag為真if(!humidity_flag)//如果濕度大于濕度參數humidity_has_flag = 0;//重復吸合標志位清零if(humidity_flag && !humidity_has_flag)//如果濕度小于濕度參數并且還未觸發繼電器吸合{humidity_has_flag = 1;//繼電器已經吸合過了relay_flag = 1;//繼電器開始工作}}Relay(relay_flag);
}void Timer0_Isr(void) interrupt 1
{//如果處于繼電器工作模式下并且繼電器開始工作時計時if(relay_work && relay_flag){if(++TimeCount == time*1000)//吸合后達到一定時間間隔斷開繼電器{TimeCount = 0;//計時變量清零relay_flag = 0;//繼電器不工作}}
}

四、代碼整合(改一下main函數可以運行)

Init.c

#include <STC15F2K60S2.H>void SystemInit()
{P0 = 0xff;P2 = P2 & 0x1f | 0x80;P2 &= 0x1f;P0 = 0x00;P2 = P2 & 0x1f | 0xa0;P2 &= 0x1f;
}

Led.h

#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;}
}void Relay(bit flag)
{unsigned char temp = 0x00;static unsigned char temp_old = 0xff;if(flag)temp |= 0x10;elsetemp &= 0xef;if(temp != temp_old){P0 = temp;P2 = P2 & 0x1f | 0xa0;P2 &= 0x1f;temp_old = temp;}
}

Key.h

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

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, //空
0xc6, //C
0x86, //E
0x89  //H
};void SegDisp(unsigned char wela, unsigned char dula)
{P0 = 0xff;P2 = P2 & 0x1f | 0xe0;P2 &= 0x1f;P0 = (0x01 << wela);P2 = P2 & 0x1f | 0xc0;P2 &= 0x1f;P0 = Seg_Table[dula];P2 = P2 & 0x1f | 0xe0;P2 &= 0x1f;
}

pcf8591.c

#include <STC15F2K60S2.H>
#include <intrins.h>#define DELAY_TIME	5
sbit scl = P2^0;
sbit sda = P2^1;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);
}unsigned char ADRead()
{unsigned char temp = 0;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x03);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return temp;
}

main.c

#include <STC15F2K60S2.H>
#include "Init.h"
#include "Led.h"
#include "Key.h"
#include "Seg.h"
#include "pcf8591.h"typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;/*按鍵*/
idata u8 KeyVal, KeyDown, KeyUp, KeyOld;
/*數碼管*/
idata u8 SegPos;
pdata u8 SegBuf[8] = {10,10,10,10,10,10,10,10};
idata u8 SegMode;
/*指示燈*/
pdata u8 ucLed[8] = {0,0,0,0,0,0,0,0};
idata bit relay_work; //繼電器工作 0-停止 1-開始
idata bit relay_flag; //繼電器使能標志位
idata u16 TimeCount;  //定時器計時變量 
/*濕度*/
idata u8 humidity;
idata u8 humidity_set = 50;
idata u8 time = 3;
idata bit humidity_flag; //0-濕度值不小于參數 
idata bit humidity_has_flag; void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:if(++SegMode == 3)SegMode = 0;break;case 5:relay_work = !relay_work;break;case 8:if(SegMode == 1){humidity_set -= 5;if(humidity_set == 25)humidity_set = 90;}else if(SegMode == 2){if(--time == 0)time = 10;}break;case 9:if(SegMode == 1){humidity_set += 5;if(humidity_set == 95)humidity_set = 30;}else if(SegMode == 2){if(++time == 11)time = 1;}break;}
}void SegProc()
{switch(SegMode){case 0:SegBuf[0] = 11;//CSegBuf[6] = humidity / 10 ? humidity / 10 : 10;SegBuf[7] = humidity % 10;break;case 1:SegBuf[0] = 12;//ESegBuf[6] = humidity_set / 10 ? humidity_set / 10 : 10;SegBuf[7] = humidity_set % 10;break;case 2:SegBuf[0] = 13;//HSegBuf[6] = time / 10 ? time / 10 : 10;SegBuf[7] = time % 10;break;}
}void LedProc()
{u8 i;/*Relay*/if(!relay_work){relay_flag = 0;humidity_has_flag = 0;}else{humidity_flag = (humidity < humidity_set);if(!humidity_flag)humidity_has_flag = 0;if(humidity_flag && !humidity_has_flag){humidity_has_flag = 1;relay_flag = 1;}}Relay(relay_flag);/*Led*/for(i = 0; i < 3; i++)ucLed[i] = (i == SegMode);ucLed[3] = relay_work;LedDisp(ucLed);
}void ADProc()
{float RB2 = ADRead() / 51.0;if(RB2 <= 1.0)humidity = 10;else if(RB2 >= 4.0)humidity = 90;elsehumidity = 80/3.0*RB2+10-80/3.0;
}void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;			//定時器時鐘12T模式TMOD &= 0xF0;			//設置定時器模式TL0 = 0x18;				//設置定時初始值TH0 = 0xFC;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時ET0 = 1;				//使能定時器0中斷EA = 1;
}void Timer0_Isr(void) interrupt 1
{if(++SegPos == 8)	SegPos = 0;SegDisp(SegPos, SegBuf[SegPos]);if(relay_work && relay_flag){if(++TimeCount == time*1000){TimeCount = 0;relay_flag = 0;}}
}void main()
{SystemInit();Timer0_Init();while(1){//...}
}

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

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

相關文章

網絡華為HCIA+HCIP IPv6

目錄 IPv4現狀 IPv6基本報頭 IPv6擴展報頭 IPv6地址 IPv6地址縮寫規范 ?編輯 IPv6地址分配 IPv6單播地址分配 IPv6單播地址接口標識 IPv6常見單播地址 - GUA &#xff08;2 / 3 開頭&#xff09; IPv6常見單播地址 - ULA IPv6常見單播地址 - LLA IPv6組播地…

基于YOLOv8深度學習的智能小麥害蟲檢測識別系統

作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗&#xff0c;被多個學校常年聘為校外企業導師&#xff0c;指導學生畢業設計并參與學生畢業答辯指導&#xff0c;…

Mac:Maven 下載+安裝+環境配置(詳細講解)

&#x1f4cc; 下載 Maven 下載地址&#xff1a;https://maven.apache.org/download.cgi &#x1f4cc; 無需安裝 Apache官網下載 Maven 壓縮包&#xff0c;無需安裝&#xff0c;下載解壓后放到自己指定目錄下即可。 按我自己的習慣&#xff0c;我會在用戶 jane 目錄下新建…

XSS-labs(反射型XSS) 靶場 1-13關 通關

目錄 前言 XSS漏洞概述 XSS漏洞分類 通關日記 level1 分析 解題 ?level2 分析 解題 方法一&#xff1a;閉合標簽 方法二&#xff1a;閉合雙引號 level3 分析 解題 level4 分析 解題 level5 分析 解題 level6 分析 解題 level7 分析 解體 level8 …

GPT-5 將免費向所有用戶開放?

GPT-5 將免費向所有用戶開放&#xff1f; 硅谷知名分析師 Ben Thompson 最近與 OpenAI CEO Sam Altman 進行了一場深度對談&#xff0c;其中Sam Altman透漏GPT-5將免費向大家發放。 OpenAI 這波操作可不是一時沖動&#xff0c;而是被逼出來的。DeepSeek 這個新秀橫空出世&am…

【雜記二】git, github, vscode等

一、前言 暫時空著... 二、git 2.1 可能的疑問 1. VSCode 項目名和 GitHub 倉庫名是否需要一致&#xff1f; 不需要一致。 VSCode 項目名&#xff08;也就是你本地的文件夾名字&#xff09;和 GitHub 倉庫名可以不一樣。 Git 是一個分布式版本控制系統&#xff0c;它主要關…

數學愛好者寫的編程系列文章

作為一個數學愛好者&#xff0c;我大學讀的專業卻不是數學專業&#xff0c;而是跟計算機有關的專業。原本我對編程一竅不通&#xff0c;平時上課也是在看數學文獻&#xff0c;作業基本靠同學&#xff0c;考試及格就行。不過后來因為畢業的壓力&#xff0c;我還是擁抱編程了&…

FPGA 以太網通信(四)網絡視頻傳輸系統

一、網絡視頻傳輸系統 網絡視頻傳輸系統使用ov5640攝像頭采集數據&#xff0c;通過組件UDP幀將視頻數據實時傳輸給上位機。 ov5640視頻傳輸帶寬 像素分辨率設為640x480&#xff0c;幀率設為60幀&#xff0c;像素格式為RGB565&#xff0c;傳輸帶寬為 640 x 480 x 16bit x 60 fps…

[leetcode]1631. 最小體力消耗路徑(bool類型dfs+二分答案/記憶化剪枝/并查集Kruskal思想)

題目鏈接 題意 給定 n m n\times m nm地圖 要從(1,1) 走到 (n,m) 定義高度絕對差為四聯通意義下相鄰的兩個點高度的絕對值之差 定義路徑的體力值為整條路徑上 所有高度絕對差的max 求所有路徑中 最小的路徑體力值是多少 方法1 這是我一開始自己寫的記憶化剪枝 比較暴力 時…

DeepSeek寫打臺球手機小游戲

DeepSeek寫打臺球手機小游戲 提問 根據提的要求&#xff0c;讓DeepSeek整理的需求&#xff0c;進行提問&#xff0c;內容如下&#xff1a; 請生成一個包含以下功能的可運行移動端打臺球小游戲H5文件&#xff1a; 要求 可以重新開始游戲 可以暫停游戲 有白球和其他顏色的球&am…

webpack使用詳細步驟

項目描述 本項目 webpack 的基本使用。 webpack 官方&#xff1a;https://webpack.docschina.org/concepts/ Element-plus 官方&#xff1a;https://element-plus.sxtxhy.com/zh-CN/ Vue3 官方&#xff1a;https://cn.vuejs.org/ 項目組成明細 每個步驟完成后重新執行 npm run …

【STM32實物】基于STM32的太陽能充電寶設計

基于STM32的太陽能充電寶設計 演示視頻: 基于STM32的太陽能充電寶設計 硬件組成: 系統硬件包括主控 STM32F103C8T6、0.96 OLED 顯示屏、蜂鳴器、電源自鎖開關、溫度傳感器 DS18B20、繼電器、5 V DC 升壓模塊 、TB4056、18650鋰電池、9 V太陽能板、穩壓降壓 5 V三極管。 功能…

【記一次】AI微調訓練步數計算方式

llama微調訓練步數計算方式,以下數據為假設 一、關鍵參數解析 總樣本數&#xff1a;Num examples 1,047 表示訓練數據集包含 1,047 個樣本。 訓練輪數&#xff1a;Num Epochs 300 表示整個訓練集將被遍歷 300 次。 總批次大小&#xff1a;Total train batch size 80 表示…

python-selenium 爬蟲 由易到難

本質 python第三方庫 selenium 控制 瀏覽器驅動 瀏覽器驅動控制瀏覽器 推薦 edge 瀏覽器驅動&#xff08;不容易遇到版本或者兼容性的問題&#xff09; 驅動下載網址&#xff1a;鏈接: link 1、實戰1 &#xff08;1&#xff09;安裝 selenium 庫 pip install selenium&#…

yaffs

YAFFS&#xff08;Yet Another Flash File System&#xff09;是專為NAND閃存設計的日志結構文件系統&#xff0c;其核心原理圍繞NAND閃存的特性優化數據管理。以下是其關鍵原理的詳細說明&#xff1a; 1. NAND閃存適配 寫入限制&#xff1a;NAND閃存需按頁寫入&#xff08;通…

git的底層原理

git的底層原理 三段話總結git&#xff0c; 1. 工作原理&#xff1a;git管理是一個DAG有向無環圖&#xff0c;HEAD指針指向branch或直接指向commit&#xff0c;branch指向commit&#xff0c;commit指向tree&#xff0c;tree指向別的tree或直接指向blob。 2. git所管理的一個目錄…

【計算機網絡原理】選擇題+簡答題

文章目錄 選擇題網絡基礎IP網絡拓撲 OSI七層模型協議HDLCTCP/IP 交換技術網絡安全數字簽名 算法與策略 簡答題UDPTCP 選擇題 網絡基礎 下列域名中&#xff0c;屬于國際頂級域名的是&#xff08;&#xff09; A. us B. tom C. edu D. int 下列關于光纖傳輸介質的敘述中錯誤的是…

Android數據加密方案

Android數據加密方案 前言 在移動應用開發中,數據安全是一個永恒的話題。Android應用中往往需要存儲和傳輸敏感數據,如用戶密碼、支付信息、個人隱私等。本文將深入介紹Android平臺上的數據加密方案,幫助開發者構建安全可靠的數據保護機制。 基礎知識 1. 加密算法分類 …

神聖的綫性代數速成例題13. 非齊次方程組解的性質、非齊次方程組解的討論

綫性空間的維數&#xff1a; 若綫性空間中存在一組綫性無關的矢量&#xff0c;使得中的任意矢量 都可以由綫性表示&#xff0c;則稱為綫性空間的維數&#xff0c;記作&#xff0c;稱為的一組基。 基與座標變換&#xff1a; 設和是維綫性空間的兩組基&#xff0c;且&#xff0c;…

github代理 | 快速clone項目

代理網址&#xff1a; https://ghproxy.com/ https://ghproxy.com/代理網址&#xff1a; https://ghproxy.com/ 比如需要克隆的項目git地址為&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui.git git clone https://ghproxy.com/https://github.com/AUTO…