【51单片机系列】DS18B20温度传感器模块

news2025/2/6 5:55:43

本文是关于温度传感器的相关内容。

文章目录

  • 一、 DS18B20数字温度传感器介绍
    • 1.1、 DS18B20温度传感器的特点
    • 1.2、DA18B20内部结构
    • 1.3、 DS18B20的温度转换规则
    • 1.4、 DS18B20的ROM指令表
    • 1.6、 计算温度
    • 1.7、 读写时序
  • 二、DS18B20使用示例

一、 DS18B20数字温度传感器介绍

DS18B20是 DALLAS半导体公司推出的一种“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,DS18B20是一种新型的、体积小、使用电压宽、与微处理器接口简单的数字化温度传感器。

1.1、 DS18B20温度传感器的特点

DS18B20温度传感器具有如下特点:

1、使用电压范围更宽,电压范围:3.0V ~ 5.5V,在寄生电源方式下可由数据线供电。

2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

4、DS18B20在使用中不需要任何外围元件,全部传感器元件及转换电路集成在一只形如三极管的集成电路内。

5、温度范围支持-55°C~+125°C,在-10 ~ +85°C时精度为±0.5°C。

6、可编程的分辨率为9 ~ 12位,对应的可分辨温度分别为0.5°C、0.25°C、0.125°C和0.0625°C,可实现高精度测温。

7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。

8、测量结果直接输出数字温度信号,以“一根总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

1.2、DA18B20内部结构

DS18B20外观实物如下图所示:

DS18B20外观实物图

从上图中可以看出来,当正对传感器切面(上图中间)时,传感器的管脚顺序从左到右排列:管脚1为GND,管脚2为数据DQ,管脚3为VDD。如果传感器插反,电源将短路,传感器会发烫,容易损坏。

通常在开发板上会标出传感器的凸起处,所以只需要把传感器凸起的方向对着开发板凸起方向插入即可。

DS18B20内部结构如下图所示:

DS18B20内部结构

  • ROM中的64位序列号是出厂前被光刻好的,可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20。当接多个DS18B20时,通过64位的序列号可以确定使用的是哪个温度传感器

64位光刻ROM组成如下:

8位CRC48位序列号8位类型标号(28H)

1.3、 DS18B20的温度转换规则

DS18B20的核心功能是它可以直接读出数字的温度数值。

温度传感器的精度是用户可编程功能的9、10、11或12位,精度分别为0.5、0.25、0.125、0.0625,单位°C。

上电状态下默认精度是12位。

DS18B20启动后保持低功耗等待状态,当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。转换完以后,产生的温度数据以两个字节的形式被存储到告诉暂存器的温度寄存器中,DS18B20继续保持等待状态。读取温度寄存器中的数据,再根据精度就可以得到当前测得的温度。

1.4、 DS18B20的ROM指令表

指令约定代码功能
读ROM33H读DS18B20温度传感器ROM中的编码,即64位序列号
符合ROM55H发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20使之做出响应,为下一步对DS18B20的读写作准备
搜索ROM0F0H用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件做好准备
跳过ROM0CCH忽略64位ROM地址,直接向DS18B20发送温度变换命令,适用于单片机工作
告警搜索命令0ECH执行后只有温度超过设定值上限或下限才做出响应

1.5、 DS18B20的RAM指令表

指令约定代码功能
温度变换44H启动DS18B20进行温度转换,12位转换时最长为750ms,结果存入内部9字节RAM中
读暂存器0BEH读内部RAM中9字节的内容
写暂存器4EH发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
复制暂存器48H将RAM中第3、4字节的内容复制到EEPROM中
重调EEPROM0B8H将EEPROM中内容恢复到RAM中的第3、4字节
读供电方式0B4H读DS18B20的供电模式,寄生供电时DS18B20发送0,外接电源供电DS18B20发送1

1.6、 计算温度

DS19B20温度传感器的内部存储器包括一个高速的暂存器RAM和一个非易失性的可电擦除的EEPROM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

配置寄存器是配置不同的位数来确定温度和数字的转化,配置寄存器结构如下:

TMR1R011111

低五位是1

TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。DS18B20出厂时该位被设置为0,用户不需要去改动。

R1和R0用来设置DS18B20的精度(分辨率),可设置为9、10、11或12位,对应的分辨率温度是0.5°C、0.25°C、0.125°C和0.0625°C。R0和R1配置如下:

