嵌入式系统课程设计报告书_第1页
嵌入式系统课程设计报告书_第2页
嵌入式系统课程设计报告书_第3页
嵌入式系统课程设计报告书_第4页
嵌入式系统课程设计报告书_第5页
已阅读5页,还剩14页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

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

2、始值上限32,下限26。2、通过按键可以设置环境温度的上限和下限,WK_UP按下调节上限,再按下调节下限,再按下调节上限KEY假下加1;KEY股下减1,根据上限和下限判断当前温度有没有超出范围。3、当温度超过上限,LED1B1秒亮一次。超过下限,LED2鬲1秒亮一次。(也可自定义报警方式)4、串口波特率一律用9600bps。液晶显示的信息:STM32testname:xxxxxxxxxMaximumis32C,Minimumis26CThetemperatureis29C,now!(xxxxx是自己的名字拼音)目录:第一章.系统要求1.1 设计要求1.2 设计方案第二章.硬件设计2.1 开发板

3、原理图2.2 DS18B20模块2.3 按键模块2.4 LCD显示模块2.5 LED模块第三章.软件设计3.1 程序流程图3.2 程序部分代码3.2.1 主函数、main.c3.2.2 LED函数led.c3.2.3 温度代码s18b20.c3.2.4 键盘代码key.c第四章.实物效果图第五章.课程总结第一章.设计要求及方案1.1 设计要求1、读取DS18B2温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。2、通过按键可以设置环境温度的上限和下限,WK_UP按下调节上限,再按下调节下限,再按下调节上限KEY假下加1;KEY股下减1,根据上限和下限判断当前温度有没有超出范围。

4、3、当温度超过上限,LED1B1秒亮一次。超过下限,LED2B1秒亮一次。(也可自定义报警方式)4、串口波特率一律用9600bps。液晶显示的信息:STM32testname:xxxxxxxxxMaximumis32C,Minimumis26CThetemperatureis29C,now!(xxxxx是自己的名字拼音)1.2 设计方案本次课程设计的要求是使用STM32F103s计一个温度测控系统,ALIENTEKMiniSTM32V3版开发板选择的是STM32F103RCT6乍为MCU它拥有的资源包括:48KBSRAM256KBFLASH2个基本定时器、4个通用定时器、2个高级定时器、2个D

5、MA控制器(共12个通道)、3个SPI、2个IIC、5个串口、1个USB1个CAN3个12位ADC1个12位DAC1个SDIO接口及51个通用IO口。在本课程中使用了以下部分来完成课程设计的要求:1.应用DS18B20a行温度的检测。2 .应用按键模块进行外部的上下限数值设定。3 .应用LED的闪烁进行报警。4 .应用LCD显示实时温度、上下限等信息。第二章.硬件设计2J开发板原理图详解2.1.1MCUALiENTEKMiniSTM32V3版开发被选择的是STM32F103RCT6作为MCU,它拥有的资源包括:48KBSRAM、256KBFLASH.2个基本定时器、4个通用定时器,2个高级定时

6、器,2个DMA控制器共12个通道),3个SPE2个IIC.5个串口、1个USB、I个CAN、3个12位ADC、1个12位DAC、1个SDIO接口及51个通用IO口,该芯片性价比极高,MCU部分的原理图如图2LL1(因为原理图比较大,缩小下来可能有点看不清,请大家打开开发扳光盘的原理图进行查看)所示工MiInU21TKJdUlT4FB1QIX25CLVJECFill1X2WAITUKVEpj1hjwwajk4i>ulhimaul£m?TBtrCieIMI二廿小Hi4:«iifClJhfirimWCVTCHD<3DTI»«»;ms同区Q

7、11MJXJd4-IL>nL1WtU-tOETTl.FER;申匚Rirmj-VWATfcifejKMT|RTliKMC!:ttrn-mrjtqgncfiMny-iyKxxiUENTXl小£1KiijtfriiE34:EJ3”、菊肉-FMTBkOUVNDXhWTftUfWITmqnn-1XTEtMTD4A<1CftolX'lMLTQH<1UivaawiwmEa>F1M-NTW¥T*RIW»江工1A1LX初airkv?取si0ehhixwtoCKFf1H,iIX«1a1Hg现ffl芷K送St事郡:ixn4厂橘1&11i

8、wTiL_tMLiwamyk理:恒P.;1TnJUKTim;CllTWnt,fill-.PA.4DtnT&kH4TMJ!LiM,M-gt*aatitniihrbfiiriMi5Mt;11AJ>UkHXTM11UmTTvr&tTocFUAdhX-nifci>na-iHs,MijJTXiHi,叫门*山«TrfTSfitTantTiF4I1CWIXWMIWTWIfrfTancNkiic*>mKTITWr>PWFhKL:+J,R.ILT3hltOm?0内睢!:1.'-MT1E.T3IIInriBTiEMp心mMurk社xma0L年!*UV12M

