(51單片機)串口通訊(串口通訊教程)(串口接收發送教程)

前言:

今天有兩個項目,分別為:

串口接收:

串口發送:

如上圖將文件放在Keli5 中即可,然后燒錄在單片機中就行了

燒錄軟件用的是STC-ISP,不知道怎么安裝的可以去看江科大的視頻:

【51單片機入門教程-2020版 程序全程純手打 從零開始入門】https://www.bilibili.com/video/BV1Mb411e7re?p=2&vd_source=ada7b122ae16cc583b4add52ad89fd5e

串口接收源代碼:

頭文件要記得宏定義和重定義,避免重復調用:

#ifndef _Timer0_h_//名字根據文件名定義即可
#define _Timer0_h_//聲明函數……#endif

?main.c

//接收程序
#include <STC89C5xRC.H>
#include "Delay.h"
#include "UART.h"unsigned char Sec;void main(){UATE_Init();//初始化while(1){UATE_SendByte(Sec);//發送字節Sec++;//每秒遞增Delay(1000);}
}

UART.c

#include <STC89C5xRC.H>//初始化串口
//void UART_Init(){
//	SCON=0x40;//0100 0000
//	PCON=0;
//	//&只有在兩個位都為1時結果位才是1,而|只要有一個位為1結果位就是1
//	TMOD &= 0x0F;		//設置定時器模式,高四位清0,低四位不變
//	TMOD |= 0x20;		//設置定時器模式,高四位設計成0010,低四位不變,定時器1,模式2
//	TL0 = 0x66;		//設置定時初值
//	TH0 = 0xFC;		//設置定時初值
//	TF0 = 0;		//清除TF0標志
//	TR0 = 1;		//定時器0開始計時
//	ET0=1;//允許中斷
//	EA=1;//允許總中斷
//	PT0=0;//低優先級
//}
void UATE_Init()		//4800bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位數據,可變波特率
//	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
//	AUXR &= 0xFE;		//串口1選擇定時器1為波特率發生器TMOD &= 0x0F;		//清除定時器1模式位TMOD |= 0x20;		//設定定時器1為8位自動重裝方式TL1 = 0xFA;		//設定定時初值TH1 = 0xFA;		//設定定時器重裝值ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1
}//發送字節(只發送,不接受)
void UATE_SendByte(unsigned char Byte){SBUF=Byte;//傳入字節數據while(TI==0);//發送循環,發送完TI=1;TI=0;//軟件復位
}

UART.h

//UART.h#ifndef __UART_H__
#define __UART_H__void UATE_Init();
void UATE_SendByte(unsigned char Byte);
#endif

Delay.c?

//Delay.c#include <STC89C5xRC.H>
#include <INTRINS.H>//延時函數
void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms){i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}

?Delay.h

//Delay.h#ifndef __Delay_H__
#define __Delay_H__//延時函數頭文件
void Delay(unsigned int xms);
#endif

?串口發送源代碼:

頭文件要記得宏定義和重定義,避免重復調用:

#ifndef _Timer0_h_//名字根據文件名定義即可
#define _Timer0_h_//聲明函數……#endif

?main.c

