嵌入式系统课程设计_第1页
嵌入式系统课程设计_第2页
嵌入式系统课程设计_第3页
嵌入式系统课程设计_第4页
嵌入式系统课程设计_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

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

文档简介

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个高级定时器、

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

6、器,2个DMA控制器f共12个通道)、3个0P葭,个口(25个串Ely1个U!SB、1个CAN,另个12位ADC、1个12位DAC、1个SD1O堂口及51个通用K)口。该芯片性价比极高:MCU部分的原理图如图2.1IC因为用理图比较大;缩小下来可能育点看不清,请大冢打开开发板光盘的京理图自狂筐看所示:fr沁IH<Ua_1iE;UMDrtwiTmL-J?lIu才Hft哨钟,伍3电FAIW1.随用WOWUttTHJiKNMTwoDiiMimMortmiunTjTk11fc-'-jtfariifZZJE1川tJJll2JUAPISU_LM-HMJiIMm,BF44*nXM+auiPA&

7、#39;Prtr*虱网再1SAC;ETMr-WL-WI1ieSWkEMMHtsTHntIMifW|03=.IlC3工,UArflLiEGHl*WU4*74nitrirnb.-l."v?ckttm_l1,»WTMBk<W>aTIMfJTfkW4KMociiiEJWWbTMa«!r*»LXl»5nnKi“aAF*年ri0PAJTKLTJUra-IEH:CSIHETWEmw心kitti:ilrflrhJi,IFHljUM占TOiAt«lJXHiimi.*JTFTMX博RM皿BFlI11MBi1Ki4<MC13ISfilfw

8、口FD4i<niCfi4F14.-EUW,4ue号mg小却e!Mi.雁Mamjhid*£1,不$T%rt.Irvi”.tmb.:;/+'TX-ECsp.M'FftJliUP.*MK-DtAW1>Aj*'nWC5J;、一MaM:Ji-FilftWXriTNlniJTMiTKWmi.topiutj14ms川#W-WXT!FVIU-.b1Mx口工fwA',RAPF?T3l«fleTEH.OH_TM3tLIntTMl<H-9mHrwixrri嵬7111MCU部分立理图上图中中上部的ROOT1用于设置£TkI32的启动方式,

9、其交应启幻模式如不表所不二3。丁。BQOT1启动模式说明0X用户均存存储器用凸闪存存储器,也就是FLA5HJ目r10再玩存馅器条筑有偌器启动,用于用1下竞11ERAM启动*加启蒙,即rasiM中期式代治表2LL1BCOTO、DOOT1启幻模式表2.2DS18B20设计BSiaB2O是由DATTAS半导体公司推出的一种的血一畿赢线”接口的温度传感舞.与传统的热敏电咀等测俎元件相比*它是一种新型的体枳小、造用电压配.与量处理器接口而做的数字化温度情感罂.一线总线结椅具有陆洁且经济的特占.可使用户轻松地组成传感器网络.从而为测量系统的构建厘入全新悔电.测:温度植田为一"。1工$七1精度为土

10、0,花现场置直接以“一域总线"的觐字方式转输.大大提高了摹统的抗干扰性.它髓克授漠出被测遑度.并E可根据案际襄求通过置单的远程实现9/7位的数字值读数方式.它工作在卜,5V的电压范玉,采用去种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的报警温度存臂在EEPROM中*掉电后依然保存.其内部躇构如图二81所示!VO«<将检ROM.图:华11Dsinb/O内乳结构圈阡苓用到的臂性资深如下:1)指示灯口4。2) TFTLCD埃加3JDS18B20温度悼客器前茂苗分,在之前的实例已经介绍过了,而DS18B20混境传感器属于外部器伴(板上没有直番焊豫,但是在我们开发

11、校二是有DS18B20接口(U6)眄,直接插上口S18B20即可使用,下面,我们介绍开发校上DS18B20接口和STM32的连赛电路,如匡2821所示*DS1SB20VCC3.3rioRtk""GND图?82IDS1SR2O箜口与XTKB2的逢好电奋图从上图可以看出,贪父使目的是STM32的PA0来逢接DS】8B:O的(U6)为DQ引即,图中U6为DSlSm。的推口C省同孔圭)*将DS18B20传感器情入到这个上面,并用跳线幅短揍1820PA0.就可以通过6TM32来读取DE18B20的盘登了.遑嗪示意图加隆2&22所示:2.3 按键模块ALIENTEKMiniST

