收藏 分享(赏)

嵌入式系统课程设计.doc

上传人:精品资料 文档编号:8977780 上传时间:2019-07-18 格式:DOC 页数:20 大小:1.06MB
下载 相关 举报
嵌入式系统课程设计.doc_第1页
第1页 / 共20页
嵌入式系统课程设计.doc_第2页
第2页 / 共20页
嵌入式系统课程设计.doc_第3页
第3页 / 共20页
嵌入式系统课程设计.doc_第4页
第4页 / 共20页
嵌入式系统课程设计.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、 学 生 课 程 实 践 能 力 考 查题目:温度按键设定、显示、报警系统设计课程名称:嵌入式系统开发 专业班级: 学生学号: 学生姓名: 考查地点: 考查时长: 4 小时 所属院部: 指导教师: 2017 2018 学年 第 2 学期金陵科技学院教务成绩12017-2018 学年 第 2 学期 嵌入式系统开发实践能力考核班 级 姓名 学号课程名称 嵌入式系统开发 课程编号 0806504151授课时间 2018 年 2 月 26 日- 2018 年 5 月 4 日 周学时 4 学分 2简要评语(从完成情况、是否具备独立开发能力、是否独立完成、编程熟练程度等角度评价。)任课教师签名: 日期:

2、温度按键设定、显示、报警系统设计要求:1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。2、通过按键可以设置环境温度的上限和下限,WK_UP键按下调节上限,再按下调节下限,再按下调节上限KEY1按下加1;KEY0按下减1,根据上限和下限判断当前温度有没有超出范围。3、当温度超过上限,LED1隔1秒亮一次。超过下限,LED2隔1秒亮一次。(也可自定义报警方式)4、串口波特率一律用9600bps。液晶显示的信息:STM32 testname: xxxxxxxxxMaximum is 32C,Minimum is 26 CThe temperature is 2

3、9 C,now!(xxxxx是自己的名字拼音)2目录:第 1 章.系统要求1.1 设计要求1.2 设计方案第 2 章.硬件设计2.1 开发板原理图2.2 DS18B20 模块2.3 按键模块2.4 LCD 显示模块 2.5 LED 模块第 3 章.软件设计3.1 程序流程图3.2 程序部分代码3.2.1 主函数 、main.c3.2.2 LED 函数 led.c3.2.3 温度代码 s18b20.c3.2.4 键盘代码 key.c第四章.实物效果图第五章.课程总结 3第 1 章.设计要求及方案1.1 设计要求1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26

4、。2、通过按键可以设置环境温度的上限和下限,WK_UP键按下调节上限,再按下调节下限,再按下调节上限KEY1按下加1;KEY0按下减1,根据上限和下限判断当前温度有没有超出范围。3、当温度超过上限,LED1隔1秒亮一次。超过下限,LED2隔1秒亮一次。(也可自定义报警方式)4、串口波特率一律用9600bps。液晶显示的信息:STM32 testname: xxxxxxxxxMaximum is 32C,Minimum is 26 CThe temperature is 29 C,now!(xxxxx 是自己的名字拼音)1.2 设计方案本次课程设计的要求是使用 STM32F103 设计一个温度测

5、控系统,ALIENTEK MiniSTM32 V3 版开发板选择的是 STM32F103RCT6 作为 MCU,它拥有的资源 包括:48KB SRAM、256KB FLASH、2 个基本定时器、4 个通用定时器、2 个高级定时器、2 个 DMA 控制器(共 12 个通道)、3 个 SPI、2 个 IIC、5 个串口、1 个 USB、1 个 CAN、3 个 12 位 ADC、1 个 12 位 DAC、1 个 SDIO 接口及 51 个通用 IO 口。在本课程中使用了以下部分来完成课程设计的要求:1.应用 DS18B20 进行温度的检测。2.应用按键模块进行外部的上下限数值设定。3.应用 LED