#include <STC89C5xRC.H>
#include "Delay.h"
#include "UART.h"void main(){UATE_Init();//初始化while(1){}
}
//中斷函數
void UART_Routine() interrupt 4{if(RI==1){//RI等于1表示可以中斷P2=~SBUF;//發送數據UATE_SendByte(SBUF);//接收數據RI=0;//軟件復位}
}

UART.c

#include <STC89C5xRC.H>//初始化串口
//void UART_Init(){
//	SCON=0x40;//0100 0000
//	PCON=0;
//	//&只有在兩個位都為1時結果位才是1,而|只要有一個位為1結果位就是1
//	TMOD &= 0x0F;		//設置定時器模式,高四位清0,低四位不變
//	TMOD |= 0x20;		//設置定時器模式,高四位設計成0010,低四位不變,定時器1,模式2
//	TL0 = 0x66;		//設置定時初值
//	TH0 = 0xFC;		//設置定時初值
//	TF0 = 0;		//清除TF0標志
//	TR0 = 1;		//定時器0開始計時
//	ET0=1;//允許中斷
//	EA=1;//允許總中斷
//	PT0=0;//低優先級
//}
void UATE_Init()		//4800bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位數據,可變波特率
//	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
//	AUXR &= 0xFE;		//串口1選擇定時器1為波特率發生器TMOD &= 0x0F;		//清除定時器1模式位TMOD |= 0x20;		//設定定時器1為8位自動重裝方式TL1 = 0xFA;		//設定定時初值TH1 = 0xFA;		//設定定時器重裝值ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1EA=1;//啟動總中斷ES=1;//啟動串口中斷}//發送字節(只發送,不接受)
void UATE_SendByte(unsigned char Byte){SBUF=Byte;//傳入字節數據while(TI==0);//發送循環,發送完TI=1;TI=0;//軟件復位
}串口中斷模版
中斷函數
//void UART_Routine() interrupt 4{
//	if(RI==1){//RI等于1表示可以中斷
//		P2=~SBUF;//發送數據
//		UATE_SendByte(SBUF);//接收數據
//		RI=0;//軟件復位
//	}
//}

UART.h

//UART.h#ifndef __UART_H__
#define __UART_H__void UATE_Init();
void UATE_SendByte(unsigned char Byte);
#endif

Delay.c?

//Delay.c#include <STC89C5xRC.H>
#include <INTRINS.H>//延時函數
void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms){i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}

?Delay.h

//Delay.h#ifndef __Delay_H__
#define __Delay_H__//延時函數頭文件
void Delay(unsigned int xms);
#endif

?注意兩個項目的代碼有部分不同!!!!

第一個項目是串口接收:

  • 主程序代碼:
    #include <STC89C5xRC.H>
    #include "Delay.h"
    #include "UART.h"unsigned char Sec;void main(){UATE_Init();//初始化while(1){UATE_SendByte(Sec);//發送字節Sec++;//每秒遞增Delay(1000);}
    }
    

    注意:接收是串口向電腦發送數據,發送一個16進制,每秒增加,電腦接收。而且發送是沒有中斷的!!!

  • UART.c代碼:

    void UATE_Init()		//4800bps@11.0592MHz
    {PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位數據,可變波特率
    //	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
    //	AUXR &= 0xFE;		//串口1選擇定時器1為波特率發生器TMOD &= 0x0F;		//清除定時器1模式位TMOD |= 0x20;		//設定定時器1為8位自動重裝方式TL1 = 0xFA;		//設定定時初值TH1 = 0xFA;		//設定定時器重裝值ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1
    }//發送字節(只發送,不接受)
    void UATE_SendByte(unsigned char Byte){SBUF=Byte;//傳入字節數據while(TI==0);//發送循環,發送完TI=1;TI=0;//軟件復位
    }

    沒有中斷,因此ET1=0,禁止中斷。

  • 運行:

  • 單片機沒有任何變化,電腦端STC-ISP的串口助手接收緩沖區會有逐漸增加的數據。

    串口接收數據