12、M32开发板总共有3个按键,其原理图如下:KEYO和KEYI用作若通按源输入,分别连接在PC5和PA13上,其中PAL3和JTD工共用了,所以,在使用KEYO车KEYI的时候,就不能使用JTAG来调试了:但是可以月SWD调史,这点在使用的时候要注意nKEY0和KEY1还和PS/2的DAT和CLK线共用:WK;P楂锌评书靠PAOCSTNFT的VKIJP引朦),它除了可以用作普特输入拉裤外,还可以用作STM4上的咦醒输入.该拉理是高电平触发的.由于P40还是DSIBH"的输入与脚,而1EB2O是有上拉电阻的,所以在使市WKUP按谑拊时候,请一定史断开PA0和DSIWBM的2.4 LCD显

13、示模块ALlfeNIKKMinjSlMi2开发桢唳自目前比顿通用的液晶显示澳块凄口,诬肓息比较有特色的薰容性接口,不仅支持ALIENTEK各种尺寸(2.4.2S.3,43.二寸等)的TFTLCD,还支持。LED显示器.同时,送接口交掂电回触壁屏以及噌客世堂群等不同类型的魁撞屏生口,其原理国如下;匿液晶金示模块犀理图TFT_LCD是一个通用的液晶模块接口*OLED是一个给OLED显示模块供电的接口,它配TFT_L灯口拼接在一起.当使用TFTLCD时,找t接到TPTJLUD上(,靠石怙)就可以,而当我们使用ALIENTEK的OLED洋坡时,则代OLED详计做申源、司时会连接到TTT_

14、LCD上靠左插)的常分管田,从而实现OLED与MCU的建接=ALIENTEKMiniSTM32的LCD接口兼容ALTENTEK各种况寸的TFTLCD怪块.包括1.4寸(320+240,电通屏寸("0*"。,电阻屏八3一5寸1祜。*32口,电阳屏八43寸(8。480,生容扉)、寸【800*48。*电春解)等,同时还兼容ALIENTEK的。96寸口LED爆块1>这些引脚与MCU的连接关系我们在这里萩不一一列出了,大冢可以从MCU的原理图上找到.2.5 LED模块ALIENTEKMmiSTM2开发板上总扶有3个LED.其原理图如下工IVII02.LS.1LE口原矍图其中PW

15、R是开发板电源指示灯,为蓝色。LED0和LED1分别接在PA8和PD2上,PA8还可以通过TIM1的通道1的PWM输出来控制DS0的亮度。为了方便大家判断,我们选择了DS0为红色,DS1为绿色的LED灯。第三章.软件设计3.1 程序流程图3.2 程序部分代码3.2.1 主函数、main.c#include"led.h"#include"delay.h"#include"sys.h"#include"usart.h"#include"lcd.h"#include"ds18b20.h&qu

16、ot;#include"key.h"#include<string.h>#include<stdio.h>#include<stdlib.h>inttemp_low=22;inttemp_high=32;intzanshi_low=0;intzanshi_hign=0;voidTIM3_Int_Init(u16arr,u16psc)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB1PeriphClockCmd(RC

17、C_APB1Periph_TIM3,ENABLE);附钟使能TIM_TimeBaseStructure.TIM_Period=arr;/设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler=psc;/设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率TIM_TimeBaseStructure.TIM_ClockDivision=0;/设置时钟分割:TDTS=Tck_timTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/

18、TIM向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);/根据TIM_TimeBaseInitStruct中指定而参数初始化TIMx的时间案数单位TIM_ITConfig(/使能或者失能指定的TIM中断TIM3,/TIM2TIM_IT_Update,ENABLE/使能);NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;/TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;/先占优先级0级NVIC_InitStructure

19、.NVIC_IRQChannelSubPriority=3;/从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/IRQ通道被使能NVIC_Init(&NVIC_InitStructure);根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM3,ENABLE);/使能TIMx外设)u8flag=0;intmain(void)u8t=0;u8shuzu20;u8keyvalue=0;u8gaibianshui=0;shorttemperature;delay_init();/延时函数初始化uar

20、t_init(9600);/用口初始化为9600NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/设置中断优先级分组2LED_Init();/初始在与LED连接而硬件接口TIM3_Int_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&quo

21、t;);/LCD_ShowString(0,90,200,16,16,"Max32CMin26C");memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Minis%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,1

