基于AT89C51单片机的多功能自行车测速计程器(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的多功能自行车测速计程器的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

目录

选题背景

原理图

PCB图

仿真图

 代码

系统论文

资源下载


选题背景

美丽的夜晚,骑着单车刷内环,既浪漫又可以锻炼身体,但是我们到底骑了多少米,我们的车速是多少,我们并不知道。自行车已经不仅仅是普通的代步、运输工具,而是成为人们娱乐、休闲、锻炼的首选。自行车简易数字里程表能够满足人们最基本的需求,让人们能清楚地知道当前的速度、里程等物理量。

关键字里程/速度;霍尔元件;单片机;LCD显示;超声波测距;震动防盗;人体感控; 

原理图


PCB图


仿真图


 代码


#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

#include "Data.h"
#include "DS1302.h"
#include "AT24C02.h"

sbit COUNT_IN=P3^2;

//定义1602相关管脚
sbit rs=P1^4;
sbit en=P1^0;

//键盘定义
sbit K1=P3^4;	//设置时间
sbit K3=P3^6;	//减按键
sbit K2=P3^5;	//加按键
sbit K4=P3^7;	//设置半径安全距离
sbit BEEP=P3^0;

uint count;
unsigned long Velocity,Mileage;

uchar code tab1[]={"  /  /     :    "}; //14/09/10 16:34 3   	
uchar code tab2[]={"  0.000km 00km/h"};	//000.000km 00km/h
uchar code tab3[]={"Wheel Radius  cm"};
uchar code tab4[]={"Safe Speed  km/h"};
uchar code tab5[]={"Sec :           "};
			   			
uchar Mode=0;
uchar bike_set=0;
uchar a;
char RADIUS,SAFE_SPEED;
bit LED_SEC;
uchar before_sec;	

//自定义字符
uchar code num[]={
						0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//1	 
						0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00,//2
						0x1f,0x01,0x01,0x1f,0x01,0x01,0x1f,0x00,//3	 
						0x11,0x11,0x11,0x1f,0x01,0x01,0x01,0x00,//4
						0x1f,0x10,0x10,0x1f,0x01,0x01,0x1f,0x00,//5	 
						0x1f,0x10,0x10,0x1f,0x11,0x11,0x1f,0x00,//6
						0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//7 	
};
void READS();
void SETS();
void delay(uint x)
{
	uint i,j;
	for(i=0;i<x;i++)
	for(j=0;j<110;j++);
}
void init()
{
	IT0=1;	//INT0负跳变触发	
    TMOD=0x01;//定时器工作于方式1
	TH0=0x3c;	  //50ms
	TL0=0xb0;
	EA=1; //CPU开中断总允许
	ET0=1;//开定时中断
	EX0=1;//开外部INTO中断
    TR0=1;//启动定时
}
/********液晶写入指令函数与写入数据函数,以后可调用**************/

void write_1602com(uchar com)//****液晶写入指令函数****
{
	rs=0;//数据/指令选择置为指令
	P0=com;//送入数据
	delay(1);
	en=1;//拉高使能端,为制造有效的下降沿做准备
	delay(1);
	en=0;//en由高变低,产生下降沿,液晶执行命令

}


void write_1602dat(uchar dat)//***液晶写入数据函数****
{
	rs=1;//数据/指令选择置为数据
	P0=dat;//送入数据
	delay(1);
	en=1; //en置高电平,为制造下降沿做准备
	delay(1);
	en=0; //en由高变低,产生下降沿,液晶执行命令
}
//自定义字符集
void Lcd_ram()      
{ 
	uint i,j,k=0,temp=0x40; 
	for(i=0;i<7;i++)
	{
	   for(j=0;j<8;j++)
	   {
	    write_1602com(temp+j);
	    write_1602dat(num[k]);
	    k++;
	   }
	   temp=temp+8;
	}
}

void lcd_init()//***液晶初始化函数****
{
	Lcd_ram();
	write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
	write_1602com(0x0c);//开显示不显示光标
	write_1602com(0x06);//整屏不移动,光标自动右移
	write_1602com(0x01);//清显示

	write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
	for(a=0;a<16;a++)
	{
		write_1602dat(tab1[a]);//向液晶屏写固定符号部分
	}
	write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
	for(a=0;a<16;a++)
	{
		write_1602dat(tab2[a]);//写显示固定符号
	}
}

void display()
{
	//			1km/h=100m/0.1h	  	 360s
	//			10km/h=100m/0.01h 	 36s
	//			100km/h=100m/0.001h  3.6s
	if(Mode==0&&bike_set==0)
	{
		//读时间
			Ds1302_Read_Time();
			//显示时间
			write_1602com(0x80);
			write_1602dat(0x30+time_buf1[1]/10);
			write_1602dat(0x30+time_buf1[1]%10);
			write_1602com(0x80+3);
			write_1602dat(0x30+time_buf1[2]/10);
			write_1602dat(0x30+time_buf1[2]%10);
			write_1602com(0x80+6);
			write_1602dat(0x30+time_buf1[3]/10);
			write_1602dat(0x30+time_buf1[3]%10);
			write_1602com(0x80+9);
			write_1602dat(0x30+time_buf1[4]/10);
			write_1602dat(0x30+time_buf1[4]%10);
			write_1602com(0x80+12);
			write_1602dat(0x30+time_buf1[5]/10);
			write_1602dat(0x30+time_buf1[5]%10);
			write_1602com(0x80+15);
			write_1602dat(time_buf1[7]-1);		

			if(before_sec!=time_buf1[6])
			{
				before_sec=time_buf1[6];
				write_1602com(0x80+11);
				write_1602dat(':');
				LED_SEC=1;
			}
			if(LED_SEC==0)
			{
				write_1602com(0x80+11);
				write_1602dat(' ');	
			}

			write_1602com(0x80+0x40);
			if(Mileage/1000000==0)
			write_1602dat(' ');
			else
			write_1602dat(0x30+Mileage/1000000);//数字+0x30得到该数字的LCD1602显示码
			if(Mileage%1000000/100000==0)
			write_1602dat(' ');
			else	
			write_1602dat(0x30+Mileage%1000000/100000);//数字+0x30得到该数字的LCD1602显示码
			write_1602dat(0x30+Mileage%1000000%100000/10000);//数字+0x30得到该数字的LCD1602显示码 
			write_1602com(0x80+0x40+4);
			write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//数字+30得到该数字的LCD1602显示码
			write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//数字+30得到该数字的LCD1602显示码
			write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//数字+30得到该数字的LCD1602显示码
			SETS();
	
			write_1602com(0x80+0x40+10);
			write_1602dat(0x30+Velocity/10);
			write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码
	}
	else if(Mode!=0)
	{
		switch(Mode)
		{
			case 1:	
				write_1602com(0x80+0x40);//显示固定符号写入位置
				for(a=0;a<16;a++)
				{
					write_1602dat(tab5[a]);//写显示固定符号
				}
				write_1602com(0x80+0x40+14);
				write_1602dat(0x30+time_buf1[6]/10);
				write_1602dat(0x30+time_buf1[6]%10);	
				write_1602com(0x0F);	 //打开闪烁
				write_1602com(0x80+1);
				break;						  
			case 2:
				write_1602com(0x80+4);
				break;
			case 3:
				write_1602com(0x80+7);
				break;
			case 4:
				write_1602com(0x80+10);
				break;
			case 5:
				write_1602com(0x80+13);
				break;
			case 6:
				write_1602com(0x80+0x40+15);
				break;
			case 7:
				write_1602com(0x80+15);
				break;
			case 8:
				write_1602com(0x0c);
				write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
				for(a=0;a<16;a++)
				{
					write_1602dat(tab1[a]);//向液晶屏写固定符号部分
				}
				write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
				for(a=0;a<16;a++)
				{
					write_1602dat(tab2[a]);//写显示固定符号
				}
				break;
		}
	}
	else if(bike_set!=0)
	{
		switch(bike_set)
		{
			case 1:	
				write_1602com(0x80);//显示固定符号写入位置
				for(a=0;a<16;a++)
				{
					write_1602dat(tab3[a]);//写显示固定符号
				}
				write_1602com(0x80+0x40);//显示固定符号写入位置
				for(a=0;a<16;a++)
				{
					write_1602dat(tab4[a]);//写显示固定符号
				}
				write_1602com(0x80+12);
				write_1602dat(0x30+RADIUS/10);		   //车轮半径
				write_1602dat(0x30+RADIUS%10);
				write_1602com(0x80+0x40+10);
				write_1602dat(0x30+SAFE_SPEED/10);		   //安全速度
				write_1602dat(0x30+SAFE_SPEED%10);	
				write_1602com(0x0F);	 //打开闪烁
				write_1602com(0x80+13);
				break;						  
			case 2:
				write_1602com(0x80+0x40+11);
				break;
			case 3:
				write_1602com(0x0c);
				write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
				for(a=0;a<16;a++)
				{
					write_1602dat(tab1[a]);//向液晶屏写固定符号部分
				}
				write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
				for(a=0;a<16;a++)
				{
					write_1602dat(tab2[a]);//写显示固定符号
				}
				break;
		}
	}	
}

void KEY()
{	
	if(bike_set==0&&K1==0)
	{
		delay(20);
		if(bike_set==0&&K1==0)
		{
			BEEP=0;
			delay(50);
			BEEP=1;
			Mode++;
			display();
			if(Mode>=8)
			{
				Mode=0;
				Ds1302_Write_Time();
			}
		}
		while(bike_set==0&&K1==0);
	}
	if(K4==0&&Mode==0)
	{
		delay(20);
		if(K4==0&&Mode==0)
		{
			BEEP=0;
			delay(50);
			BEEP=1;
			bike_set++;
			display();
			if(bike_set>=3)
			{
				bike_set=0;
				SETS();
			}
		}
		while(Mode==0&&K4==0);
	}

	//+
	if(K2==0&&(Mode!=0||bike_set!=0))
	{
		delay(20);
		//调时
		if(K2==0&&(Mode!=0||bike_set!=0))
		{
			BEEP=0;
			delay(50);
			BEEP=1;	
			switch(Mode)
			{
				case 1:
					time_buf1[1]++;
					if(time_buf1[1]>=100)
						time_buf1[1]=0;
					write_1602com(0x80);
					write_1602dat(0x30+time_buf1[1]/10);
					write_1602dat(0x30+time_buf1[1]%10);
					write_1602com(0x80+1);
					break;
				case 2:
					time_buf1[2]++;
					if(time_buf1[2]>=13)
						time_buf1[2]=1;
					write_1602com(0x80+3);
					write_1602dat(0x30+time_buf1[2]/10);
					write_1602dat(0x30+time_buf1[2]%10);
					write_1602com(0x80+4);
					break;
				case 3:
					time_buf1[3]++;
					if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
						time_buf1[3]=1;
					write_1602com(0x80+6);
					write_1602dat(0x30+time_buf1[3]/10);
					write_1602dat(0x30+time_buf1[3]%10);
					write_1602com(0x80+7);
					break;
				case 4:
					time_buf1[4]++;
					if(time_buf1[4]>=24)
						time_buf1[4]=0;
					write_1602com(0x80+9);
					write_1602dat(0x30+time_buf1[4]/10);
					write_1602dat(0x30+time_buf1[4]%10);
					write_1602com(0x80+10);
					break;
				case 5:
					time_buf1[5]++;
					if(time_buf1[5]>=60)
						time_buf1[5]=0;
					write_1602com(0x80+12);
					write_1602dat(0x30+time_buf1[5]/10);
					write_1602dat(0x30+time_buf1[5]%10);
					write_1602com(0x80+13);
					break;
				case 6:
					time_buf1[6]++;
					if(time_buf1[6]>=60)
						time_buf1[6]=0;
					write_1602com(0x80+0x40+14);
					write_1602dat(0x30+time_buf1[6]/10);
					write_1602dat(0x30+time_buf1[6]%10);
					write_1602com(0x80+0x40+15);
					break;
				case 7:
					time_buf1[7]++;
					if(time_buf1[7]>=8)
						time_buf1[7]=1;
					write_1602com(0x80+15);
					write_1602dat(time_buf1[7]-1);
					write_1602com(0x80+15);
					break;
			}
			switch(bike_set)
			{
				case 1:
					RADIUS++;
					if(RADIUS>=71)
					RADIUS=0;
					write_1602com(0x80+12);
					write_1602dat(0x30+RADIUS/10);
					write_1602dat(0x30+RADIUS%10);
					write_1602com(0x80+13);
					break;
				case 2:
					SAFE_SPEED++;
					if(SAFE_SPEED>=100)
					SAFE_SPEED=0;
					write_1602com(0x80+0x40+10);
					write_1602dat(0x30+SAFE_SPEED/10);
					write_1602dat(0x30+SAFE_SPEED%10);
					write_1602com(0x80+0x40+11);
					break;
			}
		}
		while(K2==0);
	}

	//-
	if(K3==0&&(Mode!=0||bike_set!=0))
	{
		delay(20);
		//调时
		if(K3==0&&(Mode!=0||bike_set!=0))
		{
			BEEP=0;
			delay(50);
			BEEP=1;
			switch(Mode)
			{
				case 1:
					time_buf1[1]--;
					if(time_buf1[1]<0)
						time_buf1[1]=99;
					write_1602com(0x80);
					write_1602dat(0x30+time_buf1[1]/10);
					write_1602dat(0x30+time_buf1[1]%10);
					write_1602com(0x80+1);
					break;
				case 2:
					time_buf1[2]--;
					if(time_buf1[2]<=0)
						time_buf1[2]=12;
					write_1602com(0x80+3);
					write_1602dat(0x30+time_buf1[2]/10);
					write_1602dat(0x30+time_buf1[2]%10);
					write_1602com(0x80+4);
					break;
				case 3:
					time_buf1[3]--;
					if(time_buf1[3]<=0)
						time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
					write_1602com(0x80+6);
					write_1602dat(0x30+time_buf1[3]/10);
					write_1602dat(0x30+time_buf1[3]%10);
					write_1602com(0x80+7);
					break;
				case 4:
					time_buf1[4]--;
					if(time_buf1[4]<0)
						time_buf1[4]=23;
					write_1602com(0x80+9);
					write_1602dat(0x30+time_buf1[4]/10);
					write_1602dat(0x30+time_buf1[4]%10);
					write_1602com(0x80+10);
					break;
				case 5:
					time_buf1[5]--;
					if(time_buf1[5]<0)
						time_buf1[5]=59;
					write_1602com(0x80+12);
					write_1602dat(0x30+time_buf1[5]/10);
					write_1602dat(0x30+time_buf1[5]%10);
					write_1602com(0x80+13);
					break;
				case 6:
					time_buf1[6]--;
					if(time_buf1[6]<0)
						time_buf1[6]=59;
					write_1602com(0x80+0x40+14);
					write_1602dat(0x30+time_buf1[6]/10);
					write_1602dat(0x30+time_buf1[6]%10);
					write_1602com(0x80+0x40+15);
					break;
				case 7:
					time_buf1[7]--;
					if(time_buf1[7]<1)
						time_buf1[7]=7;
					write_1602com(0x80+15);
					write_1602dat(time_buf1[7]-1);
					write_1602com(0x80+15);
					break;
			}
			switch(bike_set)
			{
				case 1:
					RADIUS--;
					if(RADIUS<0)
					RADIUS=70;
					write_1602com(0x80+12);
					write_1602dat(0x30+RADIUS/10);
					write_1602dat(0x30+RADIUS%10);
					write_1602com(0x80+13);
					break;
				case 2:
					SAFE_SPEED--;
					if(SAFE_SPEED<0)
					SAFE_SPEED=99;
					write_1602com(0x80+0x40+10);
					write_1602dat(0x30+SAFE_SPEED/10);
					write_1602dat(0x30+SAFE_SPEED%10);
					write_1602com(0x80+0x40+11);
					break;
			}
		}
		while(K3==0);
	}	
	if(K2==0&&K3==0&&Mode==0&bike_set==0)
	{
		BEEP=0;
		delay(100);
		BEEP=1;
		delay(100);
		BEEP=0;
		delay(100);
		BEEP=1;
		delay(100);
		Mileage=0;
		SETS();
		while(K2==0&&K3==0);
	}
}
void BJ_SAFE()
{
	if(Velocity>SAFE_SPEED)
	{
		BEEP=0;
	}
	else
	{
		BEEP=1;
	}
}

void main()
{
	//初始化
	Ds1302_Init();
	lcd_init();
	initeeprom();
	//读取初始参数
	READS();
	//定时器初始化
//	InitTimer0();
	init();
	lcd_init();
	before_sec=time_buf1[6];
	while(1)
	{
		if(Mode==0&&bike_set==0)
		{
			display();
			BJ_SAFE();
		}
		KEY();
	}
}

void EXINT0() interrupt 0
{
	count++;
}

void time0() interrupt 1
{
	uchar m,n;
	TH0=0x3c;
	TL0=0xb0;	 //50ms
	m++;
	if(LED_SEC==1)
	{
		n++;
		if(n>=10)
		{
			n=0;
			LED_SEC=0;
		}
	}
	
	if(m>=10)
	{
		m=0;
		Mileage=Mileage+10*(Velocity/3.6)/2;		 //里程m=里程+速度km/h/3.6/2
		Velocity=count *2*3.14*RADIUS /100000*2*3600  /40;//将500ms的距离经过运算得到km/h,将速度/100,方便显示
		count=0;	
	}
}

//读初值
void READS()
{
	uchar Mileage_H,Mileage_M,Mileage_L;
	delay(10);
	RADIUS=read_add(0x01);
	delay(10);
	SAFE_SPEED=read_add(0x02);

	delay(10);
	Mileage_H=read_add(0x03);
	delay(10);
	Mileage_M=read_add(0x04);
	delay(10);
	Mileage_L=read_add(0x05);

	Mileage=Mileage_H*100000+Mileage_M*1000+Mileage_L*10;
}



















系统论文(部分)


引 言

自行车被发明及使用到现在已有两百多年的历史,这两百年间人类在不断的尝试与研发过程中,将玩具式的木马车转换到今日各式新颖休闲运动自行车,自行车发展的目的也从最早的交通代步的工具转换成休闲娱乐运动的用途。

随着居民生活水平的不断提高,自行车不再仅仅是普通的运输、代步的工具,而是成为人们娱乐、休闲、锻炼的首选。因此,人们希望自行车的功用更强大,能给人们带来更多的方便。自行车简易数字里程表作为自行车的一大辅助工具也随着这个需求而面世,其功能也逐渐从单一的里程显示发展到速度、时间显示。本设计采用51系列单片机设计一种体积小、操作简单的便携式自行车的速度里程表,它能自动地显示当前自行车行驶的里程及速度,并且具有测距防盗功能。

这次主要任务是利用霍尔元件、单片机、超声波发射、震动传感器等部件设计一个可用1602液晶显示里程、速度、防盗和测距的自行车速度里程表。本文主要介绍了自行车的速度里程表的设计思想、电路原理和元件的选择等内容,整体上分为硬件部分设计和软件部分设计。

本文首先扼要对该课题的任务进行方案论证,包括硬件方案和软件方案的设计;继而具体介绍了自行车的速度里程表的硬件设计,包括单片机的选择、传感器的选择、显示电路的设计;然后简要阐述了自行车的速度里程表的软件设计思路;最后针对仿真过程遇到的问题进行了说明与分析,对本次设计进行了系统的总结。

 具体的硬件电路包括STC89C52单片机的外围电路以及液晶显示电路等。

软件设计包括:芯片的初始化程序、定时中断子程序、显示子程序等,用keil软件采用C语言编写。

第一部分 设计任务                    

1.1 设计要求

(1)用1602显示屏显示速度,路程,时间。
(2)若超过预设的速度,则蜂鸣器报警

(3)报警临界速度可调

(4)使用震动传感器设计防盗系统

(5)使用超声波模块测距

(6)选择合适的调试模型

1.2 方案设计

    采用单片机实现:用霍尔传感器将所测转速转变为数字脉冲信号,然后再将数字脉冲信号数据传输于核心单片机处理,单片机将根据设计程序计算在一定时间内数字脉冲的频率,再由计数值最终得到里程数并通过终端显示设备显示出来。且附加报警功能,在速度超过某一个固定值后,蜂鸣器响,提示需要减速。当震动传感器震动频率超出设置频率时,蜂鸣器发出响声报警,数码管可显示路面的距离。

第三部分 系统软件的设计与实现

3.1 主程序流程图

 图9  主程序流程图

3.2 显示流程图 

该子程序用LCD动态扫描显示方式。先将单片机的P2.2口连接使能端口E。接着将单片机的P2.0口连接数据/命令选择端RS,P0口连接数据端D0~D7,然后将要显示的数字的值发送给P0口。然后调用延时,接着将P2.2口置0,P2.0口置1,写指令,将P2.2口置1,P2.0口置1,写数据,直到要显示的数字全部显示在液晶上。显示流程图如图10所示。

图10 显示流程图

3.3 速度处理流程图

3.4 电路仿真

3.4.1 仿真软件简介

Proteus是世界上著名的EDA工具,从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,

它也支持IAR、Keil和MPLAB等多种编译器。

3.4.2 仿真结果

仿真结果如图12所示。 

 图12


资源下载


如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 安装 XRDP,替代系统自带RDP远程桌面

起因&#xff0c;Ubuntu的自带RDP远程桌面很好用&#xff0c;但很傻卵&#xff0c;必须登录。 而设置了自动登录也不能解开KEYRING&#xff0c;必须必须必须用GUI手动登录。 &#xff08;我远程我用头给你坐机子面前开显示器先登录&#xff1f;&#xff1f;&#xff09; 比起VN…

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…

网络技术相关知识概念

网络技术&#xff1a; 进程&#xff08;Process&#xff09; 定义&#xff1a;进程是程序的一次执行过程&#xff0c;它有自己的内存空间和系统资源&#xff08;资源独立&#xff09;。特性&#xff1a; 每个进程都有唯一的PID&#xff08;进程ID&#xff09;。进程间通信&am…

笔记 4 :linux 0.11 中继续分析 0 号进程创建一号进程的 fork () 函数

&#xff08;27&#xff09;本条目开始&#xff0c; 开始分析 copy_process () 函数&#xff0c;其又会调用别的函数&#xff0c;故先分析别的函数。 get_free_page &#xff08;&#xff09; &#xff1b; 先 介绍汇编指令 scasb &#xff1a; 以及 指令 sstosd &#xff1a;…

Vue1-Vue核心

目录 Vue简介 官网 介绍与描述 Vue的特点 与其它 JS 框架的关联 Vue周边库 初识Vue Vue模板语法 数据绑定 el与data的两种写法 MVVM模型 数据代理 回顾Object.defineProperty方法 何为数据代理 Vue中的数据代理 数据代理图示 事件处理 事件的基本使用 事件修…

Appium自动化测试系列: 2. 使用Appium启动APP(真机)

历史文章&#xff1a;Appium自动化测试系列: 1. Mac安装配置Appium_mac安装appium-CSDN博客 一、准备工作 1. 安卓测试机打开调试模式&#xff0c;然后使用可以传输数据的数据线连接上你的电脑。注意&#xff1a;你的数据线一定要支持传输数据&#xff0c;有的数据线只支持充…

MySQL:库操作

1. 创建数据库 create database [if not exists] name [create_specification], [create_specification]... []内为可选的选项 create_specification: character set charset_name -- 指定数据库采用的字符集 -- 数据库未来存储数据 collate collation_name -- 指定数据库字符…

Python3极简教程(一小时学完)下

目录 PEP8 代码风格指南 知识点 介绍 愚蠢的一致性就像没脑子的妖怪 代码排版 缩进 制表符还是空格 每行最大长度 空行 源文件编码 导入包 字符串引号 表达式和语句中的空格 不能忍受的情况 其他建议 注释 块注释 行内注释 文档字符串 版本注记 命名约定 …

github actions方式拉取docker镜像

参考&#xff1a; https://wkdaily.cpolar.cn/archives/gc 注意github actions提供的免费虚拟机空间有限&#xff0c;空间不足会报错&#xff0c;查看大概语句有10来G 我在workflow file里加了df -h 运行查看磁盘情况&#xff1a; 通过pwd命令&#xff0c;可以知道运行目录/ho…

深度加速器 为游戏而生

使用深度加速器的基本步骤如下 首先&#xff0c;访问深度加速器的官方网站或授权下载渠道&#xff0c;下载最新版本的深度加速器客户端。 下载完成后&#xff0c;电脑版直接双击打开免安装&#xff0c;将深度加速器安装到您的计算机或移动设备上。 注册与登录&#xff1a; 打…

OrangePi AI Pro 实测:感受 AI 应用的独特魅力与强大性能

OrangePi AiPro介绍和初始化配置 小寒有话说一、OrangePi AiPro介绍1. 主板详情2. 开发配置3. 镜像烧录4. 设备连接5. WiFi连接6. NVMe SSD的安装和挂载7. 更新下载源并下载必要的软件8. 扩展内存 二、Jupyter Lab AI测评应用案例1. 获取Jupyter Lab 网址链接2. 图像提取文字3.…

python开发prometheus exporter--用于hadoop-yarn监控

首先写python的exporter需要知道Prometheus提供4种类型Metrics 分别是&#xff1a;Counter, Gauge, Summary和Histogram * Counter可以增长&#xff0c;并且在程序重启的时候会被重设为0&#xff0c;常被用于任务个数&#xff0c;总处理时间&#xff0c;错误个数等只增不减的指…

电脑硬盘里的文件能保存多久?电脑硬盘文件突然没了怎么办

在数字化时代&#xff0c;电脑硬盘作为我们存储和访问数据的重要设备&#xff0c;承载着无数珍贵的回忆、工作成果和创意灵感。然而&#xff0c;硬盘里的文件能保存多久&#xff1f;当这些文件突然消失时&#xff0c;我们又该如何应对&#xff1f;本文将深入探讨这两个问题&…

【Python】深入了解`zip()`函数:高效地组合迭代对象

文章目录 1. zip()函数的基本用法2. 处理不同长度的可迭代对象3. 解压缩序列4. 使用zip()处理多个可迭代对象5. 结合for循环使用zip()6. 与字典结合使用7. 处理嵌套结构8. 与*运算符结合使用9. 实际应用示例&#xff1a;合并多个数据源10. 总结 Python中的zip()函数是一个强大且…

71.WEB渗透测试-信息收集- WAF、框架组件识别(11)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;70.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;10&#xff09;-CSDN博客 如果有…

【Python 项目】类鸟群:仿真鸟群

类鸟群&#xff1a;仿真鸟群 仔细观察一群鸟或一群鱼&#xff0c;你会发现&#xff0c;虽然群体由个体生物组成&#xff0c;但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时&#xff0c;彼此之间相互定位。受到打扰或惊吓时会破坏编队&#xf…

Java核心篇之JVM探秘:对象创建与内存分配机制

系列文章目录 第一章 Java核心篇之JVM探秘&#xff1a;内存模型与管理初探 第二章 Java核心篇之JVM探秘&#xff1a;对象创建与内存分配机制 第三章 Java核心篇之JVM探秘&#xff1a;垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战&#xff1a;Arthas工具使用及…

窗口比较器的TINA仿真

TINA仿真 LM339比较器是大多数情况下应用的&#xff0c;仿真用的TLV3491只是为了仿真说明问题。 窗口比较器。当被比较的信号电压Uin位于门限电压之间时&#xff0c;输出为高电位。当Uin不在门限电位范围之间时, 输出为低电位&#xff0c;窗口电压△UVS1-VS2。它可用来判断输入…

1.5.1抽象java入门

前言&#xff1a; 1.5.0版本中&#xff0c;我们熟练使用Git三个可视化操作&#xff08;签出&#xff0c;提交&#xff0c;对比&#xff09;&#xff0c;再加上1.4.0版本的新建&#xff0c;总计使用四个Git可视化操作&#xff1b;对java编程的学习&#xff0c;总结&#xff0c;…

部署一台本机的ai智能模型

部署ai模型 1.打开地址搜 https://ollama.com/&#xff08;开源ai模型网址&#xff09;下载软件 2.点击安装具有羊驼图标的文件 3.在右下角查看 羊驼图标 4。打开脚本&#xff0c;执行可以切换羊驼安装的位置与环境变量 5.winR 输入cmd,在命令窗口输入ollama命令 如果安装成功…