学生课程实践能力考查题目:温度按键设定、显示、报警系统设计课程名称:嵌入式系统开发专业班级:学生学号:学生姓名:考查地点:考查时长:4小时所属院部:指导教师:2017—2018学年第2学期金陵科技学院教务成绩12017-2018学年第2学期《嵌入式系统开发》实践能力考核班级姓名学号课程名称嵌入式系统开发课程编号0806504151授课时间2018年2月26日--2018年5月4日周学时4学分2简要评语(从完成情况、是否具备独立开发能力、是否独立完成、编程熟练程度等角度评价。)任课教师签名:日期:温度按键设定、显示、报警系统设计要求:1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。2、通过按键可以设置环境温度的上限和下限,WK_UP键按下调节上限,再按下调节下限,再按下调节上限……KEY1按下加1;KEY0按下减1,根据上限和下限判断当前温度有没有超出范围。3、当温度超过上限,LED1隔1秒亮一次。超过下限,LED2隔1秒亮一次。(也可自定义报警方式)4、串口波特率一律用9600bps。液晶显示的信息:STM32testname:xxxxxxxxxMaximumis32C,Minimumis26CThetemperatureis29C,now!(xxxxx是自己的名字拼音)2目录:第一章.系统要求1.1设计要求1.2设计方案第二章.硬件设计2.1开发板原理图2.2DS18B20模块2.3按键模块2.4LCD显示模块2.5LED模块第三章.软件设计3.1程序流程图3.2程序部分代码3.2.1主函数、main.c3.2.2LED函数led.c3.2.3温度代码s18b20.c3.2.4键盘代码key.c第四章.实物效果图第五章.课程总结3第一章.设计要求及方案1.1设计要求1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。2、通过按键可以设置环境温度的上限和下限,WK_UP键按下调节上限,再按下调节下限,再按下调节上限……KEY1按下加1;KEY0按下减1,根据上限和下限判断当前温度有没有超出范围。3、当温度超过上限,LED1隔1秒亮一次。超过下限,LED2隔1秒亮一次。(也可自定义报警方式)4、串口波特率一律用9600bps。液晶显示的信息:STM32testname:xxxxxxxxxMaximumis32C,Minimumis26CThetemperatureis29C,now!(xxxxx是自己的名字拼音)1.2设计方案本次课程设计的要求是使用STM32F103设计一个温度测控系统,ALIENTEKMiniSTM32V3版开发板选择的是STM32F103RCT6作为MCU,它拥有的资源包括:48KBSRAM、256KBFLASH、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的闪烁进行报警。4.应用LCD显示实时温度、上下限等信息。4第二章.硬件设计2.2DS18B20设计52.3按键模块ALIENTEKMiniSTM32开发板总共有3个按键,其原理图如下:62.4LCD显示模块2.5LED模块7其中PWR是开发板电源指示灯,为蓝色。LED0和LED1分别接在PA8和PD2上,PA8还可以通过TIM1的通道1的PWM输出来控制DS0的亮度。为了方便大家判断,我们选择了DS0为红色,DS1为绿色的LED灯。第三章.软件设计3.1程序流程图温度显示及报警模块按键设定模块83.2程序部分代码3.2.1主函数、main.c#includeled.h#includedelay.h#includesys.h#includeusart.h#includelcd.h#includeds18b20.h#includekey.h#includestring.h#includestdio.h#includestdlib.hinttemp_low=22;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_TimeBaseStructure.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_ITConfig(//使能或者失能指定的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_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设9NVIC寄存器TIM_Cmd(TIM3,ENABLE);//使能TIMx外设}u8flag=0;intmain(void){u8t=0;u8shuzu[20];u8keyvalue=0;u8gaibianshui=0;shorttemperature;delay_init();//延时函数初始化uart_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);//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,130+16,WHITE);delay_ms(200);}10POINT_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(temperature0){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);//判断温度zanshi_low=temp_low*10;zanshi_hign=temp_high*10;if((temperaturezanshi_low)||(temperaturezanshi_hign)){if(temperaturezanshi_low){flag=1;printf(chaoxiaxian);}if(temperaturezanshi_hign){flag=2;printf(chaoshangxian);11}}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(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按下{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按下12{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,temp_high,temp_low);LCD_ShowString(0