51單片機——DS18B20溫度傳感器

????????由于DS18B20數字溫度傳感器是單總線接口,所以需要使用51單片機的一個IO口模擬單總線時序與DS18B20通信,將檢測的環境溫度讀取出來

1、DS18B20模塊電路

????????傳感器接口的單總線管腳接至單片機P3.7IO口上?

2、DS18B20介紹

2.1 DS18B20外觀實物圖?

????????管腳1為GND,管腳2為數據DQ,管腳3為VDD?

2.2 DS18B20內部結構圖

2.2.1?64位光刻ROM

? ? ? ? 64位光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列號。

????????64位光刻 ROM的排列是:開始8位(28H)是產品類型標號,接著的48位是該DS18B20自身的序列號,最后 8位是前面56位的循環冗余校驗碼。

????????光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現一根總線上掛接多個DS18B20的目的

2.2.2 高速緩存存儲器?

????????DS18B20溫度傳感器的內部存儲器包括一個高速的暫存器RAM和一個非易失性的可電擦除的 EEPROM,后者存放高溫度和低溫度觸發器TH、TL和配置寄存器?

2.2.2.1?配置寄存器

????????配置寄存器是配置不同的位數來確定溫度和數字的轉化,配置寄存器結構如下圖所示:

?

(1)低五位一直都是“1

(2)TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式。在 DS18B20出廠時該位被設置為0,用戶不需要去改動

(3)R1R0用來設置DS18B20的精度(分辨率),精度可設置為9,10,11或12位,對應的分辨率溫度是 0.5℃,0.25℃,0.125℃和0.0625℃。R0和R1配置如下圖所示:

在初始狀態下默認的精度是12位,即R0=1、R1=1

2.2.2.2?高速暫存存儲器

? ? ? ? (1)高速暫存存儲器由9個字節組成,其分配如下圖所示:

????????當溫度轉換命令(44H)發布后,經轉換所得的溫度值以二字節補碼形式存放在高速暫存存儲器的第0和第1個字節

? ? ? ? (2)存儲的兩個字節,高字節的前5位是符號位S,單片機可通過單線接口讀到該數據,讀取時低位在前,高位在后,數據格式如下:

?

如果測得的溫度大于0,這5位為“0”,只要將測到的數值乘以0.0625(默認精度是12位)即可得到實際溫度

如果溫度小于0,這5位為“1”, 測到的數值需要取反加1再乘以0.0625即可得到實際溫度。

溫度與數據對應關系如下圖所示:

?

2.3?DS18B20時序

DS18B20時序包括如下幾種:初始化時序、寫(0和1)時序、 讀(0和1)時序

DS18B20發送所有的命令和數據都是字節的低位在前

2.3.1?初始化時序

????????主機輸出低電平,保持低電平至少480us(該時間范圍:480-960us),以產生復位脈沖。接著主機釋放總線,外部的上拉電阻將單總線拉高,延時15-60us,并進入接收模式

????????接著DS18B20拉低總線60-240us,以產生低電平應答脈沖,若為低電平,還要做延時,其延時的時間從外部上拉電阻將單總線拉高算起最少要480us

//初始化時序圖13的左半段:復位脈沖時序
void ds18b20_reset(){
?? ?DS18B20_PORT=0; ?//拉低DQ線(單總線)? ? ?主機輸出低電平
?? ?delay_10us(75); ?//750us(480us-960us)? ? ? ? 保持低電平至少480us
?? ?DS18B20_PORT=1; ?//拉高DQ線? ? ? ? ? ? ? ? ? ? ? ?主機釋放總線,外部的上拉電阻將單總線拉高
?? ?delay_10us(2); ?//20us(15us-60us)? ? ? ? ? ? ? ? ? ? ?延時15-60us
}

//初始化時序圖13的右半段:檢測DS18B20是否存在,返回值0存在;返回值1不存在
u8 ds18b20_check(){
?? ?u8 time_temp=0;
?? ?while(DS18B20_PORT&&time_temp<20){ ?//DS18B20_PORT:1
?? ??? ?time_temp++;
?? ??? ?delay_10us(1); ?//10us,要循環20次,相當于200us(60-240us)
?? ?}
?? ?if(time_temp>=20){
?? ??? ?return 1; ?//超時了,仍沒有等到低電平
?? ?}else{
?? ??? ?time_temp=0;
?? ?}
?? ?//如果等到了低電平,DS18B20_PORT變為0
?? ?while((!DS18B20_PORT)&&time_temp<20){ ?//DS18B20_PORT:0
?? ??? ?time_temp++;
?? ??? ?delay_10us(1);
?? ?}
?? ?if(time_temp>=20){
?? ??? ?return 1; ?//超時了,仍沒有等到高電平
?? ?}
?? ?return 0;
}

