基于STM32F107的电子温度计.docx
《基于STM32F107的电子温度计.docx》由会员分享,可在线阅读,更多相关《基于STM32F107的电子温度计.docx(16页珍藏版)》请在冰豆网上搜索。
![基于STM32F107的电子温度计.docx](https://file1.bdocx.com/fileroot1/2023-1/4/e8a335ee-15a8-4d7e-a081-90fcd607cffb/e8a335ee-15a8-4d7e-a081-90fcd607cffb1.gif)
基于STM32F107的电子温度计
嵌入式系统原理及接口技术
题目:
基于STM32F107的电子温度计
院(系):
专业:
姓名:
学号:
指导教师:
2012年12月20日
一、概述
本设计基于STM32F107芯片,利用STM32控制基板上的温度传感器DS18B20,实现DS18B20与STM32的双向通信;通过DS18B20实现温度测量,然后STM32对DS18B20转换后的数据进行读取和处理,转换成实际温度值后得到温度显示码,最后在LED显示测得的温度(显示出温度值的符号位和整数位,以及一位小数)。
二、总体设计
1.总体系统结构
2.模块划分
⑴.测温模块
⑵.LED显示模块
⑶.STM32最小系统
三、关键模块设计
⑴.测温模块
DS18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。
DS18B20工作在3V~5.5V的电压范围,可以程序设定9~12位的分辨率,测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
本设计中,DS18B20通过程序将其分辨率设为12位(温度分辨为0.0625℃)。
DS18B20与STM32的连接电路
⑵.LED显示模块
Nokia/诺基亚5110LCD原理应用资料:
LPH7366是NOKIA公司生产的可用于其5110、6150,6100等系列移动电话的液晶显示模块,国内厂家也生产有类似的兼容产品。
该产品除应用于移动电话外,也可广泛应用于各类便携式设备的显示系统。
与其它类型的产品相比,该模块具有以下特点:
●84x48的点阵LCD,可以显示4行汉字,
●采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9条。
支持多种串行通信协议(如AVR单片机的SPI、MCS51的串口模式0等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。
●可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。
●LCD控制器/驱动器芯片已绑定到LCD晶片上,模块的体积很小。
●采用低电压供电,正常显示时的工作电流在200μA以下,且具有掉电模式。
LPH7366的这些特点非常适合于电池供电的便携式通信设备和测试设备中
(3)软件设计流程
四、测试结果
开机上电后显示“TAOJING”图标,同时自动进入温度显示模式;温度可以精确到1位小数。
五、总结
本设计完全基于STM32F107开发板,利用开发板上的DS18B20、LED等资源实现了测温,显示温度等功能。
在测温精度方面也已经达到了预期要求。
附录一:
主函数
#include"stm32f10x.h"
#include"delay.c"//包含delay_us(--);delay_ms(--);这两个延时函数哦!
#include"lcd.c"//5110液晶驱动文件
GPIO_InitTypeDefGPIO_InitStructure;
u16i;//初始化时间计数器
voidGPIO_PP()
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
}
voidGPIO_IPU()
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
}
u8DS18B20_Read_Bit(void)//readonebit
{
u8data;
GPIO_PP();//SETPA0OUTPUT
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
delay_us
(2);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
GPIO_IPU();//SETPA0INPUT
delay_us(12);
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3))data=1;
elsedata=0;
delay_us(50);
returndata;
}
u8ReadOneChar(void)//readonebyte
{
u8i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
returndat;
}
voidWriteOneChar(unsignedchardat)
{
u8j;
u8testb;
GPIO_PP();//SETPA0OUTPUT;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_3);//Write1
delay_us
(2);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
delay_us(60);
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_3);//Write0
delay_us(60);
GPIO_SetBits(GPIOE,GPIO_Pin_3);
delay_us
(2);
}
}
}
//----------------------------------------------------
voidInit_DS18B20(void)
{
GPIO_PP();
//稍做延时
GPIO_ResetBits(GPIOE,GPIO_Pin_3);//单片机将DQ拉低
delay_us(750);//精确延时大于480us
GPIO_SetBits(GPIOE,GPIO_Pin_3);//DQ复位
delay_us(15);
GPIO_IPU();
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==1)i++;//计算传感器应答时间
}
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
delay_ms
(1);
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_ms(300);
Init_DS18B20();
delay_ms
(1);
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
b<<=8;
t=a+b;
return(t);
}
intmain()
{
unsignedinttemp;
unsignedcharTempH,TempL;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三句
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//配置管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最大输出速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//配置以上三
Init_DS18B20();
Init_5110();
while
(1)
{
i=0;
if(i>100)GPIO_SetBits(GPIOE,GPIO_Pin_4);//传感器反应时间过长,亮灯,表示没有传感器
temp=ReadTemperature();
if(temp&0x8000)
{
temp=~temp;//取反加1
temp+=1;
}
else
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
//----------------显示温度-----------------------
Set_R_C_5110(0,12);
Write_Char_5110('0'+(TempH/10));
Set_R_C_5110(0,18);
Write_Char_5110('0'+(TempH%10));
Set_R_C_5110(0,24);
Write_Char_5110('.');
Set_R_C_5110(0,30);
Write_Char_5110('0'+(TempL));
//------------------------------------显示传感器应答时间
Set_R_C_5110(0,42);
Write_Char_5110('0'+(i/1000));
Set_R_C_5110(0,48);
Write_Char_5110('0'+(i%1000/100));
Set_R_C_5110(0,54);
Write_Char_5110('0'+(i%100/10));
Set_R_C_5110(0,60);
Write_Char_5110('0'+(i%10));
delay_ms(30);
}
}
附录二:
LCD5110程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDATA1
#defineCMD0
#defineCLKGPIO_Pin_11
#defineDinGPIO_Pin_12
#defineDCGPIO_Pin_13
#defineCEGPIO_Pin_14
#defineRSTGPIO_Pin_15
unsignedcharasc2[][6]=
{
{0x00,0x00,0x00,0x00,0x00,0x00},//sp
{0x00,0x00,0x00,0x2f,0x00,0x00},//!
{0x00,0x00,0x07,0x00,0x07,0x00},//"
{0x00,0x14,0x7f,0x14,0x7f,0x14},//#
{0x00,0x24,0x2a,0x7f,0x2a,0x12},//$
{0x00,0x62,0x64,0x08,0x13,0x23},//%
{0x00,0x36,0x49,0x55,0x22,0x50},//&
{0x00,0x00,0x05,0x03,0x00,0x00},//'
{0x00,0x00,0x1c,0x22,0x41,0x00},//(
{0x00,0x00,0x41,0x22,0x1c,0x00},//)
{0x00,0x14,0x08,0x3E,0x08,0x14},//*
{0x00,0x08,0x08,0x3E,0x08,0x08},//+
{0x00,0x00,0x00,0xA0,0x60,0x00},//,
{0x00,0x08,0x08,0x08,0x08,0x08},//-
{0x00,0x00,0x60,0x60,0x00,0x00},//.
{0x00,0x20,0x10,0x08,0x04,0x02},///
{0x00,0x3E,0x51,0x49,0x45,0x3E},//0
{0x00,0x00,0x42,0x7F,0x40,0x00},//1
{0x00,0x42,0x61,0x51,0x49,0x46},//2
{0x00,0x21,0x41,0x45,0x4B,0x31},//3
{0x00,0x18,0x14,0x12,0x7F,0x10},//4
{0x00,0x27,0x45,0x45,0x45,0x39},//5
{0x00,0x3C,0x4A,0x49,0x49,0x30},//6
{0x00,0x01,0x71,0x09,0x05,0x03},//7
{0x00,0x36,0x49,0x49,0x49,0x36},//8
{0x00,0x06,0x49,0x49,0x29,0x1E},//9
{0x00,0x00,0x36,0x36,0x00,0x00},//:
{0x00,0x00,0x56,0x36,0x00,0x00},//;
{0x00,0x08,0x14,0x22,0x41,0x00},//<
{0x00,0x14,0x14,0x14,0x14,0x14},//=
{0x00,0x00,0x41,0x22,0x14,0x08},//>
{0x00,0x02,0x01,0x51,0x09,0x06},//?
{0x00,0x32,0x49,0x59,0x51,0x3E},//@
{0x00,0x7C,0x12,0x11,0x12,0x7C},//A
{0x00,0x7F,0x49,0x49,0x49,0x36},//B
{0x00,0x3E,0x41,0x41,0x41,0x22},//C
{0x00,0x7F,0x41,0x41,0x22,0x1C},//D
{0x00,0x7F,0x49,0x49,0x49,0x41},//E
{0x00,0x7F,0x09,0x09,0x09,0x01},//F
{0x00,0x3E,0x41,0x49,0x49,0x7A},//G
{0x00,0x7F,0x08,0x08,0x08,0x7F},//H
{0x00,0x00,0x41,0x7F,0x41,0x00},//I
{0x00,0x20,0x40,0x41,0x3F,0x01},//J
{0x00,0x7F,0x08,0x14,0x22,0x41},//K
{0x00,0x7F,0x40,0x40,0x40,0x40},//L
{0x00,0x7F,0x02,0x0C,0x02,0x7F},//M
{0x00,0x7F,0x04,0x08,0x10,0x7F},//N
{0x00,0x3E,0x41,0x41,0x41,0x3E},//O
{0x00,0x7F,0x09,0x09,0x09,0x06},//P
{0x00,0x3E,0x41,0x51,0x21,0x5E},//Q
{0x00,0x7F,0x09,0x19,0x29,0x46},//R
{0x00,0x46,0x49,0x49,0x49,0x31},//S
{0x00,0x01,0x01,0x7F,0x01,0x01},//T
{0x00,0x3F,0x40,0x40,0x40,0x3F},//U
{0x00,0x1F,0x20,0x40,0x20,0x1F},//V
{0x00,0x3F,0x40,0x38,0x40,0x3F},//W
{0x00,0x63,0x14,0x08,0x14,0x63},//X
{0x00,0x07,0x08,0x70,0x08,0x07},//Y
{0x00,0x61,0x51,0x49,0x45,0x43},//Z
{0x00,0x00,0x7F,0x41,0x41,0x00},//[
{0x00,0x55,0x2A,0x55,0x2A,0x55},//55
{0x00,0x00,0x41,0x41,0x7F,0x00},//]
{0x00,0x04,0x02,0x01,0x02,0x04},//^
{0x00,0x40,0x40,0x40,0x40,0x40},//_
{0x00,0x00,0x01,0x02,0x04,0x00},//'
{0x00,0x20,0x54,0x54,0x54,0x78},//a
{0x00,0x7F,0x48,0x44,0x44,0x38},//b
{0x00,0x38,0x44,0x44,0x44,0x20},//c
{0x00,0x38,0x44,0x44,0x48,0x7F},//d
{0x00,0x38,0x54,0x54,0x54,0x18,},//e
{0x00,0x08,0x7E,0x09,0x01,0x02},//f
{0x00,0x18,0xA4,0xA4,0xA4,0x7C},//g
{0x00,0x7F,0x08,0x04,0x04,0x78},//h
{0x00,0x00,0x44,0x7D,0x40,0x00},//i
{0x00,0x40,0x80,0x84,0x7D,0x00},//j
{0x00,0x7F,0x10,0x28,0x44,0x00},//k
{0x00,0x00,0x41,0x7F,0x40,0x00},//l
{0x00,0x7C,0x04,0x18,0x04,0x78},//m
{0x00,0x7C,0x08,0x04,0x04,0x78},//n
{0x00,0x38,0x44,0x44,0x44,0x38},//o
{0x00,0xFC,0x24,0x24,0x24,0x18},//p
{0x00,0x18,0x24,0x