概述
3.5.2 LCD 显示电路设计
系统 LCD 的电路引脚为 14 个,51 单片机芯片的 8 个接口分别与 LCD 的 8 个 数据接口连接,具备传送命令和数据的功能。芯片的 P 2.0,P 2.1 和 P 2.2 端口分 别连接到 LCD 的接口,对 LCD 的读取功能进行控制。
为了保证液晶屏的数据显示更加稳定,系统在 LCD 是数据输入端口和单片机
芯片的 P3 端口之间加入了上拉电阻用于限流。
由“清显示”、“光标返回”、“置输入模式”、“显示开/关控制”、“置功能”、 “置数据存储器地址”、“读标志或地址”等指令可以给 1602 芯片进行初始化设 置。并且根据 1602 型 LCD 的时序操作可以用程序模拟读写数据。
图 10 LCD 显示电路
3.6 蜂鸣器报警电路设计
本系统使用的蜂鸣器是 PB2130UP002A 型无源压电式蜂鸣器。由于单片机 I/O 口输出电流有限,蜂鸣器报警电路需使用放大电路驱动蜂鸣器工作。蜂鸣器 报警电路如图 11 所示,三极管在单片机输出低电平时即可导通,蜂鸣器开始报 警。
图 11 报警电路
3.7 键盘模块设计
按钮模块采用三个独立按键,一个按键端接地,另一端与 I/O 端口连接。由 于 STC89C51 的 I/O 端口的内部上拉电阻,按下按钮时,由于上拉电阻,相当于 I/O 端口接地。当按钮复位时,I/O 端口输出高电平。通过对不同时刻 I/O 口的状 态即可计算出按下的是哪个按键。
p
图 12 按键电路
3.8 电源设计
电源采用三节 5 号电池串联结构供 4.5V 电或 USB 3.7V 供电,接通电源后发 光二极管被点亮,系统开始工作。开关电路的设计具有自锁功能,如图 13 所示, P2 为电源输入接口,SW1 是电源开关。
图 13 电源电路
3.9 超声波发射与接收电路设计 超声波收发电路的主要功能为增大脉冲电压的幅值,提高超声波的有效发射
距离。本系统使用 CD4052 芯片的分时选通功能实现对四路传感器的集体控制。
3.9.1 CD4052 芯片的特点
CD4052 芯片是一种差分 4 通道的双四选一的数控模拟开关。如图 14 所示 为该芯片的引脚分布图。要实现对控制分时选通 4 通道中的一通道可以通过对 A、 B 端口的输入信号进行控制。INH 为使能端口且低电平有效,电平为 1 时能使所 有的通道全部截止。
图 14 CD4052 引脚分布图
该芯片的数字信号输入状态与各通道的关系如表 2 所示。该芯片的 16 个引
脚的功能如表 3 所示。
表 4 CD4052 芯片真值表
INH A B 所开通道
0 0 0 X0-Y0
0 1 0 X1-Y1
0 0 1 X2-Y2
0 1 1 X3-Y3
1 * * *
表 5 CD4052 芯片各引脚功能
引脚号 符号 功能
1,2,3,4 X0,X1,X2,X3 独立输入/输出端
5,6,7,8 0,Y1,Y2,Y3 独立输入/输出端
12 X 公共输入端
12 Y 公共输出端
14,15 A,B 选择输入端
11 INH 使能端
16 VCC 正供电电压
10 VEE 负供电电压
9 VSS 接地
3.9.2 超声波收发系统电路
单片机芯片的 P 1.4 端口和 P 1.5 端口与 CD 4052 芯片的 B 端口和 A 端口分别 连接,用于选择输出信号。单片机 P 1.6 端口连接 CD 4052 芯片的 X 端口,在系 统中工作时,P 1.6 输出频率是 40Khz 的脉冲信号,通过 CD4052 芯片输入到驱动 电路。超声波遇到障碍物就会发生发射,、随着传感器的接收,同时将机械波转 换为微弱的电信号。
这超声波收发信号电路的工作过程如下:首先可以在单片机中选择信号,这 一电信号可以通过 A 和 B 端口输入到芯片,P 1.6 端口输出频率大小是 40kHz 的 脉冲信号,通过 X 端口输入芯片内部,经过芯片处理后的信号电压大约会上升 100 Vpp,以驱动传感器发射超声波信号。超声波测量距离的大小受脉冲信号的 幅值影响,因此需使用专用的超声波脉冲变压器。撞到障碍物反射的机械波将被 芯片接收后转换成一个有一定频率的脉冲电信号。因为信号幅值较小,D1、D2、 D4 二极管都是处于截至状态。因此,这个微弱的电信号在 D1 和 D2 和 D4 和变 压器 T 线圈的共同作用下,不会发生短路现象。因此,通过回波信号将通过 R6 和 C3,由芯片的 Y 端口把信号输入到下一阶段的处理中。
3.10 超声波回波信号的放大电路设计
超声波回波信号是非常微弱的,导致它所转化成的电信号也非常微弱。因此, 超声波传感器接收到回波信号时需要对转化后的电信号进行放大。本系统使用 CX20106A 芯片作为放大电路的控制核心。
3.10.1 CX20106A 芯片的基本特点
CX20106A 芯片使用+5V 供电,芯片封装采用了单列八角直插式超小型的方 式。图 15 为芯片的引脚分布图
图 15 CX20106A 引脚分布图
各引脚具体功能如下:
l 脚:超声波信号输入端
2 脚:该脚与 GND 之间需要连接一个 RC 串联电路,组成一个负反馈网络 推荐选用参数为 R=4.7Ω,C=3.3μF。
3 脚:该脚与 GND 之间需要连接一个检波电容,作用是对传来的电信号 进行检波,推荐参数为 3.3μF。
4 脚:接地端(GND)。
5 脚:该脚与电源端(VCC)之间需要接入一个电阻,该电阻的作用是设置 带通滤波器的中心频率 f0,
6 脚:该脚与 GND 之间需要接入一个积分电容,标准值为 330pF
7 脚:该脚是遥控命令输出端,该引脚必须接上一个上拉电阻到电源端, 阻值为 22kΩ
8 脚:该引脚为电源正极,4.5V~5V。 该芯片有内置的放大器,具有自动控制放大倍数的作用,利用外接的电阻可
实现对带通滤波器中心频率的调节。
3.10.2 CX20106A 芯片的原理介绍
该芯片内部的电路主要是由以下各个部分组成:前置放大器、自动偏置电平 控制电路、限幅放大器、带通滤波器、峰值检波器和整形输出电路等。当该芯片 没有信号输入的时候,7 脚(OUT 端)输出的是高电平信号;当有信号输入时, 会由 7 脚输出一个负脉冲的电信号。
CX20106A 型的芯片其内部工作过程如下:当该芯片接收到回波电信号以后,
首先会依次经过前置和限幅放大器,此后该信号的波形会被调整到一个比较适合 处理的幅值;然后会继续通过带通滤波器,该滤波器会将信号中所有的干扰信号 滤除掉;经过最后的处理后,有用信号通过正常检波器和定型电路输出,进行 后续工作。
4 系统软件设计
4.1 主程序设计及流程图
在进行超声波探测时,主程序首先对单片机进行初始化,然后由 TRIG 触发 测距,并在测距模块输入端输入 10us 左右的高电平信号。此时,模块将会自动 发送 8 个 40KHz 的方波,检测是否有信号返回,且将定时器 T0 启动。因此,高 电平的持续时间就是探测器发出超声波到接收到超声波的时间,在有信号接收到 时,系统将会执行中断程序,然后调用计算距离的子程序,根据定时器 T0 记录 的时间以及声速,算出需要测量的距离。随后将调用显示子程序,计算出的距离 将会以十进制数字的形式显示在 LCD 液晶显示屏上,同时调用声音处理子程序, 蜂鸣器报警。最后,主程序通过对 P3.3 端口的返回值进行接收并判断,完成一 次测距。如果判断返回值的结果是标志位清零,则说明又一次接收到了回波信号, 那么主程序将重新从接受回波信号的标志位开始,接着在单片机的 TRIG 端口发 送 10us 左右的高电平信号输入到超声波测距模块,重新执行各个子程序。如果 接收回波的标志始没有清零,将会一直执行主程序,直至接收回波标志位清零, 说明已经没有障碍物。因此系统对障碍物可以实现实时距离测量。
超声波测距实际是对接收到的往返超声波的时间差进行测量,之后通过数据 计算得出距离值。主程序流程图如图所示,其中的 N 是计数器的值,再将声速 定为 340 米每秒即可
。
图 16 主程序流程图
4.2 各部分子程序的设计
模块化设计可以大幅度提升编程效率,增强程序的可读性。因此,本系统的 程序设计包括中断处理、显示、距离、计算等模块。
4.2.1 中断处理子程序 中断程序主要控制超声波探测器接收到回波信号后产生输送至 P3.3 引脚的
高电平,使单片机系统中断。中断处理时定时器 T0 将立即关闭,并记录返回的 高电平持续时间,并清除回波标志位。
图 17 中断程序流程图
4.2.1 显示子程序
对 LCD 液晶显示器的控制由以下几个程序构成:LCD 液晶初始设置 SETUP、 LCD 液晶初初始显示子程序 Logon、LCD 液晶写命令 WRRITE_ UCOM、LCD 液晶显 示子程序 DATA、液晶显示字符 WRTE_ASC16。
下面将对每一部分程序进行设计与说明:
(1)LCD 液晶初始设置 SETUP。这个程序的主要功能是对 LCD 液晶显示器 的初始化设置,主要设定:模式、光标设置、地址指令的设置和视频指令的设置 等。
(2)LCD 液晶初初始显示子程序 Logon。程序的主要功能是 LCD 显示的初始 化,让 LCD 有一个默认正常状态时的初始显示数据。第一行中显示“REVERSING RADAR”、第二行显示“DISTANCE:CM”
(3)LCD 液晶写命令 WRRITE_ UCOM。这个程序的功能是控制 LCD 的特殊 功能引脚,用以传输命令。
(4)LCD 液晶显示子程序 DATA。这个程序的功能是将 51 单片机计算出来 的最小距离以十进制的数字显示到 LCD 屏上,显示的是 4 位数字而且从第二行的 第九位开始显示。
(5)液晶显示字符 WRTE_ASC16。这个程序可以控制 LCD 显示 16 个字符。 如图 19 所示,主程序进入 LCD 显示模块后,该程序将首先启动对 LCD 的初 始化,设置范围包括显示、光标模块、地址指针和清屏命令等。此进程完成后, LCD 的一行将会等待数据记录。第一行数写入后,指针会指向 LCD 的第二行数据 同时,系统判断 LCD 数据显示是否已经完成。如果没有完成,将继续返回数据显
示程序段,如果已经完成,则显示程序执行结束。
图 18LCD 显示子程序流程图
。
4.2.3 距离计算子程序
距离计算公式为:S=(V*T0)/2=17T0/1000cm(其中 T0 为计数器 T0 的计数值) 计算超声波距离的子程序设计是基于超声波探测器在一定时间发出的超声
波信号。当信号被障碍物反射回来时,超声波探测器接收到回波信号。通过计算
同一个信号从发射到接收的时间间隔,就可以用上述公式计算得出障碍物距离。
当超声波探测器发出超声波信号时,内部计时器 t0 被激活。根据定时器的 计数功能,记录超声波信号从发送到接收的时间。当探测器收到超声波信号时, 接收芯片在 INT1 端将会输出中断请求信号,单片机处理外部中断信号,即处理 中断服务子程序,读出 T0 值。
图 19 距离子程序流程图
5 系统误差分析
5.1 影响超声波探测的因素 在使用超声波传感器时,发射器和接收器都使用相同的一个设备。在通常状
态下超声波频率是 40KHz,但是超声波传感器不能传到所有区域,探测范围非常 有限,并且存在障碍物被其他物体覆盖,而在此情况下是否能够继续检测到障碍 物就与下列因素有关:
(1) 根据反射理论,由于入射角与反射角相等,反射回来的超声波信号是
否能够被超声波探测器接收取决于障碍物的表面与信号的传播速度。
因此超声波信号不一定能反射回发射装置中的。
(2) 障碍物的物理属性不同,对超声波的传播速度也有一定的影响。
(3) 在超声波信号的反射过程中,障碍物的物理属性不同,被反射回的超 声波信号也不同,有些物体能吸收一部分超声波信号,而有的会全部 反射。对于相对柔软的障碍物,更不易被检测到。
(4) 空气也是影响超声波信号传播的一个因素。在其他条件不变时,空气 间隔越大,超声波在发射与接收的过程中衰减就越大,障碍物不易被 发现。
由此可见,影响超声波探测器的主要因素有:角度、障碍物材质、与障碍物 的距离。
因此,在实际生活中对超声波探测器造成影响的一些不利因素有:
(1) 在道路凹凸不平或者草坪上前进的情况。
(2) 障碍物比较尖锐的情况。
(3) 在极易吸波的柔软物质情况下。
(4) 在汽车的轰鸣声正对着传感器的情况下。
(5) 在超声波发射装置上有附着物的情况下。
(6) 在遇到金属网格或者细线的情况下。
5.2 误差解决方案
5.2.1 温度补偿法分析 超声波在空气中传播过程中,其速度会受到温度、压强等因素的影响,而且
受温度的影响较大,因此我们需对这一影响进行研究,通常情况下可以利用温度 补偿来弥补这一影响。
温度补偿系统是将温度传感器与系统连接,温度传感器要有较高的抗干扰能 力,当完成温度测量时,单片机对其进行计算。本文选取了 DS18B20 温度传感 器,传感器结构为两条数据总线,这两条总线能够实现温度转换和数据传输功能, 在温度传感器运行过程中,可以将数据总线直接与单片机进行连接,将测量到的 数据输入单片机中,在该过程中不需进行 A/D 转换,并且另一条数据线用于传
输温度转换指令和读写指令。
5.2.2 小波去噪法分析 超声信号是由有效信号与高斯白噪声信号耦合形成的。一般来说,噪声信号
的频率较高,引起的小波分解系数的模较小。这样,对各层小波信号作一个阈值 处理,并将处理后的各层信号分量重新合成即可达到去除信号噪声的目的。
噪声信号一般分布在回波信号小波分解后频率较高的分量当中,随着分解运 算的不断进行,频率较高的细节分量当中的噪声信号将逐渐降低,而真实的超声 接收信号能量则会逐渐变大,这样就可以通过计算其中的高频分量与低频分量之 间的相似性来确定是否还有必要继续进行小波分解。当它们之间的相关性系数比 较小时,说明高频细节分量中还存在着大量噪声,需进一步对信号进行小波分解, 当相关性系数比较大时,说明高频细节分量当中的噪声信号已比较小,这时即可 结束分解运算,达到自动选择小波分解层数的目的,优化运算资源。
结论
本设计主要是利用 STC89C51 单片机,设计一个倒车防撞循迹报警系统,这 个系统具有的功能很多,在设计的过程中对这些功能的控制具有一定的难度,并 且它具有很多的优点,主要可以在性能上、安全上、精度上、技术上等等都具有 很强大优势,应用性比较高。对于这次设计,我还有一些地方由于一些原因的影 响,并没有很好的完成,主要实现了测距循迹报警这三个功能。此次设计最终要 实现的目标是超声波测距仪不仅能够产生超声波并且可以完成波的发送和接收, 以及红外传感器能够探测路径实现循迹,从而实现在 LCD 上显示的测量距离。
在设计的过程中,我进行了大量的资料查找,并且结合学习到的关于单片机
和超声波的知识,在导师的指导下对这个系统进行了设计,对课题要求也基本上 完成了。但是,在本次设计中,我还有很多的不足的地方,由于知识的欠缺,在 实验上不能达到很好的设计,这就使得器件在运用上显得比较粗燥,而且技术上 的叙述也达不到特别精准、具体。
本次毕业设计的完成,对我起到了一个很大的帮助,从中我学到了很多东西, 对软件的编程,对硬件的焊接制作,以及单片机的一些功能都有了一定的认识。 这使我认识到了只学习书本上的知识是远远不够的,因为书本大多都是理论概述 的东西,很难再书本上体会到实践的内涵,所以我们要结合书本上的理论知识很 好的运用到实践中,但是在理论与实践的结合过程中我们会有遇到很多的问题, 需要考虑的东西也很多,因此我们必须要经过一些测试与验证才能得出结果。通 过本次的毕业设计,我更加深信实践才是验证真理的唯一方法,而且在硬件的焊 接制作中,动手能力也得到了提高。最后总结出最重要的一点就是,要充分认识 到只有把理论与实践相结合,才能做好每一件事情。
参考文献
马爱霞,徐音.超声波传感器原理及应用[J].科技风,2016(01):109
郭强.周云仙等.液晶显示手册「M」.电子工业出版社,2003
松井邦彦.传感器实用电路设计与制作[M].北京:科学出版社,2005
孟立凡,郑宾,候文.超声测距换能器及收发电路的研究[J].华北工学学报
刘芹.具有温度补偿功能的超声波测距系统设计[J].山东工业技 术,2018(23):115.
诸葛晶昌,吴军,詹湘琳,于之靖.基于自适应小波去噪法的精密超声波测距 方法[J].吉林大学学报(工学版),2017,47(04):1301-1307.
附录一:主程序
#include <REGX52.H>
#include <stdio.h>
#include “LCD.H”
#include “18B20.H”
#include “delay.h”
sbit k1=P3^5; sbit k2=P3^6; sbit csb=P2^5; sbit csbint=P3^2; sbit bg=P2^6; sbit fmq=P3^3;
unsigned char aa[]={’ ‘,’ ‘,‘D’,‘i’,‘s’,‘t’,‘a’,‘n’,‘c’,‘e’,’:’}; //Distance
unsigned char bb[11]={’ ‘,’ ‘,’ ‘,’ ‘,’.’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,};
unsigned char cc[]={‘A’,’.’,‘A’,‘A’,‘m’};
unsigned char zf,a1,a2,a3,xs,e,n,m,z; //zf 温度正负标志位;a1,a2,a3,按键设定 程序中定值的米、分米、厘米临时存储变量
//xs,e 用于按键程序中设定 位闪动显示的变量;flag,未用,n,是背光控制标志位变量;m,z;
unsigned int dz,k,s,j,bgz,k; int temp;
float temperature,csbc,wdz; bit wh;
main()
{
TH0=0; TL0=0;
TMOD=0X11; //T1,T0 为 16 位定时器
EA=0;
bg=0; n=0; m=0; z=0;
init(); Init_DS18B20();
dz=80; bb[6]=0xdf; bb[7]=0x43;
e=4; cc[0]=dz/100+‘0’; cc[2]=dz/10%10+‘0’; cc[3]=dz%10+‘0’;
LCD_Write_String(0,0,aa); LCD_Write_String(11,1,cc); while(1)
{
temp=ReadTemperature(); fmq=1;
DelayMs(100); if(temp<0)
{
}
else
{
}
temp=-(temp-1); zf=1;
bb[0]=’-’;
zf=0; bb[0]=’ ';
csb=0; //启动一次模块
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
csb=1;
ET0=1; //启动计数器 T0,用以计时
TR0=1; EA=1;
j=80; //延时
while(j–)
{
}
csbint=1; j=0;
while(csbint) //判断接收回路是否收到超声波的回波
{
j++;
if(j>=2500) //如果达到一定时间没有收到回波,则将 csbint
置零,退出接收回波处理程序
csbint=0;
} TR0=0;
s=TH0256+TL0; //读取时间数据
TH0=0; TL0=0;
wdz=0.00000607temp; //温度补偿计算
if(zf==0)
{
csbc=0.03315+wdz;
}
else csbc=0.03315-wdz; csbc=csbc/2;
s=s*csbc-8;
if(s<5) //测量值小于下限
{
cc[0]=’-’;
cc[2]=’-’;
cc[3]=’-’;
}
else if(s>500) //测量值大于上限
{
}
else
{
cc[0]=‘C’;
cc[2]=‘C’;
cc[3]=‘C’;
cc[0]=s/100+‘0’; cc[2]=s/10%10+‘0’; cc[3]=s%10+‘0’;
}
if(s<dz)
{
bgz=s*5;
for (k=0;k<bgz;k++)
{
DelayUs2x(150);
fmq=!fmq; //BEEP 取反
}
}
bb[1]=temp/1000+0x30; bb[2]=temp/100%10+0x30;//显示十位 bb[3]=temp%100/10+0x30;//显示个位 bb[5]=temp%10+0x30; //小数
if(zf==0)
{
if(temp<1000)
{
bb[1]=’ ';
if(temp<100)
{
}
}
}
else
{
bb[2]=’ ';
if(temp<1000)
{
bb[1]=’-’;
bb[0]=’ ‘;
if(temp<100)
{
bb[0]=’ ‘;
bb[1]=’ ‘;
bb[2]=’-’;
}
}
}
LCD_Write_String(0,1,bb); LCD_Write_String(11,0,cc);
while(!k2) //液晶背面开关
{
n=1;
}
if(n==1)
{
bg=~bg; //bg=0;时开背光灯
n=0;
}
if(!k1) //按键处理程序
{
TR1=0; TR0=0; cc[0]=‘A’;
cc[1]=’.’;
cc[2]=‘A’;
cc[3]=‘A’;
cc[4]=‘m’; LCD_Write_String(11,1,cc); k=500;
while(k)
{
k–;
DelayMs(2);
}
cc[0]=dz/100+‘0’; cc[2]=dz/10%10+‘0’; cc[3]=dz%10+‘0’;
LCD_Write_String(11,1,cc); a1=dz/100;
a2=dz/10%10; a3=dz%10; n=1;
while(n)
{
if(!k2)
{
while(!k2); e=1;
xs=3; a1+=1;
if(a1>5) a1=0; cc[0]=a1+‘0’;
}
if (e==1)
{
xs++; cc[0]=a1+‘0’;
if(xs>6)
{
}
}
else
{
xs=0; e=0;
cc[0]=’ ';
xs++; if(xs>3)
{
xs=0; e=1;
}
}
LCD_Write_String(11,1,cc); if(!k1)
{
while(!k1);
cc[0]=a1+‘0’; m=1;
while(m)
{
if(!k2)
{
while(!k2); e=1;
xs=3; a2+=1;
if(a2>9) a2=0; cc[2]=a2+‘0’;
LCD_Write_String(11,1,cc);
}
if (e==1)
{
xs++; cc[2]=a2+‘0’;
if(xs>6)
{
}
}
else
{
xs=0; e=0;
cc[2]=’ ';
xs++; if(xs>3)
{
xs=0; e=1;
}
}
LCD_Write_String(11,1,cc);
if(!k1)
{
while(!k1);
cc[2]=a2+‘0’; z=1;
while(z)
{
if(!k2)
{
while(!k2); e=1;
xs=3; a3+=1;
if(a3>9)
a3=0; cc[3]=a3+‘0’;
LCD_Write_String(11,1,cc);
}
if (e==1)
{
xs++; cc[3]=a3+‘0’;
if(xs>6)
{
}
}
else
{
xs=0; e=0;
cc[3]=’ ';
xs++; if(xs>3)
{
xs=0; e=1;
}
}
LCD_Write_String(11,1,cc);
if(!k1)
{
while(!k1); dz=a1100+a210+a3; n=0;
m=0; z=0;
}
}
}
}
}
}
}
}
}
附录二:LCD 显示子程序
#include"LCD.H"
void write_com(unsigned char com) //写命令
{
RS_CLR; RW_CLR;
P0=com; DelayMs(5); EN_SET;
DelayMs(5); EN_CLR;
}
void write_data(unsigned char date) //写一个字符
{
RS_SET; RW_CLR;
P0=date; DelayMs(5); EN_SET;
DelayMs(5); EN_CLR;
}
void init() //初始化
{
write_com(0x38);
write_com(0x0c); write_com(0x06); write_com(0x01);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,
unsigned char *s)
{
if (y == 0)
{
}
else
{
}
write_com(0x80 + x);
write_com(0xC0 + x);
while (*s)
{
write_data( *s); s ++;
}
}
附录三:EEPROM 通讯程序
#include “eeprom.h”
#include “delay.h”
void Start(void) //I2 开始
{
SDA=1; SCL=1; NOP4(); SDA=0; NOP4(); SCL=0;
}
void Stop(void) //I2C 停止
{
SDA=0; SCL=0; NOP4(); SCL=1; NOP4(); SDA=1;
}
void RACK(void) //读取应答
{
SDA=1; NOP4();
SCL=1; NOP4(); SCL=0;
}
void NO_ACK(void) //发送非应答信号
{
SDA=1; SCL=1; NOP4(); SCL=0; SDA=0;
}
void Write_A_Byte(uchar b) //写一个字节数据
{
uchar i; for(i=0;i<8;i++)
{
b<<=1;
SDA=CY; //CY 进位程序状态字寄存器
nop(); SCL=1; NOP4(); SCL=0;
}
RACK();
}
void Write_IIC(uchar addr,uchar dat) //向指写地地址写数据
{
Start(); Write_A_Byte(0xa0); Write_A_Byte(addr); Write_A_Byte(dat); Stop();
DelayMs(10);
}
uchar Read_A_Byte(void) //读取一个字节
{
uchar i,b; for(i=0;i<8;i++)
{
SCL=1; b<<=1; b|=SDA; SCL=0;
}
return b;
}
uchar Read_Current(void) //从当前地址取数据
{
uchar d; Start();
Write_A_Byte(0xa1); d=Read_A_Byte(); NO_ACK();
Stop(); return d;
}
uchar Random_Read(uchar addr) //从任意地址读取数据
{
Start(); Write_A_Byte(0xa0); Write_A_Byte(addr); Stop();
return Read_Current();
}
致谢
首先,我要感谢张洛花老师在毕业设计中对我的悉心指导与严格要求,在我 写作毕业论文期间,从确定课题到最终的定稿,张老师为我提供了许多指导,在 此谨向张老师表示由衷的感激与敬意。
接着,我要感谢我的室友在这两年之间,在生活中给予我的支持与关怀,感 谢你们在我毕业设计期间给我的帮助与启发。
感谢河南城建学院为我提供了大学学习机会,我永远不会忘记在这两年中哭 过、笑过的回忆。
最后
以上就是善良马里奥为你收集整理的汽车倒车雷达系统的设计与实现(二)的全部内容,希望文章能够帮你解决汽车倒车雷达系统的设计与实现(二)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复