2.3.2?寫時序

????????寫時序包括寫0時序和寫1時序。所有寫時序至少需要60us,且在2次獨立的寫時序之間至少需要1us的恢復時間,兩種寫時序均起始于主機拉低總線

????????寫1時序:主機輸出低電平,延時2us,然后釋放總線,延時60us

????????寫0時序:主機輸出低電平,延時60us,然后釋放總線,延時2us

//寫時序:寫一個字節到ds18b20中,提前準備好數據
void ds18b20_write_byte(u8 dat){ ?
?? ?u8 i=0;
?? ?u8 temp=0;
?? ?//從低位向高位寫 eg:1001 0011
?? ?for(i=0;i<8;i++){
?? ??? ?temp=dat&0x01; ?//拿到dat中低位的數據
?? ??? ?dat>>=1;
?? ??? ?if(temp){
?? ??? ??? ?//寫1時序
?? ??? ??? ?DS18B20_PORT=0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?主機輸出低電平
?? ??? ??? ?_nop_(); ?//1us? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 延時2us
?? ??? ??? ?_nop_();
?? ??? ??? ?DS18B20_PORT=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?釋放總線
?? ??? ??? ?delay_10us(10); ?//100us(60-120us)? ? ? ? ? ??延時60us
?? ??? ?}else{
?? ??? ??? ?//寫0時序
?? ??? ??? ?DS18B20_PORT=0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?主機輸出低電平
?? ??? ??? ?delay_10us(6);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 延時60us
?? ??? ??? ?DS18B20_PORT=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?釋放總線
?? ??? ??? ?_nop_(); ?//1us? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 延時2us
?? ??? ??? ?_nop_();
?? ??? ?}
?? ?}
}??

2.3.3 讀時序?

?

????????所有讀時序至少需要60us,且在2次獨立的讀時序之間至少需要1us的恢復時間。每個讀時序都由主機發起,至少拉低總線1us。主機在讀時序期間必須釋放總線,并且在時序起始后的15us之內采樣總線狀態

????????典型的讀時序過程為:主機輸出低電平延時2us,然后主機轉入輸入模式延時12us,然后讀取單總線當前的電平,然后延時50us

?//讀一位
u8 ds18b20_read_bit(){
?? ?u8 dat=0; ?//存的是某一位(0或1)
?? ?//主機輸出低電平
?? ?DS18B20_PORT=0;
?? ?//延時2us
?? ?_nop_(); ?//1us
?? ?_nop_();
?? ?DS18B20_PORT=1;? ? ?主機轉入輸入模式
?? ?//延時2us,時間不能過長,必須在15us內讀到數據??延時12us
?? ?_nop_(); ?//1us
?? ?_nop_();
?? ?if(DS18B20_PORT){? ? ??讀取單總線當前的電平
?? ??? ?dat=1;
?? ?}else{
?? ??? ?dat=0;
?? ?}
?? ?delay_10us(5);? ? ?延時50us
?? ?return dat;
}
//讀一個字節
u8 ds18b20_read_byte(){
?? ?u8 i=0;
?? ?u8 dat=0;
?? ?u8 temp=0;
?? ?for(i=0;i<8;i++){
?? ??? ?temp=ds18b20_read_bit(); ?//i=0時,temp=1;i=1時,temp=1
?? ??? ?dat>>=1; ?//i=0時,dat=000 0000;i=1時,dat=0100 0000
?? ??? ?dat|=temp<<7; ?//i=0時,dat=1000 0000;i=1時,dat=1100 0000
?? ?}
?? ?return dat;
}

2.3.4?DS18B20的典型溫度讀取過程

復位→發SKIPROM命令(0XCC)→發開始轉換命令(0X44)→延時→復位→發送SKIPROM命令(0XCC)→發讀存儲器命令(0XBE)→連續讀出兩個字節數據(即溫度)→結束

