基于单片机的自行车智能辅助系统设计

news2024/11/14 4:18:21

文章目录

  • 前言
  • 资料获取
  • 设计介绍
  • 功能介绍
  • 设计程序
  • 具体实现截图
  • 目 录
  • 设计获取


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

随着科学技术与物联网的发展,推动着智能化产品逐渐从无到有再到快速发展,智能科技逐渐改变社会发展方式,过去很多无法想象的科学技术或者生活方式,现在利用先进和智能化逐一解决,而过去普通自行车智能辅助系统已经不能科学的需求。为了设计一款基于单片机自行车智能辅助系统控制器,此设计利用51系列单片机,很好设计出一款智能化自行车智能辅助控制系统的要求。
本设计的完整的系统主要包括STC系列单片机最小系统、 速度采集电路、液晶显示电路、按键电路、光照采集电路、语音播放电路、温度采集电路和电源电路等组成。
本设计软件系统采用模块设计思想,采用C语言作为程序设计语言,通过Keil C51完成程序设计,使用仿真器下载软件完成程序的烧录和在线调试。 本文中设计了各个模块运行流程图和程序运行思想。
在系统硬件和软件系统都完成后,经过相应的软硬件测试后,通过搭建实验平台,逐步验证系统功能。最后,经过实际试验,验证了本系统具有很好的实用性和稳定性。

功能介绍

该系统的电路原理图是使用Altium Designer原理图绘制软件完成的。该款软件是PORTEL公司20世纪后期研发出的一款绘制原理图软件。采用标准库应用方式,能进行网络设计,这款软件有数据处理能力很快和开源系统及three D 仿真能力,是一个32位的常用软件,可以完成大多数系统图的制作,要你看看编译器生成的汇编代码,你将能够体验到此款软件的使用非常方便的,大部分语句生系统原理图板设计和PL器件制作等工作,能制作信号层最多32个,16个信号源。此款绘图软件的特色如下所示:
(1)可以很容易的画出好几十种的原理图链接方式;
(2)强大的全局编辑功能;
(3)此款绘图软件含有很大的定则原理,在编译窗口下,可以满足在在线编译和其它编译方法;
(4)此款绘图软件含有自动铺铜性能,而且另外具有全自动铺铜功能;
(5)软件所占内存很小,而且兼容性很好的。
本设计的原理图是通过网络标号进行走线连接了,这样看起来更加清晰,不易混乱,而且查错非常简便。

本设计由STC89C52单片机电路+液晶1602显示电路+时钟DS1302显示电路+霍尔测速电路组成。
通过液晶1602实时显示时间、速度、温度和光强。

串口更新时间命令:2019032718235503 (位数必须正好)
表示:2018年03月27日18时23分55秒 周03

设计程序

#include "main.h"
/*-----------------------------------------------
  名称:IIC协议 PCF8591 AD/DA转换
  内容:使用4路AD中的4路检测外部模拟量输入
------------------------------------------------*/  
#define AddWr 0x90   //写数据地址 
#define AddRd 0x91   //读数据地址
extern bit ack;
/*------------------------------------------------
             读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
	unsigned char Val;
	Start_I2c();               //启动总线
	SendByte(AddWr);             //发送器件地址
	if(ack==0)return(0);
		SendByte(Chl);            //发送器件子地址
	if(ack==0)return(0);
		Start_I2c();
		SendByte(AddRd);
	if(ack==0)return(0);
		Val=RcvByte();
	NoAck_I2c();                 //发送非应位
	Stop_I2c();                  //结束总线
	return(Val);
}
/*------------------------------------------------
               写入DA转换数值
输入参数:dat 表示需要转换的DA数值,范围是0-255
------------------------------------------------*/
/*bit WriteDAC(unsigned char dat)
{
   Start_I2c();               //启动总线
   SendByte(AddWr);             //发送器件地址
     if(ack==0)return(0);
   SendByte(0x40);            //发送器件子地址
     if(ack==0)return(0);
   SendByte(dat);             //发送数据
     if(ack==0)return(0);
   Stop_I2c();  
}*/


