嵌入式系统课程设计报告.doc

上传人:聆听****声音 文档编号:14477941 上传时间:2023-06-23 格式:DOC 页数:26 大小:1,011KB
下载 相关 举报
嵌入式系统课程设计报告.doc_第1页
第1页 / 共26页
嵌入式系统课程设计报告.doc_第2页
第2页 / 共26页
嵌入式系统课程设计报告.doc_第3页
第3页 / 共26页
嵌入式系统课程设计报告.doc_第4页
第4页 / 共26页
嵌入式系统课程设计报告.doc_第5页
第5页 / 共26页
嵌入式系统课程设计报告.doc_第6页
第6页 / 共26页
嵌入式系统课程设计报告.doc_第7页
第7页 / 共26页
嵌入式系统课程设计报告.doc_第8页
第8页 / 共26页
嵌入式系统课程设计报告.doc_第9页
第9页 / 共26页
嵌入式系统课程设计报告.doc_第10页
第10页 / 共26页
嵌入式系统课程设计报告.doc_第11页
第11页 / 共26页
嵌入式系统课程设计报告.doc_第12页
第12页 / 共26页
嵌入式系统课程设计报告.doc_第13页
第13页 / 共26页
嵌入式系统课程设计报告.doc_第14页
第14页 / 共26页
嵌入式系统课程设计报告.doc_第15页
第15页 / 共26页
嵌入式系统课程设计报告.doc_第16页
第16页 / 共26页
嵌入式系统课程设计报告.doc_第17页
第17页 / 共26页
嵌入式系统课程设计报告.doc_第18页
第18页 / 共26页
嵌入式系统课程设计报告.doc_第19页
第19页 / 共26页
嵌入式系统课程设计报告.doc_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统课程设计报告.doc

《嵌入式系统课程设计报告.doc》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计报告.doc(26页珍藏版)》请在冰点文库上搜索。

嵌入式系统课程设计报告.doc

.

成绩

学生课程实践能力考查

题目:

温度按键设定、显示、报警系统设计

课程名称:

嵌入式系统开发专业班级:

学生学号:

学生姓名:

考查地点:

考查时长:

4小时

所属院部:

指导教师:

2017—2018学年第2学期

金陵科技学院教务

.

2017-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。

液晶显示的信息:

STM32test

name:

xxxxxxxxx

Maximumis32C,Minimumis26C

Thetemperatureis29C,now!

(xxxxx是自己的名字拼音)

目录:

第一章.系统要求

1.1设计要求

1.2设计方案

第二章.硬件设计

2.1开发板原理图

2.2DS18B20模块

2.3按键模块

2.4LCD显示模块

2.5LED模块

第三章.软件设计

3.1程序流程图

3.2程序部分代码

3.2.1主函数、main.c

3.2.2LED函数led.c

3.2.3温度代码s18b20.c

3.2.4键盘代码key.c

第四章.实物效果图

第五章.课程总结

第一章.设计要求及方案

1.1设计要求

1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。

2、通过按键可以设置环境温度的上限和下限,

WK_UP键按下调节上限,再按下调节下限,再按下调节上限……

KEY1按下加1;

KEY0按下减1,

根据上限和下限判断当前温度有没有超出范围。

3、当温度超过上限,LED1隔1秒亮一次。

超过下限,LED2隔1秒亮一次。

(也可自定义报警方式)

4、串口波特率一律用9600bps。

液晶显示的信息:

STM32test

name:

xxxxxxxxx

Maximumis32C,Minimumis26C

Thetemperatureis29C,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

#include

#include

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);//设置中断优先级分组2

LED_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;//转为正数

}

else

LCD_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_hign))

{

if(temperature

{

flag=1;

printf("chaoxiaxian");

}

if(temperature>zanshi_hign)

{

flag=2;

printf("chaoshangxian");

}

}

else

{

flag=0;

LED0=1;//正常情况灯不亮

LED1=1;

}

//获取温度时间控制t

t++;

//浏览开关

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口速度为50MHz

GPIO_Init(GPIOA,&GPIO_InitStructure); //根据设定参数初始化GPIOA.8

GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8输出高

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //LED1-->PD.2端口配置,推挽输出

GPIO_Init(GPIOD,&GPIO_InitStructure); //推挽输出,IO口速度为50MHz

GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2输出高

}

3.2.3温度代码s18b20.c

#include"ds18b20.h"

#include"delay.h"

voidDS18B20_Rst(void)

{

DS18B20_IO_OUT();//SETPA0OUTPUT

DS18B20_DQ_OUT=0;//拉低DQ

delay_us(750);//拉低750us

DS18B20_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/0

u8DS18B20_Read_Bit(void) //readonebit

{

u8data;

DS18B20_IO_OUT();//SETPA0OUTPUT

DS18B20_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;//Write1

delay_us

(2);

DS18B20_DQ_OUT=

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

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2