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

下载本文档

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

文档简介

成绩学生课程实践能力考查题目:温度按键设定、显示、报警系统设计课程名称:嵌入式系统开发专业班级:学生学号:学生姓名:考察地点:考察时长:4小时所属院部:指导教师:2023—2023学年第2学期金陵科技学院教务2023-2023学年第2学期《嵌入式系统开发》实践能力考核班级姓名学号课程名称嵌入式系统开发课程编号授课时间2023年2月26日--2023年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是自己的名字拼音)目录:系统规定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第四章.实物效果图第五章.课程总结设计规定及方案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显示实时温度、上下限等信息。硬件设计2.2DS18B20设计2.3按键模块ALIENTEKMiniSTM32开发板总共有3个按键,其原理图如下:2.4LCD显示模块2.5LED模块其中PWR是开发板电源指示灯,为蓝色。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"#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(RCC_APB1Periph_TIM3,ENABLE);//时钟使能 TIM_TimeBaseStructure.TIM_Period=arr;//设立在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler=psc;//设立用来作为TIMx时钟频率除数的预分频值10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision=0;//设立时钟分割:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(//使能或者失能指定的TIM中断 TIM3,//TIM2 TIM_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中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM3,ENABLE);//使能TIMx外设 }u8flag=0;intmain(void){u8t=0; u8shuzu[20]; u8keyvalue=0; u8gaibianshui=0; shorttemperature;delay_init();//延时函数初始化uart_init(9600);//串口初始化为9600 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设立中断优先级分组2LED_Init();//初始化与LED连接的硬件接口 TIM3_Int_Init(9999,7199);//10Khz的计数频率,计数到5000为500ms LCD_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);}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(temperature<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); //判断温度 zanshi_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++; //浏览开关 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按下 { 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,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.2LED函数led.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; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure); //根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8输出高GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //LED1-->PD.2端口配置,推挽输出GPIO_Init(GPIOD,&GPIO_InitStructure); //推挽输出,IO口速度为50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.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=1 delay_us(15);//15US}//等待DS18B20的回应//返回1:未检测到DS18B20的存在//返回0:存在u8DS18B20_Check(void) { u8retry=0; DS18B20_IO_IN();//SETPA0INPUT while(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; return0;}//从DS18B20读取一个位//返回值:1/0u8DS18B20_Read_Bit(void) //readonebit{u8data; DS18B20_IO_OUT();//SETPA0OUTPUTDS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SETPA0INPUT delay_us(12); if(DS18B20_DQ_IN)data=1;elsedata=0; delay_us(50);returndata;}//从DS18B20读取一个字节//返回值:读到的数据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;}//写一个字节到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;//Write1delay_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:存在 u8DS18B20_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); GPIO_SetBits(GPIOA,GPIO_Pin_2);//输出1 DS18B20_Rst(); returnDS18B20_Check();}//从ds18b20得到温度值//精度:0.1C//返回值:温度值(-550~1250)shortDS18B20_Get_Temp(void){u8temp;u8TL,TH; shorttem;DS18B20_Start();//ds1820startconvertDS18B20_Rst();DS18B20_Check(); DS18B20_Write_Byte(0xcc);//skipromDS18B20_Write_Byte(0xbe);//convert TL=DS18B20_Read_Byte();//LSBTH=DS18B20_Read_Byte();//MSB if(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(void){ GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//PA15 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设立成上拉输入 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA15 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//PC5 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设立成上拉输入 GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIOC5 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PA0 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//PA0设立成输入,默认下拉 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.0 }//按键解决函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//返回值://0,没有任何

温馨提示

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

评论

0/150

提交评论