蓝桥杯超声波模块原理图:
将上述引脚J2跳帽(1-3,2-4)短接。
超声波工作原理:
代码:
下述代码用到定时器0,和定时器1:
定时器0:功能:数码管扫描,超声波测量允许,数码管缓存区刷新
定时器1:功能:12us发送超声波,超声波发送后计时
#include <STC15F2K60S2.H>
#define uint8_t unsigned char
/*变量定义*/
sbit TX = P1^0;
sbit RX = P1^1;
bit set; //超声波测量标志位
uint8_t temp = 123; //接收超声波返回的数值
unsigned char Nixie[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xa1,0x86,0x8e,0xbf,0x7f,0xff};
uint8_t showNixieByte[8] = {1,2,18,18,18,1,1,1}; //数码管显示段
uint8_t triggeNixieBit; //数码管位选循环位
/*函数声明*/
void showNixie(void);
void Timer0Init(void);
void Timer1Init(void);
uint8_t send_ul();
void upData();
/*-------------------------------------------------*/
void main()
{ Timer0Init();
Timer1Init();
while(1)
{
if(set) //超声波测量允许判断
{
temp = send_ul(); //测量
upData(); //将测量的数据写入缓冲区
set = 0; //清除标志位
}
}
}
/*更新数码管缓冲区的数据*/
void upData()
{
showNixieByte[5] = temp/100;
showNixieByte[6] = (temp%100)/10;
showNixieByte[7] = temp%10;
}
/*-------------------------------------------------*/
/*超声波发送接收函数*/
uint8_t send_ul()
{
uint8_t temp = 0,count = 8; //发送超声波次数
TL1 = 0x70; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TX = 1; //将超声波发送端置位
TR1 = 1; //打开定时器1,准备发送超声波
while(count--)
{
TX^=1;
while(TF1 == 1); //等待发送超声波发送时间到
TF1 = 0; //软件将定时器溢出标志位清零
}
TR1 = 0; //关闭定时器
TF1 = 0; //清空标志位
TL1 = 0x00; //设置定时初始值,准备为接收超声波时间计时
TH1 = 0x00; //设置定时初始值
TR1 = 1; //打开定时器
while(RX && !(TF1)); //等待接收到超声波或者定时结束
TR1 = 0; //关闭定时器
if(TF1) //判断定时器标志位是定时器溢出还是接收到超声波脉冲
{
temp = 255; //超出计数范围,置位255
TF1 = 0; //清空标志位为发送脉冲做准备
}
else
{
temp = ((TH1<<8)|TL1) *0.017;//否则进行数据处理
}
TH1=0; //清空定时器
TL1=0;
return temp;
}
/*-------------------------------------------------*/
/*定时器配置服务函数*/
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初始值
TH0 = 0xD1; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
void Timer1Init(void) //12微秒@12.000MHz
{
AUXR &= 0xbf; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x70; //设置定时初始值
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
ET1 = 0;
}
void tm0_isr() interrupt 1
{
static uint8_t count_ul; //超声波规定时间测量位
showNixie();
count_ul++;
if(count_ul == 66) //66ms触发函数
{
set = 1;
count_ul = 0;
}
}
/*-------------------------------------------------*/
/*显示函数*/
void showNixie(void)
{
P2 = (P2&0x1f)|0xe0;
P0 = 0xff;
P2 = (P2&0x1f)|0xc0;
P0 = 1<<triggeNixieBit;
P2 = (P2&0x1f)|0xe0;
P0 = Nixie[showNixieByte[triggeNixieBit]];
//
// XBYTE[0xE000] = 0xff; //ȥԽڭӰ
// XBYTE[0xC000] = (1<<triggeNixieBit);
// XBYTE[0xE000] =Nixie[showNixieByte[triggeNixieBit]];
if(++triggeNixieBit==8) triggeNixieBit = 0;
}
/*-------------------------------------------------*/