一、概述
这是本学期的一次小作业,用的学校的老旧的S3C2410试验箱,外接一个超声波模块,实现测距。对于这个题目,只要学过一些单片机方面的知识,那么这应该是一个很简单的任务,因为操作系统不是必须的,所以就当单片机用就很简单了。既然很简单,那为什么我还要记录一下呢,因为还是会有人觉得不太简单的,同时也因为不想码代码了,写一下这个记录一下,说不定还能帮到别人。
二、超声波模块
超声波模块就很常见了,使用的是HC-SR04,四个引脚,VCC,TRIG,ECHO,GND。记得要使用5V供电,一般的超声波模块都是5V供电,如果使用3.3V供电,TRIG引脚的电平信号会不正常,开始没注意使用3.3V,结果怎么也不正常,后来换成5V就好了,要注意。
这里放两张图,网上扒的,该有的还是要有。
三、接线引脚
超声波模块引脚对应的S3C2410的引脚接线。
VCC | +5V |
---|---|
TRIG | PB1 |
ECHO | PG2 |
GND | GND |
四、程序代码
这里贴代码。
UINT8T txt[100];
float distance;
int main()
{
sys_init(); //系统初始化
timer_init(); //定时器初始化
lcd_init_app(); //液晶屏初始化
rGPBCON |=(0x01<<2); //初始化PB1引脚为输出 TRIG
rGPBUP |=(0x01<<1); //不使能上拉
rGPGCON &=~(0x00<<4); //初始化PG2引脚为输入 ECHO
rGPGUP &=~(0x00<<2); //使能上拉
Glib_FilledRectangle(330,240,330+160,240+20,WHITE); //液晶屏局部清屏
while(1)
{
rGPBDAT |=(0x01<<1); //输出拉高
delay(150); //短暂延时发送一定时间的高电平
rGPBDAT &=~((0x01<<1)); //输出拉低
while((rGPGDAT&0x04)==0); //等待引脚抬高 PG2
rWTCNT = 0xffff; //重置计数器值 向下计数模式
rWTCON |=(0x01<<5); //开启定时器
while((rGPGDAT&0x04)!=0); //等待引脚拉低 PG2
rWTCON &=~(0x01<<5); //关闭定时器
distance = ( (float)(0xffff-rWTCNT)*340*100/2/1000000 ); //距离
//因为是自动重载向下计数模式,并且重载值为0XFFFF,所以需要用0XFFFF减去计数值
//声速为340m/s,计数频率为1M,所以需要除2再乘100再除1000000将单位转换为cm
sprintf((char *)txt,"Distance:%.3fcm ",distance);
uart_printf("%.3fcm",distance); //串口发送
Lcd_DspAscII8x16(330+12,240+2,BLACK,txt); //液晶屏显示
delay(1000); //延时
}
}
就这些了,里面有一些液晶屏的代码,因为试验箱上是带液晶屏的,所以在液晶屏上显示出了距离,也通过串口发送了,串口的初始化在sys_init();这个子函数里,使用的串口1。
代码中有两处while(1)等待程序,是对照着时序图写的,先等待ECHO引脚抬高,之后开始计时,等待引脚拉低后停止计时器,计算距离。只是计算出了理论上的距离值,并没有进行滤波或拟合等操作,因为对于这次那啥来说没什么必要。
使用的是看门狗定时器,当做普通计时器用了,为什么使用看门狗定时器呢,因为资料例程使用的看门狗定时器,稍作修改就可以使用了,就不用再查手册了,哈哈。定时器不使用中断,直接开启计数读寄存器WTCNT的计数值。这里要注意是向下计数模式,即WTCNT的值是递减的,初始值设置为了0xffff,所以程序中使用0xffff减去WTCNT得到计数值,再计算得出距离值。
S3C2410的GPIO还是需要看一下手册,有的只能输出,这里放两个寄存器配置图,GPIOB的GPBCON(第一个图)和GPBUP寄存器。
GPIO功能由两个位来配置功能,所以在上面程序中会看到是左移了两位。下面会上传S3C2410的寄存器手册和代码。
五、总结
就这些东西了,没什么难的东西,能用就行。因为是在那啥期间做的,还是帮别的组做的,所以就更随意了,能用就行。
代码是在资料的例程中的修改、添加实现的,能用就行。有液晶屏的,没有或者不需要可以屏蔽掉,使用串口观察。
计算的距离值没有做任何滤波操作,就是计算出一个理论值,能用就行。
建立S3C2410工程需要安装对应的keil5支撑包,下面会上传一下。
有的地方说的不是很清楚比如定时器配置部分,到时候可以下载一下工程自己看一下。
写这个主要是为了记录一下,其中尝试时还是遇到一些问题的,弄好了就记录分享一下,助人助己。当然只是实现了最基本的。
以上纯属个人经验,并且个人能力也有限,可能出现差错,如有问题请指正,我就改。
下面上传一下寄存器手册、工程代码和keil支撑包,不需要积分就可以下载,下载链接:
https://download.youkuaiyun.com/download/wojueburenshu/33182546