(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.mzph.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;还是要在代码层面进行处理。