电脑
百度经验
1:了解超声波的工作原理, 2:绘制电路图 3:掌握STC89吃2芯片 4:会基本的软件工具
用超声波发出信号,弹回信号来,计算时间。所以根据电路的连接,确定超声波发出,弹回信号来确定t1,t2超声波发出时开始计时,在发出的时候遇到物体即在接收端产生一个电信号,如图2-1所示。超声波是一种人听不到的声音,传播为340M/S,假如用t1时刻超声波发出,t2表示超声波弹回时刻t2-t1得出一个时间值,t2-t1=0.01s,有340 x 0.01=3.4米。所以超声波离物体3.4M,如果用s表示s=340(t2-t1)/2。图2-1超声波原理图2.2 原理框架 如图2-2所示本文选用的超声波模块为HC-SPO4,显示模块采用LCD12864,MCU采用STC89C52RC芯片STC89C52RC统计出超声波传输所用时间,测量出所测距离由LCD12864显示出来。
LCD1602: LCD1602是一种工业字符型液晶,可以同时显示16 X 2个字符即32个字符。LCD1602的显示原理是利用液晶的物理特性,通过电压对其显示区的控制进行显示,当电压刺激液晶分子时就可以显示出图形。(2)引脚功能 图2-4 LCD1602① GND负极② VCC正极③ VL,调节液晶亮度④ RS寄存器选择⑤ R/W读写⑥ EN使能⑦ D0-D7信号⑧ BL+,BL-电源
STC89C52: (1) 芯片工作条件 ① 时钟电路。 ② 电源电路。 ③ 复位电路。此单片机20脚和40脚为供电引脚,18和19脚为晶振电路,18和19脚接两个电容接地是为了帮助晶振起振,9脚接按钮和电容接VCC,当按键按下时9脚和VCC接通,9脚变为高电平即单片机复位,当上电的时候电容由于充电导通,即9脚变为高电平,当充电完成时由于电容通交流隔直流所以电容不导通,因为9脚的一端和一个10K的电阻相连,所一9脚被拉低变为低电平。
超声波模块: 本超声波模块都是在淘宝里买的 他主要有4个引脚,电源,接地,发送,接收。电路图
软件部分: #include'lcd.h'sbit Trig = P2^1; //定义 P2.1口sbit Echo = P2^0; //定义 P2.0口unsigned char PuZh[]=' Pechin Science '; //指针方式进行显示unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};static unsigned char DisNum = 0; unsigned int time=0; unsigned long S=0; bit flat =0; unsigned char buff[4] ={ 0,0,0,0,};void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100; //算出的是厘米 if((S>=700)||flat==1) //超出测量范围“--” { flat=0; display(0, 1, ASCII[11]); display (1, 1, ASCII[10]); //显示点 display (2, 1, ASCII[11]); display (3, 1, ASCII[11]); display (4, 1, ASCII[12]); //显示米 } else { buff[0]=S%1000/100; buff[1]=S%1000%100/10; buff[2]=S%1000%10 %10; display (0, 1, ASCII[buff[0]]); display (1, 1, ASCII[10]); //显示点 display (2, 1, ASCII[buff[1]]); display (3, 1, ASCII[buff[2]]); display (4, 1, ASCII[12]); //显示米 } }void zd1() interrupt 3 // T0中断用来计算和启动模块。 {flat=1; //标志位 } void StartModule() //启动模块函数 { Trig=1; //开始启动模块 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 _nop_(); //一微秒的延时 Trig=0; //开始启动模块 }void delayms(unsigned int ms) //延时函数{ unsigned char x=100,y; for(;ms;ms--) //for循环 { while(--x) //while循环 { y=10; while(--y); } }}void main(void) //主函数{ LED=1; //led测试 TMOD=0x10; //设T0为方式1,DATE=1 TH1=0; //高八装入的初值为零 TL1=0; //低八装入的初值为零 ET1=1; //允许TO中断 EA=1; //开启总中断 InitLcd1602(); LcdShowStr(0,0,PuZh); while(1) //循环 { StartModule(); while(!Echo); 当Echo为零时等待 TR0=1; //开启计数 while(Echo); //设Echo为1计数并等待 TR0=0; //关闭计数 Conut(); //计算距离 delayms(80); //延时80毫秒 } }头文件,接口申明2#ifndef __LCD_H_#define __LCD_H_/*当使用4位数据传输时定义,使用八位取消这个定义*/#define LCD1602_4PINS#include
1.显示不出来:如LCD显示不出来,背光灯不亮,显示不正确,或显示亮度过低等问题。
2复位:复位是单片机工作的必要条件,当显示不出结果的时候不知道单片机是不是工作的,在不知道的情况下,写了一个点亮一个LED灯程序。对单片机是不是工作的进行判断。