R1R0精度最大转换时间
009-bit93.75ms ( t C O N V / 8 ) (t_{CONV}/8) (tCONV/8)
0110-bit187.5ms ( t C O N V / 4 ) (t_{CONV}/4) (tCONV/4)
1011-bit375ms ( t C O N V / 2 ) (t_{CONV}/2) (tCONV/2)
1112-bit750ms ( t C O N V ) (t_{CONV}) (tCONV)

初始状态默认精度是12位,即R1R0=11。

高速暂存存储器由9个字节组成,分配如下:

寄存器内容字节地址
温度值低位(LS Byte)0
温度值高位(MS Byte)1
高温限值(TH)2
低温限值(TL)3
配置寄存器4
保留5
保留6
保留7
CRC校验位8

当温度转换命令(44H)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。存储的两个字节,高字节的前5位是符号S,单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如下:

寄存器bit7bit6bit5bit4bit3bit2bit1bit0
LS Byte 2 3 2^3 23 2 2 2^2 22 2 1 2^1 21 2 0 2^0 20 2 − 1 2^{-1} 21 2 − 2 2^{-2} 22 2 − 3 2^{-3} 23 2 − 4 2^{-4} 24
MS ByteSSSSS 2 6 2^6 26 2 5 2^5 25 2 4 2^4 24

如果测得的温度大于0,符号位S=0,将测试得到的数值乘以0.0625(默认精度)即可得到实际温度;

如果测得的温度小于0,符号位S=1,将测到的数据取反加1再乘以0.0625即可得到实际温度。

温度与数据对应关系如下:

温度°C数据输出(二进制)数据输出(十六进制)
+1250000 0111 1101 000007D0H
+850000 0101 0101 00000550H
+25.06250000 0001 1001 00010191H
+10.1250000 0000 1010 001000A2H
+0.50000 0000 0000 10000008H
00000 0000 0000 00000000H
-0.51111 1111 1111 1000FFF8H
-10.1251111 1111 0101 1110FF5EH
-25.06251111 1110 0110 1111FE6EH
-551111 1100 1001 0000FC90H

上电复位时温度寄存器默认值为+85°C。

比如测试到的数据为0x0550,高5位是0表示测试到的温度是正温度,0x0550十进制是1360,将1360乘以0.0625等于85就是得到的温度值,即0x0550对应的是85°C。

1.7、 读写时序

由于DS18B20是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证数据的完整性。

DS18B20时序包括:初始化时序、写(0和1)时序、读(0和1)时序。

DS18B20发送所有的命令和数据都是字节的低位在前。

(1) 初始化时序

单总线上的所有通信都是以初始化序列开始的。

主机输出低电平,保持低电平时间至少480us(该时间的时间范围可以从480到960us),以产生复位脉冲。

接着主机释放总线,外部的上拉电阻将单总线拉高,延时15~60us,并进入接收模式。

接着DS18B20拉低总线60~240us,以产生低电平应答脉冲,若为低电平,还要做延时,其延时时间从外部上拉电阻将单总线拉高算起算起最少要480us。

初始化时序图如下:

DS18B20初始化时序图

① 数据线拉到低电平0;

②延时480us;

③ 数据线拉到高电平1;

④ 延时等待80us,如果初始化成功则在15~60us内产生一个由DS18B20返回的低电平,根据该状态可以确定它存在;

⑤ 如果CPU读到了数据线上的低电平0后,还要延时,其延时时间从发出的高电平算起(第③步)的时间算起,最少要480us。

根据上述时序,可以编写对应的初始化代码,如下:

/*************************************************************************
* 函数名:		DS18B20Init
* 函数功能:	DS18B20温度传感器初始化
* 输入:			void
* 输出:			初始化成功返回1,失败返回0
**************************************************************************/
uchar DS18B20Init()
{
	uchar i;
	DSPORT=0;  // 数据线拉低
	i=80;
	while(i--);  // 延时480us
	DSPORT=1;  // 数据线拉高
	i=0;
	while(DSPORT)
	{
		delay1ms(1);  // 数据线拉高后延时至少480us
		i++;
		if(i>5)
		{
			return 1;
		}
		
	}
	return 0;
}

其中DSPORT定义如下:

sbit DSPORT = P3^7; // DS18B20的数据线连接到P3.7口

(2) 写时序

写时序包括写0时序和写1时序。

所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。

写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。

写0时序:主机输出低电平,延时60us,然后释放总线,延时2us。

写时序图如下:

DS18B20写时序图

① 数据线先置低电平0;

② 延时15us;

③ 按从低位到高位的顺序发送数据(一次只发送一位);

④ 延时60us;

⑤ 将数据线拉到高电平。

⑥ 重复1~5步骤,直到发送完整的字节;

