}
}
}
displaynum(distance1); //显示距离、温度 displaynum2(distance2); displaynum3(tmp);
4.2 超声波测距程序
超声波接收程序主要是利用外中断检测返回超声波信号,一旦接收到返回超声波信号(即INT引脚出现高电平),立即启动定时器,并延时14ms。若14ms内回波电平由高变低,则触发中断,关闭计时器,保存计时器值,并将测距成功标志字赋值1。如果14ms后还未收到结束信号,则测距不成功。
其程序流程图如图4-2所示。
图 4-2
10
其距源程序如下:
void measure1() //测距1 {
uint time; Trig1=0;
TMOD=0x01; //设置T0为计时器工作方式1 EA=0; // Trig1=1; // delay12us(); Trig1=0; succeed_flag=0;
EA=1; // TH0=0; TL0=0;
while(Echo1 == 0); // EX0=1;
TR0=1; // delay(14); // TR0=0; EX0=0;
if(succeed_flag == 1){ // time=timeH*256+timeL; distance1=time*speed; }
if(succeed_flag == 0){ // distance1=30;
}
}
关中断 发出声波 开中断, 等待回波电平 计时开始 等待电平跳变 测距成功,计算距离 测距不成功,距离值为3m 11
void measure2() //测距2,同上 {
uint time; Trig2=0; TMOD=0x10; EA=0; Trig2=1; delay12us(); Trig2=0; succeed_flag=0; EA=1;
TH1=0; TL1=0; while(Echo2 == 0); EX1=1;
TR1=1; delay(14); TR1=0; EX1=0;
if(succeed_flag == 1){ time=timeH*256+timeL; distance2=time*speed; } if(succeed_flag == 0){ distance2=30; }
}
12
void timerstop1() interrupt 0 //外中断0,控制T0 {
EX0=0; timeH =TH0; timeL =TL0; succeed_flag=1; }
void timerstop2() interrupt 2 //外中断1,控制T1 { EX1=0;
timeH =TH1; timeL =TL1; succeed_flag=1; }
需要说明的是,主程序中已经设置相关语句用于检测距离值的有效性,3m为无效数据。 4.3 1602显示程序
设计使用的1602液晶为5V电压驱动,可显示两行,每行16个字符。 1602的写操作时序如图4-3所示:
图 4-3
13
程序流程如图4-4所示
图 4-4
时序图中的延时,因厂家而定,一般在纳秒级。因为单片机时序为微秒级,故程序中可不作延时,但稳定性的角度考虑,仍作简短延时。
1602显示源程序如下: void write_com(uchar com){ }
void write_dat(uchar com){
lcdrs=0; //写入指令 P0=com;
delay(5); //短暂延时 lcden=1; delay(5); lcden=0;
lcdrs=1; //写入数据 P0=com; delay(5); lcden=1;
14