基于STM32F107开发板的多功能温度计设计报告.docx
《基于STM32F107开发板的多功能温度计设计报告.docx》由会员分享,可在线阅读,更多相关《基于STM32F107开发板的多功能温度计设计报告.docx(63页珍藏版)》请在冰豆网上搜索。
基于STM32F107开发板的多功能温度计设计报告
生产实习设计报告
设计题目:
基于STM32F107开发板的多功能温度计设计
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期:
年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期:
年月日
导师签名:
日期:
年月日
一、概述
本设计基于STM32F107开发板,利用核心板上的STM32控制基板上的温度传感器DS18B20,实现DS18B20与STM32的双向通信;通过DS18B20实现温度测量,然后STM32对DS18B20转换后的数据进行读取和处理,转换成实际温度值后得到温度显示码,最后在OLED显示测得的温度(显示出温度值的符号位和整数位,以及一位小数)。
该多功能温度计除具备测温功能外,还有如下附加功能:
可手动切换显示温度、日期、星期和时间;手动校时、调整日期;最高∕最低温度记忆功能;℃∕℉切换显示;每日闹钟功能;可通过RS232串口传输当前温度和时间至PC机。
本设计最终通过Matlab实现了温度标定,提高了测温准确度。
二、总体设计
1.总体系统结构
2.模块划分
⑴.测温模块
⑵.OLED显示模块
⑶.按键、拨码开关模块
⑷.蜂鸣器模块
⑸.串行通信模块
3.人员分工
张家明完成源程序的编写,以及代码的修改、编译、下载、调试等工作;
孙凯强、魏国祥、温琛林、王学良负责DS18B20、OLED相关资料的搜集和整理;
王植阳、魏征、田开负责日历时钟芯片PCF8563相关资料的搜集和整理;
王如胜、王江、王圣南负责最后产品各项功能的验证。
三、关键模块设计
⑴.测温模块
DS18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。
DS18B20工作在3V~5.5V的电压范围,可以程序设定9~12位的分辨率,测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
本设计中,DS18B20通过程序将其分辨率设为12位(温度分辨为0.0625℃)。
DS18B20与STM32的连接电路
⑵.OLED显示模块
OLED使用的控制器为SSD1305,可通过写入不同的命令字来设置对比度、显示开关、电荷泵、页地址等。
OLED被配置为使用I2C的方式。
I2C的地址二进制位为0111100X,16进制为0x78(写地址),0x79(读地址)。
OLED的Reset平时应该拉高,在初始化的时候,应该有一个从低电平到高电平的跳变。
使用的MCU端口为
PB6CLKI2C
PB7SDAI2C
PE6RESET(低有效)
⑶.按键、拨码开关模块
基板一共有4个按键,分别为KEY1,KEY2,KEY3,KEY4。
其中,按键未按下,对应的GPIO口为高电平,按键按下后变为低电平。
使用的MCU端口为
PE2KEY4GPIO
PE3KEY3GPIO
PE4KEY2GPIO
PE5KEY1GPIO
平拨开关一种有4个。
开关拨到上方为低电平,拨到中间和下方为高电平。
使用的MCU端口为
PD11SW4GPIO
PC15SW3GPIO
PC14SW2GPIO
PC13SW1GPIO
拨码开关电路图
⑷.蜂鸣器模块
当PD15为高电平的时候,蜂鸣器响。
低电平的时候,蜂鸣器没有声音。
使用的MCU端口为
PD15BUZZGPIO
⑸.串行通信模块
RS232的电平转换芯片为MAX232CE。
外部接口为DB9。
有两个LED指示灯,TXD用来显示接受到数据,RXD用来显示正在发送数据。
对外接口为DB9接口,定义为:
2RXD,3TXD,5GND。
因此,基板可以通过串口线直接连接到PC机,和PC机进行通信。
使用的MCU端口为:
PD5UART2_TX(Remap)
PD6UART2_RX(remap)
四、测试结果
1.开机上电后显示“中国海洋大学”图标、“中国海洋大学09级自动化”、“多功能温度计”等文字,显示过后自动进入温度显示模式;
2.进入温度显示模式后,OLED显示出当前所测温度(摄氏+华氏);
此时拨动SW1可显示自开机上电或复位后所记录的摄氏最高∕最低温度值;拨动SW2可显示相对应的华氏最高∕最低温度值;拨动SW3可启动串行传输功能,即通过RS232串口传输当前温度和时间至PC机;将拨码开关拨回原位即可返回温度显示界面;
3.按下KEY1可在温度显示模式和日期、星期和时间显示模式之间来回切换;
4.进入日期、星期和时间显示模式后,按下KEY2进入校时模式,此时可通过KEY1选择校准小时、分钟、秒;
每次校准时,按下KEY3则对应项+1,按下KEY4则对应项-1;
小时或分钟或秒校准后都需要按下KEY2,此时显示对应项校准完成;所有项目均校准完成后,按下KEY4推出校时模式,返回日期、星期和时间显示模式;
5.进入日期、星期和时间显示模式后,按下KEY3进入调整日期模式,此时可通过KEY1选择调整年、月、日;
每次调整时,按下KEY3则对应项+1,按下KEY4则对应项-1;
年或月或日调整后都需要按下KEY2,此时显示对应项校准完成;所有项目均校准完成后,按下KEY4推出日期调整模式,返回日期、星期和时间显示模式;
6.进入日期、星期和时间显示模式后,拨动SW1进入闹钟设定模式,此时可通过KEY1选择设定小时、分钟以及取消闹钟;
每次设定时,按下KEY3则对应项+1,按下KEY4则对应项-1;
小时或分钟设定或取消闹钟后都需要按下KEY2,此时显示对应项设定完成;所有项目均设定完成后,将SW1拨回原退位即可出闹钟设定模式,返回日期、星期和时间显示模式;
7.闹钟响起时,拨动SW2即可停止响铃。
五、总结
本设计完全基于STM32F107开发板,利用开发板上的DS18B20、OLED、PCF8563日历时钟芯片、按键与拨码开关、蜂鸣器等资源实现了测温,显示温度(摄氏+华氏),最高∕最低温度记忆,显示日期、星期、时间,手动校时、调整日期,每日闹钟等诸多功能。
另外在测温标定方面也通过Matlab进行了实际值与测量值之间的函数关系拟合(详见“附录一”),提高了测温的准确度;在测温精度方面也已经达到了预期要求。
附录一
Matlab实现温度标定
%2012年9月9日~2012年9月14日共六天,每天于不同时间、不同地点随机测温50
%次,同时记录实际温度值,绘出每日测量温度曲线与实际温度曲线,同时绘制
%每日测量值与实际值之间的差值走势图
n=1:
50;
%2012年9月9日
temp1_1=[26.026.126.025.725.525.525.425.625.725.6...
25.525.525.425.325.225.225.225.525.425.4...
25.325.225.225.225.225.225.225.225.225.2...
25.225.225.026.126.226.426.526.526.626.6...
26.526.326.226.126.125.925.925.926.026.2];%实际值
temp2_1=[28.528.428.426.127.127.427.327.527.627.3...
27.327.027.126.827.127.027.127.127.127.2...
27.227.427.327.627.527.627.527.527.427.5...
27.527.527.126.626.227.127.327.628.128.3...
28.228.328.328.228.327.927.928.027.928.0];%测量值
temp3_1=zeros(1,50);
temp3_1=temp2_1-temp1_1;
figure
(1)
subplot(3,2,1)
plot(n,temp1_1,'r');
axis([1502230]);
xlabel('n');ylabel('temperature∕℃');title('2012年9月9日')
holdon
plot(n,temp2_1,'b')
gridon
figure
(2)
subplot(3,2,1)
plot(n,temp3_1,'r')
axis([150-0.53])
xlabel('n');ylabel('差值∕℃');title('2012年9月9日')
gridon
%2012年9月10日
temp1_2=[26.526.125.725.425.325.225.325.425.425.5...
25.525.625.625.726.726.726.626.626.526.5...
26.526.426.526.526.426.426.326.226.125.4...
25.525.525.425.525.225.425.425.325.325.2...
25.025.225.125.225.125.125.926.026.226.0];%实际值
temp2_2=[25.826.427.127.127.627.427.627.426.927.4...
27.327.327.227.227.127.327.627.928.028.1...
28.228.228.128.328.428.328.128.228.025.9...
26.827.427.327.826.126.927.027.127.427.3...
27.227.426.927.427.427.128.028.128.328.6];%测量值
temp3_2=zeros(1,50);
temp3_2=temp2_2-temp1_2;
figure
(1)
subplot(3,2,2)
plot(n,temp1_2,'r');
axis([1502230]);
xlabel('n');ylabel('temperature∕℃');title('2012年9月10日')
holdon
plot(n,temp2_2,'b')
gridon
figure
(2)
subplot(3,2,2)
plot(n,temp3_2,'r')
axis([150-0.53])
xlabel('n');ylabel('差值∕℃');title('2012年9月10日')
gridon
%2012年9月11日
temp1_3=[25.925.726.026.425.825.625.425.525.525.6...
25.625.725.625.525.425.425.325.325.225.3...
25.425.425.525.125.225.125.225.125.125.9...
26.026.126.126.126.126.226.326.426.326.2...
26.226.426.426.326.426.526.526.424.824.8];%实际值
temp2_3=[26.728.428.827.925.926.327.427.627.827.8...
28.027.827.427.326.927.026.827.126.626.8...
27.127.527.726.326.727.627.427.827.927.2...
27.327.527.928.127.827.928.028.027.927.8...
27.927.927.827.827.928.028.128.026.026.6];%测量值
temp3_3=zeros(1,50);
temp3_3=temp2_3-temp1_3;
figure
(1)
subplot(3,2,3)
plot(n,temp1_3,'r');
axis([1502230]);
xlabel('n');ylabel('temperature∕℃');title('2012年9月11日')
holdon
plot(n,temp2_3,'b')
gridon
figure
(2)
subplot(3,2,3)
plot(n,temp3_3,'r')
axis([150-0.53])
xlabel('n');ylabel('差值∕℃');title('2012年9月11日')
gridon
%2012年9月12日
temp1_4=[24.824.824.824.824.924.924.925.025.125.0...
25.125.225.226.226.126.226.425.525.325.2...
25.125.125.125.325.425.525.525.425.525.7...
25.625.425.325.224.924.924.924.924.924.9...
25.025.025.024.924.924.924.924.924.925.0];%实际值
temp2_4=[26.726.926.927.127.127.327.327.727.427.3...
27.627.827.626.426.626.826.827.727.427.3...
27.227.327.427.327.327.427.827.427.627.6...
27.627.827.827.425.326.927.127.227.126.9...
26.927.026.726.526.426.325.225.425.627.0];%测量值
temp3_4=zeros(1,50);
temp3_4=temp2_4-temp1_4;
figure
(1)
subplot(3,2,4)
plot(n,temp1_4,'r');
axis([1502230]);
xlabel('n');ylabel('temperature∕℃');title('2012年9月12日')
holdon
plot(n,temp2_4,'b')
gridon
figure
(2)
subplot(3,2,4)
plot(n,temp3_4,'r')
axis([150-0.53])
xlabel('n');ylabel('差值∕℃');title('2012年9月12日')
gridon
%2012年9月13日
temp1_5=[24.925.025.124.923.823.523.323.223.223.1...
23.023.023.022.422.422.522.522.622.722.8...
22.822.822.922.922.923.423.823.924.124.2...
24.324.724.624.524.524.524.424.525.024.9...
24.824.524.723.523.423.223.123.123.223.3];%实际值
temp2_5=[25.226.126.526.624.324.825.325.325.425.5...
25.825.325.424.624.825.025.025.125.225.2...
25.325.425.625.525.724.625.826.026.026.1...
26.026.226.126.126.326.426.526.926.926.8...
26.626.025.623.823.924.124.124.424.924.7];%测量值
temp3_5=zeros(1,50);
temp3_5=temp2_5-temp1_5;
figure
(1)
subplot(3,2,5)
plot(n,temp1_5,'r');
axis([1502230]);
xlabel('n');ylabel('temperature∕℃');title('2012年9月13日')
holdon
plot(n,temp2_5,'b')
gridon
figure
(2)
subplot(3,2,5)
plot(n,temp3_5,'r')
axis([150-0.53])
xlabel('n');ylabel('差值∕℃');title('2012年9月13日')
gridon
%2012年9月14日
temp1_6=[23.423.523.723.823.924.024.824.824.724.8...
24.824.824.724.924.824.824.824.724.724.2...
24.124.124.224.324.424.424.524.524.424.5...
24.524.524.524.524.624.524.624.924.925.0...
24.925.225.325.425.425.325.523.123.223.2];%实际值
temp2_6=[24.925.225.925.925.926.125.826.526.726.8...
26.826.626.826.526.626.826.726.626.524.8...
25.826.126.126.126.126.226.126.126.226.3...
26.425.126.126.326.626.326.627.027.327.4...
27.326.926.926.726.426.126.124.324.424.6];%测量值
temp3_6=zeros(1,50);
temp3_6=temp2_6-temp1_6;
figure
(1)
subplot(3,2,6)
plot(n,temp1_6,'r');
axis([1502230]);
xlabel('n');ylabel('temperature∕℃');title('2012年9月14日')
holdon
plot(n,temp2_6,'b')
gridon
figure
(2)
subplot(3,2,6)
plot(n,temp3_6,'r')
axis([150-0.53])
xlabel('n');ylabel('差值∕℃');title('2012年9月14日')
gridon
运行结果:
%运用最小二乘算法(LS)实现测量值与实际值之间的函数关系拟合
clc
%2012年9月9日
temp1_1=[25.025.225.325.425.525.625.725.926.026.126.226.326.526.6];%实际值
temp2_1=[27.127.527.227.327.427.327.627.928.028.128.028.328.228.1];%测量值
subplot(3,2,1)
plot(temp1_1,temp2_1,'*')
holdon
a_1=polyfit(temp1_1,temp2_1,1);
b_1=polyval(a_1,temp1_1);
plot(temp1_1,b_1,'r');
xlabel('实际值');ylabel('测量值');title('2012年9月9日')
disp(a_1)
%2012年9月10日
temp1_2=[25.025.125.225.325.425.525.625.725.926.026.126.226.326.4
26.5];%实际值
temp2_2=[27.227.427.427.626.927.327.327.228.028.128.028.228.328.4
28.6];%测量值
subplot(3,2,2)
plot(temp1_2,temp2_2,'*')
holdon
a_2=polyfit(temp1_2,temp2_2,1);
b_2=polyval(a_2,temp1_2);
plot(temp1_2,b_2,'r');
xlabel('实际值');ylabel('测量值');title('2012年9月10日')
disp(a_2)
%2012年9月11日
temp1_3=[24.825.125