嵌入式综合实验周(17页).doc

上传人:1595****071 文档编号:36082026 上传时间:2022-08-25 格式:DOC 页数:17 大小:475.50KB
返回 下载 相关 举报
嵌入式综合实验周(17页).doc_第1页
第1页 / 共17页
嵌入式综合实验周(17页).doc_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《嵌入式综合实验周(17页).doc》由会员分享,可在线阅读,更多相关《嵌入式综合实验周(17页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-嵌入式系统原理及应用综合实验报告专业班级:姓名: 学 号:_时 间:_指导教师:_2017年 9 月 17 日嵌入式系统原理及应用综合实验报告摘要:信盈达电子有限公司产品信盈达智能穿戴开发平台,广泛应用于嵌入式生产实训教学中。该文通过分析STM32F40xxx系列微控制器的架构和操作原理,通过使用信盈达智能穿戴开发平台,给出了相关的编程设计方法和注意事项关键词:嵌入式 STM32 智能穿戴。1 引言IEEE(Institute of Electrical and Electronics Engineers,美国电气和电子工程师协会)对的定义:“用于控制、监视或者辅助操作机器和设备的装置”。原

2、文为:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants)。嵌入式系统,通常指一种专用的计算机设备,或作为装置和设备的一部分,亦或是指单纯的一块控制电路板。事实上带有数字接口的设备都使用了嵌入式系统。从上加以定义,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。国内普遍认同的定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。本次实训采用了信盈达智能穿戴开发平台,通过为期一周的学习,快

3、速掌握了STM32F40XXX系列微控制器的基础使用方法,并通过编程实现了相关的功能。2 总体设计方案2.1 设计思路2.1.1设计一个智能穿戴系统,实现下列功能:显示小组姓名、班级、学号;显示实时温度、湿度;测量并显示心率;测量并显示血压;返回初始界面。2.2 设计方框图3 系统硬件设计3.1 微控制器电路的设计图1 STM32F11微控制器电路3.2 按键电路的设计图2 按键电路3.3温湿度检测电路图3 SHT20温湿度检测电路SHT20是新一代sensirion湿度和温度传感器,采用数字输出方案,带有I2C接口,具有优异的长期稳定性,本电路采用I2C方案进行通讯。3.4 OLED显示电路

4、图4 OLED显示电路平台搭载了一款13264大小的OLED屏幕。OLED是有机发光二极管的缩写,又称有机电激光显示、有机发光半导体。其具有自发光、广视角、超高对比度、低耗电的优良性能,为一种高端的显示设备。4 系统软件设计图5 系统流程图相关程序编写:main函数所需头文件:#include stm32f4xx.h#include key.h#include led.h#include exti.h#include uart.h#include delay.h#include timer.h#include oled.h#include spi.h#include bmp.h#include

5、 iic.h#include sht20.h按键程序:在main函数中,按键程序采用switch语句,按下后累计按下次数,以此选择软件功能模块。switch(page)case 1: OLED_clear();name_page();break;case 2: OLED_clear();clock_page();break;case 3: OLED_clear();pulse_page();break;case 4:OLED_clear();bp_page();break;case 5:OLED_clear();kal_km_page();break; default:break;SPI程序:

6、SPI 是一种全双工串行接口,英文全称: Serial Peripheral Interface,可处理多个连接到指定总线上的主机和从机。在数据传输过程中,总线上只能有一个主机和一个从机通信。在数据传输中,主机总是会向从机发送一帧 8到 16 个位的数据,而从机也总会向主机发送一帧字节数据。“全双工”意义为:主机、从机同时给对方发送数据。 SPI,是一种高速的,全双工, 同步的通信总线(“同步” 的意思是数据传输需要时钟线),并且在芯片的管脚上只占用四根线,“信盈达智能穿戴设备开发平台”上的 OLED 屏使用的是 SPI 接口。SPI 控制器的初始化步骤有以下几步:(1) 使能 SPI 复用功

