1、自制的板子的原理图,有一个错误的地方,导致超声波不能正常使用。
下图是实物的原理图存在错误,不小心,自我批评一下。
图中的C6电容330pF的一端接到了VCC,是错误的。
蓝桥杯的原理图是下图,接到GND
因此。焊接的时候需要额外处理。
二、焊接说明
下图是实际的PCB图。存在错误。因此需要如下处理。
将
3、超声模发送头和接收头的焊接说明
买的超声波有两个规格,一个大的一个小的。
大的超声波头,看背后引脚那面,有一个引脚有个大黑色的圆圈。是负极。不管是发送的还是接收的都是如此。
小的超声波的头,正的那个引脚有个+号。
电路板的焊接的时候,建议焊接小的那个超声波头。可以直接焊接上去也可以焊接个排母,后面需要就插上去。
4、CX20106的焊接
注意VCC是第八个引脚,可以直接焊进去。
测试代码
#include "stc15.h"
#include "intrins.h"
sbit TX = P1^0;
sbit RX = P1^1;
unsigned int Time = 0;
unsigned int dis = 0;
#define somenop() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
//共阳数目管段码
unsigned char month = 0; //定义一个变量让其变化显示
//0-f 0xbf代表 -
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};
//---------------------------------简单延时函数-------------------------
void delay(unsigned int t)
{
while(t--);
}
void Delay12us() //@12.000MHz 延时12us
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
//-------------------------------74HC138初始化---------------------------
void Init_74HC138(unsigned char n)
{
switch(n)
{
case 4:P2 = P2| 0x1f; P2 = 0x80; break;
case 5:P2 = P2| 0x1f; P2 = 0xa0; break;
case 6:P2 = P2| 0x1f; P2 = 0xc0; break;
case 7:P2 = P2| 0x1f; P2 = 0xe0; break;
case 0:P2 = P2| 0X1f; P2 = 0x00; break; //所有锁存器都不选择
}
}
//----------------------------------系统初始化---------------------------
void InitSystem(void)
{
Init_74HC138(5);
P0 = 0x00; //关闭继电器与蜂鸣器
Init_74HC138(4);
P0 = 0xff; //关闭led
}
//---------------------------------数码管安位显示--------------------------
void SMG_DisplayBit(unsigned char pos ,unsigned char dat)
{
Init_74HC138(6);
P0 = 0x01 << pos ;//位选
Init_74HC138(7);
P0 = dat; //段码
}
//-------------------------------关闭所有数码管----------------------
void SMG_CLOSEALL(unsigned char dat)
{
Init_74HC138(6);
P0 = 0xff; //选中所有数码管
Init_74HC138(7);
P0 = dat; //关闭
}
void SMG_Display_Dynamic(void)
{
SMG_DisplayBit(0,0xff);
delay(200);
SMG_DisplayBit(1,0xff);
delay(200);
SMG_DisplayBit(2,0xff);
delay(200);
SMG_DisplayBit(3,0xff);
delay(200);
SMG_DisplayBit(4,0xff);
delay(200);
SMG_DisplayBit(5,SMG_Duan[dis/100]);
delay(200);
SMG_DisplayBit(6,SMG_Duan[dis/10%10]);
delay(200);
SMG_DisplayBit(7,SMG_Duan[dis%10]);
delay(200);
SMG_CLOSEALL();
delay(200);
}
//--------------------------------------发出声波----------------------------------
void SendWave(void)
{
unsigned char i;
for(i = 0; i < 8;i++)
{
TX = 1;
somenop();
TX = 0;
somenop();
}
}
//------------------------------------超声波测距----------------------------------
void Ultrasonic_Dis(void)
{
TMOD &= 0x0f; //定时器1模式0 13位最大值8192
TH1 = 0x00;
TL1 = 0x00;
TF1 = 0; //溢出标志位
TR1 = 0;
SendWave(); //发送声波信号
TR1 = 1;//启动定时
while(RX == 1 && TF1 == 0); //等待超声波信号返回或者等到测量超出范围 返回RX = 0
TR1 = 0;//停止计时
if(TF1 == 1) //溢出了还没有返回信号
{
TF1 = 0;
dis = 999;
}
else
{
//接收到了返回信号 将定时时间合成16位
Time = (TH1 << 8) | TL1; //总时间
//dis = ((Time / 10) * 17) / 100 + 3;
dis = Time * 0.0172;
}
}
//------------------------------------------------------------------------------------
void Delay_SMG( unsigned char t)
{
while(t--)
{
SMG_Display_Dynamic();
}
}
void main(void)
{
InitSystem();
while(1)
{
Ultrasonic_Dis();
Delay_SMG(50);
}
}