蓝桥杯单片机组第十四届省赛,2024年最新写得太好了

Write_DS18B20(0xcc);
Write_DS18B20(0x44);

init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);

low=Read_DS18B20();
high=Read_DS18B20();

return ((high<<8)|low)/16.0;

}



onewire.h
#include <STC15F2K60S2.H>

void Delay_OneWire(unsigned int t) ;
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
float Read_Temperature(void);


####  2.2.3 DS1302



> 
> 该模块读取数据是16进制,不要忘记数码管表示时除或者取余16
> 
> 
> 



ds1302.c
/* # DS1302代码片段说明
1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <ds1302.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;

//
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}

//
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; nop();
SCK=0; nop();
RST=1; nop();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}

//
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; nop();
SCK=0; nop();
RST=1; nop();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; nop();
SCK=0; nop();
SCK=1; nop();
SDA=0; nop();
SDA=1; nop();
return (temp);
}

void Set_Rtc(unsigned char ucRtc)
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0);//关闭写保护
for(i=0;i<3;i++)
Write_Ds1302_Byte(0x84-i
2,ucRtc[i]);
Write_Ds1302_Byte(0x8e,1);//打开写保护
}

void Read_Rtc(unsigned char ucRtc)
{
unsigned char i;
for(i=0;i<3;i++)
ucRtc[i]=Read_Ds1302_Byte(0x85-i
2);
}



ds1302.h
#include <STC15F2K60S2.H>

void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte ( unsigned char address );
void Set_Rtc(unsigned char *ucRtc);
void Read_Rtc(unsigned char *ucRtc);


#### 2.2.4 NE555



> 
> NE555模块我放在main.c里面写的,采用定时器0,可以用STC烧录工具生成代码
> 
> 
> 



> 
> ![](https://img-blog.csdnimg.cn/direct/ac8d0fabfe534b69b191b4ce7a94c77a.png)加上一句**TMOD|=0x05;**就ok了 
> 
> 
> 



//NE555必须使用定时器0 且要加入(TMOD|=0x05;)这段代码
//定时器0初始化
void Timer0Init(void) //0毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x05; //设置计时方式
TL0 = 0x00; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}




---


## 3.main.c文件


### 3.1 定时器



> 
> 因为NE555采用定时器0,所以我采用定时器1来计时
> 
> 
> 



/利用STC工具生成后要加入(ET1=1,EA=1)两段代码
//定时器1初始化
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x18; //设置定时初始值
TH1 = 0xFC; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时

ET1=1;
EA=1;

}

//定时器1
void Timer1Sever(void) interrupt 3
{
if(++Key_Slow10) Key_Slow=0;
if(++Seg_Slow
500) Seg_Slow=0;
if(++Seg_Pos==8) Seg_Pos=0;

if(++Timer_1000ms==1000) 
{
	TR0=0;//停止计时
	Timer_1000ms=0;
	Freq=(TH0<<8)|TL0;
	TH0=TL0=0;
	TR0=1;//开始计时
}

if(Find_Flag==1)
{
	if(++Timer_3000ms==3000)
	{
		Timer_3000ms=3001;
	}
}

if(S9_Flag==1)
{
	if(++Timer_2000ms==2000)
		Timer_2000ms=2001;
}
else
	Timer_2000ms=0;
if(++Timer_1000ms==1000)
{
	Timer_1000ms=0;
	Led_Star_Flag=!Led_Star_Flag;
}
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
Led_Disp(Seg_Pos,ucLed[Seg_Pos]);

}


### 3.2 void main()



> 
>  DS18B20上电后会先显示85,所以要延时750ms,STC生成
> 
> 
> 


![](https://img-blog.csdnimg.cn/direct/0ab99cc94d804fb08e90aba743b51a10.png)



> 
> 对应DS1302模块,要先设置时间
> 
> 
> 



//main()函数
void main()
{
//读取DS18B20要在main()函数里面先读取延时750ms。
Read_Temperature();
Delay750ms();
//读书DS1302的时间要先在main()函数里面先设置。
Set_Rtc(ucRtc);
//用定时器要先初始化
Timer0Init();
Timer1Init();
//板子要先初始化
System_Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}


###  3.3 完整代码



main.c
#include <STC15F2K60S2.H>
#include <intrins.h>
#include <iic.h>
#include <onewire.h>
#include <ds1302.h>
#include <Seg.h>
#include <Key.h>
#include <Led.h>
#include <Init.h>

//变量定义区
/按键/
unsigned char Key_Slow;//10
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;
/数码管/
unsigned int Seg_Slow;//500
unsigned Seg_Pos;
unsigned Seg_Buf[8]={10,10,10,10,10,10,10,10};
unsigned Seg_Point[8]={0,0,0,0,0,0,0,0};
/Led/
unsigned ucLed[8]={0,0,0,0,0,0,0,0};
/自定义变量/

unsigned char Seg_Disp_Mode;//界面:0-时间,1-回显,2-参数
/时间界面/
unsigned char ucRtc[3]={0x13,0x03,0x05};//时-分-秒,写出0x的形式
/回显界面/
unsigned char Re_Disp_Mode;//回显:0-温度,1-湿度,2-时间
//温度回显·
unsigned char Max_Temperature;//最大温度
float Aver_Temperature;//平均温度
//湿度回显
unsigned char Max_Humidity;//最大湿度
float Aver_Humidity;//平均湿度
//时间回显
unsigned char trigger_Inedx;//触发次数
unsigned char trigger_Time[3];//触发时间
/参数界面/
unsigned char Temperature_Set=30;

/温湿度界面/
unsigned int Freq;//实时频率
unsigned int Timer_1000ms;
/S9长短按/
unsigned int Timer_2000ms;//用于S9长按
bit S9_Flag;//记录是否按下S9;
/温湿度界面/
bit Tem_And_Hum_Flag;//温湿度界面和其他界面的区分标志
unsigned char Temperature_Disp;//温湿度界面的温度
unsigned char Humidity_Disp;//温湿度界面的湿度
unsigned char Temperature_Disp_Old;//上一次温湿度界面的温度
unsigned char Humidity_Disp_Old;//上一次温湿度界面的湿度
bit Error_Humidity;//湿度是否有效
bit Led6_Flag;//判断本次采集的温湿度是否均升高
/判断是否进入采集/
bit flag;//判断湿度数据是否有效,有效为0,无效为1;
unsigned char Voltage;
unsigned char Voltage_Old;
unsigned int Timer_3000ms;//3s
bit Find_Flag;
/报警指示灯/
bit Led_Star_Flag;//控制亮灭
bit Led_Flag;//表明采集温度大于温度参数的状态
unsigned int Timer_1000ms;//1000ms

//清空数据函数
void Clear_Data(void)
{
unsigned char i=0;
Max_Temperature=0;
Aver_Temperature=0;
Max_Humidity=0;
Aver_Humidity=0;
trigger_Inedx=0;
for(i=0;i<3;i++)
trigger_Time[i]=0;
}

//按键处理函数
void Key_Proc()
{
if(Key_Slow) return;
Key_Slow=1;

Key_Val = Key_Read();
Key_Down = Key_Val & (Key_Old ^ Key_Val);
Key_Up = ~ Key_Val & (Key_Old ^ Key_Val);
Key_Old = Key_Val;

//时间回显界面
if(Re_Disp_Mode==2&&Seg_Disp_Mode==1)
{
	if(Key_Down==9)
		S9_Flag=1;//开始计时
	if(Key_Up==9)//S9抬起
	{						
		if(Timer_2000ms>=2000&&S9_Flag==1)
		{
			Clear_Data();
			S9_Flag=0;//停止计时
		}
		else
			S9_Flag=0;//停止计时
	}
}

switch(Key_Down)
{
	case 4:
		if(++Seg_Disp_Mode==3)
			Seg_Disp_Mode=0;
		Re_Disp_Mode=0;
	break;
	
	case 5:
		if(Seg_Disp_Mode==1)
		{
			if(++Re_Disp_Mode==3)
				Re_Disp_Mode=0;
		}	
	break;
		
	case 8:
		if(Seg_Disp_Mode==2)
		{
			if(++Temperature_Set==100)
				Temperature_Set=99;
		}
	break;
		
	case 9:	
		//参数界面
		if(Seg_Disp_Mode==2)
		{	
			if(--Temperature_Set==255)
				Temperature_Set=0;
		}
	break;
	
}

}

//湿度处理函数
bit Read_Humidity(void)
{
if(Freq<200||Freq>2000)
Error_Humidity=0;//无效数据
else
{
Error_Humidity=1;
Humidity_Disp=(unsigned char)(2/45*(Freq-200)+10);
}
return Error_Humidity;
}

//清除数码管
void Clear_Seg(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
Seg_Buf[i]=10;
Seg_Point[i]=0;
}
}
//信息处理函数
void Seg_Proc()
{
unsigned char i;
if(Seg_Slow) return;
Seg_Slow=1;

Read_Rtc(ucRtc);
Temperature_Disp=(unsigned char)Read_Temperature();

//判断是否进入温湿度界面
Voltage=AD_Read(0x41);
//由亮到暗,避免重复进入
if((Voltage_Old>50&&Voltage<50)&&Tem_And_Hum_Flag==0)
{
	Find_Flag=1;//开始计时
	Tem_And_Hum_Flag=1;
	if(Read_Humidity()==1)
	{
		if(++trigger_Inedx==100) trigger_Inedx=99;
		for(i=0;i<3;i++)
			trigger_Time[i]=ucRtc[i];
	}
}
//是否间隔3s
else if(Tem_And_Hum_Flag==1&&Timer_3000ms>=3000) 
{
	Find_Flag=0;//停止计时·
	Timer_3000ms=0;
	Tem_And_Hum_Flag=0;
}

Voltage_Old=Voltage;

//处于温湿度界面
if(Tem_And_Hum_Flag==1)
{
	Seg_Buf[0]=16;//E
	Seg_Buf[1]=Seg_Buf[2]=10;//熄灭
	Seg_Buf[3]=Temperature_Disp/10;
	Seg_Buf[4]=Temperature_Disp%10;
	Seg_Point[6]=0;
	
	if(Temperature_Disp>Temperature_Set) 
		Led_Flag=1;
	else 
		Led_Flag=0;
	/*用于读取最大温度,平均温度*/
	Max_Temperature=(Max_Temperature>Temperature_Disp)?Max_Temperature:Temperature_Disp;
	//平均温度等于(前几次采集的次数乘上平均值+本次采集的温度)/采集次数
	Aver_Temperature=((trigger_Inedx-1)*Aver_Temperature+Temperature_Disp)/trigger_Inedx;
	
	Seg_Buf[5]=11;//-
	//采集有效
	if(Error_Humidity==1)
	{
		flag=0;//进行了温湿度采集,且采集有效
		Seg_Buf[6]=Humidity_Disp/10;
		Seg_Buf[7]=Humidity_Disp%10;
		/*用于读取最大温度,平均温度*/
		Max_Humidity=(Max_Humidity>Humidity_Disp)?Max_Humidity:Humidity_Disp;
		//平均温度等于(前几次采集的次数乘上平均值+本次采集的温度)/采集次数
		Aver_Humidity=((trigger_Inedx-1)*Aver_Humidity+Humidity_Disp)/trigger_Inedx;
		
		if(trigger_Inedx>=2)
		{
			Led6_Flag=(Temperature_Disp>Temperature_Disp_Old)&(Humidity_Disp>Humidity_Disp_Old);
			Temperature_Disp_Old=Temperature_Disp;
			Humidity_Disp_Old=Humidity_Disp;
		}
	}
	else
	{
		flag=1;//进行了温湿度采集,且采集有效
		Seg_Buf[6]=Seg_Buf[7]=17;//A
	}
	
}
else
{
	switch(Seg_Disp_Mode)
	{
		//时间
		case 0:
			Seg_Buf[0]=ucRtc[0]/16;
			Seg_Buf[1]=ucRtc[0]%16;
			Seg_Buf[2]=11;//-
			Seg_Buf[3]=ucRtc[1]/16;
			Seg_Buf[4]=ucRtc[1]%16;
			Seg_Buf[5]=11;//-
			Seg_Buf[6]=ucRtc[2]/16;
			Seg_Buf[7]=ucRtc[2]%16;
			Seg_Point[6]=0;
		break;
		
		//回显
		case 1:
			switch(Re_Disp_Mode)
			{
				//温度
				case 0:
					if(trigger_Inedx==0)
						Clear_Seg();
					Seg_Buf[0]=12;//C
					Seg_Buf[1]=10;//熄灭
					if(trigger_Inedx>0)
					{
						Seg_Buf[2]=Max_Temperature/10;
						Seg_Buf[3]=Max_Temperature%10;
						Seg_Buf[4]=11;//-
						Seg_Buf[5]=(unsigned char)Aver_Temperature/10;
						Seg_Buf[6]=(unsigned char)Aver_Temperature%10;
						Seg_Buf[7]=(unsigned int)(Aver_Temperature*100)%10;
						Seg_Point[6]=1;
					}	
				break;
				//湿度
				case 1:
					if(trigger_Inedx==0)
						Clear_Seg();
					Seg_Buf[0]=13;//H
					Seg_Buf[1]=10;//熄灭
					if(trigger_Inedx>0)
					{
						Seg_Buf[2]=Max_Humidity/10;
						Seg_Buf[3]=Max_Humidity%10;
						Seg_Buf[4]=11;//-
						Seg_Buf[5]=(unsigned char)Aver_Humidity/10;
						Seg_Buf[6]=(unsigned char)Aver_Humidity%10;
						Seg_Buf[7]=(unsigned int)(Aver_Humidity*100)%10;
						Seg_Point[6]=1;
					}
					break;
				//时间
				case 2:
					if(trigger_Inedx==0)
						Clear_Seg();
					Seg_Buf[0]=14;//F
					Seg_Buf[1]=trigger_Inedx/10;
					Seg_Buf[2]=trigger_Inedx%10;
					if(trigger_Inedx>0)
					{
						Seg_Buf[3]=trigger_Time[0]/16;
						Seg_Buf[4]=trigger_Time[0]%16;
						Seg_Buf[5]=11;//-
						Seg_Buf[6]=trigger_Time[1]/16;
						Seg_Buf[7]=trigger_Time[1]%16;
						Seg_Point[6]=0;
					}
				break;	
			}
		break;
			
		//参数
		case 2:
			Seg_Buf[0]=15;//P
			Seg_Buf[1]=Seg_Buf[2]=Seg_Buf[3]=Seg_Buf[4]=Seg_Buf[5]=10;//熄灭
			Seg_Buf[6]=Temperature_Set/10;
			Seg_Buf[7]=Temperature_Set%10;
			Seg_Point[6]=0;
		break;
		
	}
}

}

