找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7820|回复: 3
打印 上一主题 下一主题
收起左侧

测距模块初级2-用了51单片机内部的一个计数器控制两个超声波测距模块

[复制链接]
跳转到指定楼层
楼主
ID:76556 发表于 2015-4-10 02:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、用51单片机内部的一个定时器/计数器控制两个测距模块(同样的程序写法也可以控制三个、四个,很多个)
2,、没有写入分析测距模块反馈到51MCU的数据的程序,这样程序谈不上智能!
3、而且本人认为程序还是不够简化。
重要提示:

        本人在测试时发现如果在震动,振幅大的时候模块反馈的数据是错的!在请教老师后我知道了这种干扰的的产生是因为导线在摆动时让电荷发生改变,使触发信号线与信号接收线的电压发生改变,因为51单片机属于数字芯片,信号的格式只有高电平与低电平两种,所以只要当电平发生变化时单片机就会接受到错误信号










#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num1,num2,num3,num4,led0,led1,aa,bb;
sbit tr=P1^0;
sbit ec=P1^1;
sbit lcd0=P2^0;
sbit lcd1=P2^1;
sbit tr1=P1^2;
sbit ec1=P1^3;
sbit lcd2=P2^2;
sbit lcd3=P2^3;
void timer(uint x)
{
uint q,w;
for(q=x;q>0;q--)
for(w=110;w>0;w--);
}
void init()
{
ec=0;
tr=0;
ec1=0;
tr1=0;
num1=0;
num2=0;
num3=0;
num4=0;
led0=1;
led1=1;
}
void trk()
{
tr=1;
timer(10);
tr=0;
num3=1;
}
void trk1()
{
tr1=1;
timer(10);
tr1=0;
num3=1;
}
void eck()
{
if(ec==1)
        {
        TR0=1;
        num2=1;
        }
if(ec==0&num2==1)
        {
        TR0=0;
        if(num1<30)
                {
                led0=0;
                num3=0;
                }
        if(num1>30)
                {
                led1=0;
                num3=0;
                }
        }
}
void eck1()
{
if(ec1==1)
        {
        TR0=1;
        num2=1;
        }
if(ec1==0&num2==1)
        {
        TR0=0;
        if(num4<30)
                {
                led0=0;
                num3=0;
                }
        if(num4>30)
                {
                led1=0;
                num3=0;
                }
        }
}
void open_time()
{
TMOD=0x01;
TH0=(65536-1)/256;
TL0=(65536-1)%256;
EA=1;
ET0=1;
TR0=0;
}
void dongzuo()
{
if(led0==0)
        {
        lcd0=0;
        lcd1=1;
        bb=1;
        aa=0;
        }
if(led1==0)
        {
        lcd1=0;
        lcd0=1;
        bb=1;
        aa=0;
        }
}
void dongzuo1()
{
if(led0==0)
        {
        lcd2=0;
        lcd3=1;
        aa=1;
        bb=0;
        }
if(led1==0)
        {
        lcd2=1;
        lcd3=0;
        aa=1;
        bb=0;
        }
}

void main()
{
aa=1;
bb=0;
while(1)
        {
        while(aa==1)
        {
                bb=0;
                init();
                open_time();
                trk();
                while(num3==1)
                        {
                        eck();
                        }

                dongzuo();
        }
        while(bb==1)
                {
                aa=0;
                init();
                open_time();
                trk1();
                while(num3==1)
                        {
                        eck1();
                        }
                dongzuo1();
                }
        }
}
void time() interrupt 1
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
num1++;
num4++;
}  




设计者:薛羽豪


评分

参与人数 1黑币 +5 收起 理由
神奇国度 + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:74643 发表于 2015-5-13 21:11 | 只看该作者
正在做这个
回复

使用道具 举报

板凳
ID:91831 发表于 2015-10-7 20:10 | 只看该作者
lz这个会不会导致程序一直在执行定时器一中断里的内容啊,感觉程序会一直进入定时器中断没法处理别的内容了
回复

使用道具 举报

地板
ID:93295 发表于 2016-3-15 20:40 | 只看该作者
请问你的程序有卡死的情况吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表