6、的闪烁进行报警。4.应用 LCD 显示实时温度、上下限等信息。4第 2 章.硬件设计2.2 DS18B20 设计52.3 按键模块6ALIENTEK MiniSTM32 开发板总共有 3 个按键,其原理图如下: 2.4 LCD 显示模块 2.5 LED 模块7其中 PWR 是开发板电源指示灯,为蓝色。LED0 和 LED1 分别接在 PA8 和 PD2 上,PA8 还可以通过 TIM1 的通道 1 的 PWM 输出来控制 DS0 的亮度。为了方便大家判断,我们选择了 DS0 为红色,DS1 为绿色的 LED 灯。 第 3 章.软件设计3.1 程序流程图温度显示及报警模块 按键设定模块83.2

7、程序部分代码3.2.1 主函数 、main.c#include “led.h“#include “delay.h“#include “sys.h“#include “usart.h“#include “lcd.h“#include “ds18b20.h“#include “key.h“#include #include #include 9int temp_low = 22;int temp_high = 32;int zanshi_low=0;int zanshi_hign=0;void TIM3_Int_Init(u16 arr,u16 psc)TIM_TimeBaseInitTypeDe

8、f TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /时钟使能TIM_TimeBaseStructure.TIM_Period = arr; /设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到 5000 为 500msTIM_TimeBaseStructure.TIM_Prescaler =psc; /设置用来作为 TIMx 时钟频率除数的预分频值 10Khz 的计数频率 TIM_TimeBaseStruct

