基于STM32F107开发板的万年历和温度测量系统设计_第1页
基于STM32F107开发板的万年历和温度测量系统设计_第2页
基于STM32F107开发板的万年历和温度测量系统设计_第3页
基于STM32F107开发板的万年历和温度测量系统设计_第4页
基于STM32F107开发板的万年历和温度测量系统设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、生产实习设计报告设计题目:基于STM32F107开发板的万年历和温度测量系统设计生产组长姓名:xx设计组长姓名:xx设计小组成员:xx、xx、xx、xx、xx、xx、xx、xx 2013年9月12日目录一、概述3二、总体设计31总体系统结构32模块划分33人员分工4三、关键模块设计41.测温模块42.OLED显示模块43.按键开关模块54.加速度传感器模块6四、测试结果6五、总结6六、附录71.关键程序代码72.实物照片35一、概述本设计基于STM32F107开发板,利用板上的单片机在OLED显示屏上显示年月日、时间、星期和温度;利用核心板上的STM32控制基板上的温度传感器DS18B20实现

2、温度测量,然后STM32对DS18B20转换后的数据进行读取和处理,当晃动板子时,转换成实际温度值后得到温度显示码,最后在OLED显示测得的温度(显示出温度值的符号位和整数位,以及两位小数,并以摄氏温度和华氏温度两种形式同时显示),再次晃动板子时再次显示年月日星期和时间。该多功能温度计除具备测温功能外,还有如下附加功能:可手动切换显示温度、日期、星期和时间;手动校时、调整日期。二、总体设计1总体系统结构DS18B20PCF856按键开关设置加速度传感器OLED显示MCU图 1 系统框图2模块划分测温模块OLED显示模块按键开关模块三轴加速度传感器模块3人员分工三、 关键模块设计1.测温模块DS

3、18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。DS18B20工作在3V5.5V 的电压范围,可以程序设定912位的分辨,测温范围55125,在-10+85时精为0.5。本设计中,DS18B20通过程序将其分辨率设为12位(温度分辨为0.0625)。图 2 DS18B20与STM32的连接电路2.OLED显示模块OLED使用的控制器为SSD1305,可通过写入不同的命令字来设置对比度、显示开关、电荷泵、页地址等。图 3 OLED与STM32连接电路OLED被配置为使用I2C的方式。I2C的地址二进制位为X,16进制为0x78(写地址),0x79(读地址)。OLED的

4、Reset平时应该拉高,在初始化的时候,应该有一个从低电平到高电平的跳变。使用的MCU端口为:l PB6 CLK I2Cl PB7 SDA I2Cl PE6 RESET (低电平有效)3.按键开关模块基板一共有4个按键,分别为KEY1,KEY2,KEY3,KEY4。其中,按键未按下,对应的GPIO口为高电平,按键按下后变为低电平。图 4 按键电路图使用的MCU端口为l PE2 KEY4 GPIOl PE3 KEY3 GPIOl PE4 KEY2 GPIOl PE5 KEY1 GPIO4.加速度传感器模块RS232的电平转换芯片为MAX232CE。外部接口为DB9。有两个LED指示灯,TXD用来

5、显示接受到数据,RXD用来显示正在发送数据。对外接口为DB9接口,定义为:2RXD,3TXD,5GND。因此,基板可以通过串口线直接连接到PC机,和PC机进行通信。使用的MCU端口为:l PD5 UART2_TX(Remap)l PD6 UART2_RX(remap)四、测试结果1. 开机上电后显示年月日、时间和星期;2. 在日历时钟显示时,摇晃板子之后,OLED显示当前所测温度(摄氏+华氏);3. 在温度显示时,摇晃板子之后,OLED显示日历时钟;4. 在日历时钟显示模式时,按下KEY1进入校时模式,此时可通过KEY1选择校准年、月、日、小时、分钟、秒和星期;按下KEY3则对应项+1,按下K

6、EY4则对应项-1;按下KEY1键确认,返回日期、星期和时间正常显示模式。五、总结本设计完全基于STM32F107开发板,利用开发板上的DS18B20、OLED、PCF8563日历时钟芯片、按键开关、三轴加速度芯片LIS35DE等资源实现了测温,显示温度(摄氏+华氏);显示日期、星期、时间,手动校时、调整日期;摇晃实验板实现温度和日历时钟之间的切换。六、附录1.关键程序代码/main.c#include include.h#include DS18B20.h#include temperature.h#include realtime.h#include MEMS.hu8 DisplayBuf

