生产实习设计报告设计题目:基于STM32F107开发板的万年历和温度测量系统设计生产组长姓名:xx设计组长姓名:xx设计小组成员:xx、xx、xx、xx、xx、xx、xx、xx2013年9月12日目录一、概述...............................................3二、总体设计...........................................31.总体系统结构........................................32.模块划分............................................33.人员分工............................................4三、关键模块设计.......................................41.测温模块.............................................42.OLED显示模块.........................................43.按键开关模块.........................................54.加速度传感器模块......................................6四、测试结果...........................................6五、总结...............................................6六、附录...............................................71.关键程序代码.........................................72.实物照片............................................35一、概述本设计基于STM32F107开发板,利用板上的单片机在OLED显示屏上显示年月日、时间、星期和温度;利用核心板上的STM32控制基板上的温度传感器DS18B20实现温度测量,然后STM32对DS18B20转换后的数据进行读取和处理,当晃动板子时,转换成实际温度值后得到温度显示码,最后在OLED显示测得的温度(显示出温度值的符号位和整数位,以及两位小数,并以摄氏温度和华氏温度两种形式同时显示),再次晃动板子时再次显示年月日星期和时间。该多功能温度计除具备测温功能外,还有如下附加功能:可手动切换显示温度、日期、星期和时间;手动校时、调整日期。二、总体设计1.总体系统结构2.模块划分⑴.测温模块⑵.OLED显示模块⑶.按键开关模块⑷.三轴加速度传感器模块DS18B20PCF856按键开关设置加速度传感器OLED显示MCU图1系统框图3.人员分工三、关键模块设计1.测温模块DS18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。DS18B20工作在3V~5.5V的电压范围,可以程序设定9~12位的分辨率,测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。本设计中,DS18B20通过程序将其分辨率设为12位(温度分辨为0.0625℃)。图2DS18B20与STM32的连接电路2.OLED显示模块OLED使用的控制器为SSD1305,可通过写入不同的命令字来设置对比度、显示开关、电荷泵、页地址等。图3OLED与STM32连接电路OLED被配置为使用I2C的方式。I2C的地址二进制位为0111100X,16进制为0x78(写地址),0x79(读地址)。OLED的Reset平时应该拉高,在初始化的时候,应该有一个从低电平到高电平的跳变。使用的MCU端口为:PB6CLKI2CPB7SDAI2CPE6RESET(低电平有效)3.按键开关模块基板一共有4个按键,分别为KEY1,KEY2,KEY3,KEY4。其中,按键未按下,对应的GPIO口为高电平,按键按下后变为低电平。图4按键电路图使用的MCU端口为PE2KEY4GPIOPE3KEY3GPIOPE4KEY2GPIOPE5KEY1GPIO4.加速度传感器模块RS232的电平转换芯片为MAX232CE。外部接口为DB9。有两个LED指示灯,TXD用来显示接受到数据,RXD用来显示正在发送数据。对外接口为DB9接口,定义为:2RXD,3TXD,5GND。因此,基板可以通过串口线直接连接到PC机,和PC机进行通信。使用的MCU端口为:PD5UART2_TX(Remap)PD6UART2_RX(remap)四、测试结果1.开机上电后显示年月日、时间和星期;2.在日历时钟显示时,摇晃板子之后,OLED显示当前所测温度(摄氏+华氏);3.在温度显示时,摇晃板子之后,OLED显示日历时钟;4.在日历时钟显示模式时,按下KEY1进入校时模式,此时可通过KEY1选择校准年、月、日、小时、分钟、秒和星期;按下KEY3则对应项+1,按下KEY4则对应项-1;按下KEY1键确认,返回日期、星期和时间正常显示模式。五、总结本设计完全基于STM32F107开发板,利用开发板上的DS18B20、OLED、PCF8563日历时钟芯片、按键开关、三轴加速度芯片LIS35DE等资源实现了测温,显示温度(摄氏+华氏);显示日期、星期、时间,手动校时、调整日期;摇晃实验板实现温度和日历时钟之间的切换。六、附录1.关键程序代码//main.c#includeinclude.h#includeDS18B20.h#includetemperature.h#includerealtime.h#includeMEMS.hu8DisplayBuff[20];timeRealTime;dateRealDate;sc8WeekdayStr[7][16]={Sun.,Mon.,Tue.,Wed.,Thur.,Fri.,Sat.,};intmain(void){intdir1=0,dir2=0,dir3=0;intdir11=0,dir22=0,dir33=0;acc_3dmems,flag;flag.x=flag.y=flag.z=0;u8select=0;SystemInit();//设置系x统时钟USART2_Init();USART2_Configuration(9600);I2C_GPIOInit();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);sprintf((char*)DisplayBuff,%4d-%02d-%02d,RealDate.year,(u8)RealDate.month,RealDate.day);PrintStringLocate(DisplayBuff,16,0x02,0x05);sprintf((char*)DisplayBuff,%4s,WeekDayStr[RealDate.weekday]);PrintStringLocate(DisplayBuff,16,0x06,0x08);sprintf((char*)DisplayBuff,%02d:%02d:%02d,RealTime.hour,RealTime.minute,RealTime.second);PrintStringLocate(DisplayBuff,16,0x04,0x05);if(KEY1PressDown()){select++;//DelayMs(200);if(select7)select=0;//}switch(select){case0:PrintStringLocate(Date:CHANGE,16,0x00,0x00);//设置日期break;case1:while(1){PrintStringLocate(CHANGE:YEAR,16,0x00,0x00);//设置年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;case2:while(1){PrintStringLocate(CHANGE:MON,16,0x00,0x00);//设置月if(KEY3Read())RealDate.month++;if(KEY4Read())RealDate.month--;if(RealDate.month12)RealDate.month=January;SetDate(&RealDate);sprintf((char*)DisplayBuff,%4d-%02d-%02d,RealDate.year,(u8)RealDate.month,RealDate.day);PrintStringLocate(DisplayBuff,16,0x02,0x05);if(KEY2PressDown())break;}break;case3: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(RealDate.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())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(Re