?/*
DS18B20 的典型溫度讀取過程為:
復位→發SKIPROM命令(0XCC)→發開始轉換命令(0X44)
→延時→
復位→發送SKIPROM命令(0XCC)→發讀存儲器命令(0XBE)→連續讀出兩個字節數據(即溫度)→結束。
*/
//開始溫度轉換
void ds18b20_start(){
?? ?ds18b20_init(); ?//初始化:復位和檢查
?? ?ds18b20_write_byte(0xcc); ?//發SKIPROM命令(0XCC)
?? ?ds18b20_write_byte(0x44); ?//發開始轉換命令(0X44)
}
//從ds18b20得到溫度值
double ds18b20_read_temperture(){
?? ?double temp;
?? ?u8 dath=0;
?? ?u8 datl=0;
?? ?u16 value=0;
?? ?ds18b20_start();
?? ?ds18b20_init(); ?//初始化:復位和檢查
?? ?ds18b20_write_byte(0xcc); ?//發送SKIPROM命令(0XCC)
?? ?ds18b20_write_byte(0xbe); ?//發讀存儲器命令(0XBE)
?? ?//連續讀出兩個字節數據(即溫度)
?? ?datl=ds18b20_read_byte(); ?//低8位
?? ?dath=ds18b20_read_byte(); ?//高8位
?? ?//高8位和低8位連接起來,拼成16位
?? ?value=(dath<<8)+datl; ?
?? ?//判斷是正溫度還是負溫度
?? ?if((value&0xf800)==0xf800){ ?//負溫度
?? ??? ?value=(~value)+1;
?? ??? ?temp=value*(-0.0625);
?? ?}else{ ?//正溫度
?? ??? ?temp=value*0.0625;
?? ?}
?? ?return temp;
}?

3、實驗

要實現的功能是:插上DS18B20溫度傳感器,數碼管顯示檢測的溫度值?

如果不知道怎么進行多文件編程,51單片機——I2C-EEPROM-CSDN博客中有

3.1 Public文件

3.1.1 public.h

//頭文件中放置函數的聲明、全局變量的定義
#ifndef _public_H
#define _public_H
#include "reg52.h"
//全局變量
typedef unsigned int u16;
typedef unsigned char u8;
//兩個延遲函數聲明
void delay_10us(u16 us);
void delay_ms(u16 ms);
#endif

3.1.2?public.c

#include "public.h"
void delay_10us(u16 us){
?? ?while(us--);
}
void delay_ms(u16 ms){
?? ?u16 i=0,j=0;
?? ?for(i=0;i<ms;i++){
?? ??? ?for(j=0;j<110;j++);
?? ?}
}

3.2 動態數碼管?

3.2.1 smg.h

#ifndef _smg_H
#define _smg_H
#include "public.h"
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define SMG_A_DP_PORT P0
extern u8 gsmg_code[];
void smg_display(u8 save_buff[],u8 pos);
#endif

3.2.2 smg.c

?#include "smg.h"
u8 gsmg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//save_buff是一個u8類型的數組,方便外部傳入要顯示的數據
//pos是數碼管從左開始第幾個位置開始顯示,取值范圍是1-8
void smg_display(u8 save_buff[],u8 pos){
?? ?u16 i=0;
?? ?u16 pos_temp=pos-1;
?? ?for(i=pos_temp;i<8;i++){
?? ??? ?//位選
?? ??? ?switch(i){
?? ??? ??? ?case 0:
?? ??? ??? ??? ?LSC=1,LSB=1,LSA=1; ?//7
?? ??? ??? ??? ?break;
?? ??? ??? ?case 1:
?? ??? ??? ??? ?LSC=1,LSB=1,LSA=0; ?//6
?? ??? ??? ??? ?break;
?? ??? ??? ?case 2:
?? ??? ??? ??? ?LSC=1,LSB=0,LSA=1; ?//5
?? ??? ??? ??? ?break;
?? ??? ??? ?case 3:
?? ??? ??? ??? ?LSC=1,LSB=0,LSA=0; ?//4
?? ??? ??? ??? ?break;
?? ??? ??? ?case 4:
?? ??? ??? ??? ?LSC=0,LSB=1,LSA=1; ?//3
?? ??? ??? ??? ?break;
?? ??? ??? ?case 5:
?? ??? ??? ??? ?LSC=0,LSB=1,LSA=0; ?//2
?? ??? ??? ??? ?break;
?? ??? ??? ?case 6:
?? ??? ??? ??? ?LSC=0,LSB=0,LSA=1; ?//1
?? ??? ??? ??? ?break;
?? ??? ??? ?case 7:
?? ??? ??? ??? ?LSC=0,LSB=0,LSA=0; ?//0
?? ??? ??? ??? ?break;
?? ??? ?}
?? ??? ?SMG_A_DP_PORT=save_buff[i-pos_temp];?
?? ??? ?delay_10us(100);
?? ??? ?SMG_A_DP_PORT=0x00; ?//消隱
?? ?}
}