第二個項目是串口發送:

  • 主程序代碼:
    #include <STC89C5xRC.H>
    #include "Delay.h"
    #include "UART.h"void main(){UATE_Init();//初始化while(1){}
    }
    //中斷函數
    void UART_Routine() interrupt 4{if(RI==1){//RI等于1表示可以中斷P2=~SBUF;//發送數據UATE_SendByte(SBUF);//接收數據RI=0;//軟件復位}
    }


    注意:發送是電腦向串口發送數據,利用中斷來控制LED燈(P2),RI=1打開中斷。

  • UART.c代碼:

    void UATE_Init()		//4800bps@11.0592MHz
    {PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位數據,可變波特率
    //	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
    //	AUXR &= 0xFE;		//串口1選擇定時器1為波特率發生器TMOD &= 0x0F;		//清除定時器1模式位TMOD |= 0x20;		//設定定時器1為8位自動重裝方式TL1 = 0xFA;		//設定定時初值TH1 = 0xFA;		//設定定時器重裝值ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1EA=1;//啟動總中斷ES=1;//啟動串口中斷}//發送字節(只發送,不接受)
    void UATE_SendByte(unsigned char Byte){SBUF=Byte;//傳入字節數據while(TI==0);//發送循環,發送完TI=1;TI=0;//軟件復位
    }

    有中斷,因此EA,ES啟動中斷。

  • ?運行:

  • 發送對應的16進制,用LED燈來檢測,如發送0f,就是0000 1111,也就是后四個燈亮,單片機對應的燈會亮。

    串口發送數據

代碼解析與教程:

?Dealy模塊
  • 包含源代碼與頭文件,不需要知道怎么實現的會用即可,后續使用,直接將頭文件和源代碼拿過來用即可;

xms是定義的毫秒,1000毫秒就是1秒;模版生成的是1毫秒的,因此xms等于1000
?UART模塊
  • 包含源代碼與頭文件,需要知道怎么實現,會用
  • 51單片機串口通訊十分重要,要理解怎么用,要知道原理是什么,要結合原理圖來分析怎么做,先看代碼
    #include <STC89C5xRC.H>//初始化串口
    //void UART_Init(){
    //	SCON=0x40;//0100 0000
    //	PCON=0;
    //	//&只有在兩個位都為1時結果位才是1,而|只要有一個位為1結果位就是1
    //	TMOD &= 0x0F;		//設置定時器模式,高四位清0,低四位不變
    //	TMOD |= 0x20;		//設置定時器模式,高四位設計成0010,低四位不變,定時器1,模式2
    //	TL0 = 0x66;		//設置定時初值
    //	TH0 = 0xFC;		//設置定時初值
    //	TF0 = 0;		//清除TF0標志
    //	TR0 = 1;		//定時器0開始計時
    //	ET0=1;//允許中斷
    //	EA=1;//允許總中斷
    //	PT0=0;//低優先級
    //}
    void UATE_Init()		//4800bps@11.0592MHz
    {PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位數據,可變波特率
    //	AUXR &= 0xBF;		//定時器1時鐘為Fosc/12,即12T
    //	AUXR &= 0xFE;		//串口1選擇定時器1為波特率發生器TMOD &= 0x0F;		//清除定時器1模式位TMOD |= 0x20;		//設定定時器1為8位自動重裝方式TL1 = 0xFA;		//設定定時初值TH1 = 0xFA;		//設定定時器重裝值ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1
    }//發送字節(只發送,不接受)
    void UATE_SendByte(unsigned char Byte){SBUF=Byte;//傳入字節數據while(TI==0);//發送循環,發送完TI=1;TI=0;//軟件復位
    }
  • 最上面的代碼:主要是理解SCON和PCON,其他的就是定時器/計數器,中斷的內容

?Timer0模塊
  • 包含源代碼與頭文件,需要知道怎么實現,會用
  • 51單片機的定時器和計數器十分重要,要理解怎么用,要知道原理是什么,要結合原理圖來分析怎么做,先看代碼
#include <STC89C5xRC.H>//void Timer0_Init()
//{
//	TF0=0;TR0=1;//TCON,寄存器
//	//TMOD=0x01;//0000 0001,寄存器
//	TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位不變,方便使用兩個定時器
//	TMOD=TMOD&0x01;//把TMOD的最低位置1,高四位不變,方便使用兩個定時器
//	TH0=64535/256;//高電位,寄存器,1毫秒
//	TL0=64535%256;//低電位,寄存器,1毫秒
//	ET0=1;EA=1;PT0=0;//打開中斷開關
//	
//}
//定時器0初始化函數
void Timer0_Init()		//1毫秒@11.0592MHz
{
//	AUXR &= 0x7F;		//定時器時鐘12T模式TMOD &= 0xF0;		//設置定時器模式TMOD |= 0x01;		//設置定時器模式TL0 = 0x66;		//設置定時初值TH0 = 0xFC;		//設置定時初值TF0 = 0;		//清除TF0標志TR0 = 1;		//定時器0開始計時ET0=1;//允許中斷EA=1;//允許總中斷PT0=0;//低優先級
}中斷程序函數
//中斷函數模版
//void Timer0_Routine() interrupt 1
//{
//	static unsigned int T0Count;
//	TL0 = 0x66;		//設置定時初值
//	TH0 = 0xFC;		//設置定時初值
//	T0Count++;
//	if(T0Count>=1000){
//		T0Count=0;
//		//下面是代碼區
//	}
//}
  • 最上面注釋掉的代碼是要求理解的;中間的代碼是STC-ISP軟件生成的;最下面的代碼是中斷函數模版,拿到main.c中可直接使用,但是也要了解原理:

定時器/計數器、中斷教程(重點!!!!)

  1. 首先,要理解原理,會認原理圖:

(本篇均是我自己理解的,只是幫助大家理解,若像深學深究,請去自行找資源,如有不對,希望大家指出)

先看官方解釋:

  • 紅色部分是定時器,作用是自己設定一個最大值,讓計數器達到時,完成什么什么,比如執行中斷
  • 黃色部分是計數器,作用是自己設定,讓其變化,比如+1,毫秒,微妙,完成時繼續怎么怎
  • 藍色部分是中斷器,中斷當前執行,執行自己設定的東西,中斷這部分可以嵌套,像if函數一樣,低優先級讓高優先級

他們三者的關系非常微妙,僅僅相連,相輔相成:

  • 定時器就是設定一個時間,計數器開始計時,到點了中斷器開始執行;舉個例子:你訂一個10.00的鬧鐘(定時器)提醒你起床,時間一點一點的過去(計數器),10.00的時候鬧鐘提醒你(定時器),隨后你開始起床(中斷器);那么他們是怎么實現的呢
?定時器/計數器(模式一)
  • 先看原理圖:

  • 相關寄存器:

  • 官方解釋

  • 模式一官方解釋

  • 下面開始來解釋我的理解(再看原理圖):
  1. 序號1是非門:反向輸出,例如:GATE是1,輸出0,是0,輸入1。
  2. 序號2是或門:符號為梯形(或弧形缺口),邏輯上滿足 “有 1 出 1,全 0 出 0”。
  3. 序號3是與門:符號為矩形缺口,邏輯上滿足 “全 1 出 1,有 0 出 0”。

    1,2,3序號均是TMOD里的,請看原理圖:
    • 代碼TMOD=0x01,是16進制,轉化為二進制為0000 0001,前(高)四位對應著定時器1;后(低)四位對應著定時器0;本代碼使用的是定時器0, 0001分別對應GATE,C/T,M1,M0,由上面的官方解釋可得,M1=0,M0=1時,就是使用并啟動本寄存器。
      但是這樣定義有弊端,也就是定時器1和定時器0不能一起使用,因次,使用下面的代碼:TMOD &=0xF0,也就是TMOD = TMOD & 0xF0(1111 0000)。看不懂沒關系,舉個例子:1010 0101 &? 1111 0000 = 1010 0000,也就是有0出0;
      1010 0101 |? 1111 0000 = 1111?0101,也就是有1出1;因此使用代碼:
       
      1. TMOD &= 0xF0; //設置定時器模式

      2. TMOD |= 0x01; //設置定時器模式

      就可以定義定時器0;
    • 因此,當GATE=0時,通過序號1,輸出1;然后通過序號2,輸出1;因此,只需要將TR0設定成1,輸出就是1,就可以啟動寄存器了。
  4. 序號4是高電位和低電位寄存器:用來設置定時初值,如圖:
    • 先解釋上面的代碼,可幫助理解,下面的代碼可以不理解(后續可生成):TH0和TL0,最大位就是65535,為了分開儲存,用TH0和TL0分別儲存,例如:現在有一個數123,但是一個盒子只能裝進2位數,因此分成123/100=1和123%100=23儲存,同理身為16進制,就要用256來做除數;代碼中設定為64535的目的是因為1000毫秒就是1秒,65535-64535=1000,用來表示1秒,計時器每次加1秒。
  5. 序號7.8(圖中忘記標了(TR0))是TCON(定時器控制)寄存器:TF0=0時,可以理解成初始化;TR0=1時,表示允許計時;反之兩個就是反義理解
  6. 序號5.6是TMOD(定時器模式)寄存器:用來控制定時器和計數器的模式,本篇只講用的多的模式一
?中斷器
  • 先看原理圖:

    這里我們定義好定時器0后,TF0=1,ET0=1,打開中斷,隨后PT0=0,接入低級優先:

    理解上面的東西后,再看中斷函數:

    運用靜態局部變量T0Count,來表示定時區間,達到1000毫秒(1秒)后重新執行該函數
    P20行代碼是代碼區,也就是放你想每1秒就重復執行的代碼。

?串口通訊教程(方式1)(接收和發送)(重點!!!!!!)

  • 主要是理解SCON和PCON,其他的就是定時器/計數器,中斷的內容

  • SCON(方式1)
  • SCON先看官方解釋:

  • SCON解釋:

    如圖:SCON正好是個16進制,8個變量;我們只用方式1;根據官方解釋來看,SM0=0,SM1=1,就是方式1;SM2,TB8,RB8不是方式1的制定為0;REN=1是啟動串口接收;TI,RI默認為0,表示串口通訊(中斷)允許開啟(后續可變);

  • PCON
  • PCON官方解釋:
    ?

  • PCON解釋:
    SBUF就是接收數據的,如圖:

    根據我標的圖來看,你需要將數據寫進SBUF里,然后通過設置定時器初值波特率倍率,然后從發送端到接收端。
    //發送字節(只發送,不接受)
    void UATE_SendByte(unsigned char Byte){SBUF=Byte;//傳入字節數據while(TI==0);//發送循環,發送完TI=1;TI=0;//軟件復位
    }

    其中TI就是SCON中的其中一個變量,發送的時候TI=0,發送完TI=1,因此要自定義軟件復位。EA,ES分別置于1,作用如下:

        EA=1;//啟動總中斷ES=1;//啟動串口中斷

    下面來看:

        ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1

    TR1是定時器的教程(放在下面了),作用是打開定時器1
    ET1是中斷的內容作用是禁止定時器1中斷,如圖:

  • 現在來看中斷函數:


    RI=0是接收數據用的,當接收時RI=1,接收完畢后進行軟件復位。

?LED教程:

  • 先看原理圖:

    ?

    LED是高電位,設定為0就是通電
  • P2就是16進制的LED燈總控制,如:0xFF=1111 1111,就是全關,例如代碼中的:
    P2=0xFE,就是1111 1110,就是L1亮,左移一位就是1111 1101,就是L2亮,其他同理,配合中斷函數,就可以每秒移動一次

?舉一反三(新項目):

在第二個項目的基礎上,改一下main.c文件

#include <STC89C5xRC.H>
#include "Delay.h"
#include "UART.h"void main(){UATE_Init();//初始化UATE_SendByte(SBUF);//發送字節(新增)while(1){}
}
//中斷函數
void UART_Routine() interrupt 4{if(RI==1){//RI等于1表示可以中斷P2=~SBUF;//發送數據UATE_SendByte(SBUF);//接收數據RI=0;//軟件復位}
}

就可以做到發送緩沖區發送后, 接收緩沖區也顯示:

注意選擇同樣的模式(文本模式或者HEX模式)?,支持的文本如下:

效果視頻:?

串口的接收和發送

?注:該代碼是本人自己所寫,可能不夠好,不夠簡便,歡迎大家指出我的不足之處。如果遇見看不懂的地方,可以在評論區打出來,進行討論,或者聯系我。上述內容全是我自己理解的,如果你有別的想法,或者認為我的理解不對,歡迎指出!!!如果可以,可以點一個免費的贊支持一下嗎?謝謝各位彥祖亦菲!!!!!

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

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

相關文章

《汽車制造技術基礎》第一次作業

作業內容 查閱相關資料&#xff0c;談談對汽車制造技術的發展的理解。 可以是關于汽車的先進制造技術 或 汽車先進制造技術 與 制造理念的發展趨勢 或 汽車先進制造技術對環境與可持續發展的影響等。 以下從技術突破、制造理念轉型及環境影響三個維度展開對汽車制造技…

Scala day4(tuple, set and map)

Foreword Hi!! my dear friends, are you lazy at today?? Oh! I am also lazy sometimes, but you will know keep study that’s a right way at last. Now!! let’s start new travel about Scala. Text The all Codes in file day3.scala, like the below program: i…

docker compose搭建博客wordpress

一、前言 docker安裝等入門知識見我之前的這篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…

第二期:[特殊字符] 深入理解MyBatis[特殊字符]MyBatis基礎CRUD操作詳解[特殊字符]

前言 &#x1f31f; 在掌握了 MyBatis 的基本配置與環境搭建之后&#xff0c;接下來的重點便是深入理解其核心功能——CRUD 操作&#xff08;增刪改查&#xff09;。&#x1f4bb; 數據庫操作是任何應用開發中不可或缺的一環&#xff0c;而 MyBatis 正是通過靈活的 SQL 映射機…

Java面試黃金寶典46

1. Python 如何寫爬蟲 定義:Python 爬蟲是借助 Python 語言編寫程序,模擬瀏覽器行為向目標網站發送 HTTP 請求,獲取網頁內容,再通過解析工具提取所需數據的程序。其本質是自動化的數據采集過程。要點: 發送請求:利用requests庫發送 HTTP 請求,如 GET、POST 等,獲取網頁…

建設“大數據智慧招商平臺”,助力園區突破招商瓶頸!

在數字經濟高速發展的今天&#xff0c;傳統招商模式正面臨信息不對稱、效率低下、匹配不精準等瓶頸。產業園區作為區域經濟發展的核心載體&#xff0c;亟需借助智能化手段提升招商效能。構建大數據智慧招商平臺&#xff0c;利用大數據、人工智能等技術獲取精準招商線索、促進產…

Vue事件修飾符課堂練習

Vue事件修飾符課堂練習 題目?&#xff1a;基于 Vue 2.0&#xff0c;使用事件修飾符 .stop、.prevent、.capture、.self 和 .once&#xff0c;為按鈕綁定 click 事件&#xff0c;并展示每個修飾符的作用。 要求?&#xff1a; 創建一個 Vue 實例&#xff0c;并綁定到一個 HT…

【C#】線程回調

在 C# 中&#xff0c;線程回調是一種常見的編程模式&#xff0c;用于在線程完成任務后執行某些操作。通過使用 Thread 類或其他更高層次的并發工具&#xff08;如 Task&#xff09;&#xff0c;可以實現線程回調的功能。 回調機制 特點 直接性&#xff1a;回調通常是通過委托…

【C++游戲引擎開發】第14篇:視圖空間與相機坐標系

一、視圖空間的基礎數學框架 1.1 齊次坐標與變換矩陣 三維坐標系變換采用44齊次坐標矩陣,其通用形式為: M = [ A 3 3 b 3 1 0 1 3 1 ] \mathbf{M} = \begin{bmatrix} \mathbf{A}_{33} & \mathbf{b}_{31} \\ \mathbf{0}_{13} & 1 \end{bmatrix} M=[A33?013??…

【大模型理論篇】關于生成式模型中聯合分布概率學習必要性以及GPT是生成式模型的討論

1. 背景 之前我們在《生成式模型與判別式模型對比(涉及VAE、CRF的數學原理詳述)》以及《生成式模型算法原理深入淺出&#xff08;涉及Stable Diffusion、生成對抗網絡、高斯混合模型、隱馬爾可夫模型、樸素貝葉斯等算法原理分析及生成式模型解釋&#xff09;》中&#xff0c;我…

DIP支付方式改革下各種疾病醫療費用的影響以及分析方法研究綜述

DIP支付方式改革下各種疾病醫療費用的影響以及分析方法研究綜述 摘要 本文綜述了DIP支付方式改革對不同疾病醫療費用的影響及其分析方法&#xff0c;通過分析12篇相關文獻&#xff0c;探討了DIP支付方式在控制醫療費用、優化費用結構、提升醫療服務效率等方面的作用及其局限性…

嵌入式硬件篇---單片機周期

文章目錄 前言 前言 在單片機中&#xff0c;時序控制是其執行指令和協調外設的核心基礎。以下是單片機中常見的各種周期及其詳細說明&#xff0c;以層次結構展開&#xff1a; 時鐘周期&#xff08;Clock Cycle&#xff09; 定義&#xff1a; 時鐘周期是單片機的最小時間單位&a…

游戲引擎學習第221天:(實現多層次過場動畫)

資產: intro_art.hha 已發布 在下載頁面&#xff0c;你會看到一個新的藝術包。你將需要這個藝術包來進行接下來的開發工作。這個藝術包是由一位藝術家精心制作并打包成我們設計的格式&#xff0c;旨在將這些藝術資源直接應用到游戲中。它包含了許多我們會在接下來的直播中使用…

【3GPP核心網】【5G】精講5G系統的策略和計費控制框架

1. 歡迎大家訂閱和關注,精講3GPP通信協議(2G/3G/4G/5G/IMS)知識點,專欄會持續更新中.....敬請期待! 目錄 1. 系統架構 1.1 非漫游架構 1.2 漫游架構 1.3 支持Rx接口 2. 服務化接口及參考點 2.1 PCF 與 AF 間接口 2.2 PCF與SMF間接口 2.3 PCF與AMF間接口 2.4 V-PC…

榕壹云門店管理系統:基于Spring Boot+Mysql+UniApp的智慧解決方案

項目背景&#xff1a;數字化賦能服務行業&#xff0c;破解傳統門店管理痛點 在消費升級與數字化轉型浪潮下&#xff0c;傳統服務行業&#xff08;如美容、美發、美甲、采耳等&#xff09;面臨諸多管理挑戰&#xff1a;會員流失率高、預約排班混亂、員工績效統計低效、數據孤島等…

開發效率提升200%——cursor

cursor帶來的編程"革命" 高級語言編程轉為"自然語言編程"借助cursor&#xff0c;直接超越初級后臺開發、超越初級前端開發、超越初級測試、超越初級UI&#xff0c;產研一體linux命令只用學不用記&#xff0c;語言描述就是命令給一個表結構流程提示詞&…

UE4 踩坑記錄

1、Using git status to determine working set for adaptive non-unity build 我刪除了一個沒用的資源&#xff0c;結果就報這個錯&#xff0c;原因就是這條命令導致的&#xff0c; 如果這個項目是git項目&#xff0c; ue編譯時會優先通過 git status檢查哪些文件被修改&#…

藍橋杯 2025 C++組 省 B 題解

可分解的正整數 算法&#xff1a;思維 因為可以有負數 所以除了1以外的任何數都可以構造 當這個數為x構造方法為 -(x-1) -(x-2) -(x-3) ....-1 0 1...x-3 x-2 x-1 x 除了x&#xff0c;x以前的數都會被負數抵消 #include <bits/stdc.h> #define ll long long ll a…

docker創建容器添加啟動--restart選項

一、通過 Docker 命令直接修改已啟動的容器&#xff08;推薦-已驗證&#xff09; 操作步驟&#xff1a; 1.執行更新命令&#xff1a; docker update --restartalways <容器名或ID>此命令會將容器的重啟策略調整為 always&#xff08;無論容器以何種狀態退出&#xff0…

redission鎖釋放失敗處理

redission鎖釋放失敗處理 https://www.jianshu.com/p/055ae798547a 就是可以刪除 鎖的key 這樣鎖就釋放了&#xff0c;但是 還是要結合業務&#xff0c;這種是 非正規的處理方式&#xff0c;還是要在代碼層面進行處理。