基于STM8的数字温度计设计
这是在2021年12月初完成的一次课程设计,全程自己设计组装完成,现作为记录存档发布,大家也可以借鉴本文来完成自己的课程设计。(建议使用电脑阅读)
1 课程设计和方案设计
1.1 课程设计的目的与意义
本课程是在前导验证性认知实验以及相关的理论课基础上,进行更高层次命题的设计性的教学环节,是学生在教师指导下独立查阅资料、设计、安装和编程特定功能的电子电路的课程。对于提高学生的电子工程素质和科学实验能力非常重要。
本课程旨在培养学生综合单片机和模电、数电、传感器等知识,解决电子信息方面常见实际问题的能力,并了解一般电子电路与单片机构成简单系统及较为复杂的编程的方法。促使学生积累单片机系统的开发经验,准备走向更复杂更实用的应用领域,是参加各类大学生电子竞赛前的技能培训课程。目的在于巩固基础、注重设计、培养技能、追求创新、走向实用。
1.2 本次课程设计的学习目标
1)掌握数字温度计的设计、组装与调试方法。
2)熟悉AD和IAR软件的使用方法。
3)提高动手能力,学会将理论知识与实践相结合,充分发挥个人与团队协作的能力。
1.3 设计任务与要求
选用STM8型单片机作为主控制器件,DS18B20作为测温传感器,通过LCD1602实现温度显示。通过DS18B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.01℃。利用该器件直接向单片机传输数字信号,使用单片机处理及控制。可设置的上下限温度报警。
1.4 基本思路与设计框图
数字温度计主要由液晶显示屏LCD1602、温度传感器DS18B20和单片机STM8S105K4T6组成,STM8S通过DS18B20读取温度信息,然后将数据显示在显示屏上。通过按键,可以设置报警值,当STM8S检测到温度超过预警值时,LED会发光。其方案设计的框图如图1-1:
图1-1 方案设计框图
虽然课程设计中要求使用的温度传感器是DS18B20,但在前期的方案设计中,也曾考虑过使用LM35作为温度传感器,它与DS18B20最大的不同是,DS18B20输出的是数字信号,而LM35是电压转换型温度传感器,输出的是模拟信号,不能直接连接STM8S的I/O口,需要使用AD转换将模拟信号转换为数字信号,在信号处理上LM35显然要更麻烦些。
2 LCD1602及其驱动程序
LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。所谓的“1602”是指显示的时候,有2行内容,每行有16个字符。
2.1 引脚
LCD1602有16个引脚,如图2-1所示:
图2-1 LCD1602的引脚说明
通常来讲,LCD1602的A、K、VCC、VDD、VSS需要各自接到3.3V和地,而RS、RW、EN以及D7~D0引脚需要接单片机的I/O口,如图2-2所示,此谓八位接线法。
需要注意的是,Vo是调整显示屏对比度的引脚,直接接VCC时对比度最弱,字可能会看不清楚;接地时对比度最强。为了方便我们调整对比度,可接入一个10K的电位器,Vo接电位器的中间引脚。个人测试,电位器的两端无论接入VCC或地均不影响效果。
图2-2 LCD1602的八线接法
从八位接法可以看出,单片机被占用了11个IO口,这对于I/O资源紧缺的单片机来说不是一个好办法,因此,我们采用了四位接线法。
如图2-3所示,D3-D0不用,RS、RW、EN以及D7-D4接单片机的I/O口,A、K、VCC、VDD、VSS需要各自接到3.3V和地,这样算来仅使用了7个接口。由于我们始终是写入数据,因此RW可以直接接地,而不必连接到单片机上,这样最终只用了6个接口,减少了被占用的I/O资源,减轻单片机的负担。不过,在程序处理上就有点麻烦了,而且屏幕的刷新频率也会有所降低。
图2-3 LCD1602的四线接法
2.2 时序
对于外部的设备,如果单片机想要与其通信的话,那么就必须遵守该设备的时序。这些时间参数都是ns级别的,时间很短,若按照时序来一步步操作肯定是万无一失的。不过,由于不同厂家的器件工艺问题,延时程序可以不一定精确。个人经验是,延时宁愿多,不能少,待器件能正常通讯后,可进一步减少延时时长。如图2-4是LCD1602的写时序和读时序:
图2-4 LCD1602的读写时序图
由于本次设计不需要读LCD1602,这里仅讲述写时序的实现。写时序分为写数据和写命令。写数据时要求RS为低电平,写命令时要求RS为高电平。接下来的时序是一样的:首先将EN拉高,然后送入数据,保持至少450ns,这时候LCD1602接收的是有效数据,最后把EN拉低。
需要注意,我们采用的是四线模式,所以一次只能传输4位数据,LCD1602要求先传输高四位数据,再传低四位数据。
2.3 指令
LCD1602的指令是RS、RW、E、D7~D0这几个引脚一起配合组成的,如图2-5所示。
图2-5 LCD1602的指令
下面介绍我们所用到的常用命令及功能:
- 0x38:设置16X2显示,8位数据接口;
- 0x28:设置16X2显示,4位数据接口;
- 0x0F:开显示,显示光标,光标闪烁;
- 0x01:清屏;
- 0x06:当写入数据的时候光标右移,地址加一;
- 0x0C:开显示,不显示光标。
2.4 驱动程序的实现
对于四线接法,需要做的初始化工作如下:
(1)设置16X2显示,打开4位数据接口(0x28);(2)清屏(0x01);(3)开显示,不显示光标(0x0C);(4)要求当写入数据的时候光标右移,地址加一(0x06)。实现代码如下:
代码2-1 LCD1602的初始化程序
LCD1602_Cmd(0x20);
Delay_ms(20);
LCD1602_Cmd(0x28);
Delay_ms(20);
LCD1602_Cmd(0x01); /* 清屏 */
LCD1602_Cmd(0x06); /* 写入数据光标右移,写入新数据显示屏不移动 */
LCD1602_Cmd(0x0C); /* 开显示,有光标,光标闪烁 */
值得注意的是,经过个人测试,按下最小系统板的复位电路会出现LCD1602乱码的情况。由于LCD复位后默认是8线输入,如果写命令函数是一个按四线输入写入的函数,那么执行0x28等效为先写入8线指令0x20;写入后LCD已经改为了四线模式,再写入4线指令0x28的高四位,但是不再有低四位写入,所以之后写入其他数据时,LCD1602仍在等待上一个指令的低四位。这样就导致了不能正常的进行后面的操作。所以,在该程序中,应先执行0x20或0x02,将LCD1602的模式改为四线模式,再进行其他操作。
读写函数的实现大致可以按照上面所讲的时序来进行操作。另外还需要一个定位的函数,当向LCD1602发送要显示的字符时,需要确定字符显示的位置。在LCD1602自带的DDRAM的地址0x80H-0x8F处可写入显示屏的第一行字符,在地址0xC0H-0xCF处可写入显示屏的第二行字符。因此定位函数的实现很简单,实质就是一个地址偏移的过程。下面是代码实现:
代码2-2 定位字符显示位置的程序
/* 0x80和0xC0分别是两行的开始地址,将字符的序号加上行的地
址作为命令发送给LCD1602会让下一个字符输出在指定的位置 */
/******发送地址******/
static void LCD1602_SetCursor(uint8_t x, uint8_t y) // x:列坐标 y:行坐标
{
LCD1602_Cmd(x + (y ? LINE1:LINE0));
}
3 DS18B20及其驱动程序
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。温度测量范围为-55至+125摄氏度,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625摄氏度。
3.1 引脚
DS18B20有三个引脚,分别是VCC、GND和DQ。VCC需接入3.3V,GND接地,而DQ作为数据线接入单片机IO口。需要注意的是,DS18B20的数据线本身没有接上拉电阻,自己是无法接收高电平的,因此连接的时候需要连上4.7K~10K的上拉电阻。当然有些单片机I/O是自带上拉电阻的,比如STM8S,所以本次设计是不用连接的。一般电路图如图3-1所示:
图3-1 DS18B20的连接方法
3.2 时序
DS18B20采用的是1-Wire总线。1-Wire总线即是单总线,是一个简单的信号传输电路,可通过一根共用的数据线实现主控制器与一个或一个以上从器件之间的半双工双向通信。优点是需要占用的I/O资源大大减少,减轻了单片机的负担;但与此同时,通信的时序却变得复杂起来了。也正因如此,单片机在跟DS18B20通信的时候,需要严格遵守其单总线协议。
不过实际上,由于不同厂家的器件工艺问题,延时程序不必严格遵守数据手册上的说明,而且有时候即使遵守了协议,也未必能通讯成功,这时候就需要多加延时了。再次说明,个人经验是,延时宁愿多,不能少,待器件能正常通讯后,可进一步减少延时时长。
3.2.1 初始化时序
如图3-2为初始化的时序图:
图3-2 DS18B20的初始化时序图
在初始化序列期间,单片机需拉低总线并保持480us以上(范围可以是480-960us)以发出(TX)一个复位脉冲,然后释放总线,进入接收状态(RX)。单总线由5K上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后发出一个由60-240us低电平信号构成的存在脉冲。
3.2.2 读/写时序
如图3-3为读/写时序图:
图3-3 DS18B20的读写时序图
写时序分为写1时序和写0时序,写时序一共持续至少60us。
写1时序时,单片机将数据线拉低,保持15us,然后拉高,保持45us;写0时序时,单片机将数据线拉低,保持45us,然后拉高,保持15us。两个写周期之间至少1us的恢复时间。
和写时序一样,读时序一共持续至少60us。单片机先将数据线拉低,保持5us,然后拉高,这时DS18B20发送数据,单片机即可读取数据。
需要注意,无论是读还是写,都是从低四位开始,高四位结束,与LCD1602是相反的。
3.3 指令
根据数据手册,DS18B20的指令分为ROM指令和功能指令。常用的ROM指令是0xCC,这条指令允许总线控制器不用提供64位ROM编码就使用功能指令。例如,总线控制器可以先发出一条忽略ROM指令,然后发出温度转换指令0x44,从而完成温度转换操作。
常用的功能指令有两个:0x44是温度转换指令,温度转换指令被执行,产生的温度转换结果数据以2个字节的形式被存储在高速暂存器中,而后DS18B20保持等待状态;0xBE是读暂存器指令,这条命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9字节(字节8,CRC)读完。
3.4 温度寄存器
温度寄存器如图3-4所示,高五位为符号位,中间七位为整数位,低四位为小数位。当测量结果为正时,符号位均为0;当测量结果为负时,符号位均为1,且其他位是以补码的形式存储的。
图3-4 DS18B20的温度寄存器
3.5 驱动程序的实现
驱动程序的实现大致思路如下:
(1)编写复位函数和检测存在脉冲函数,其中检测存在脉冲的程序中考虑了超时处理,核心代码如下:
代码3-1 检测存在脉冲的程序
DS18B20_DQ_IN; /* 设置DQ管脚为输入模式 */
/* 等待复位信号低电平 */
while((DS18B20_DQ_STATUS != RESET) && (cnt < RESPONSE_MAX_TIME_1))
{
cnt++;
Delay_us(1);
}
if(cnt >= RESPONSE_MAX_TIME_1)
return ERROR;
else
cnt = 0;
/* 再等待复位信号拉高,表示复位结束 */
while((DS18B20_DQ_STATUS == RESET) && (cnt < RESPONSE_MAX_TIME_2))
{
cnt++;
Delay_us(1);
}
if(cnt >= RESPONSE_MAX_TIME_2)
return ERROR;
else
return SUCCESS;
(2)编写读和写函数,可先按照读写时序图实现读写一个位(bit)的函数,那么读写一个字节(byte)的函数就是将前者反复调用的过程;
(3)获取温度函数,按照上述时序即可写出函数。要注意的是每次发送命令之前都要检测存在脉冲,每一次执行测温前都要进行一次复位操作。其核心实现代码如下:
代码3-2 采集温度程序
Temperature->flag = DS18B20_Check(); /* 检测存在脉冲 */
if(Temperature->flag == ERROR)
return;
DS18B20_WriteByte(0xCC); /* 跳过ROM检测 */
DS18B20_WriteByte(0x44); /* 开始温度转换 */
/* 等待温度采集完成 */
//while(DS18B20_ReadByte() != 0xFF);
DS18B20_Reset(); /* 发送复位脉冲 */
Temperature->flag = DS18B20_Check(); /* 检测存在脉冲 */
if(Temperature->flag == ERROR)
return;
DS18B20_WriteByte(0xCC); /* 跳过ROM检测 */
DS18B20_WriteByte(0xBE); /* 读取温度 */
data_L = DS18B20_ReadByte(); /* 读取数据低8位 */
data_H = DS18B20_ReadByte(); /* 读取数据高8位 */
4 程序编写和硬件调试
4.1 软件简介
本次课程设计所使用的软件为IAR和AD18。
4.1.1 IAR FOR STM8
IAR for STM8是一款基于STM8的集成开发环境软件,专门用于STM8芯片的开发,是一款单片机编程软件,它能够为用户提供软件的绝大部分功能,并且支持在STM8系列芯片组上使用,可以有效的协助编程人员进行程序开发,可以让开发人员的程序更加符合设计标准,更容易在不同的处理器中进行运行,提高了用户开发设计程序的可能性。本次设计使用IAR来完成程序编写。
ST公司为STM8芯片提供了固件库,可以使程序的可读性大大提高,同时也方便我们进行编写和调试程序,因此我们使用STM8S固件库完成程序编写。
4.1.2 Altium Designer 18
Altium Designer是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件使电路设计的质量和效率大大提高。本次设计我们使用AD18来绘制设计原理图。
4.2 程序编写及完善
在编写完LCD1602和DS18B20的驱动程序后,开始主函数及其管脚配置的编写,并进行调试。
4.2.1 管脚配置
对于LCD1602而言,配置D7~D4、RS、E管脚为开漏输出低速模式;对于DS18B20而言,由于DQ数据线需要双向通讯,在需要向DS18B20写入数据的时候,要将DQ配置为开漏输出高速模式,在需要向DS18B20读入数据的时候,要将DQ配置为上拉输入模式(无中断)。涉及的代码如下:
代码4-1 涉及I/O口配置的代码
/*********LCD1602***********/
#define Rx_PORT (GPIOB)
#define RS_PIN (GPIO_PIN_4) /* PB4 */
#define EN_PIN (GPIO_PIN_5) /* PB5 */
#define Rx_FOUR_PINS (RS_PIN | EN_PIN)
#define Dx_PORT (GPIOC)
#define D4_PIN (GPIO_PIN_4) /* PC4 */
#define D5_PIN (GPIO_PIN_5) /* PC5 */
#define D6_PIN (GPIO_PIN_6) /* PC6 */
#define D7_PIN (GPIO_PIN_7) /* PC7 */
#define Dx_FOUR_PINS (D4_PIN | D5_PIN | D6_PIN | D7_PIN)
GPIO_Init(Dx_PORT, (GPIO_Pin_TypeDef)Dx_FOUR_PINS, GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(Rx_PORT, (GPIO_Pin_TypeDef)Rx_FOUR_PINS, GPIO_MODE_OUT_PP_HIGH_FAST);
/*********DS18B20***********/
#define DS18B20_DQ_PORT (GPIOD)
#define DS18B20_DQ_PIN (GPIO_PIN_4) /* PD4 */
#define DS18B20_DQ_OUT GPIO_Init(DS18B20_DQ_PORT, DS18B20_DQ_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW)
#define DS18B20_DQ_IN GPIO_Init(DS18B20_DQ_PORT, DS18B20_DQ_PIN, GPIO_MODE_IN_PU_NO_IT)
各引脚对应STM8S的I/O引脚及配置模式如下表所示:
器件管脚 | STM8S I/O 引脚 | 配置模式 |
---|---|---|
RS | PB4 | GPIO_MODE_OUT_PP_HIGH_FAST |
EN | PB5 | GPIO_MODE_OUT_PP_HIGH_FAST |
D7-D4 | PC7-PC4 | GPIO_MODE_OUT_PP_HIGH_FAST |
DQ | PD4 | GPIO_MODE_OUT_PP_HIGH_SLOW 和 GPIO_MODE_IN_PU_NO_IT |
配置好管脚后,开始编写主函数和延时函数。
4.2.2 主函数的编写及调试
图4-1 主函数main的流程框图
主函数主要实现各驱动设备的初始化,以及对温度数据的处理。如图4-1所示为主函数的大致流程框图。
为了使调试更方便,可编写UART通讯的程序,使用USB转TTL模块,将测量结果打印到电脑的串口调试助手中。此处省略UART的代码。主函数的核心代码如下:
代码4-2 主函数核心代码
//初始化LCD1602和DS18B20
LCD1602_Init();
DS18B20_Reset();
flag_init = DS18B20_Check();
if(flag_init == ERROR) //若DS18B20初始化失败
{
LCD1602_PrintStr(0, 0, "Init ERROR! Please Reset!");
while(1);
}
else
{
LCD1602_PrintStr(0, 0, "Init SUCCESS!");
Delay_ms(2000);
LCD1602_Clr();
}
while (1)
{
DS18B20_GetTemperature(&Temperature); //开始温度采集
if(Temperature.flag == SUCCESS) //采集成功
{
if(Temperature.sign == 0) //如果温度为正
LCD1602_PrintStr(0, 0, "Temper:+");
else //如果温度为负
LCD1602_PrintStr(0, 0, "Temper:-");
//对温度数据进行处理,分离数据位
//采集的数据为小数,为方便处理,将其扩大100倍转化成整数
t = (uint16_t)(Temperature.temp * 100);
intT[0] = '0' + t / 1000 ; //十位
intT[1] = '0' + t / 100 % 10 ; //个位
LCD1602_PrintStr(8, 0, intT); //整数部分分离完毕,显示
LCD1602_PrintStr(10, 0, "."); //显示小数点
decT[0] = '0' + t / 10 % 10 ; //十分位
decT[1] = '0' + t % 10 ; //百分位
LCD1602_PrintStr(11, 0, decT); //小数部分分离完毕,显示
LCD1602_PrintStr(13, 0, "C.."); //显示摄氏度
}
else
LCD1602_PrintStr(0, 0, "Temper:--.--C.."); //采集失败,不显示数据
}
编写好主函数后,连接电路,给STM8S上电,通过ST-LINK将程序烧录进芯片中,观察LCD1602是否有“Init SUCCESS!”的字样。若没有,则说明LCD1602并未正确初始化,程序或电路连接出了差错。对于这类器件来说,时序非常重要,任何一个闪失都会导致通讯失败。根据个人的调试经验,一般来讲,LCD1602未成功初始化的原因多半是时序问题,可能是因为STM8S的运行速度太快,LCD1602跟不上其速度而导致的。为此可以将延时函数作调整,让单片机等待更长的时间。重新烧录程序,按下复位键,观察LCD1602是否有显示。
类似的,在调试DS18B20的过程中,可使用串口调试助手打印测量结果,观察是否被正确初始化以及测量是否正确可靠。若没有,则多半也是时序问题,可对延时函数进行相应调整。如果没有示波器,只能慢慢有耐心地去调试,延时长度可以先增加大一点,待器件能正常通讯后,可进一步减少延时时长。
4.3 电路连接及调试
在编写好主函数后,开始按照在AD18画好的原理图使用面包板和杜邦线进行电路连接。电路调试和程序调试是不分主次、同步进行的。若LCD1602未正确显示,则除了程序的原因以外,可能的原因有管脚和单片机I/O口连接错误、管脚的电压不稳定等。
调试好后的现象如图4-2和图4-3所示。当用手拿着温度传感器DS18B20时,人手温度较高,LCD1602显示温度上升;松开手后,LCD1602显示温度下降。图中显示的是宿舍(靠近内侧)的温度,摄于下午两点左右,温度在26度附近;而在晚上九点测得温度在24度附近,符合实际情况。
图4-2 上电后的实物图(12.12下午两点:26.75)
图4-3 上电后的实物图(12.12晚上九点:24.62)
5 总结
5.1 缺陷与不足
(1)没有做出PCB板,也没有使用万能板焊接电路,而是使用了面包板,主要原因是临近期末考试,时间不足,仅能用面包板完成课设;
(2)LCD字符显示亮度不足,可能是电位器阻值不够的原因;
(3)功能不够完善,比如可设置的温度报警系统就仅仅只是个雏形,并没有去真正实现,主要也是时间原因。
5.2 心得体会
经过接近两周的努力,我最终做出了课程设计,虽然最后依然不太如人意,虽然过程比较艰辛,但这其中的兴奋自然是无法用言语表达的。从一开始的开发环境的安装,到网上购买零件和最小系统板、自己安装电路焊接引脚;从一开始LCD1602和传感器均不能正常工作而为此困惑一个星期(当时还以为LCD1602坏了,重新买了一个),到现在能成功使用四线驱动LCD1602和传感器,这其中经历了太多太多的挫折,但在这些挫折面前,我始终没有放弃过,而是继续跟困难死磕。在网上和书里查阅资料,耐心地进行调试,在一次又一次的失败中,我最终征服了困难,实现了预期效果。
据我多次查阅,关于四线驱动LCD1602的相关资料,网上和书本基本上都鲜有涉及,仅仅只是给了个代码就没了,因此也遇到了诸如不能显示和乱码等诸多问题,本想为此放弃而使用传统的八线驱动,但是在截止验收前的最后一天,通过调整延时时间,终于尝试了出来,虽然效果不太理想(刷新频率慢),但还是采用了本方案。
关于为什么不使用TIM定时器来进行延时,是因为DS18B20要求的延时级别是us级的,需要几us的延时,但是TIM定时器已经不能满足这个要求。根据个人测试,使用TIM定时器延时1us产生中断的时候,进行各种入栈、出栈操作已经不止1us了,因此实际情况可能是十几us。若课设允许使用STM32,那么Cortex-3内核自带的systick系统滴答器可以提供如此微小的定时,延时1~2us不是问题。所以,有一种办法是使用nop()延时,在intrinsics.h头文件中可以找到这个宏定义,对应的是汇编指令nop,这样一条指令大概可以延时一个系统时钟周期,其长短视用户的时钟配置情况而定(但是nop的数量跟延时长短仍然不是一个线性的关系,原因是STM8是三级流水线设计,对执行效率采取了一定的优化);还有一种办法就是传统的软件粗延时,这种办法比较简便,而且LCD1602和DS18B20的时序精确度要求也不高,因此使用本办法进行延时。
在整个电路设计的过程中,我逐渐加强了对单片机STM8、显示屏LCD1602和温度传感器DS18B20的了解和运用能力,对课本知识以及以前学过的知识有了一个更好的总结与理解,同时也提高了自己的查阅能力。通过这次设计,我深刻体会到理论与实践的区别,了解了理论知识和实践相结合的重要意义,只有当我们亲自动手,将理论付之于实现,才能够将理论知识内化成自己的一部分。在这个过程中,我的动手能力和理论知识的掌握程度有了很大的提高,这将为自己今后的学习和工作打好了坚实的基础。最后,感谢老师的教导,也感谢同学的帮助,但最重要的,还是要感谢那个不肯放弃、坚持到最后一刻的自己!
附录
物料清单
物料名称 | 个数 |
---|---|
STM8S105K4T6 | 1 |
LCD1602 | 1 |
DS18B20 | 1 |
10K电位器 | 1 |
面包板 | 1 |
LED | 1 |
电路原理图
完整代码
见电子附件。
参考文献
[1]阎石主编.数字电子技术基础[M].6版.北京:高等教育出版社,2016.
[2]阎石,王红编.数字电子技术基础学习辅导与习题解答[M].6版.北京:高等教育出版社,2016.
[3]严海蓉等编著.嵌入式微处理器原理及应用:基于ARM Cortex-M3 微控制器:STM32系列[M].2版.北京:清华大学出版社.2019.
[4]潘永雄编著.STM8S系列单片机原理及应用[M].3版.西安:西安电子科技大学出版社.2018.10.
[5]潘永雄编著.电子线路CAD使用教程:基于Altium Designer[M].6版.西安:西安电子科技大学出版社.2016.12.
[6]沈红卫等编著.STM32单片机应用与全案实践[M].1版.北京:电子工业出版社.2017.6.
[7]范红刚等编著.STM8单片机自学笔记[M].1版.北京:北京航空航天大学出版社.2014.1.
[8]微雪电子有限公司:LCD1602数据手册[Z]
[9]达拉斯半导体公司:DS18B20数据手册[Z]
版权声明:本文为CSDN博主「Mount256」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_39514357/article/details/122166493
暂无评论