7、f20;time RealTime;date RealDate;sc8 WeekdayStr716 = Sun., Mon., Tue., Wed., Thur., Fri. , Sat., ;int main(void) int dir1=0,dir2=0,dir3=0; int dir11=0,dir22=0,dir33=0; acc_3d mems,flag; flag.x=flag.y=flag.z=0; u8 select = 0; SystemInit();/设置系x统时钟 USART2_Init(); USART2_Configuration(9600); I2C_GPIOIni

8、t(); OLED_Init(); RealTime_Init(); MEMS_Init();/*-时间-*/ while(1) while(1) PrintStringLocate(Calendar , 16 , 0x00, 0x00); PrintStringLocate(Date: , 16 , 0x02, 0x00); PrintStringLocate(Weekday: ,16 , 0x06, 0x00); PrintStringLocate(Time: , 16 , 0x04, 0x00); GetTime(&RealTime); GetDate(&RealDate); sprin

9、tf(char *)DisplayBuff, %4d-%02d-%02d,RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(DisplayBuff, 16,0x02,0x05); sprintf(char *)DisplayBuff, %4s, WeekDayStrRealDate.weekday); PrintStringLocate(DisplayBuff, 16,0x06,0x08); sprintf(char *)DisplayBuff, %02d:%02d:%02d,RealTime.hour,Re

10、alTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY1PressDown() select + ; /DelayMs(200); if(select7) select=0; / switch(select) case 0: PrintStringLocate(Date: CHANGE , 16 , 0x00, 0x00); /设置日期 break; case 1: while(1) PrintStringLocate(CHANGE: YEAR , 16 , 0x00, 0x00)

