我想做超声波测距,用89c51系列的很简单,再这个系列的单片机太慢,现在基本上都
用stc15系列了吧,我现在都是stc15系列了,价格便宜,速度快。电压还是宽电压,在3.3v~5v之间
都可以,主要是速度快了,就可以处理更多的程序了。
好了,不说费话了,
其实用过stc15系列做超声波测距,就知道有个问题就是,单片机的速度快了,那么定时器
跑一圈的时间就少了,像stc15t系列跑一圈才 1除以12乘以65536,计算公式
1/12*65536=5.461ms左右。声音的速度大概为 us/58cm, 5461/58=94.2cm左右,发现计时器不够用了,
这个时候就得想办法了,
一般新手就不知道怎么办了,
其它很简单,定一个全局变量,记录跑了几圈,然后乘以65536,
具体的程序可以了看下面我发的 马伟的教程
上面有详细介绍。这里我就不多说,
那个教程写的很清楚。
写教程太花时间了。
教程:
本教程用的硬件清单:
单片机:stc12c5a60s2、stc15w408as、stc15f2k60等
超声波模块:HC-SR04
超声波测距的特点就是便宜,缺点就不说了,主要说说超声波器距离模块的用法原理吧,模块图如下:
好了,超声波模块的简介就这么多了,话不多说,直接上程序
源程序:
- #include "STC12C5A.H"
-
- typedef unsigned char u8;
- typedef unsigned int u16;
-
- sbit Trig = P2^1;
- sbit Echo = P2^0;
-
- //声明函数
- void getDistance();//获取距离
- void Timer0Init();//初始化定时器0
- void UartInit();//初始化串口
- void SendData(u8 data_buf); //发送数据到串口
- void DelayXms(u16 n); //延时N ms
-
- //定义全局变量
- u8 cnt=0; //定时器0中断次数
- u16 time; //计时
- u16 distance; //距离
-
-
- void main(){
- EA = 1;//开启总中断
-
- UartInit();//初始化串口
- Timer0Init();//初始化定时器0
-
- while(1){
- getDistance(); //获取距离
- DelayXms(800); //延时
- }
-
- }
-
- //获取距离
- void getDistance()
- {
- u8 i,j=60;
- u8 str[] = "D:-.--M";
-
- TH0 = TL0 = cnt = 0; //初始化定时器0
- Trig = 1; //拉高超声波模块触发IO
- while(j--); // 延时20us
- Trig = 0; //拉低超声波模块触发IO
- while(!Echo);//等待超声波模块输出IO拉高
- TR0 = 1; //开启定时器计时
- while(Echo); //等待超声波模块输出IO拉低
- TR0 = 0; //关闭定时器计时
-
- //判断是否超出模块最大测距 4m
- if(cnt < 5){
- //计算出时间
- time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;
- //计算出距离 340m/s 或 us/58cm
- distance = time / 58 + 0.5;
- }else
- distance = 0;
-
- str[2] = (distance % 1000 / 100) + '0';
- str[4] = (distance % 100 / 10) + '0';
- str[5] = (distance % 10) + '0';
- //从串口发出,也可以用显示器显示,自己接显示驱动就可以了
- for(i=0;i<7;i++){
- SendData(str[i]);
- }
- SendData('');
- //复位定时器
- cnt = 0;
- TH0 = TL0 = 0;
- }
- //定时器0寄存器初始化
- void Timer0Init(void) //100微秒@12.000MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x50; //设置定时初值
- TH0 = 0xFB; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 0; //定时器0开始计时
- ET0 = 1; //开启定时器中断
- }
-
- void T0() interrupt 1
- {
- cnt++;
- }
- //串口初始化定时器1
- void UartInit(void) //4800bps@12.000MHz
- {
- SCON=0x52;
- AUXR &= 0xFE;
- TMOD=0x20;
- TH1=TL1=0xf3;
- PCON=0x80;
- TR1=1;
- }
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
超声波测距程序.rar
(1.25 KB, 下载次数: 505)
|