在上次问过程序问题后,我又检查和编译后改正了许多,我和我的搭档一起搞定了HY-SRF05超声波模块不过,由于我们都是C语言的初学者所以在程序上还是会有很多我们想不到的问题存在,所以想向各位高手请教一下,我的程序可是有现象的哦!
希望在大家的帮助下我会成长的更快,在这里先感谢大家了.......
程序如下:
#include<reg51.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig=P1^1; //超声波控制端
sbit Echo=P3^2; //串行数据接收端
sbit buzz=P2^7; //蜂鸣器
long shuju; //全局数据控制变量
uchar b;
char code l[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char code ll[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
/*----------延时子程序-----------*/
void delay(uint x)
{
uchar a,b;
for(b=x;b>0;b--)
for(a=150;a>0;a--);
}
/*---------数码管显示部分---------*/
void xianshi()
{
uchar a,b,c;
a=shuju%10; //厘米显示计算
b=(shuju%100)/10; //分米显示计算
c=shuju/100; //米的显示计算
P0=l[a];
P2=0xfe;
delay(5);
P0=l[b];
P2=0xfd;
delay(5);
P0=ll[c];
P2=0xfb;
delay(5);
}
/*------程序开始前的初始化------*/
void chush()
{
shuju=0;
EA=1; //打开中断总开关
EX0=0; //关闭外部中断0
IT0=1; //采用低电平触发中断即由高变低视为外部中断请求
TMOD=0x01; //T0使用定时模式,工作模式1 ,16位
TH0=0x00;
TL0=0x00;
ET0=1; //IE寄存器 允许定时器0中断
TR0=0; //关闭定时器0
}
/*-----------开启芯片-----------*/
void kaiqi()
{
uchar a;
Trig=0; //首先拉低发射端
TR0=0; //关闭T0定时器
EX0=0; //关闭外部中断
TH0=0x00;
TL0=0x00;
Trig=1; //开启控制端
for(a=0;a<11;a++); //芯片的开启时间
Trig=0; //关闭控制端等待接收信号
for(a=0;a<6;a++); //接收端关闭时间
while(Echo==0); //接收端等待
TR0=1; //关闭定时器T0
EX0=1; //开启外部中断
}
/*-----------外部中断-----------*/
void Int0(void) interrupt 0 using 1
{
b=1;
TR0=0;
shuju=TH0*256+TL0;
shuju=shuju*0.017;
TH0=0x00;
TL0=0x00;
EX0=0; //关闭外中断
}
void TF0_() interrupt 1 //定时器0溢出中断
{
b=1;
TH0=0x00;
TL0=0x00;
buzz=0; //蜂鸣器用来判断定时是否溢出
delay(5);
}
/*------------主程序------------*/
void main()
{
chush(); //运行初始化子程序
while(1)
{
b=0;
kaiqi(); //运行开启子程序
EA=1; //CPU开启中断
EX0=1; //开启外部中断
while(b==0); //等待接收端置低
xianshi(); //运行显示子程序
EX0=0; //关闭外部中断
TR0=0;
TH0=0x00;
TL0=0x00;
shuju=0;
}
}
超声波的资料也附加上了......
一周热门 更多>