⑦ 最后将数据线拉高。

根据上述时序编写出DS18B20写数据的代码,如下:

/*************************************************************************
* 函数名:		DS18B20WriteByte
* 函数功能:	DS18B20按照时序写一个字节
* 输入:			dat:写入的数据
* 输出:			void
**************************************************************************/
void DS18B20WriteByte(uchar dat)
{
	uchar i, j;
	j=0;
	for(i=0;i<8;i++)
	{
		DSPORT=0;  // 数据线拉低
		j++;  // 延时15us
		j++;
		DSPORT=dat&0x01;
		j=10;  // 延时60us
		while(j--);
		DSPORT=1;
		dat=dat>>1;
	}
}	

(3) 读时序

单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。

所有读时序至少需要60us,且在2次读时序之间至少需要1us的恢复时间。

每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us内采样总线状态。

读时序图如下:

DS18B20读时序图

① 将数据线拉低0;

② 延时1us;

③ 将数据线拉高1,释放总线准备读数据;

④ 延时10us;

⑤ 读数据线的状态得到1个状态位,并进行数据处理;

⑥ 延时45us;

⑦ 重复1~6步骤,直到读完一个字节。

根据上述时序可以编写DS18B20读数据的时序,如下:

/*************************************************************************
* 函数名:		DS18B20ReadByte
* 函数功能:	DS18B20按照时序读一个字节
* 输入:			void
* 输出:			返回读取到的一个字节的数据
**************************************************************************/
uchar DS18B20ReadByte()
{
	uchar i, j;
	uchar bi, dat;
	j=0;
	dat=0;
	for(i=0;i<8;i++)
	{
		DSPORT=0;  // 数据线拉低
		j++;  // 延时1us
		DSPORT=1;
		j++;  // 延时10us
		j++;
		bi=DSPORT;
		dat= (dat>>1)|(bi<<7);
		j=7;
		while(j--);
	}
	
	return dat;
}

(4) DS18B20读取温度

根据ROM指令表,当总线上只有一个DS18B20时,首先发送CCH指令,然后发送RAM温度转换指令44H,

那么如果总线上只挂接了一个DS18B20,那么DS18B20典型温度读取过程为:复位→发SKIP ROM命令(0xCC)→发开始转换命令(0x44)→延时→复位→发送SKIP ROM命令(0xCC)→发读存储器命令(0xBE)→连续读出两个字节数据(即温度)→结束。

二、DS18B20使用示例

本示例实现的功能为:系统运行时,插上DS18B20温度传感器,数码管显示检测的温度值。用到的资源包括数码管和DS18B20,proteus设计如下:

proteus设计数码管显示检测到的温度

根据上面介绍的时序及读温度流程,DS18B20读取温度代码如下:

// DS18B20转换温度,复位->发送0xcc跳过ROM命令->发送0x44温度转换命令
void DS18B20ChangeTemp()
{
	DS18B20Init();
	delay1ms(1);
	DS18B20WriteByte(0xcc);  // 发送0xcc命令
	DS18B20WriteByte(0x44);  // 发送0x44命令
}

// DS18B20发送读取温度命令,复位->发送0xcc跳过ROM命令->发送0xBE读存储器命令
void DS18B20ReadTempCom()
{
	DS18B20Init();
	delay1ms(1);
	DS18B20WriteByte(0xcc);  // 发送0xcc命令
	DS18B20WriteByte(0xBE);  // 发送0xBE命令
}

// DS18B20读取检测到的温度,温度转换->发送读温度命令->读取数据
int DS18B20ReadTemp()
{
	int temp;
	uchar tmH, tmL;
	DS18B20ChangeTemp();
	DS18B20ReadTempCom();
	tmL=DS18B20ReadByte();
	tmH=DS18B20ReadByte();
	temp=tmH;
	temp = (temp<<8)|tmL;
	return temp;
}

主函数main.c如下:

/*
	实现功能:使用DS18B20温度传感器检测当前温度,并将结果显示到数码管中
	[2023-12-25] zoya
*/
#include <reg52.h>
#include "TempDS18B20.h"

typedef unsigned char u8;
typedef unsigned int u16;

#define GPIO_LED P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smg[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
u8 display[6];

// 延时函数
void delay(u16 i)
{
	while(i--);
}