22、30+16,WHITE);delay_ms(200);).POINT_COLOR=BLUE;/设置字体为蓝色LCD_ShowString(0,110,260,16,16,"Thetemperatureis:.Cnow");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(te

23、mperature<0)(LCD_ShowChar(0+40,150,'-',16,0);temperature=-temperature;elseLCD_ShowChar(0+40,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);/判断温度zansh

24、i_low=temp_low*10;zanshi_hign=temp_high*10;if(temperature<zanshi_low)|(temperature>zanshi_hign)(一一if(temperature<zanshi_low)(flag=1;printf("chaoxiaxian");if(temperature>zanshi_hign)(.flag=2;printf("chaoshangxian");else(flag=0;LED0=1;/正常情况灯不亮LED1=1;)/获取温度时间控制tt+;/浏览开关K

25、EY_Init();delay_ms(10);keyvalue=KEY_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,"Maxis%2dC,Minis%2dC”,temp_high,temp_low);LCD_ShowString(0,90,200,16,16,shuzu);)if(keyvalue=1)/key0按

26、下(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(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,

27、16,16,shuzu);if(keyvalue=1)key0按下(temp_low-;memset(shuzu,0,20);sprintf(shuzu,"Maxis%2dC,Minis%2dC",temp_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

28、(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"voidLED_Init(void)(.GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE/);使能PA,PD端口时钟/LED0->PA.8端口配置/推挽输出

29、/IO口速度为50MHz/根据设定参数初始化/PA.8输出高/LED1->PD.2端口配置,/推挽输出,IO口速度为/PD.2输出高GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_InitStructure.G

30、PIO_Pin=GPIO_Pin_2;推挽输出GPIO_Init(GPIOD,&GPIO_InitStructure);50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2);)3.2.3 温度代码s18b20.c#include"ds18b20.h"#include"delay.h"voidDS18B20_Rst(void)(DS18B20_IO_OUT();/SETPA0OUTPUTDS18B20_DQ_OUT=0;/拉低DQdelay_us(750);/拉低750usDS18B20_DQ_OUT=1;/DQ=1delay_u

31、s(15);/15US)等待DS18B20的回应/返回1:未检测到DS18B20的存在/返回0:存在u8DS18B20_Check(void)(u8retry=0;DS18B20_IO_IN();/SETPA0INPUTwhile(DS18B20_DQ_IN&&retry<200)(retry+;delay_us(1);if(retry>=200)return1;elseretry=0;while(!DS18B20_DQ_IN&&retry<240)(retry+;delay_us(1);if(retry>=240)return1;ret

32、urn0;/从DS18B20读取一个位/返回彳t:1/0u8DS18B20_Read_Bit(void)/readonebit(u8data;DS18B20_IO_OUT();/SETPA0OUTPUTDS18B20_DQ_OUT=0;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;/从DS18B20读取一个字节/返回值:读到的数据u8DS18B20_Read_Byte(void)/re

33、adonebyte(u8i,j,dat;dat=0;for(i=1;i<=8;i+)(j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);returndat;写一个字节到DS18B20/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;/Write1dela

34、y_us(2);DS18B20_DQ_OUT=1;delay_us(60);else(DS18B20_DQ_OUT=0;/Write0delay_us(60);DS18B20_DQ_OUT=1;delay_us(2);/开始温度转换voidDS18B20_Start(void)/ds1820startconvert(DS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);/skipromDS18B20_Write_Byte(0x44);/convert初始化DS18B20的IO口DQ同时检测DS的存在/返回1:不存在/返回0:存在u8DS1

35、8B20_Init(void)(GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)/使能PORTA口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;/PORTA0推挽输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPI

36、O_SetBits(GPIOA,GPIO_Pin_2);/输出1DS18B20_Rst();returnDS18B20_Check();/从ds18b20得到温度值/精度:0.1C/返回值:温度值(-5501250)shortDS18B20_Get_Temp(void)u8temp;u8TL,TH;shorttem;DS18B20_Start();/ds1820startconvertDS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);/skipromDS18B20_Write_Byte(0xbe);/convertTL=DS18B20

37、_Read_Byte();/LSBTH=DS18B20_Read_Byte();MSBif(TH>7)TH=TH;TL=TL;temp=0;/温度为负elsetemp=1;/温度为正tem=TH;/获得高八位tem<<=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(vo

38、id)GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABL曝能PORTA,PORTC时钟GPIO_PinRemapCon巾g(GPIO_Remap_SWJ_JTAGDisable,ENABLE削jtag,使能SWD,可以用SWD模式调试GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;PA15GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;设置成上拉输入GPIO_Init

39、(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设置成输入,默认下拉GPIO_Init(GPIOA,&am

温馨提示

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

评论

0/150

提交评论