9、&mTIMIlUE3trasirtniDctttmimixraa?Fi?sa-cnxnbjed:图2.1.1.1MCU部分原理图上图中中上部的mOQTl用于设置STM32的启动方式,其对应启动模式如下表所示工BOOTOBOOT1启动模式说明0X月户闪存存储器月户为存存储器,也就是FLAEH启动10系统存徜器系统存储器启动,用于串口下载11SRAM启动SRAM启动,用于在SRAH中调试代码2.1.1.1BOOTO.BOOTl启劭模式表2.2DS18B20设计DS1SB20是由DALLAS半导体公司推出的一种的,'一线量线”接口的温度恃感器.与偿统的热被电阻等测温元件相比.它是一种

10、新型的体积小.港用电压宽、与微处理器接口筒单的数字化温度传感器*一线总线结构具有面洁且经济的特点,可使用户轻松地组建传感器网络,从而为;则量系统的构建即入全新概念,潴量温度范围为-55T125X7,精度为土。_5七.现场温嚏直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性.它能直接读出被测温度,并旦可根据实际票求通过衙单的编程实现9T2位的数字值读数方式.它工作在3T.5V的电压范围,采用多种封装形式,从而使系统设计灵活*方便.设定分辨率及用户设定的报警温度存防在EEPRQM中,掉电后依然保存.其内部结构如图阻L1所示:“064母non和单胤*。Vw>®2811DS1

11、8B20内部玷构图所要用到的谏件责渡如下:1)指示灯DS02>TFTLCD军块3)DS18B20温度传惠器前两部分,在之前的实例已经介绍过了,而DS18B20温度传遂患属于外部器件(板上没有直接焊接),但是在我们开发板上是有DS18B20接口(U6)的,直爰插上DS18B20即可使用.下面卜我们介绍开发板上DS12B20接口和STM32的连接电路,如图2821所示!(】组上0DO1图28.2.1DS18B20空口与3TM32的连接电路图从上图可以看出.我们笠用的是STM及的PA0夹连接DS1&R20的(U6)的DQ引脚.图中U6为DS18B?0的插口C脚圆孔座),将口S1阻20传

12、感器插入霆这个上面,并用跳线帽短接1820与PA0,就可以通过STM32来读取DS1阳20的温度了.连接示意图如图2822所示:2.3按键模块ALIENTEKMiniSTM32开发板总共有3个按键,其原理图如下:KEAKEYOKEYOIKEY1VCC331KUPKEY1TWKI?1图2.141按键输入原理图KEYO和KEY1用作普通按键输入,分别连接在PC5和PA15上,其中PA15和JTDI共用了所以,在使用KEYO和KEY1的时候,就不能使用JTAG来调试了,但是可以用SWD调试,这点在使用的时候要注意.KEYQ和KEY】还和PX2的DAT和CLK线共用.WK_UP按键连接到PAWSTM3

13、2的WKUP引脚),它除了可以用作普通输入按键外,逐可以用作STM奖的唤醒输入,该按键是高电平触皮的,由于PAO还是D518B20的输入引脚,而18B20是有上拉电阻的,所以在使用WKUP按键的时候,请一定要断开PAO和DS18B20的2.4 LCD显示模块ALIENTEKMiniSTM32开发板载有目前比较通用的液晶显示模块接口,还有其比较有特色的兼容性接口,不仅支持ALIENTEK各种尺寸(2.4,2,8>3.5.43.7寸等)的TFTLCD,还支持OLED显示器,同时,该接口支持电阻触摸屏跳及电容触摸屏等不同类型的触摸异接口,其原理图如下:图251液晶显示模块原理图TFT_LCD是