11、; /设置年 if(KEY3Read() RealDate.year +; if(KEY4Read() RealDate.year -; SetDate(&RealDate); sprintf(char *)DisplayBuff, %4d-%02d-%02d,RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(DisplayBuff, 16,0x02,0x05); if(KEY2PressDown() break; break; case 2: while(1) PrintStringLocate(CHANG

12、E: MON , 16 , 0x00, 0x00);/设置月 if(KEY3Read() RealDate.month +; if(KEY4Read() RealDate.month -; if(RealDate.month 12) RealDate.month = January; SetDate(&RealDate); sprintf(char *)DisplayBuff, %4d-%02d-%02d,RealDate.year, (u8)RealDate.month, RealDate.day); PrintStringLocate(DisplayBuff, 16,0x02,0x05);

13、 if(KEY2PressDown() break; break; case 3: while(1) PrintStringLocate(CHANGE: DAY , 16 , 0x00, 0x00); /设置日 if(KEY3Read() RealDate.day +; if(RealDate.month=1|RealDate.month=3|RealDate.month=5|RealDate.month=7|RealDate.month=8|RealDate.month=10|RealDate.month=12) if(RealDate.day31) RealDate.day=1; if(R

14、ealDate.month=4|RealDate.month=6|RealDate.month=9|RealDate.month=11) if(RealDate.day30) RealDate.day=1; if(RealDate.year%400=0)|(RealDate.year%4=0&RealDate.year%100!=0) if(RealDate.month=2) if(RealDate.day29) RealDate.day=1; else if(RealDate.month=2) if(RealDate.day28) RealDate.day=1; if(KEY4Read()

15、RealDate.day -; if(RealDate.month=1|RealDate.month=3|RealDate.month=5|RealDate.month=7|RealDate.month=8|RealDate.month=10|RealDate.month=12) if(RealDate.day1) RealDate.day=31; if(RealDate.month=4|RealDate.month=6|RealDate.month=9|RealDate.month=11) if(RealDate.day1) RealDate.day=30; if(RealDate.year

16、%400=0)|(RealDate.year%4=0&RealDate.year%100!=0) if(RealDate.month=2) if(RealDate.day1) RealDate.day=29; else if(RealDate.month=2) if(RealDate.day 23) RealTime.hour = 1; SetTime(&RealTime); sprintf(char *)DisplayBuff, %02d:%02d:%02d,RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(D

17、isplayBuff, 16,0x04,0x05); if(KEY2PressDown() break; break; case 5: while(1) PrintStringLocate(CHANGE: MIN , 16 , 0x00, 0x00); /分 if(KEY3Read() RealTime.minute +; if(KEY4Read() RealTime.minute -; if(RealTime.minute 59) RealTime.minute = 1; SetTime(&RealTime); sprintf(char *)DisplayBuff, %02d:%02d:%0

18、2d,RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY2PressDown() break; break; case 6: while(1) PrintStringLocate(CHANGE: SEC , 16 , 0x00, 0x00); /秒 if(KEY3Read() RealTime.second = 0; if(KEY4Read() RealTime.second = 0; SetTime(&RealTime); sprintf(ch

19、ar *)DisplayBuff, %02d:%02d:%02d,RealTime.hour,RealTime.minute,RealTime.second); PrintStringLocate(DisplayBuff, 16,0x04,0x05); if(KEY2PressDown() break; break; default: break; if(KEY1PressDown()&KEY1PressDown()/确定键 WriteData(0,0,132,0,8,0); / break; MEMS_Get(&mems); /DelayMs(80); switch(flag.x)/加速度x

20、坐标 case 0:if(mems.x85&mems.x195&(255-mems.x)85) flag.x=2;dir1+; else flag.x=0;break; case 1:if(mems.x195&(255-mems.x)85) flag.x=2;dir1+; else flag.x=0;break; case 2:if(mems.x85&mems.x83&mems.y195&(255-mems.y)83) flag.y=2;dir2+; else flag.y=0;break; case 1:if(mems.y195&(255-mems.y)83) flag.y=2;dir2+;

21、 else flag.y=0;break; case 2:if(mems.y83&mems.y113&mems.z177&(255-mems.z)113) flag.z=2;dir3+; else flag.z=0;break; case 1:if(mems.z177&(255-mems.z)113) flag.z=2;dir3+; else flag.z=0;break; case 2:if(mems.z113&mems.z85&mems.x195&(255-mems.x)85) flag.x=2;dir11+; else flag.x=0;break; case 1:if(mems.x19

22、5&(255-mems.x)85) flag.x=2;dir11+; else flag.x=0;break; case 2:if(mems.x85&mems.x83&mems.y195&(255-mems.y)83) flag.y=2;dir22+; else flag.y=0;break; case 1:if(mems.y195&(255-mems.y)83) flag.y=2;dir22+; else flag.y=0;break; case 2:if(mems.y83&mems.y113&mems.z177&(255-mems.z)113) flag.z=2;dir33+; else

23、flag.z=0;break; case 1:if(mems.z177&(255-mems.z)113) flag.z=2;dir33+; else flag.z=0;break; case 2:if(mems.z113&mems.z177) dir33+;break; default:break; if(dir11=2|dir22=2|dir33=2) / /BuzzOn(); /DelayMs(500); /BuzzOff(); dir11=dir22=dir33=0; /DelayMs(20000); full_clr(0x00); break; /*函数名: putchar*功能说明:

24、重定义putc函数,这样可以使用printf函数从串口3打印输出*/int putchar(int c) u8 s2 = 0x00, 0x00; s0 = (u8)c; /*OLED输出*/ PrintString(s,16); return c; #ifdef USE_FULL_ASSERT/* * 函数名称assert_failed * 函数说明 报告在检查参数发生错误时的源文件名和错误行数 * 输入参数 file: 源文件名 line: 错误所在行数 * 输出参数 无 * 返回参数 无 */void assert_failed(uint8_t* file, uint32_t line)

25、/* 用户可以增加自己的代码用于报告错误的文件名和所在行数, 例如:printf(错误参数值: 文件名 %s 在 %d行rn, file, line) */ /* 无限循环 */ while (1) #endif/*文件结束*/temperature.c#include include.h#include OLED.h#include DS18B20.h#include unsigned char symbol_1=0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,0x00,0x00,

26、0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00;/unsigned char symbol_2=0x00,0x00,0x18,0x24,0x24,0x18,0x02,0xFE,0x82,0x82,0x82,0xE2,0x06,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x03,0x00,0x00,0x00,0x00;/float temper = 0.0;float temper_2=0.0;void US

27、ART2_Init(void) GPIO_InitTypeDef GPIO_InitStructure; /* 开启相应部件的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOD, ENABLE); /* 将USART Tx的GPIO配置为推挽复用模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO

28、_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* 将USART Rx的GPIO配置为浮空输入模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig (GPIO_Remap_USART2 ,ENABLE);void USART2_Configuration(u32 BaudR

29、ate) USART_InitTypeDef USART_InitStructure; /* 开启相应部件的时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /* 第4步:配置USART参数 - BaudRate - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructur

30、e.USART_BaudRate = BaudRate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); /* 第5步:使能 USART, 配置完毕 */ USART_Cmd(USART2, ENABLE); /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 如下语句解决第1个字节无法正确发送出去的问题 */ USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送外城标志,Transmis

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论