嵌入式课程设计(Proteus+STM32CubeMX+Keil)——基于Proteus开发的农场环境监测系统
这次分享当年的嵌入式课程设计,本次课程设计基于Proteus开发农场环境监测系统,采用Proteus、STM32CubeMX、Keil嵌入式开发框架,通过Proteus搭建硬件仿真电路,模拟现实世界中的农场环境监测。
话不多说,先看最终的实现效果。

界面划分为几个区域:温度显示器、状态显示器、温度传感器、报警系统、温控电机、控制台等,界面分区较为清晰。
STM32F103R6中用到的主要引脚如下:PA0~PA7作为LCD12864的数据线输入,其使能等信号端分布在PC5~PC9。PB0~PB7作为LM016L的数据线输入,其使能等信号端为PB10~PB12。PC0~PC4为控制台的输入信号端,PA11~PA14为模拟家畜移动的按键输入端。
1 主要功能
本次课程设计的内容主要是设计一款基于家畜养殖场的环境监测系统,用Proteus硬件仿真的方式,模拟显示世界中用到的硬件设备。基于上述嵌入式开发背景,主要实现以下几个功能:
1 显示交互信息
2 获取农场实时温度
3 报警系统与异常情况处理系统
4 家畜活动情况模拟监测
2 设计方案
2.1 主要任务
针对项目中所描述的功能,在Proteus仿真设计中作了相应的抽象,具体任务如下表所示:
|
任务名称 |
任务内容 |
|
温度采集 |
读取DS18B20的数据,并将其在LM016L液晶显示器上显示 |
|
报警系统 |
实现对蜂鸣器以及LED灯的控制 |
|
温控系统 |
实现对模拟温控电机的控制 |
|
家畜活动监测与交互信息显示 |
实现LCD12864的输出控制 |
|
控制台 |
对系统中所有按键进行统一控制 |
2.2 STM32CubeMx相关配置
根据Proteus电路原理图,STM32CubeMX的芯片引脚图如下图所示:

其中PA11~PA14、PC0~PC4较特殊,其GPIO设置为External Interrupt Mode with Falling edge trigger detection即下降沿触发外部中断,Pull-up上拉模式。如下图所示:


2.3 功能模块实现
DS18B20获取温度
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // DS18B20开始转化
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc); // 跳过ROM
DS18B20_Write_Byte(0xbe); // 读温度值
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0; //温度为负
}else temp=1; //温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL; //获得底八位
tem=(double)tem*0.625; //转换
if(temp)return tem; //返回温度值
else return -tem;
}
以上是DS18B20的部分驱动代码,根据其资料手册查询对应的引脚功能,其余驱动代码部分没有全部罗列,大致原理类似。下面介绍主函数部分的代码设计:
main.c
LCD1602_Init(); //初始化LM016L
DS18B20_Init(); //初始化DS18B20
LCD12864_Init(); //初始化LCD12864
while (1){
switch(state) //state初值为0
{
case 0: display_temperature(0,0);
//获取温度值并在LCD1602上显示,当前温度值与阈值进行比较并报警
if(key==KEY2_PRESS) //key=3,设置温度,转state1
{
ClearScreen(2);
LCD12864显示相关状态信息;
key=0;
LCD1602_WriteCmd(0x01); //清屏
state= 1;
}
当key的值为其他外部中断时,作类似的跳转state操纵;
case 1:
LCD1602_ShowStr(0,0,"SetHighTemp:",12);
LCD1602_ShowStr(0,1,"HTemp =",7);
LCD1602_ShowNum(8,1,Hight_Temp_Value/100);
LCD1602_ShowNum(9,1,Hight_Temp_Value%100/10);
if(key==KEY0_PRESS)
{
ClearScreen(2);
LCD12864显示相关状态信息;
key=0;
Hight_Temp_Value=Hight_Temp_Value+10;
if(Hight_Temp_Value>1000)
Hight_Temp_Value=0;
}
else if(key==KEY1_PRESS)
{
ClearScreen(2);
LCD12864显示相关状态信息;
key=0;
Hight_Temp_Value=Hight_Temp_Value-10;
if(Hight_Temp_Value<1)
Hight_Temp_Value=0;
}
else if(key==KEY2_PRESS)
{
ClearScreen(2);
LCD12864显示相关状态信息;
key=0;
LCD1602_WriteCmd(0x01); //清屏
state= 2;
}
break;
case 2:
LCD1602_ShowStr(0,0,"SetLowTemp:",11);
LCD1602_ShowStr(0,1,"LTemp =",7);
LCD1602_ShowNum(8,1,Low_Temp_Value/100);
LCD1602_ShowNum(9,1,Low_Temp_Value%100/10);
以下程序与case1的情况类似;
case 3:
//每按一下,改变以下升温电机的状态
if(i) {
HAL_GPIO_WritePin(Heat_OUT_GPIO_Port,Heat_OUT_Pin, GPIO_PIN_SET);
ClearScreen(2);
LCD12864显示相关状态信息;
}
else {
HAL_GPIO_WritePin(Heat_OUT_GPIO_Port,Heat_OUT_Pin, GPIO_PIN_RESET);
ClearScreen(2);
LCD12864显示相关状态信息;
state= 0;
break;
}
case 4:
//每按一下,改变以下降温风机的状态
与上述升温风机的代码类似;
case 5:
//模拟家畜向上移动
ClearScreen(2);
LCD12864显示相关状态信息;
key=0;
if(y_pos>2)
{
Display_Hanzi(x_pos,y_pos,clear_boy);
//清除原来的位置
y_pos--;
}
if(y_pos<3)
y_pos=2;
Display_Hanzi(x_pos,y_pos,animal);
state=0;
break;
case 6:
//模拟家畜向下移动,与case5类似
case 7:
//模拟家畜向左移动,与case5类似
case 8:
//模拟家畜向下移动,与case5类似
}
}
}
3 功能演示
3.1 温度读取

3.2 报警系统

3.3 家畜活动模拟

以上是课程设计中的一些主要内容,计科专业,对嵌入式的一些东西了解不多,可以当一个参考或启发。如果有小盆友需要再具体一些的教程,可以之后补上。后会有期!
更多推荐



所有评论(0)