14、一个通用的液晶模块接口.OLED是一个给OLED显示模块供电的接口.它和TFTJCD拼接在一起.当使用丁FTLCD时,我们接至UTFTJLCD上£魅右插)就可以了,而当我们使用ALIENTEK的。LED模块时则接。LED排针做胆源,同时会连接到TFTJLCD上C靠左插)的部分管固,从而实现OLED与MCU的连接.ALIENTEKMimSTMS?的LCD接口兼容ALIENTEK各种尺寸的TFTLCD模块,包括:2一4寸020屋40,电阻舁”23寸(320*240,电阻屏)、土5寸(480*320,电阻屏人4一3寸(800*480,电容屏人7寸(800*4K0,电容屏)等,同时还兼容AL

15、IENTEK的096寸QLED模块士这些引脚与MCU的连接关系我们在这里就不一一列出了,大家可以从MCU的原理图上找到*2.5 LED模块ALIENTEKMuu£32开发板上总共有3个LED,其原理图如下:图2181LED亘理图其中PWR是开发板电源指示灯,为蓝色。LED0和LED1分别接在PA8和PD2上,PA8还可以通过TIM1的通道1的PWM输出来控制DS0的亮度。为了方便大家判断,我们选择了DS0为红色,DS1为绿色的LED灯。第三章.软件设计3.1 程序流程图按键设定模块温度显示及报警模块设定上限KEYlftnlKKY24£I日*KLk1按设定卜限KHYlAtUK

16、EY2减13.2 程序部分代码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<string.h>#include<stdio.h>#include<stdlib.h>inttemp_low=22;

17、inttemp_high=32;intzanshi_low=0;intzanshi_hign=0;voidTIM3_Int_Init(u16arr,u16psc)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);附钟使能TIM_TimeBaseStructure.TIM_Period=arr;/设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500msTIM_Ti

18、meBaseStructure.TIM_Prescaler=psc;/设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率TIM_TimeBaseStructure.TIM_ClockDivision=0;/设置时钟分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/TIM向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);/根据TIM_TimeBaseInitStruct中指定而参数初始化TIMx的时间案数单位TIM_ITConf

19、ig(/使能或者失能指定的TIM中断TIM3,/TIM2TIM_IT_Update,ENABLE/使能);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;/TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;/先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;/从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/IRQ通道被使能NVIC_Init(&NVIC_Ini

20、tStructure);/根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM3,ENABLE);/使能TIMx外设u8flag=0;intmain(void)u8t=0;u8shuzu20;u8keyvalue=0;u8gaibianshui=0;shorttemperature;delay_init();/延时函数初始化uart_init(9600);/用口初始化为9600NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/设置中断优先级分组2LED_Init();/初始在与LED连接而硬件接口TIM3_I

21、nt_Init(9999,7199);/10Khz的计数频率,计数到5000为500msLCD_Init();POINT_COLOR=RED;/设置字体为红色LCD_ShowString(0,50,200,16,16,"STM32test");LCD_ShowString(0,70,200,16,16,"name:zhangqiqi");/LCD_ShowString(0,90,200,16,16,"Max32CMin26C");memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Mini

22、s%2dC",temp_high,temp_low);LCD_ShowString(0,90,200,16,16,shuzu);while(DS18B20_Init()/DS18B20初始化LCD_ShowString(0,130,200,16,16,"DS18B20Error");delay_ms(200);LCD_Fill(0,130,239,130+16,WHITE);delay_ms(200);.POINT_COLOR=BLUE;/设置字体为蓝色LCD_ShowString(0,110,260,16,16,"Thetemperatureis:.C

23、now");LCD_ShowChar(0+25*8,110,',',16,0);LCD_ShowChar(0+29*8,110,'!',16,0);while(1)POINT_COLOR=BLUE;设置字体为蓝色if(t%10=0)/每100ms读取一次t=0;temperature=DS18B20_Get_Temp();if(temperature<0)(LCD_ShowChar(0+40,150,'-',16,0);/显示负号temperature=-temperature;/转为正数elseLCD_ShowChar(0+40