3.3 DS18B20

3.3.1 ds18b20.h

#ifndef _ds18b20_H
#define _ds18b20_H
#include "public.h"
#include "intrins.h" ?//_nop_():1us
sbit DS18B20_PORT=P3^7; ?//DQ
//初始化時序圖13的左半段:復位脈沖時序
void ds18b20_reset();
//初始化時序圖13的右半段:檢測DS18B20是否存在,返回值0存在;返回值1不存在
u8 ds18b20_check();
//初始化時序
u8 ds18b20_init();
//寫時序:寫一個字節到ds18b20中,提前準備好數據
void ds18b20_write_byte(u8 dat);
//讀一位
u8 ds18b20_read_bit();
//讀一個字節
u8 ds18b20_read_byte();
//開始溫度轉換
void ds18b20_start();
//從ds18b20得到溫度值
double ds18b20_read_temperture();
#endif

3.3.2 ds18b20.c

#include "ds18b20.h"
//協議層
//初始化時序圖13的左半段:復位脈沖時序
void ds18b20_reset(){
?? ?DS18B20_PORT=0; ?//拉低DQ線(單總線)
?? ?delay_10us(75); ?//750us(480us-960us)
?? ?DS18B20_PORT=1; ?//拉高DQ線
?? ?delay_10us(2); ?//20us(15us-60us)
}

//初始化時序圖13的右半段:檢測DS18B20是否存在,返回值0存在;返回值1不存在
u8 ds18b20_check(){
?? ?u8 time_temp=0;
?? ?while(DS18B20_PORT&&time_temp<20){ ?//DS18B20_PORT:1
?? ??? ?time_temp++;
?? ??? ?delay_10us(1); ?//10us,要循環20次,相當于200us(60-240us)
?? ?}
?? ?if(time_temp>=20){
?? ??? ?return 1; ?//超時了,仍沒有等到低電平
?? ?}else{
?? ??? ?time_temp=0;
?? ?}
?? ?//如果等到了低電平,DS18B20_PORT變為0
?? ?while((!DS18B20_PORT)&&time_temp<20){ ?//DS18B20_PORT:0
?? ??? ?time_temp++;
?? ??? ?delay_10us(1);
?? ?}
?? ?if(time_temp>=20){
?? ??? ?return 1; ?//超時了,仍沒有等到高電平
?? ?}
?? ?return 0;
}

//初始化時序(將初始化時序圖13的左半段和右半段連接起來)
u8 ds18b20_init(){
?? ?ds18b20_reset();
?? ?return ds18b20_check();
}


//ds18b20中讀寫操作
//寫時序:寫一個字節到ds18b20中,提前準備好數據
void ds18b20_write_byte(u8 dat){ ?
?? ?u8 i=0;
?? ?u8 temp=0;
?? ?//從低位向高位寫 1001 0011
?? ?for(i=0;i<8;i++){
?? ??? ?temp=dat&0x01; ?//拿到dat中低位的數據
?? ??? ?dat>>=1;
?? ??? ?if(temp){
?? ??? ??? ?//寫1時序
?? ??? ??? ?DS18B20_PORT=0;
?? ??? ??? ?_nop_(); ?//1us
?? ??? ??? ?_nop_();
?? ??? ??? ?DS18B20_PORT=1;
?? ??? ??? ?delay_10us(10); ?//100us(60-120us)
?? ??? ?}else{
?? ??? ??? ?//寫0時序
?? ??? ??? ?DS18B20_PORT=0;
?? ??? ??? ?delay_10us(6);
?? ??? ??? ?DS18B20_PORT=1;
?? ??? ??? ?_nop_(); ?//1us
?? ??? ??? ?_nop_();
?? ??? ?}
?? ?}
}