//其他处理函数
void Led_Proc()
{
unsigned char i;
for(i=0;i<2;i++)
ucLed[i]=(i==Seg_Disp_Mode);
ucLed[2]=Tem_And_Hum_Flag;

ucLed[3]=(Led_Star_Flag&Led_Flag);
ucLed[4]=flag;

ucLed[5]=Led6_Flag;

}

//NE555必须使用定时器0 且要加入(TMOD|=0x05;)这段代码
//定时器0初始化
void Timer0Init(void) //0毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x05; //设置计时方式
TL0 = 0x00; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

//利用STC工具生成后要加入(ET1=1,EA=1)两段代码
//定时器1初始化
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x18; //设置定时初始值
TH1 = 0xFC; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时

ET1=1;
EA=1;

}

//定时器1
void Timer1Sever(void) interrupt 3
{
if(++Key_Slow10) Key_Slow=0;
if(++Seg_Slow
500) Seg_Slow=0;
if(++Seg_Pos==8) Seg_Pos=0;

if(++Timer_1000ms==1000) 
{
	TR0=0;//停止计时
	Timer_1000ms=0;
	Freq=(TH0<<8)|TL0;
	TH0=TL0=0;
	TR0=1;//开始计时
}

if(Find_Flag==1)
{
	if(++Timer_3000ms==3000)
	{
		Timer_3000ms=3001;
	}
}

if(S9_Flag==1)
{
	if(++Timer_2000ms==2000)
		Timer_2000ms=2001;
}
else
	Timer_2000ms=0;
if(++Timer_1000ms==1000)
{
	Timer_1000ms=0;
	Led_Star_Flag=!Led_Star_Flag;
}
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
Led_Disp(Seg_Pos,ucLed[Seg_Pos]);

}

