|
基于stc89c52单片机,采用HC-SR04模块利用声波反弹算出距离。- #include "reg52.h"
- //距离小于10cm,D5亮,D6灭,反之相反现象
- sbit D5 = P2^0;
- sbit D6 = P2^1;
- sbit Trig = P1^5;
- sbit Echo = P1^6;
- void Delay10us() //@11.0592MHz
- {
- unsigned char i;
- i = 2;
- while (--i);
- }
- void Time0Init()
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01;
- TH0 = 0;
- TL0 = 0;
- //设置定时器0工作模式1,初始值设定0开始数数,不着急启动定时器
- }
- /*
- 十进制2左移1位,变成20。相当于乘以10
- 二禁止1左移1位,变成10(2)。相当于乘以2,左移8位,乘以2的8次方=256;*/
- void startHC()
- {
- Trig = 0;
- Trig = 1;
- Delay10us();
- Trig = 0;
- }
- void main()
- {
- double time;
- double dis;
-
- Time0Init();
-
- while(1){
- //1. Trig ,给Trig端口至少10us的高电平
- startHC();
- //2. echo由低电平跳转到高电平,表示开始发送波
- while(Echo == 0);
- //波发出去的那一下,开始启动定时器
- TR0 = 1;
- //3. 由高电平跳转回低电平,表示波回来了
- while(Echo == 1);
- //波回来的那一下,我们开始停止定时器
- TR0 = 0;
- //4. 计算出中间经过多少时间
- time = (TH0 * 256 + TL0)*1.085;//us为单位
- //5. 距离 = 速度 (340m/s)* 时间/2
- dis = time * 0.017;
- if(dis < 10){
- D5 = 0;
- D6 = 1;
- }else{
- D5 = 1;
- D6 = 0;
- }
- //定时器数据清零,以便下一次测距
- TH0 = 0;
- TL0 = 0;
- }
- }
复制代码
|
|