嵌入式系统课程设计报告书.docx
《嵌入式系统课程设计报告书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计报告书.docx(25页珍藏版)》请在冰豆网上搜索。
嵌入式系统课程设计报告书
成绩
学生课程实践能力考查
题目:
温度按键设定、显示、报警系统设计
课程名称:
嵌入式系统开发专业班级:
学生学号:
学生姓名:
考查地点:
考查时长:
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=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;//Write0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us
(2);
}
}
}
//开始温度转换
voidDS18B20_Start(void)//ds1820startconvert
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);//skiprom
DS18B20_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