设计要求
驱动超声波传感器,启动距离测量功能,并将其结果显示到数码管上,距离数据单位为m。
按键“S4”定义为“切换”按键,通过此按键切换距离的显示精度(一位或两位小数)。切换顺序如图所示。
数码管显示格式如下图所示(数码管高位显示固定标识符“S”):
距离数据精度为两位小数
距离数据精度为一位小数
备注
单片机IRC振荡器频率设置为12MHz。
按键模式:BTN;扩展方式:IO模式。
上电测量的距离数据显示精度为两位小数字。
代码
sys.h
#ifndef __SYS_H__
#define __SYS_H__
#include <STC15F2K60S2.H>
//sys.c
extern unsigned char UI;
extern float distance;
void init74hc138(unsigned char n);
void init();
//seg_key.c
void Key_Loop();
void Seg_Loop();
void seg_ui();
#endif
main.c
#include "sys.h"
#include "intrins.h"
#define NUM 10
#define FNUM 8
sbit RX=P1^1;
sbit TX=P1^0;
bit flag1=0;
bit flag2=0;
bit flag3=0;
void Timer0_Isr(void) interrupt 1
{
static unsigned char count1=0,count2=0;
static unsigned int count3=0;
count1++;count2++;count3++;
if(count1==2){
count1=0;
flag1=1;
}
if(count2==50){
count2=0;
flag2=1;
}
if(count3==1000){
count3=0;
flag3=1;
}
}
void Timer0_Init(void) //100微秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9C; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
void delay(){
unsigned char i=NUM;
while(i--){
_nop_();
}
}
void send_wave(){
unsigned char i=FNUM;
while(i--){
TX=1;
delay();
TX=0;
}
}
void re_wave(){
send_wave();
TH1=0;
TL1=0;
TR1=1;
while((RX==1)&&(TF1==0));
TR1=0;
if(!TF1){
distance=(float)(TH1<<8|TL1)*0.017;
}else{
TF1=0;
distance=0.0;
}
}
void main(){
init();
Timer0_Init();
TMOD|=0x10;
while(1){
if(flag1){
flag1=0;
Seg_Loop();
}
if(flag2){
flag2=0;
Key_Loop();
seg_ui();
}
if(flag3){
flag3=0;
re_wave();
seg_ui();
}
}
}