//讀時序:讀位、讀字節 1001 0011
//讀一位
u8 ds18b20_read_bit(){
?? ?u8 dat=0; ?//存的是某一位(0或1)
?? ?//主機輸出低電平
?? ?DS18B20_PORT=0;
?? ?//延時2us
?? ?_nop_(); ?//1us
?? ?_nop_();
?? ?DS18B20_PORT=1;
?? ?//延時2us,時間不能過長,必須在15us內讀到數據
?? ?_nop_(); ?//1us
?? ?_nop_();
?? ?if(DS18B20_PORT){
?? ??? ?dat=1;
?? ?}else{
?? ??? ?dat=0;
?? ?}
?? ?delay_10us(5);
?? ?return dat;
}
//讀一個字節
u8 ds18b20_read_byte(){
?? ?u8 i=0;
?? ?u8 dat=0;
?? ?u8 temp=0;
?? ?for(i=0;i<8;i++){
?? ??? ?temp=ds18b20_read_bit(); ?//i=0時,temp=1;i=1時,temp=1
?? ??? ?dat>>=1; ?//i=0時,dat=000 0000;i=1時,dat=0100 0000
?? ??? ?dat|=temp<<7; ?//i=0時,dat=1000 0000;i=1時,dat=1100 0000
?? ?}
?? ?return dat;
}


/*
DS18B20 的典型溫度讀取過程為:
復位→發SKIPROM命令(0XCC)→發開始轉換命令(0X44)
→延時→
復位→發送SKIPROM命令(0XCC)→發讀存儲器命令(0XBE)→連續讀出兩個字節數據(即溫度)→結束。
*/
//開始溫度轉換
void ds18b20_start(){
?? ?ds18b20_init(); ?//初始化:復位和檢查
?? ?ds18b20_write_byte(0xcc); ?//發SKIPROM命令(0XCC)
?? ?ds18b20_write_byte(0x44); ?//發開始轉換命令(0X44)
}
//從ds18b20得到溫度值
double ds18b20_read_temperture(){
?? ?double temp;
?? ?u8 dath=0;
?? ?u8 datl=0;
?? ?u16 value=0;
?? ?ds18b20_start();
?? ?ds18b20_init(); ?//初始化:復位和檢查
?? ?ds18b20_write_byte(0xcc); ?//發送SKIPROM命令(0XCC)
?? ?ds18b20_write_byte(0xbe); ?//發讀存儲器命令(0XBE)
?? ?//連續讀出兩個字節數據(即溫度)
?? ?datl=ds18b20_read_byte(); ?//低8位
?? ?dath=ds18b20_read_byte(); ?//高8位
?? ?//高8位和低8位連接起來,拼成16位
?? ?value=(dath<<8)+datl; ?
?? ?//判斷是正溫度還是負溫度
?? ?if((value&0xf800)==0xf800){ ?//負溫度
?? ??? ?value=(~value)+1;
?? ??? ?temp=value*(-0.0625);
?? ?}else{ ?//正溫度
?? ??? ?temp=value*0.0625;
?? ?}
?? ?return temp;
}

3.4 main.c

#include "public.h"
#include "smg.h"
#include "ds18b20.h"
/*
下載程序后,插上DS18B20溫度傳感器,數碼管顯示檢測的溫度值
*/
void main(){
?? ?u8 i=0;
?? ?int temp_value; ?//有負溫度
?? ?u8 temp_buf[5];
?? ?ds18b20_init(); ?//起始信號,檢查ds18b20在不在,要不要都可以
?? ?while(1){
?? ??? ?i++;
?? ??? ?if(i%50==0){ ?//減少讀的頻率,750us轉換一次
?? ??? ??? ?temp_value=ds18b20_read_temperture()*10;
?? ??? ?}
?? ??? ?if(temp_value<0){
?? ??? ??? ?//顯示符號位
?? ??? ??? ?temp_value=-temp_value;
?? ??? ??? ?temp_buf[0]=0x40; ?//顯示負號
?? ??? ?}else{
?? ??? ??? ?temp_buf[0]=0x00; ?//不顯示
?? ??? ?}
?? ??? ?//讀的溫度要在數碼管顯示
?? ??? ?temp_buf[1]=gsmg_code[temp_value/1000];
?? ??? ?temp_buf[2]=gsmg_code[temp_value%1000/100];
?? ??? ?temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;
?? ??? ?temp_buf[4]=gsmg_code[temp_value%1000%100%10];
?? ??? ?smg_display(temp_buf,4);
?? ?}
}

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

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