void Delay750ms() //@12.000MHz
{
unsigned char i, j, k;

_nop_();
_nop_();
i = 35;
j = 51;
k = 182;
do
{
	do
	{
		while (--k);
	} while (--j);
} while (--i);

}

//main()函数
void main()
{
//读取DS18B20要在main()函数里面先读取延时750ms。
Read_Temperature();
Delay750ms();
//读书DS1302的时间要先在main()函数里面先设置。
Set_Rtc(ucRtc);
//用定时器要先初始化
Timer0Init();
Timer1Init();
//板子要先初始化
System_Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}




---


 4.结束语




**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/dfd483a05077fcf941b06e2142cfdde8.png)
![img](https://img-blog.csdnimg.cn/img_convert/42a3cac0ed9330c4d46e6e97555e2853.png)
![img](https://img-blog.csdnimg.cn/img_convert/fd847e0d4d98d594a8a0d107ce6880e6.png)
![img](https://img-blog.csdnimg.cn/img_convert/30146e8bec132e490edc891e0ba7c0bd.png)
![img](https://img-blog.csdnimg.cn/img_convert/a9e311366d367a2745c40ff7ee9b0c12.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/817533bef03ea209c1048363ea1d0f06.jpeg)

![](https://img-blog.csdnimg.cn/img_convert/9a8cb5f8c0ec69e6499adead0da6e95b.png)



最全的Linux教程,Linux从入门到精通

======================

1.  **linux从入门到精通(第2版)**

2.  **Linux系统移植**

3.  **Linux驱动开发入门与实战**

4.  **LINUX 系统移植 第2版**

5.  **Linux开源网络全栈详解 从DPDK到OpenFlow**



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/59742364bb1338737fe2d315a9e2ec54.png)



第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)



**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论




**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/95a4915b713a2d6077c405bcecb0df3e.jpeg)

x学习笔记教程](https://img-blog.csdnimg.cn/img_convert/59742364bb1338737fe2d315a9e2ec54.png)



第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。



![华为18级工程师呕心沥血撰写3000页Linux学习笔记教程](https://img-blog.csdnimg.cn/img_convert/9d4aefb6a92edea27b825e59aa1f2c54.png)



**本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。**

> 需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论




**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-h3Qmul5Y-1713089291357)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值