之前编写的程序,当测量结果小于100cm时,蜂鸣器就发出嘀嘀嘀的声音报警。现在怎么改动一下,使当测量距离在60-100cm时以某一频率的声音报警,当测量结果小于60cm时以更高频率的声音报警?已经编写好的程序如下: #include <REGX51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define bj P3_3 //报警值输出(声音)
#define csbint P3_2 //超声波接收
#define LED P2 //数码管段
#define csbout P0_0 //超声波接收
sbit LED3 = P0^2; //数码管位驱动
sbit LED2 = P0^4; //数码管位驱动
sbit LED1 = P0^6; //数码管位驱动
uchar cl,csbds,xm1,xm2,xm0,sj1,buffer[3];
uchar convert[10]={0x60,0x7E,0xA2,0x2A,0x3C,0x29,0x21,0x7A,0x20,0x28};
static unsigned char temp1; //温度值的整数部分
uint s,i,t,sj2,sj3,wd;
float csbc,wdz;
/*有关全局变量*/
void csbcj();
void delay(i); //延时函数
void scanLED(); //显示函数
void showOnce(); //显示循环函数
void timeToBuffer(); //显示转换函数
void offmsd();
void csbfs();
void csbsc();
void main()
{
EA=1; //开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时
ET0=1; //定时器0中断允许
ET1=1; //定时器1中断允许
TH1=0xE7;
TL1=0xC2;
csbint=1;
cl=1;
TR1=1; //设定时值1为20ms
sj1=40;
sj2=100;
sj3=599;
temp1=25;
csbsc();
while(1)
{
csbcj(); //调用超声波测距程序
if(s>sj3) //大于时显示“CCC”
{
buffer[0]=0xE1;
buffer[1]=0xE1;
buffer[2]=0xE1;
}
else if(s<sj1) //小于时显示“- - -”
{
buffer[2]=0xBF;
buffer[1]=0xBF;
buffer[0]=0xBF;
}
else timeToBuffer(); //调用转换段码功能模块
offmsd(); //调用判断百位数为零模块,百位为零时不显示
if(s<sj2) //判断是否达到报警值
{
bj=0;
if(s<40)
i=20;
else i=s*2;
while(--i)
{
scanLED(); //调用显示函数
}
}
i=300;
bj=1;
while(--i)
{
scanLED(); //调用显示函数
}
}
}
void delay(i) //延时子程序
{
while(--i);
}
void scanLED() //显示功能模块
{
LED=buffer[0];
LED3=0;
delay(25);
LED3=1;
delay(50);
LED=buffer[1];
LED2=0;
delay(25);
LED2=1;
delay(50);
LED=buffer[2];
LED1=0;
delay(25);
LED1=1;
delay(50);
}
void offmsd() //百位为数0判断模块
{
if (buffer[2]==0x60) //如果值为零时百位不显示
buffer[2] = 0xff;
}
void timer1int (void) interrupt 3 using 2 //终断处理程序
{
csbds++;
if(csbds>=10)
{
csbds=0;
cl=1;
}
}
void timeToBuffer() //转换段码功能模块
{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[0]=convert[xm2];
buffer[1]=convert[xm1];
buffer[2]=convert[xm0];
}
void csbcj() //超声波测距子程序
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
bj=1;
delay(2500);
i=10; //超声波脉冲个数5个
while(i--)
{
csbout=!csbout; //超声波发送
}
TR0=1;
i=250; //盲区值(延时躲过超声波发送头的余波)
while(i--)
{
}
i=0;
while(csbint) //判断接收回路是否收到超声波的回波
{
i++;
if(i>=3000) //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
csbint=0;
}
csbint=1;
TR0=0;
t=TH0;
t=t*256+TL0;
t=t;
s=t*csbc; //计算测量结果
cl=0;
TH1=0xE7;
TL1=0xC2;
TR1=1;
}
}
//计算超声波速度
void csbsc()
{
wdz=0.0000615*temp1;
csbc=0.03314+wdz;
csbc=csbc/2;
}
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>