相關文章

STL容器-- list的模擬實現(附源碼)

STL容器-- list的模擬實現&#xff08;附源碼&#xff09; List的實現主要時考察我們對list這一容器的理解&#xff0c;和代碼的編寫能力&#xff0c;通過上節對list容器的使用&#xff0c;我們對list容器已經有了一些基本的了解&#xff0c;接下來就讓我們來實現一些list容器常…

Redis 學習指南與資料分享

Redis學習資料 Redis學習資料 Redis學習資料 Redis 作為一款高性能內存數據庫&#xff0c;在當今軟件開發領域占據著重要地位。其豐富的數據類型、強大的功能特性以及廣泛的應用場景&#xff0c;吸引著眾多開發者深入學習。以下為你精心整理的 Redis 學習指南與實用資料分享&…

Lynx TiDB 慢日志收集工具

作者&#xff1a; 小龍蝦愛大龍蝦 原文來源&#xff1a; https://tidb.net/blog/7247e68f 簡介 lynx 工具可以定時將 TiDB 集群的慢查詢收集并持久化到后端數據庫中&#xff0c;然后通過 grafana 查詢展示出來&#xff0c;這可以幫助我們更好的分析慢查詢日志。 背景 盡管…

Gin 源碼概覽 - 路由

本文基于gin 1.1 源碼解讀 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注冊路由 我們先來看一段gin代碼&#xff0c;來看看最終得到的一顆路由樹長啥樣 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…

docker 基礎語法學習,K8s基礎語法學習,零基礎學習

下面是關于Docker和Kubernetes的基礎語法學習資料&#xff0c;包括一些關鍵概念和示例代碼。 Docker 基礎語法 1. 安裝 Docker 首先&#xff0c;你需要安裝 Docker。以下是不同操作系統上的安裝指南&#xff1a; Windows/Mac: 下載并安裝 Docker Desktop。 Linux: 根據你的…

【逆境中綻放:萬字回顧2024我在挑戰中突破自我】

&#x1f308;個人主頁: Aileen_0v0 &#x1f525;熱門專欄: 華為鴻蒙系統學習|計算機網絡|數據結構與算法 ?&#x1f4ab;個人格言:“沒有羅馬,那就自己創造羅馬~” 文章目錄 一、引言二、個人成長與盤點情感與心理成長學習與技能提升其它榮譽 三、年度創作歷程回顧創作內容概…

職場溝通與行為

職場溝通與行為 引言 在職場上&#xff0c;你是否曾遇到過困惑的溝通&#xff1f;是否對同事的行為有過疑慮&#xff1f;這不僅是個別現象&#xff0c;而是我們這個時代工作文化中的普遍問題。許多職場的摩擦&#xff0c;來自溝通不暢或是行為不當。那么&#xff0c;如何才能…

【Linux 重裝】Ubuntu 啟動盤 U盤無法被識別,如何處理?

背景 U盤燒錄了 Ubuntu 系統作為啟動盤&#xff0c;再次插入電腦后無法被識別 解決方案&#xff08;Mac 適用&#xff09; &#xff08;1&#xff09;查找 USB&#xff0c;&#xff08;2&#xff09;格式化&#xff08;1&#xff09;在 terminal 中通過 diskutil list 查看是…

中職網絡建設與運維ansible服務

ansible服務 填寫hosts指定主機范圍和控制節點后創建一個腳本&#xff0c;可以利用簡化腳本 1. 在linux1上安裝系統自帶的ansible-core,作為ansible控制節點,linux2-linux7作為ansible的受控節點 Linux1 Linux1-7 Yum install ansible-core -y Vi /etc/ansible/hosts 添加…

數據庫服務體系結構

1. 數據庫服務應用配置 服務進行配置有什么作用&#xff1f; 實現服務運行啟動 實現某些功能 應用配置有三種方式&#xff1f; 利用編譯安裝進行配置 編寫配置文件信息 ,.默認的配置文件: /etc/my.cnf 利用啟動命令參數配置信息&#xff0c;mysqld_safe --skip-grant-tables --…

Langchain+FastApi+Vue前后端Ai對話(超詳細)