// 数码管显示函数
void DigDisplay()
{
	u8 i;
	for(i=0;i<6;i++)
	{
		switch(i)
		{
			case 0: LSA=1; LSB=1; LSC=1; break;  // Y7
			case 1: LSA=0; LSB=1; LSC=1; break;  // Y6
			case 2: LSA=1; LSB=0; LSC=1; break;  // Y5
			case 3: LSA=0; LSB=0; LSC=1; break;  // Y4
			case 4: LSA=1; LSB=1; LSC=0; break;  // Y3
			case 5: LSA=0; LSB=1; LSC=0; break;  // Y2
			case 6: LSA=1; LSB=0; LSC=0; break;  // Y1
			case 7: LSA=0; LSB=0; LSC=0; break;  // Y0
		}
		
		GPIO_LED=display[i];
		delay(500);
		GPIO_LED=0x00;
	}
}

// 温度处理函数
void TempPros(int temp)
{
	float tp;
	if(temp<0)
	{
		display[0]=0x40;  // -
		temp=temp-1;
		temp=~temp;
		tp=temp;
		temp=tp*0.0625*100+0.5;
	}
	else
	{
		display[0]=0x00;
		tp=temp;
		temp=tp*0.0625*100+0.5;
	}
	
	display[1]=smg[temp%10000/1000];
	display[2]=smg[temp%1000/100]|0x80;  // |0x80显示小数点
	display[3]=smg[temp%100/10];
	display[4]=smg[temp%10/1];
	display[5]=0x39;
	
}

void main()
{
	while(1)
	{
		TempPros(DS18B20ReadTemp());
		DigDisplay();
	}
}

仿真结果,DS18B20默认温度是85°,所以系统初始运行时显示85度。

数码管显示DS18B20检测到的温度

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

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

相关文章

真心建议,入职业务部门前先学会BI数据分析

不管进入哪个业务部门&#xff0c;都需要具备一定的数据分析能力&#xff0c;能够从不断累积的数据中发现并解决问题。比如销售部门的需要通过分析销售数据&#xff0c;及时发现销售不佳的商品&#xff0c;调整销售策略&#xff0c;提高销售额、销售利润等。而随着精细化数据分…

一体式读卡器:引领数据读取新潮流

一体式读卡器&#xff1a;引领数据读取新潮流 随着科技的发展&#xff0c;读卡器在各个领域的应用越来越广泛&#xff0c;如工业自动化生产、身份认证、门禁控制、数据采集等。读卡器主要有两种类型&#xff1a;一体式读卡器和分体式读卡器。这两种类型的读卡器各有其优缺点&a…

Pr2024 for Mac/win中文版:为创意无限延展的全新时代

随着科技的不断进步和创新&#xff0c;影视制作行业也在不断发展。作为专业视频编辑软件的领军者&#xff0c;Premiere Pro于2024年推出了全新的版本Pr2024&#xff0c;为创意无限延展的全新时代揭开了崭新的篇章。 Pr2024以其强大的功能和卓越的性能&#xff0c;为用户带来了…

基于图搜索的自动驾驶规划算法 - BFS,Dijstra,A*

本文将讲解BFS&#xff0c;Dijstra&#xff0c;A*&#xff0c;动态规划的算法原理&#xff0c;不正之处望读者指正&#xff0c;希望有兴趣的读者能在评论区提出一些这些算法的面试考点&#xff0c;共同学习&#xff0c;一起进步 0 图论基础 图有三种&#xff1a;无向图、有向…

软件架构师的主要职责说明文(合集)

软件架构师的主要职责说明文1 职责&#xff1a; 1、挖掘和分析业务需求&#xff0c;对公司业务平台进行架构改进和升级设计&#xff0c;制定架构升级规划和过渡方案; 2、承担软件产品核心功能的开发工作&#xff0c;牵头保障整个系统不出现重大技术故障; 3、进行技术评估与产品…

有什么好用的C/C++源代码混淆工具?

​ 有什么好用的C/C源代码混淆工具&#xff1f; 开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用…

财务分析进阶篇:终于有人把利润分析怎么做给讲清了!

在之前的BI系列文章中&#xff0c;我们给大家介绍了如何用BI进行企业费用分析和毛利分析的方法。   发布后有小伙伴提到&#xff1a;“既然费用和毛利都分析了&#xff0c;顺便把利润表的数据分析一起做了呗”&#xff0c;因此这就有了本期内容。我希望结合前两篇文章&#xf…

ssh工具 从ssh服务器下载文件夹

此文分享一个python脚本,用于快速的定位、选择ssh服务器上的文件夹,并将其下载到本地指定的位置。 效果演示 🔥完整演示效果 👇 第一步,显然,我们需要选择功能 👇 第二步,确认我们需要从哪个ssh服务器上下载文档 👇 第三步,定位、选择、确认需要下载的文件夹…