sbit key_set = P3^5;
sbit key_LED = P3^6;
sbit key_BEEP = P3^7;
sbit LED1 = P2^4;
sbit LED2 = P2^3;
		  
sbit music1 = P1^0;
sbit music2 = P1^1;
sbit music3 = P1^2;
sbit music4 = P1^3;
sbit music5 = P1^4;

char state = 0;
char i;
#define CIRCLE  180   //宏定义 车轮的周长(这个要根据实际的车轮进行设置)
sbit Signal = P2^2;   //这里的Signal表示的是霍尔传感器的信号引脚 
unsigned int PluNum = 0; //脉冲数
bit dealSuduFlag =0;	 //处理速度标志
uint speed = 0 ;  //定义速度变量 
uint length = 0 ;//定义路程变量
uint time_20ms,time_2m;
uchar light_data;
int Temp_data;
uchar Speed_Limit = 25;
unsigned char xdata dis0[16];//定义显示区域临时存储数组
unsigned char uart_i =0;	  //串口计数
unsigned char ReadTimeFlag= 0;//读取时间标志
unsigned char night_flag= 0;//读取时间标志
unsigned char off_flag= 0;//读取时间标志
unsigned char SetFlag =0;	//时间设置标志
unsigned char time_buf2[17];   //时间暂存
unsigned char dis_time_buf[16] = {0};

/*------------------------------------------------
               定时器初始化子程序
------------------------------------------------*/
void ConfigTimer0()
{
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0为模式1
	TH0=(65536-10000)/256;		  //重新赋值 10ms
 	TL0=(65536-10000)%256;
    ET0 = 1;        //使能T0中断
    TR0 = 1;        //启动T0
	EA = 1;
}
/*------------------------------------------------
               定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
	TH0=(65536-20000)/256;		  //重新赋值 20ms
	TL0=(65536-20000)%256;
	
	time_20ms++;
	if(time_20ms%30==0)	   //定时读取时间标志
	{
		if(state==0)
		{	
			ReadTimeFlag=1; 
		}
	}
	if(time_20ms==100)	 //定时处理速度
	{
		dealSuduFlag =1;  //处理速度标志置位
		time_20ms =0;
		if((night_flag==1)&&(speed==0))
			time_2m++;
		else time_2m = 0;
		if(time_2m == 60)
		{
			time_2m=0;
		 	if((night_flag==1)&&(speed==0))
				off_flag =1;
			else
			   off_flag = 0;
		}	
	}

}
/*------------------------------------------------
               显示子程序
------------------------------------------------*/
void Display()
{
	if(state==0)
	{			
		LcdShowStr(3, 0, "Temp:");        //Temperature显示到液晶屏上
		LCD_set_position(8,0);	
		LCD_WriteData(0X30+TN/10);
		LCD_WriteData(0X30+TN%10);
		LCD_WriteData('.');	
		LCD_WriteData(0X30+TD);
		LCD_WriteData(0XDF);//显示°
		LCD_WriteData('C');	 

		LcdShowStr(3, 1, "Light:");        //light intensity显示到液晶屏上
		LCD_set_position(9,1);		 
		LCD_WriteData(0X30+light_data/100);
		LCD_WriteData(0X30+light_data%100/10);
		LCD_WriteData(0X30+light_data%10);
		LcdShowStr(12, 1, "Lux"); 

	}
	if(state==1)
	{
		LCD_WriteCom(0x02 + 0x80);     //表示第一行
		
		LCD_WriteData(2 + 0X30);
		LCD_WriteData(0 + 0X30);
		LCD_WriteData(dis_time_buf[2] + 0X30);    //年
		LCD_WriteData(dis_time_buf[3] + 0X30);
		
		LCD_WriteData('/');
		
		LCD_WriteData(dis_time_buf[4] + 0X30);    //月
		LCD_WriteData(dis_time_buf[5] + 0X30);
		
		LCD_WriteData('/');
		
		LCD_WriteData(dis_time_buf[6] + 0X30);    //日
		LCD_WriteData(dis_time_buf[7] + 0X30);
		
		LCD_WriteData(' ');
		
		LCD_WriteData(dis_time_buf[14] + 0X30);    //星期
		
		LCD_WriteCom(0x44 + 0x80);    //表示第二行
		
		LCD_WriteData(dis_time_buf[8] + 0X30);    //时
		LCD_WriteData(dis_time_buf[9] + 0X30);
		
		LCD_WriteData(':');
		
		LCD_WriteData(dis_time_buf[10] + 0X30);    //分
		LCD_WriteData(dis_time_buf[11] + 0X30);
		
		LCD_WriteData(':');
		
		LCD_WriteData(dis_time_buf[12] + 0X30);   //秒
		LCD_WriteData(dis_time_buf[13] + 0X30);
	}
	if(state==2)
	{
		//第一行,显示速度
		LcdShowStr(2,0,"Speed:"); //设定液晶的写入位置为第一行第一格
		LCD_WriteData(speed/100 +0x30);        //显示速度的整数部分
		LCD_WriteData('.');
		LCD_WriteData(speed%100/10 +0x30);   //显示速度的小数第一位
		LCD_WriteData(speed%10 +0x30);   //显示速度的小数第二位
		LCD_WriteData('m');
		LCD_WriteData('/');
		LCD_WriteData('s');
		
		    //第二行,显示里程
		LcdShowStr(2,1,"Length:");  //设定液晶的写入位置为第二行第一格
		LCD_WriteData(length/10000+0x30);    //显示里程的万位
		LCD_WriteData(length%10000/1000+0x30);    //显示里程的千位
		LCD_WriteData(length%1000/100+0x30);    //显示里程的百位
		LCD_WriteData(length%100/10+0x30);    //显示里程的十位
		LCD_WriteData(length%10+0x30);    //显示里程的个位
		LCD_WriteData('m');

	}		

}
/*------------------------------------------------
               按键控制子程序
------------------------------------------------*/
void ScanContrl()
{
	if(!key_set)
    {
		delayms(10);
		if(!key_set) 
		{
			state++;
			LCD_WriteCom(0x01);
			while(!key_set);
			if(state>2)
				 state=0;
		}
	}
   	if(!key_LED)
    {
		delayms(10);				
		if(!key_LED) 
	  	{
			music2 = 0;


	  	}
		while(!key_LED);
		music2 = 1;	
	}
	 if(!key_BEEP)
    {
		delayms(10);				
		if(!key_BEEP) 
	  	{
			LED1 = ~LED1;
			LED2 = ~LED2;
			if(LED1==1)
		 		music3 = 1;
			else
				music3 = 0;
	  	}
		while(!key_BEEP);
		music3 = 1;	
	}

}