一、引入 首先可以先看下作者的文章 FastApi相關文章&#xff1a;創建最簡單FastApi的項目Vue相關文章&#xff1a;最簡單的aixos二次封裝Langchain相關文章&#xff1a;如何使用LangSmith跟蹤deepseek模型 二、后端搭建 1 項目文件結構 routers&#xff1a;存放api接口se…

如何在不暴露MinIO地址的情況下,用Spring Boot與KKFileView實現文件預覽

在現代Web應用中&#xff0c;文件預覽是一項常見且重要的功能。它允許用戶在不上傳或下載文件的情況下&#xff0c;直接在瀏覽器中查看文件內容。然而&#xff0c;直接將文件存儲服務&#xff08;如MinIO&#xff09;暴露給前端可能會帶來安全風險。本文將介紹如何在不暴露MinI…

簡歷_使用優化的Redis自增ID策略生成分布式環境下全局唯一ID,用于用戶上傳數據的命名以及多種ID的生成

系列博客目錄 文章目錄 系列博客目錄WhyRedis自增ID策略 Why 我們需要設置全局唯一ID。原因&#xff1a;當用戶搶購時&#xff0c;就會生成訂單并保存到tb_voucher_order這張表中&#xff0c;而訂單表如果使用數據庫自增ID就存在一些問題。 問題&#xff1a;id的規律性太明顯、…

Jira中bug的流轉流程

Jira中bug的狀態 1. 處理Bug的流程2. bug狀態流轉詳述bug的狀態通常包括 1. 處理Bug的流程 2. bug狀態流轉詳述 bug的狀態通常包括 未解決 1. 測試人員創建一個bug&#xff0c;填寫bug的詳細信息&#xff0c;如概要、bug級別、復現步驟、現狀、預期結果等 2. 定位bug&#x…

Linux的幾個基本指令

文章目錄 一、幾個基本指令1、ls 指令注意&#xff01; 2、pwd命令3、touch 指令4、mkdir 指令注意&#xff01;注意&#xff01; 5、cd 指令注意&#xff01; 6、cp 指令 今天我們學習Linux下的幾個基本指令&#xff0c;本篇是在Xshell環境下執行的。 一、幾個基本指令 1、…

軟件工程師歐以寧:引領無人機導航與物聯網安全的技術革新

在科技日新月異的今天,軟件工程師歐以寧憑借卓越的技術能力和前瞻性的創新思維,成為了無人機自主導航和物聯網安全領域的佼佼者。作為一名深耕技術前沿的專家,歐以寧不僅推動了無人機導航技術的突破性進展,還為智能家居和物聯網的安全架構提供了全新的解決方案。她的研究成果,以…

數據庫基礎練習1(創建表,設置外鍵,檢查,不為空,主鍵等約束)安裝mysql詳細步驟

安裝MySQL詳細步驟 1. 下載 MySQL 安裝程序 訪問 MySQL 官方網站&#xff1a;MySQL Downloads。在下載頁面&#xff0c;選擇 "MySQL Community (GPL) Downloads"。在 "MySQL Community Server" 部分&#xff0c;根據你的操作系統&#xff08;Windows&…

laravel中請求失敗重試的擴展--Guzzle

背景 開發過程中&#xff0c;跟外部接口對接時&#xff0c;很常見的要考慮到失敗重新的情況&#xff0c;這里記錄一下我用的失敗重試的情況&#xff0c; 重試方法 1、使用 Laravel 的 HTTP 客戶端和異常處理 結合異常處理和重試邏輯 use Illuminate\Support\Facades\Http;…

ThinkPHP 8的一對多關聯

【圖書介紹】《ThinkPHP 8高效構建Web應用》-CSDN博客 《2025新書 ThinkPHP 8高效構建Web應用 編程與應用開發叢書 夏磊 清華大學出版社教材書籍 9787302678236 ThinkPHP 8高效構建Web應用》【摘要 書評 試讀】- 京東圖書 使用VS Code開發ThinkPHP項目-CSDN博客 編程與應用開…

工業網口相機:如何通過調整網口參數設置,優化圖像傳輸和網絡性能,達到最大幀率

項目場景 工業相機是常用與工業視覺領域的常用專業視覺核心部件&#xff0c;擁有多種屬性&#xff0c;是機器視覺系統中的核心部件&#xff0c;具有不可替代的重要功能。 工業相機已經被廣泛應用于工業生產線在線檢測、智能交通,機器視覺,科研,軍事科學,航天航空等眾多領域 …