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++;
}
设计者:薛羽豪
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++;
}
设计者:薛羽豪
评分
相关帖子
- • 关于51单片机定时器计数不够长的问题,想问问各位大佬有没有什么思路
- • Proteus中显示警告no program code loaded,已经添加过hex文件了
- • 基于89C51单片机的可调倒计时程序
- • 求分享资料 一个基于51单片机超声波手持测距仪
- • 单片机定时器/计数器问题求解答
- • 如何使用单片机定时器来控制一个物理按钮的IO口的通断啊?
- • 用51单片机做的温度监测报警装置,手动报警是需要按下SEND按钮的,但是现在我想...
- • STC15单片机+DS3231+DS18B20+DHT11+OLED12864+ESP8266_01S组成网络时间 有待改善
- • 基于单片机的自行车里程表程序 大写N到底是什么性质的变量 在哪里声明