HC-SR04工作原理及说明:
1、 给Trig触发控制信号IO端口至少10us的高电平信号;
2、 模块自动发送8个40khz的方波,并自动检测是否有信号返回;
3、 有信号返回时,Echo回响信号输出端口输出一个高电平,高电平持续的时间就是超声波从发射到 返回的时间;
4、 两次测距时间间隔最少在60ms以上,以防止发射信号对回响信号的影响;
单片机控制HC-SR04超声波测距说明:
单片机的P1.7口接HC-SR04的Trig端口,P1.6口接HC-SR04的Echo端口,超声波在传播时碰到障碍物即返回,HC-SR04模块收到回波信号后Echo口输出一个高电平,单片机检测到高电平后即启动计数器开始计数,直到单片机检测到Echo口变成低电平后结束计数,计数器的计数值乘以单片机计数周期就是超声波从发射到接收的往返时间,即距离S=v*t/2;
初始化函数,对T2 初始化
void UltraSoundInit()
{
Trig = 0;
TH2 = RCAP2H = 0;
TL2 = RCAP2L = 0;
TR2 = 0;//关闭定时器
ET2=1; //允许T2中断
}
定时器/计数器
1、与单片机的CPU相互独立
2、根据机器内部时钟或者外部的脉冲
3、初始化;
对TMOD赋值,以确定T0和T1的工作方式
计算初值,并将其写入THO、TLO或TH、TL
中断方式,对EA赋值,开放定时器中断
使TR0或TR1置位,启动定时器/计数器
4、C/T:定时或计数 C/T=0为定时模式; C/T=1为计数模式
M1M0:计数器模式 00方式0:13位定时/计数器;01方式1:16位;10方式2:8位 自动重装;11方式3:T0分为两个独立的8位,T1方式终止
GATE=0:不受中断影响;GATE=1:受中断影响
eg:TMOD=0X01 //0000 0001 //设置定时器0为工作方式1 0(GATE)0(C/T)01(M1M0)
/************************************更新于2017.12.7************************************/
串口通信
传输速率:比特率是每秒钟传输二进制代码的位数,单位是位/秒(bps),如每秒传输240个字符,而每个字符格式包含十位(1位起始,8位数据,1位停止),这时比特率为:10位*240个/秒=2400bps
RS-232标准接口主要引脚:
插针序号 信号名称 功能 信号方向
3(25针)/ 2(9针) RXD 接收数据(串行输入) DCE-DTE
2/3 TXD 发送数据(串行输出) DTE-DCE
7/5 SGND 信号接地
RS-232问题:
1、传输距离一般不要超过15m。
2、最高速率为20bps。
3、有电平偏移(收发双方共地)
4、抗干扰能力差,采用较大的电压摆幅。
80C51串行口的控制寄存器:
SCON是一个特殊功能的寄存器,用以设计串行口的工作方式,接收/发送设置,以及状态标志
SM0、SM1 工作方式选择位 常用01,方式1:10位异步收发器 波特率可变
SM2 (一般不用)方式1时,当SM2=1,则只有接收到有效停止位时,RI才置1
REN 允许串行接收位 由软件置REN=1 则启动串行口接收数据 ; 若软件置REN=0 则禁止接收
TB8 方式1未用
RB8 在方式1时,若SM2=0,则RB8是接收到的停止位
TI 发送中断标志位 发送停止位开始时,由内部硬件使TI置1,向CPU发送中断请求,在中断服务程序中,必须用软件将TI清零,取消中断
RI 接收中断标志位 接收停止位中间时,由内部硬件使RI置1,向CPU发送中断请求,在中断服务程序中,必须用软件将RI清零,取消中断
PCON只有一位SMOD于串行口工作有关
SMOD 波特率倍增位 SMOD=1 波特率提高一倍 SMOD=0 复位
波特率计算
方式1波特率可变 由定时器T1溢出率来决定
方式1波特率=(32分之2的SMOD次方)* (T1溢出率)
T1溢出率=fosc / { 12 * [ 256-TH1(T1的初值 ] }
单片机常用晶振:12MHz、11.0592MHz
串口通信步骤:
确定T1的工作方式(编程TMOD寄存器)
计算T1的初值、装载TH1、TL1
启动T1(TCON中的TR1位)
确定串行口控制(编程SCON寄存器)
串口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)
示例:
void main()
{
TMOD=0X20; //设置定时器为方式2
TH1=0Xfd; //装入初值
TL1=0Xfd;
TR1=1; //启动定时器1
SM0=0;
SM1=1; //设置串口为方式1
REN=1; //接收使能
EA=1; //打开中断总开关
ES=1; //打开串口中断开关
while(1)
{
if(flag==1)
{
ES=0;
flag=0;
SBUF=a;
while(!TI); //等待数据发送结束
TI=0;
ES=1;
}
}
}
void serial() interrupt 4
{
a=SBUF;
P1=a;
RI=0;
flag=1; //标志位
}
/************************************更新于2017.12.11************************************/
写程序及程序的下载与调试
1、程序下进去,可以测距,但LCD1602不显示任何数据
原因是:显示函数模块,write_date写成了write_com。没有清楚的区分写数据和写指令。
2、按键可以使用,但LCD1602只能显示一位距离阈值
原因还未找出
4、最初写程序,不知道要用到两个定时器,一个用于超声波测距;一个用于串口通信
接下来解决以上问题,完成串口通信
/**********************************更新于2017.12.30*************************************/