/*------------------------------------------------
               数据读取子程序
------------------------------------------------*/
void ReadData()
{
	/****************第一路AD**********************/
	for(i=0;i<5;i++)		  //连续读5次,输入通道后多读几次,取最后一次值,以便读出稳定值
		light_data = 255-ReadADC(0);		  //采集第一路AD值 0-255
	light_data = light_data*250/255;
	if(light_data<30)
		night_flag = 1;
	else night_flag = 0;
     /****************第二路路AD**********************/
 	//for(i=0;i<5;i++)		  //连续读5次,输入通道后多读几次,取最后一次值,以便读出稳定值
   	//	 = 255-ReadADC(1);		  //采集第二路AD值 0-255

    /****************第三路AD**********************/
 	//for(i=0;i<5;i++)		  //连续读5次,输入通道后多读几次,取最后一次值,以便读出稳定值
   		//num=ReadADC(2);		  //采集第三路AD值 0-255
    /****************第四路AD**********************/
 	//for(i=0;i<5;i++)		  //连续读5次,输入通道后多读几次,取最后一次值,以便读出稳定值
   		//num=ReadADC(3);		  //采集第四路AD值 0-255

 	ReadTemp();

	if(1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零
	{
		ReadTimeFlag=0;  //标志位清零
		Ds1302_Read_Time();//读取时间参数

		dis_time_buf[0] = (time_buf[0] >> 4);    //年   
		dis_time_buf[1] = (time_buf[0] & 0x0f);
		dis_time_buf[2] = (time_buf[1] >> 4);   
		dis_time_buf[3] = (time_buf[1] & 0x0f);

		dis_time_buf[4] = (time_buf[2] >> 4);    //月  
		dis_time_buf[5] = (time_buf[2] & 0x0f);

		dis_time_buf[6] = (time_buf[3] >> 4);    //日   
		dis_time_buf[7] = (time_buf[3] & 0x0f);

		dis_time_buf[14] = (time_buf[7] & 0x07); //星期

		//第2行显示  
		dis_time_buf[8] = (time_buf[4] >> 4);    //时   
		dis_time_buf[9] = (time_buf[4]& 0x0f);   

		dis_time_buf[10] = (time_buf[5] >> 4);   //分   
		dis_time_buf[11] = (time_buf[5] & 0x0f);   

		dis_time_buf[12] = (time_buf[6] >> 4);   //秒   
		dis_time_buf[13] = (time_buf[6] & 0x0f);
	}
}

/*------------------------------------------------
               响应子程序
------------------------------------------------*/
void WarnBuzzer()
{
	if(length > 0)
	{
		if(length %5000 == 0)
			music5 = 0; 
		else music5 = 1;
	}
	else  music5 = 1;
	if(speed>800)
		music4 = 0;	
	else
		music4 = 1;	
	if(night_flag)
	{	
		if(speed>0)
		{
		   	off_flag=0;
			LED1 = 0;
			LED2 = 0;
		}
		if(off_flag==1)
		{	
			LED1 = 1;
			LED2 = 1;
		}

	}
	else 	
	{
		LED1 = 1;
		LED2 = 1;
	}
}

void UART_Init(void)
{
    SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
	TL1 = TH1;  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}

void uartSendByte(unsigned char dat)
{
	unsigned char time_out;
	time_out=0x00;
	SBUF = dat;			  //将数据放入SBUF中
	while((!TI)&&(time_out<100))  //检测是否发送出去
	{time_out++;delayus(10);}	//未发送出去 进行短暂延时
	TI = 0;						//清除ti标志
}

void uartSendStr(unsigned char *s,unsigned char length)
{
	unsigned char NUM;
	NUM=0x00;
	while(NUM<length)	//发送长度对比
	{
		uartSendByte(*s);  //放松单字节数据
		s++;		  //指针++
		NUM++;		  //下一个++
  	 }
}
void UART_SER (void) interrupt 4 	//串行中断服务程序
{
	unsigned char uart_buf;
	if(RI)                        //判断是接收中断产生
	{
		RI=0;                      //标志位清零
		  uart_buf=SBUF;                 //读入缓冲区的值
		  time_buf2[uart_i]=uart_buf&0x0F;
		  uart_i++;
		  if(uart_i>=16)                  //连续接收16个字符信息
		   {
		    uart_i=0;
			SetFlag=1;               //接收完成标志位置1
		   }
	      SBUF = uart_buf; //把接收到的值再发回电脑端
	}
	if(TI)  //如果是发送标志位,清零
	TI=0;
} 
/*------------------------------------------------
                主程序
------------------------------------------------*/
void main()
{	music1 = 0;
	InitLcd();//初始化液晶函数
	//Init_DS18B20();
	Ds1302_Init();
	ConfigTimer0();
	UART_Init();
	LcdShowStr(0, 0, "    Welcome    ");	  
	LcdShowStr(0, 1, " Bicycle System");
	delayms(3000);
	delayms(3000);
	LCD_WriteCom(0x01);
	uartSendStr("ready ok !",10);
	music1 = 1;
	while(1)
	{
		if(SetFlag==1)     //如果接收到串口信息则更新时钟
		{
			for(i=0;i<8;i++)
			{
				time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15
			}
			Ds1302_Write_Time();//接收更新的时间然后写入ds1302
			SetFlag=0;          //时钟信息更新后标志位清零
		}	
		if(Signal)
	    {
			delayms(10);				
			if(Signal) 
		  	{
				PluNum++;
				length +=  CIRCLE/100.0 ; //路程加一个车轮周期
		  	}
			while(Signal);	
		}
		if(dealSuduFlag == 1)
		{
			speed=(uint)(CIRCLE *PluNum/2.0);	//m/s
			PluNum=0;
			dealSuduFlag=0;
		}
		ReadData();//读取传感器数据
		ScanContrl();//按键控制
		Display(); 	 //数据显示
		WarnBuzzer();//蜂鸣器报警
	}
}


具体实现截图

请添加图片描述

请添加图片描述
请添加图片描述

目 录

第1章 绪论 3
1.1本文研究背景和意义 3
1.2自行车智能辅助控制系统发展趋势 3
1.3本文研究内容 4
第2章 控制系统总体方案设计 5
2.1控制系统功能分析 5
2.2单片机芯片的选择 5
第3章 系统的硬件平台设计 6
3.1系统总体框架设计 6
3.2控制中心电路设计 6
3.2.1最小系统电路设计 6
3.2.2电源转换电路 7
3.3主要信号采集与处理电路设计 8
3.3.1霍尔测试电路设计 8
3.3.2按键电路设计 9
3.3.3 语音播放电路设计 9
3.3.4光照采集电路设计 10
3.3.5温度测量电路设计 11
3.3.6 LCD1602显示电路设计 12
3.3.7时钟电路设计 13
3.4系统总体电路设计 13
第4章 系统软件平台设计 15
4.1开发环境软件介绍 15
4.1.1 Keil简介 15
4.1.2程序在Keil中的调试 15
4.2主程序设计 16
4.3主要系统信号采集与处理程序设计 16
4.3.1 LCD1602程序设计 16
4.3.2按键检测程序设计 17
4.3.3光照强度采集程序设计 18
4.3.4温度传感器程序设计 19
第5章 硬件组装与调试 21
5.1元器件的选择与测量 21
5.2元件的焊接与组装 21
5.3电路的调试 22
5.3.1 调试方法 22
5.3.2 调试步骤 22
第6章 总结 24
致 谢 25
参考文献 26

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多数元素-简单

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 【LeetCode 每日一题】169. 多数元素 | 手写图解版思路 代码讲解_哔哩哔哩_bilibili c为计数器&#xff0c;代表当前候选人的票数 v为当前候选人 x为遍历的各候选人得票 分三种情况&#xff1a; 第一种&#xff0c;c…

OpenBayes 一周速览|IC-Light 图片打光神器一键启动!Tecnalia 电子设备废物高光谱数据集上线,提高电子废物回收准确性

公共资源速递 This Weekly Snapshots &#xff01; 5 个数据集&#xff1a; * BTAD 工业异常数据集 * WebVid 大型短视频数据集 * bAbi 问答和文本理解的数据集 * OpenMIR 音乐收听脑电图数据集 * Tecnalia 电子设备废物高光谱数据集 2 个教程&#xff1a; * ComfyUl …

12. Inseq 特征归因:可视化解释 LLM 的输出

Feature Attribution&#xff08;特征归因&#xff09;&#xff1a;你可以将其当做对模型输出的解释&#xff0c;就像在图像分类中可视化模型关注的区域一样。 本文将介绍 Inseq&#xff0c;这是一个用于解释和可视化序列生成模型输出的工具。我们将通过翻译任务&#xff08;关…

Flink 本地启动的多种方式

Flink 本地启动的多种方式 Application模式通过代码提交到Yarn上启动 //设置Yarn客户端 YarnClient yarnClient ; Configuration configuration new Configuration(); if (customConfiguration ! null) {configuration.addAll(customConfiguration); } configuration.set(Jo…

Linux——虚拟机网络配置

进行虚拟机网络配置是确保虚拟机能够正常访问网络、与宿主机及其他设备进行通信的关键步骤。虚拟机网络配置允许用户根据实际需求选择合适的网络模式&#xff0c;并调整网络参数以满足特定的网络环境要求。 虚拟机常见的三种网络模式包括桥接模式、NAT模式和主机模式&#xff…

Shiro rememberMe反序列化漏洞(Shiro-550) 靶场攻略

漏洞原理 Apache Shiro框架提供了记住密码的功能&#xff08;RememberMe&#xff09;&#xff0c;⽤户登录成功后会⽣成经过 加密并编码的cookie。在服务端对rememberMe的cookie值&#xff0c;先base64解码然后AES解密再反 序列化&#xff0c;就导致了反序列化RCE漏洞。 那么&a…

制作网上3D展馆需要什么技术并投入多少费用?

制作网上3D展览馆项目&#xff0c;需要考虑以下技术和预算方面的信息&#xff1a; 技术需求&#xff1a; 1、三维建模技术&#xff1a;利用3D软件&#xff08;3ds max、maya、blender、c4d等&#xff09;制作展馆和展品的3D模型 2、Web3D技术&#xff1a;如WebGL&#xff0c…

飞腾平台perf工具PMU事件集成指南

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

VMware安装ubuntu24.04桌面版

一、安装推荐要求 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 二、下载桌面系统 下载地址&#xff08;使用手机转存再下载是对作者的最大支持&#xff09;&#xff1a;夸克网盘分享 (quark.cn) 已安装的纯净版ubuntu虚拟…

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台

普通查询+聚合函数的使用(8个例子,数值和字符串的比较)

目录 回顾普通查询聚合函数的使用 表数据 例子1 例子2 例子3 ​​​​​​​例子4 例子5 例子6 例子7(数值和字符串的比较) 例子8 回顾普通查询聚合函数的使用 之前我们介绍过聚合函数 --mysql分组查询 -- 聚合函数(介绍,使用),group by使用,分组聚合统计(使用,havi…

MATLAB基本语句

MATLAB语言为解释型程序设计语言。在程序中可以出现顺序、选择、循环三种基本控制结构&#xff0c;也可以出现对M-文件的调用(相当于对外部过程的调用)。 由于 MATLAB开始是用FORTRAN语言编写、后来用 C语言重写的&#xff0c;故其既有FORTRAN的特征&#xff0c;又在许多语言规…

基于JAVA+SpringBoot+Vue的医院资源管理系统

基于JAVASpringBootVue的医院资源管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…

基于SpringBoot的医院管理系统【附源码】

基于SpringBoot的医院管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4系统概要设计 4.1概述 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 医生模块的实现 5.1.…

音视频入门基础:FLV专题(3)——FLV header简介

一、引言 本文对FLV格式的FLV header进行简介&#xff0c;FLV文件的开头就是FLV header。 进行简介之前&#xff0c;请各位先从《音视频入门基础&#xff1a;FLV专题&#xff08;1&#xff09;——FLV官方文档下载》下载FLV的官方文档《video_file_format_spec_v10_1.pdf》和…

猫咪掉毛背后的隐秘原因?除毛除臭宠物空气净化器双管齐下!

作为一个二胎家庭&#xff0c;两只猫咪&#xff0c;除了卖萌加倍之外&#xff0c;拉屎需要排队之外&#xff0c;家里最不缺就是毛了。作为一个名鼻炎患者真的很难顶。感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落…

wpf,工具栏上,最小化按钮的实现

工具栏上&#xff0c;最小化按钮的实现。工具栏做成的是用户控件。 用户控件的xaml <Button HorizontalAlignment"Right" Height"32" Click"MinimizeClick" /> 用户控件的cs代码 private void MinimizeClick(object sender, RoutedEven…

IDEA创建Web项目(详细版)

目录 1 新建Web项目 步骤如下 1 打开idea,选择新建项目 2 点击创建 3 点击项目结构&#xff0c;选择添加模块 ---web 2 配置Tomcat 步骤如下 1 点击Edit Configurations&#xff08;编辑配置&#xff09; 1.1 右上角当前文件下 选择编辑配置 1.2 点击菜单栏中run 选…

奔驰「进退」两难

合资车企&#xff0c;尤其是BBA为代表的传统豪华品牌&#xff0c;正在进入阵痛期。 9月14日&#xff0c;奔驰在华合资公司—腾势新能源发生工商变更&#xff0c;比亚迪受让前者剩余10%股份&#xff0c;并变更为旗下全资子公司。至此&#xff0c;这个由奔驰和比亚迪在2011年成立…

Python 从入门到实战25(模块)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类继承的相关知识。今天我们将学习一下模块的…