24、,150,'',16,0);/去掉负号memset(shuzu,0,20);sprintf(shuzu,"Thetemperatureis:%3d.%1dC",temperature/10,temperature%10);LCD_ShowString(0,110,200,16,16,shuzu);delay_ms(10);/判断温度zanshi_low=temp_low*10;zanshi_hign=temp_high*10;if(temperature<zanshi_low)|(temperature>zanshi_hign)(一一if(tem

25、perature<zanshi_low)(.flag=1;printf("chaoxiaxian");if(temperature>zanshi_hign)(.flag=2;printf("chaoshangxian");else(flag=0;LED0=1;/正常情况灯不亮LED1=1;/获取温度时间控制tt+;/浏览开关KEY_Init();delay_ms(10);keyvalue=KEY_Scan(0);if(keyvalue!=0)(if(keyvalue=3)(gaibianshui=(gaibianshui+1)%3;if(ga

26、ibianshui=1)/改变上限(if(keyvalue=2)/key1按下(temp_high+;memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Minis%2dC”,temp_high,temp_low);LCD_ShowString(0,90,200,16,16,shuzu);if(keyvalue=1)/key0按下(temp_high-;memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Minis%2dC",temp_high,temp_low);LCD_ShowString

27、(0,90,200,16,16,shuzu);if(gaibianshui=2)/改变上限(if(keyvalue=2)/key1按下(temp_low+;memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Minis%2dC",temp_high,temp_low);LCD_ShowString(0,90,200,16,16,shuzu);if(keyvalue=1)/key0按下(temp_low-;memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Minis%2dC",tem

28、p_high,temp_low);LCD_ShowString(0,90,200,16,16,shuzu);)keyvalue=0;)voidTIM3_IRQHandler(void)/TIM3中断(if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)/检查指定的TIM中断发生与否:TIM中断源(TIM_ClearITPendingBit(TIM3,TIM_IT_Update);/清除TIMx的中断待处理位:TIM中断源/温度不正常处理灯if(flag=1)(LED0=!LED0;)if(flag=2)(LED1=!LED1;)3.2.2 LED函数le

29、d.c#include"led.h"voidLED_Init(void)(.GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;/LED0->PA.8端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/推挽输出/IO口速度为50MHz/根据设定参数初始化GPI

30、O_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8);/PA.8输出高GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;推挽输出GPIO_Init(GPIOD,&GPIO_InitStructure);50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2);3.2.3 温度代码s18b20.c#include"ds18b20.h”#includ

31、e"delay.h"voidDS18B20_Rst(void)DS18B20_IO_OUT();/SETPA0OUTPUTDS18B20_DQ_OUT=0;拉低DQdelay_us(750);/拉低750usDS18B20_DQ_OUT=1;/DQ=1delay_us(15);/15US)/等待DS18B20的回应返回1:未检测到DS18B20的存在/返回0:存在u8DS18B20_Check(void)u8retry=0;DS18B20_IO_IN();/SETPA0INPUTwhile(DS18B20_DQ_IN&&retry<200)retry+

32、;delay_us(1););if(retry>=200)return1;elseretry=0;while(!DS18B20_DQ_IN&&retry<240)retry+;delay_us(1););if(retry>=240)return1;/LED1->PD.2端口配置,/推挽输出,IO口速度为/PD.2输出高return0;)/从DS18B2减取一个位/返回值:1/0u8DS18B20_Read_Bit(void)/readonebit(u8data;DS18B20_IO_OUT();/SETPA0OUTPUTDS18B20_DQ_OUT=0;

33、delay_us(2);DS18B20_DQ_OUT=1;DS18B20_IO_IN();/SETPA0INPUTdelay_us(12);if(DS18B20_DQ_IN)data=1;elsedata=0;delay_us(50);returndata;)/从DS18B2减取一个字节返回值:读到的数据u8DS18B20_Read_Byte(void)/readonebyte(u8i,j,dat;dat=0;for(i=1;i<=8;i+)(j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);)returndat;)/写一个字节到D

34、S18B20/dat:要写入的字节voidDS18B20_Write_Byte(u8dat)(u8j;u8testb;DS18B20_IO_OUT();/SETPA0OUTPUT;for(j=1;j<=8;j+)(testb=dat&0x01;dat=dat>>1;if(testb)(DS18B20_DQ_OUT=0;/Write1delay_us(2);DS18B20_DQ_OUT=1;delay_us(60);elseDS18B20_DQ_OUT=0;Write0delay_us(60);DS18B20_DQ_OUT=1;delay_us(2);/开始温度转换vo

35、idDS18B20_Start(void)/ds1820startconvertDS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);/skipromDS18B20_Write_Byte(0x44);/convert/初始化DS18B20的IO口DQ同时检测DS的存在/返回1:不存在/返回0:存在u8DS18B20_Init(void)GPIO_InitTypeDefGPIO_InitStructure;/使能PORTAL时钟/PORTA0推挽输出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,EN

36、ABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_2);/输出1DS18B20_Rst();returnDS18B20_Check();/从ds18b20得到温度值/精度:0.1C返回值:温度值(-5501250)shortDS18B2

37、0_Get_Temp(void)u8temp;u8TL,TH;shorttem;DS18B20_Start();/ds1820startconvertDS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);/skipromDS18B20_Write_Byte(0xbe);/convertTL=DS18B20_Read_Byte();/LSBTH=DS18B20_Read_Byte();/MSBif(TH>7)TH=TH;TL=TL;temp=0;/温度为负elsetemp=1;/温度为正tem=TH;/获得高八位tem<<

38、=8;tem+=TL;/获得底八位tem=(float)tem*0.625;转换if(temp)returntem;/返回温度值elsereturn-tem;3.3.4键盘代码key.c#include"key.h"#include"delay.h"/按键初始化函数/PA15和PC5设置成输入voidKEY_Init(void)GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);使能PORTA

39、,PORTC钟GPIO_PinRemapCon的(GPIO_Remap_SWJ_JTAGDisable,ENABLE);/关闭jtag,使能SWD可以用SWD模式调试GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;PA15GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;设置成上拉输入GPIO_Init(GPIOA,&GPIO_InitStructure);/初始化GPIOA15GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;PC5GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;/设置成上拉输入GPIO_Init(GPIOC,&GPIO_InitStructure);/初始化GPIOC5GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;PA0GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;/PA0设置成输入,

温馨提示

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

评论

0/150

提交评论