9、ure.TIM_ClockDivision = 0; /设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM 向上计数模式TIM_TimeBaseInit(TIM3, /根据 TIM_TimeBaseInitStruct中指定的参数初始化 TIMx 的时间基数单位TIM_ITConfig( /使能或者失能指定的 TIM 中断TIM3, /TIM2TIM_IT_Update ,ENABLE /使能);NVIC_InitStructure.NVIC_IRQChannel = TIM

10、3_IRQn; /TIM3 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /先占优先级 0 级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /从优先级 3 级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ 通道被使能NVIC_Init( /根据 NVIC_InitStruct 中指定的参数初始化外设NVIC 寄存器TIM_Cmd(TIM3, ENABLE); /使能 TIMx 外设u8 flag=0; int

11、 main(void)u8 t = 0;10u8 shuzu20;u8 keyvalue=0;u8 gaibianshui=0;short temperature;delay_init(); /延时函数初始化 uart_init(9600); /串口初始化为 9600NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/ 设置中断优先级分组 2LED_Init(); /初始化与 LED 连接的硬件接口TIM3_Int_Init(9999,7199);/10Khz 的计数频率,计数到 5000 为 500ms LCD_Init();POINT_COLOR

12、 = RED; /设置字体为红色 LCD_ShowString(0, 50, 200, 16, 16, “STM32 test“);LCD_ShowString(0, 70, 200, 16, 16, “name: zhang qi qi “);/LCD_ShowString(0,90,200,16,16,“Max 32 C Min 26 C“);memset(shuzu, 0, 20);sprintf(shuzu, “Max is %2d C,Min is %2d C“, temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuz

13、u);while (DS18B20_Init() /DS18B20 初始化 LCD_ShowString(0, 130, 200, 16, 16, “DS18B20 Error“);delay_ms(200);LCD_Fill(0, 130, 239, 130 + 16, WHITE);delay_ms(200);POINT_COLOR = BLUE; /设置字体为蓝色 LCD_ShowString(0, 110, 260, 16, 16, “The temperature is: . C now “);LCD_ShowChar(0+25*8,110,16,0);LCD_ShowChar(0+

14、29*8,110,!,16,0);while (1)POINT_COLOR = BLUE; /设置字体为蓝色 if (t % 10 = 0) /每 100ms 读取一次t = 0;11temperature = DS18B20_Get_Temp();if (temperature zanshi_hign)if(temperaturezanshi_hign)flag=2;printf(“chaoshangxian“);elseflag=0;LED0=1; /正常情况灯不亮LED1=1;/获取温度时间控制 tt+;/浏览开关KEY_Init();12delay_ms(10);keyvalue=KE

15、Y_Scan(0);if(keyvalue!=0)if(keyvalue=3)gaibianshui=(gaibianshui+1)%3;if(gaibianshui=1) /改变上限if(keyvalue=2) /key1 按下temp_high+;memset(shuzu, 0, 20);sprintf(shuzu, “Max is %2d C,Min is %2d C“, temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);if(keyvalue=1) /key0 按下temp_high-;memset(shuzu

16、, 0, 20);sprintf(shuzu, “Max is %2d C,Min is %2d C“, temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);if(gaibianshui=2) /改变上限if(keyvalue=2) /key1 按下temp_low+;memset(shuzu, 0, 20);sprintf(shuzu, “Max is %2d C,Min is %2d C“, temp_high, temp_low);LCD_ShowString(0, 90, 200, 16, 16, shuzu);

17、if(keyvalue=1) /key0 按下temp_low-;memset(shuzu, 0, 20);sprintf(shuzu, “Max is %2d C,Min is %2d C“, temp_high, temp_low);13LCD_ShowString(0, 90, 200, 16, 16, shuzu);keyvalue=0;void TIM3_IRQHandler(void) /TIM3 中断if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) /检查指定的 TIM 中断发生与否:TIM 中断源 TIM_ClearITPen

18、dingBit(TIM3, TIM_IT_Update ); /清除 TIMx 的中断待处理位:TIM 中断源 /温度不正常处理灯if(flag=1)LED0 = !LED0;if(flag=2)LED1 = !LED1;3.2.2 LED 函数 led.c#include “led.h“void LED_Init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); /使能 PA,PD 端口时钟GPIO_InitSt

19、ructure.GPIO_Pin = GPIO_Pin_8; /LED0PA.8 端口配置14GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO 口速度为 50MHzGPIO_Init(GPIOA, /根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8); /PA.8 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /LED1PD.2 端口配置, 推挽

20、输出GPIO_Init(GPIOD, /推挽输出 ,IO 口速度为50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2); /PD.2 输出高 3.2.3 温度代码 s18b20.c#include “ds18b20.h“#include “delay.h“void DS18B20_Rst(void) DS18B20_IO_OUT(); /SET PA0 OUTPUTDS18B20_DQ_OUT=0; /拉低 DQdelay_us(750); /拉低 750usDS18B20_DQ_OUT=1; /DQ=1 delay_us(15); /15US/等待 DS18B20 的回应/

21、返回 1:未检测到 DS18B20 的存在/返回 0:存在u8 DS18B20_Check(void) u8 retry=0;DS18B20_IO_IN();/SET PA0 INPUT while (DS18B20_DQ_INelse retry=0;while (!DS18B20_DQ_IN 15return 0;/从 DS18B20 读取一个位/返回值:1/0u8 DS18B20_Read_Bit(void) / read one bitu8 data;DS18B20_IO_OUT();/SET PA0 OUTPUTDS18B20_DQ_OUT=0; delay_us(2);DS18B2

22、0_DQ_OUT=1; DS18B20_IO_IN();/SET PA0 INPUTdelay_us(12);if(DS18B20_DQ_IN)data=1;else data=0; delay_us(50); return data;/从 DS18B20 读取一个字节/返回值:读到的数据u8 DS18B20_Read_Byte(void) / read one byte u8 i,j,dat;dat=0;for (i=1;i1); return dat;/写一个字节到 DS18B20/dat:要写入的字节void DS18B20_Write_Byte(u8 dat) u8 j;u8 test

23、b;DS18B20_IO_OUT();/SET PA0 OUTPUT;for (j=1;j1;if (testb) 16DS18B20_DQ_OUT=0;/ Write 1delay_us(2); DS18B20_DQ_OUT=1;delay_us(60); else DS18B20_DQ_OUT=0;/ Write 0delay_us(60); DS18B20_DQ_OUT=1;delay_us(2); /开始温度转换void DS18B20_Start(void)/ ds1820 start convert DS18B20_Rst(); DS18B20_Check(); DS18B20_W

24、rite_Byte(0xcc);/ skip romDS18B20_Write_Byte(0x44);/ convert /初始化 DS18B20 的 IO 口 DQ 同时检测 DS 的存在/返回 1:不存在/返回 0:存在 u8 DS18B20_Init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /使能 PORTA 口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /PORTA0 推挽输出GPIO_Ini

25、tStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_SetBits(GPIOA,GPIO_Pin_2); /输出 1DS18B20_Rst();return DS18B20_Check(); /从 ds18b20 得到温度值/精度:0.1C/返回值:温度值 (-5501250) short DS18B20_Get_Temp(void)17u8 temp;u8 TL,TH;short tem;DS18B20_Start ();

26、 / ds1820 start convertDS18B20_Rst();DS18B20_Check(); DS18B20_Write_Byte(0xcc);/ skip romDS18B20_Write_Byte(0xbe);/ convert TL=DS18B20_Read_Byte(); / LSB TH=DS18B20_Read_Byte(); / MSB if(TH7)TH=TH;TL=TL; temp=0;/温度为负 else temp=1;/温度为正 tem=TH; /获得高八位temKEY1WK_UP!u8 KEY_Scan(u8 mode) static u8 key_up=

27、1;/按键按松开标志if(mode)key_up=1; /支持连按 if(key_up/去抖动 key_up=0;if(KEY0=0)return KEY0_PRES;else if(KEY1=0)return KEY1_PRES;else if(WK_UP=1)return WKUP_PRES; else if(KEY0=1 return 0;/ 无按键按下第 4 章.实物效果图19第五章 课程总结 嵌入式开发是自动化专业的主要课程之一,现实生活中,嵌入式在应用可以说得是无处不在。因此在大学中掌握嵌入式的开发技术是十分重要的,也是十分必要的。本次使用基于 Cortex-M3 内核的 32 位

28、 ARM 处理器 stm32 作为主控制器,设计了一种温度测控系统。在本次设计中深深体会到了应用的重要性。在课程设计的过程中,为了减小干扰的影响,数据采集后,平均算法进行温度输出。并利用串口设计了简单的交互系统,虽然没有使用上位机,但也达到了比较好的效果。通过本次课程设计,着实经历到了很多想象不到的困难,自己的一些想法也不够成熟,最后还是参考了别人的解决方案,这让我深深认识到在嵌入式开发这条路上,与别人交流学习是提升自己的非常有效的方式。在设定时间以及温度上下限,可是经过自己的冥思苦想还是想不出来,怎么都实现不了。无奈之下,我只好去隔壁寝室的大神那里虚心求教,在参考了他的程序之后我恍然大悟,选

29、择了在循环之外先按顺序读取字符串的方法,顺利解决了我的问题,让我深深认识到了交流的重要性,在自己的想法不够完善时,多多了解些别人的算法对提升自己是有很大帮助的。由于之前没有完整开发一个有较多功能系统的经历,在本次做课程设计的过程中,走了不少的弯路,也学到很多课本上没有的知识。使用库开发 Stm32 时,非常注重模块化的概念,不光是很多片上资源使用库文件来进行封装,自己在编写一些函数时也应该学会进行封装,其中又涉及到 c 语言很多之前没太注意到的地方,在开发过程中着实让我吃了不少苦头,不过幸运的是同学的指导下,我一点点解决了那些疑惑的地方,更加深入了理解了一个工程的整体结构,对模块化的思想印象深刻。这对我以后的开发将起到巨大的作用。总之,本次的嵌入式课程设计让我收获了很多,不仅仅学习到了很多课本和课堂上学不到的东西,更重要的是学习到了库开发的思想,以及体会到了交流的重要性,同时也感谢老师这一学期来的认真授课,严谨的答疑解惑,让我认识到理论知识对开发潜移默化的作用。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报