计网03-数据的封装和解封装

数据封装和解封装的过程 实例&#xff1a;有两台电脑 PC&#xff11;和PC&#xff12;&#xff0c;PC1要给PC&#xff12;发送一个文本文件 1、数据的封装过程&#xff1a; 应用层&#xff1a;将原始数据转换成计算机能识别的二进制数传输层&#xff1a;在传输层是有固定的传…

vr虚拟高压电器三维仿真展示更立体全面

VR工业虚拟仿真软件的应用价值主要体现在以下几个方面&#xff1a; 降低成本&#xff1a;通过VR技术进行产品设计和开发&#xff0c;可以在虚拟环境中进行&#xff0c;从而减少对物理样机的依赖&#xff0c;降低试错成本和时间。此外&#xff0c;利用VR技术构建的模拟场景使用方…

Guava自加载缓存LoadingCache使用指南

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天我们来聊聊缓存。在Java世界里&#xff0c;高效的缓存机制对于提升应用性能、降低数据库负担至关重要。想象一下&#xff0c;如果每次数据请求都要跑到数据库里取&#xff0c;那服务器岂不是要累趴了&#x…

如何在Photoshop中创建色彩鲜艳的文本效果

如何在 Photoshop 中制作霓虹灯 1. 如何创建背景 步骤 1 学习如何在 Photoshop 中制作霓虹灯文本的第一步是背景。创建一个新的 1160 x 750 像素文档&#xff0c;并将分辨率设置为 300。 转到"文件">"嵌入位置"&#xff0c;然后打开"垃圾灰色砖…

苹果证书p12和描述文件的创建方法

​ 苹果证书p12和描述文件的创建方法 在2020年之前&#xff0c;我们在使用appuploder创建苹果证书的时候&#xff0c;只需要注册苹果开发者账号&#xff0c;但不需要缴费成为开发者。 在2020年之后&#xff0c;需要先缴费成为苹果开发者。 假如你还没有注册苹果开发者账号&…

ElasticSearch 文档操作

批量操作 语法 批量操作对json有严格的要求&#xff0c;每个json串不能换行&#xff0c;只能放在同一行&#xff0c;相邻的json串之间必须要有换行。每个操作必须是一对json串&#xff08;delete语法除外&#xff09; { action: { metadata }} { request body } { ac…

同步与互斥(三)

一、递归锁 /* 创建一个递归锁&#xff0c;返回它的句柄。 * 此函数内部会分配互斥量结构体 * 返回值: 返回句柄&#xff0c;非NULL表示成功 */ SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );/* 释放 */ BaseType_t xSemaphoreGiveRecursive( SemaphoreHandle_t…

WAVE SUMMIT+ 2023倒计时2天,传文心一言将曝最新进展!

10句话2分钟&#xff0c;挑战成功说服宿管阿姨开门&#xff0c;这个人群中的“显眼包”是一个接入文心大模型4.0游戏里的NPC&#xff0c;妥妥 “工具人”实锤&#xff5e; 尝试用AI一键自动识别好坏咖啡豆&#xff0c;看一眼便知好坏&#xff0c;真正“颜值即正义”&#xff0…

电脑监控软件排行榜(电脑监控软件隐藏安装)

在当今数字化时代&#xff0c;电脑已经成为我们工作、学习和生活中不可或缺的工具。然而&#xff0c;随着电脑使用的普及&#xff0c;电脑监控软件也逐渐浮出水面。这类软件可以对电脑进行全方位的监控和管理&#xff0c;保护电脑安全、提高工作效率。 本文将为您介绍电脑监控…

处理etcd源码包编译异常

1、下载etcd包&#xff0c;执行go build报异常&#xff1a; client\v2\example_keys_test.go:1:1: expected package, found . client\v3\example_auth_test.go:1:1: expected package, found . client\v3\concurrency\example_election_test.go:1:1: expected package, found…

限流(rate limiter)

项目中业务提出需求&#xff0c;要求对商品的立即购买接口进行限流。 经过百度及调研&#xff0c;决定在拦截器加限流。拦截器相关讲解见上几篇博客springmv中的拦截器 springmvc限流 RateLimiter 最终的限流代码如下(从百度借鉴&#xff0c;已经找不到出处&#xff09;&am…

Python模拟动态星空

前言 今天&#xff0c;我们来用Python做个星空。 一、模拟星空 1,.首先导入所需要的库&#xff1a; from turtle import * from random import random, randint 2.初始画面&#xff1a; screen Screen() width, height 800, 600 screen.setup(width, height) screen.tit…