7、能所映射的 GPIO 口时钟。(2) SPI 控制器时钟使能。(3) 配置 GPIO 为复用功能。( MOSI/MISO/CLK)(4) GPIO 复用功能为第几复用功能( AFx)。(5) 配置 GPIO 输出速率为 50MHz。(6) 配置 SPIx-CR1 寄存器。 相关代码如下所示:void Spi1_init(void)RCC-AHB1ENR |= 1APB2ENR |= 1MODER &= (0X3F MODER |= 0X2A AFR0 &= (0XFFF AFR0 |= 0X555 OSPEEDR &= (0X3F OSPEEDR |= 0X2A CR1 = 0;SPI1-CR

8、1 |= 3 CR1 |= 1 CR1 |= 4 CR1 |= 1 SR & (1DR = val;while (SPI1-SR & (1DR); SHT20芯片程序: #include iic.h #include delay.h#include sht20.h#define SHT20ADDR 0x80 /SHT20写地址#define ACK 0 /应答信号#define NACK 1 /非应答信号#define FAIL 1 /读取温湿度失败的返回值。#define READ_TEMP_COMD 0xf3 /读取温度命令#define READ_HUMI_COMD 0xf5 /读取湿度

9、命令TempHumiValue_t temp_humi_Value;static void SHT20_setResolution(void);static void SHT20_setResolution(void);void SHT20_softReset(void);static u8 SHT20_writeOneByte(u8 dataToWrite)u8 ack; ack = IIC_WriteByte(dataToWrite); /发送字节return ack;void SHT20_softReset(void) IIC_Start(); /start I2CSHT20_write

10、OneByte(SHT20ADDR&0xfe); /I2C address + writeSHT20_writeOneByte(0xfe); /soft resetIIC_Stop(); /stop I2C void SHT20_Init(void)SHT20_softReset();static u8 SHT20_readOneByte(u8 ack)u8 temp;temp=IIC_ReadByte(ack); return temp;static void SHT20_setResolution(void) IIC_Start(); /Start I2C if(SHT20_writeOn

11、eByte(SHT20ADDR&0xfe)=ACK) /I2C address + write + ACK if(SHT20_writeOneByte(0xe6)=ACK) /写用户寄存器 if(SHT20_writeOneByte(0x83)=ACK); /设置分辨率 11bit RH% 测量时间:12ms(typ.) & 11bit T 测量时间:9ms(typ.) IIC_Stop(); /Stop I2C float SHT20_readTemOrHum(u8 commod)float temp; /温度u8 ack=1;u8 MSB,LSB; /温度、相对湿度的寄存器数据float

12、Humidity,Temperature; /温湿度的转换结果SHT20_setResolution(); /设置帧率8bit,9bit,10 bit,11bit ,12bit,13bit,14bitIIC_Start(); /iic开始信号ack = SHT20_writeOneByte(SHT20ADDR&0xfe);if( ack = ACK ) /写地址,并等待ACK if(SHT20_writeOneByte(commod)=ACK) /写命令 dodelay_ms(6); /延时IIC_Start(); /发送开始信号while(SHT20_writeOneByte(SHT20AD

13、DR|0x01)=NACK); /无应答则整形,还在测量中,如果有应答,则结束当前循环MSB = SHT20_readOneByte(ACK); /读Data(MSB),给应答ACKLSB = SHT20_readOneByte(ACK); /读Data(LSB),给应答ACKSHT20_readOneByte(NACK); /读Checksum ,不给应答NACK IIC_Stop(); /Stop I2CLSB &= 0xfc; /Data (LSB) 的后两位在进行物理计算前前须置0 temp = MSB*256 + LSB; /十六进制转成十进制if (commod=(u8)READ_

14、HUMI_COMD) /命令为读取湿度的命令 /*- calculate relative humidity %RH -*/ Humidity =(temp*125)/65536-6; /公式: RH%= -6 + 125 * SRH/216return Humidity; /返回值:humidity else if(commod=(u8)READ_TEMP_COMD) /命令为读取温度的命令 /*- calculate temperature C -*/Temperature = (temp*175.72f)/65536-46.85f; /公式:T= -46.85 + 175.72 * ST

15、/216return Temperature; /返回值:temperature return FAIL;TempHumiValue_t * SHT20_readTemAndHum(void)temp_humi_Value.humidity = SHT20_readTemOrHum(READ_HUMI_COMD);/读取湿度temp_humi_Value.temperature = SHT20_readTemOrHum(READ_TEMP_COMD);/读取湿度return &temp_humi_Value; OLED初始化程序: /初始化SSD1306 void Oled_init(void

16、) OLED_pinInit(); OLED_deSelect(); /不选择OLEDOLED_reset();OLED_writeByte(0xAE,OLED_CMD);/-turn off oled panelOLED_writeByte(0x02,OLED_CMD);/-SET low column addressOLED_writeByte(0x10,OLED_CMD);/-SET high column addressOLED_writeByte(0x40,OLED_CMD);/-SET start line address SET Mapping RAM Display Start

17、 Line (0x000x3F)OLED_writeByte(0x81,OLED_CMD);/-SET contrast control registerOLED_writeByte(0xCF,OLED_CMD); / SET SEG Output Current BrightnessOLED_writeByte(0xA1,OLED_CMD);/-SET SEG/Column Mapping 0xa0左右反置 0xa1正常OLED_writeByte(0xC8,OLED_CMD);/SET COM/Row Scan Direction 0xc0上下反置 0xc8正常OLED_writeByte

18、(0xA6,OLED_CMD);/-SET normal displayOLED_writeByte(0xA8,OLED_CMD);/-SET multiplex ratio(1 to 64)OLED_writeByte(0x3f,OLED_CMD);/-1/64 dutyOLED_writeByte(0xD3,OLED_CMD);/-SET display offSETShift Mapping RAM Counter (0x000x3F)OLED_writeByte(0x00,OLED_CMD);/-not offSETOLED_writeByte(0xd5,OLED_CMD);/-SET

19、 display clock divide ratio/oscillator frequencyOLED_writeByte(0x80,OLED_CMD);/-SET divide ratio, SET Clock as 100 Frames/SecOLED_writeByte(0xD9,OLED_CMD);/-SET pre-charge periodOLED_writeByte(0xF1,OLED_CMD);/SET Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_writeByte(0xDA,OLED_CMD);/-SET com p

20、ins hardware configurationOLED_writeByte(0x12,OLED_CMD);OLED_writeByte(0xDB,OLED_CMD);/-SET vcomhOLED_writeByte(0x40,OLED_CMD);/SET VCOM Deselect LevelOLED_writeByte(0x20,OLED_CMD);/-SET Page Addressing Mode (0x00/0x01/0x02)OLED_writeByte(0x02,OLED_CMD);/OLED_writeByte(0x8D,OLED_CMD);/-SET Charge Pu

21、mp enable/disableOLED_writeByte(0x14,OLED_CMD);/-SET(0x10) disableOLED_writeByte(0xA4,OLED_CMD);/ Disable Entire Display On (0xa4/0xa5)OLED_writeByte(0xA6,OLED_CMD);/ Disable Inverse Display On (0xa6/a7) OLED_writeByte(0xAF,OLED_CMD);/-turn on oled panelOLED_writeByte(0xAF,OLED_CMD); /*display ON*/

22、OLED_clear();OLED_setPos(0,0); 5 结束语 通过本次为期五天的嵌入式实训,让我对上个学期学习的嵌入式相关只是有了深一步的了解。通过本次实验,我感觉收获还是蛮多的。可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。参考文献1陈志旺.STM32嵌入式微控制器快速上手(第二版).北京:电子工业出版社,2014.52嵌入式系统原理及应用.北京:北京邮电大学出版社,20093 桑楠.嵌入式系统原理及应用开发技术. 北京:北航大学

23、出版社,2003附录电路原理图:Main.c程序#include stm32f4xx.h#include key.h#include led.h#include exti.h#include uart.h#include delay.h#include timer.h#include oled.h#include spi.h#include bmp.h#include iic.h#include sht20.h#include hp6.h#include mpu6050.hu8 page = 0;void clock_page(void);void pulse_page(void);void

24、bp_page(void);void step_page(void);void kal_km_page(void);int main()/裸机程序结构 delay_init(100);led_init();key_init();Spi1_init();Oled_init();IIC_PinInit();SHT20_Init();Hp_6_init(); /初始化HP6心率血压 模块 MPU_Init();/HP_6_VersionInfo();while (1)switch(page)case 0:OLED_clear(); kal_km_page();case 1: OLED_clear()

25、;clock_page();break;case 2: OLED_clear();pulse_page();break;case 3:OLED_clear();bp_page();break; default:break;void kal_km_page (void)while(1) OLED_showCHinese(0, 0, 0);OLED_showCHinese(16, 0, 1);OLED_showCHinese(32, 0, 2);OLED_showCHinese(48, 0, 3);OLED_showCHinese(64, 0, 4);OLED_showCHinese(80, 0,

26、 5);OLED_showCHinese(0, 2, 6);OLED_showCHinese(16, 2, 7);OLED_showCHinese(32, 2, 8);OLED_showCHinese(48, 2, 9);OLED_showCHinese(64, 2, 10);OLED_showCHinese(80, 2, 11);if(key_scan()page = page +1; /切换到page1IIC_Stop();break; /跳出当前页面 void clock_page(void)TempHumiValue_t humi_temp_val ; /温湿度u8 uiBuf40;

27、while(1)humi_temp_val = *SHT20_readTemAndHum();/获取温度sprintf(char*)uiBuf,%02dc %02d,(char)humi_temp_val.temperature,(char)humi_temp_val.humidity); / 以整数显示OLED_showString(10,6,uiBuf,16); OLED_showString(10+8*7,6,%,16); if(key_scan()page = page +1; /切换到page1IIC_Stop();break; /跳出当前页面 void pulse_page(voi

28、d)static u8 oldPulseVal = 0; /上一次的心率值u8 uiBuf40; u8 pulseBuf24 = 0;HP_6_OpenRate(); /打开心率测量OLED_showString(10,4,pulse,16); while(1)/OLED_showString(10,4,pulse,16); / HP_6_GetRateResult();/HP_6_GetResultData(pulseBuf);/sprintf(char*)uiBuf,%03d,pulseBuf7); / /byte 7是心率结果/OLED_showString(10,6,uiBuf,16)

29、; /delay_ms(100);if(pulseBuf7 & pulseBuf7!= oldPulseVal) /如果可以获得心率结果,表明测量成功,则关闭心率测量oldPulseVal = pulseBuf7;HP_6_CloseRate();sprintf(char*)uiBuf,%03d,pulseBuf7); / /byte 7是心率结果OLED_showString(10,6,uiBuf,16); else /如果获取不到心率结果,则每隔100毫秒钟获取心率值HP_6_GetRateResult();HP_6_GetResultData(pulseBuf);delay_ms(100

30、);if(key_scan()page = page +1; /切换到page2HP_6_CloseRate(); /关闭心率测量IIC_Stop();break; /跳出当前页面 void bp_page(void)u8 uiBuf40; u8 BpBuf24 = 0;HP_6_OpenBp(); /打开血压测量 while(1) HP_6_GetBpResult(); /获取血压测量状态 HP_6_GetResultData(BpBuf); if(0 = BpBuf7) /byte 7是血压测量的状态:0测量中,1测量完成、2测量失败 OLED_showString(10,4,testin

31、g,16); else if(1 = BpBuf7) OLED_showString(10,4,success,16);sprintf(char*)uiBuf,%03d/%03d MMGH, BpBuf10, BpBuf11);/byte 10是血压测量结果的高压,byte 11是血压测量结果的低压OLED_showString(10,6,uiBuf,16); HP_6_CloseBp(); else if(2 = BpBuf7) HP_6_CloseBp(); OLED_showString(10,4,fail ,16); else /do nothingdelay_ms(100); if(key_scan()page =0; /切换到page3HP_6_CloseBp(); /关闭血压测量IIC_Stop();break; /跳出当前页面 -第 17 页-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 单元课程

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