所用编辑软件为IAR,无仿真,仅用于口袋实验。可实现功能如下:
1、用超声波模块测量某个障碍物的距离;
2、可通过按键修改上下限报警值;
3、 在OLED屏上实时显示所测障碍物距离、已设定的距离测量的上下限报警值;
4、当超声波模块测的距离大于设定的上限值时,蜂鸣器以0.5Hz的频率报警。当超声波模块测得的距离小于设定的下限值时,蜂鸣器持续报警;
5、当超声波模块测得的距离处于设定的上限值和下限值之间时,蜂鸣器停止鸣叫,LED灯模块按D1~D8的顺序,两个两个地循环亮起;
文章分为三部分
一、手柄板原理图部分讲解
1.原理图超声波模块及实物模块的安装。
二、基于IAR的编辑,完成上述功能的代码讲解
1.代码设计及代码逻辑讲解
2.部分代码展示讲解(结合原理图和手柄板实物)
三、注意事项
一、手柄板原理图部分讲解
1.原理图超声波模块及实物模块的安装。
二、基于IAR的编辑,完成上述功能的代码讲解
1.代码设计及代码逻辑讲解
根据要求可以判断需要用到的元器件有:按钮、OLED屏、超声波模块、蜂鸣器、LED灯。
接下来就根据他们的关系画简易的关系图:
根据我们的逻辑进行编程。
1.先初始化我们已知所需要的引脚:四个按钮引脚,八个LED灯引脚,蜂鸣器引脚,超声波模块引脚。
2.编写函数led8()使其实现LED灯模块按D1~D8的顺序,两个两个地循环亮起。
void led8()
{
Port_Init();
GPIO_Init(P5,6,GPO,0);
GPIO_Set(P6,0,0);
delay_ms(100);
GPIO_Set(P6,0,1);
GPIO_Set(P4,0,0);
GPIO_Set(P4,1,0);
delay_ms(100);
GPIO_Set(P4,0,1);
GPIO_Set(P4,1,1);
GPIO_Set(P4,2,0);
GPIO_Set(P4,3,0);
delay_ms(100);
GPIO_Set(P4,2,1);
GPIO_Set(P4,3,1);
GPIO_Set(P4,4,0);
GPIO_Set(P4,5,0);
delay_ms(100);
GPIO_Set(P4,4,1);
GPIO_Set(P4,5,1);
GPIO_Set(P4,6,0);
GPIO_Set(P4,7,0);
delay_ms(100);
GPIO_Set(P4,6,1);
GPIO_Set(P4,7,1);
Port_Init();
}
3.编写距离转化函数ex_num()
void ex_num() //距离转化函数
{
ex_max = (int)(setmax * 100); //先把cm为单位的最大距离放大100倍
dis_max[0] = ex_max/10000;
dis_max[1] = ex_max/1000%10;
dis_max[2] = ex_max/100%10;
dis_max[3] = ex_max/10%10;
dis_max[4] = ex_max%10;
ex_min = (int)(setmin * 100); //先把cm为单位的最小距离放大100倍
dis_min[0] = ex_min/10000;
dis_min[1] = ex_min/1000%10;
dis_min[2] = ex_min/100%10;
dis_min[3] = ex_min/10%10;
dis_min[4] = ex_min%10;
}
4.在User_IdleTask()函数中编写按钮代码(此处只展示其中一个按钮的代码)
if(GPIO_get(P1,6)!=1)
{
setmin++;
ex_num();
OLED_DisplaySTR(0, 0, "setmin:", 8, 0);
OLED_DisplayDEC(0, 1, dis_min[0], 8, 0);
OLED_DisplayDEC(1, 1, dis_min[1], 8, 0);
OLED_DisplayDEC(2, 1, dis_min[2], 8, 0);
OLED_DisplaySTR(3, 1, ".", 8, 0);
OLED_DisplayDEC(4, 1, dis_min[3], 8, 0);
OLED_DisplayDEC(5, 1, dis_min[4], 8, 0);
OLED_DisplaySTR(6, 1, "cm", 8, 0);
OLED_DisplaySTR(0, 2, "setmax:", 8, 0);
OLED_DisplayDEC(0, 3, dis_max[0], 8, 0);
OLED_DisplayDEC(1, 3, dis_max[1], 8, 0);
OLED_DisplayDEC(2, 3, dis_max[2], 8, 0);
OLED_DisplaySTR(3, 3, ".", 8, 0);
OLED_DisplayDEC(4, 3, dis_max[3], 8, 0);
OLED_DisplayDEC(5, 3, dis_max[4], 8, 0);
OLED_DisplaySTR(6, 3, "cm", 8, 0);
OLED_Update();//oled更新显示
}
5.在User_IdleTask()函数中编写判断DISTANT的范围代码,即大于setmax时蜂鸣器以0.5Hz的频率报警;小于setmin时蜂鸣器持续报警;处于上下限之间时LED灯模块按D1~D8的顺序,两个两个地循环亮起。(此处代码不展示,重点是if函数的运用)
6.完成编程开始调试,先测试有无代码编写错误,然后将按钮代码注释掉,标注断点,点击Debug without Downloading开始逐行或逐过程调试,检查代码是否符合所需功能。然后连接单片机进行单片机仿真,测试功能。到此试验结束。
三、注意事项
1.编写代码要有耐心,当出现报错是多数情况。
2.启用某个元器件时,先检查是否初始化过该引脚。
3.P14和超声波模块启动口冲突,可以换成P11或者P12。
4.单片机仿真时,必须连接外部电源,不然超声波模块可能会不工作。
注:本篇文章仅用于学习分享