声音导引系统(包含详细的程序等)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

声音导引系统(B题)
摘要:本设计以Atmega128单片机为控制核心,STC89C52RC为辅助控制器,电动车为执行器件,实现声音引导电动车精确定位的功能。

系统采用NEC电子电机控制ASSP 芯片(型号MMC-1),控制直流电机的运行,可实现256档调速。

小车平均速度达14cm/s。

采用斜率补偿法,实际最小定位误差为0.6cm。

采用nRF905无线模块实现小车与主控制器之间的通讯;采用RT12864液晶和ZLG7290键盘模块做为人机界面;采用MP3语音模块,提供优质的语音提示。

关键词:声音导引智能电动车无线收发定位
目录
1系统方案 (1)
1.1总体设计方案 (1)
1.1.1整体方案比较 (1)
1.2设计与论证 (2)
1.2.1定位方案的设计 (2)
1.2.2误差信号产生及控制算法分析 (2)
2单元电路设计 (3)
2.1系统组成 (3)
2.2控制器电路设计 (3)
2.3音频接收电路设计 (3)
2.4 nRF905无线模块电路设计 (4)
2.5电机驱动电路设计 (4)
2.6 SK-SDMP3语音模块电路设计 (4)
2.7 其他硬件模块介绍 (4)
3.软件设计 (4)
3.1开发软件介绍 (4)
3.2系统程序设计 (5)
3.2.1主机系统主程序 (5)
3.2.2从机系统主程序 (5)
3.2.3其他子程序 (5)
4.系统测试 (5)
4.1测试使用的仪器及设备 (5)
4.2指标测试和测试结果 (5)
4.3 测试结果分析 (6)
5.结论 (7)
参考文献 (7)
附录1图2.2.1 (7)
附录2图2.5.1 (8)
附录3图2.6.1 (10)
附录4图2.7.1 (12)
附录5表4.1.1 (13)
附录6图4.2.1 (14)
附录7表4.2.2 (14)
附录8表4.2.4 (14)
附录9表4.2.5 (15)
附录10图4.2.1 (15)
附录10主要元件清单 (16)
附录10程序清单 (16)
1系统方案
1.1总体设计方案
本系统设计要求实现三个位置不同的声音接收器引导一个可移动声源精确定位,设计要素有声音接收器、测距方案、以及定位算法。

1.1.1整体方案比较
(1)测距方案的论证与选择:
方案一:采用音频峰值检测的方法,比较三个接收点音频信号峰值的大小来判断小车与接收点之间的距离(距离远近不同,峰值不同),从而控制小车的运动。

方案二:采用测量音频信号传递时间的方法,比较声音从声源到三个接收点的传播时间长短来判断小车与接收点之间的距离(距离远近不同,传播时间不同),从而控制小车运动。

方案选择:若采用方案一,声源在距离变化同时,接收点接收到的声音大小也在变化,因此峰值测量本身就存在较大的误差。

且三个信号的差距微小,须通过放大及AD采样才能检测出变化,电路复杂。

方案二声音速度远超过小车速度,速度误差可以忽略不计,且外围电路相对简单,但要求控制器要有三个外部中断口和较快的处理速度。

通过比较,选择方案二。

(2)定位控制算法的论证与选择:
方案一:采用三线定位的方案。

在确定声源与每个接收点的距离或者距离差之后,通过三个接收点与声源位置的不同关系确定位置。

方案二:采用模糊补偿的方案。

先大致判断出声源距一个接收器的距离,将声源划分在几个模糊的位置,分别对不同位置的时间差进行不同的补偿,然后再比较两个接收器接收到声音信号的时间差来确定位置。

方案比较:方案一需要计算接收点与声源的距离需要使用三角方程或者多次函数,计算复杂,不适合单片机控制,方案二只需求出时间差,通过模糊补偿时间差来定位,设计简单,所以选择方案二。

(3)主控制器的论证与选择
方案二:采用Atmega128单片机。

Atmega128单片机运算功能强,运算速度快,编程灵活,并且其具有丰富的外部中断口资源(7个外部中断口)、功耗低、体积小、技术相对比较成熟和成本低等优点,因此Atmega128控制芯片能很好的满足系统设计需求。

方案选择:从性价比和低功耗考虑,选择方案二。

(4)从机控制器的论证与选择
方案一:采用Atmega8单片机。

Atmega8单片机小引脚封装,其性价比相当的高,运算功能强、运算速度快。

由于从机系统需要较多的I/O口资源,这里不采用。

方案二:采用STC89C52单片机。

STC89C52单片机是一款抗干扰、高速、低功耗功能都很优秀的单片机;具有32个可用I/O口,资源相对丰富。

方案选择:从低功耗和可用资源考虑,选择方案二。

(5)电机控制方案的论证
根据题目要求,电动车的平均速度要大于5cm/s,此条件要求电机转速比较快;定位误差小于3cm,要求电机控制精准;还要考虑到车体电机安装的问题,所以本设计采用直流电机。

电机驱动芯片采用L298。

L298内含二个H桥的高电压大电流双全桥式驱动器,可以驱动两个直流电机,具有调速特性优良、调整平滑、调速范围广、过载能力大,可实现频繁的无
级快速启动和反转的等优点。

(4)其他模块的选择
本设计无线接收模块采用nRF905模块,采用发光二极管和蜂鸣器做声光指示,RT12864液晶显示器做显示,由SK-SDMP3语音模块给出语音提示,ZLG7290按键模块作为输入环节。

1.2设计与论证
1.2.1定位方案的设计
本设计采用测量音频信号传递时间的方法来定位,将音频输入信号接入单片机外部中断口,当接收到音频信号的时候,单片机通过外部中断打开定时器,开始计时;当下一次音频信号输入的时候再次进入中断关闭定时器,由于8位的ATmega128单片机采用11.0592M的晶振,定时器最小定时时间为:
=90.4ns
而题目最高要求定位精误差小于1cm,即:
=28μs
通过时间上的比较可知定时器完全可以精确到最高要求的时间,理论上完全可以实现精确定位。

1.2.2误差信号产生及控制算法分析
本设计采用单片机计时两个音频信号的间隔时间来计算空间距离,由于声音传播的速度受温度以及其它因素的影响,且计时器本身也存在时
间误差,所以测试到的时间差值并不是真正声音传播
时间的差值,而是一个时间差的偏差值,但影响时间
差值的因素是相同的,所以,所计算到的时间偏差还
是成线性关系,同样还是可以利用这个时间差来计算
距离差。

本设计采用模糊补偿定位法。

如图1.2.2,先通过
音频信号的输入大概确定小车到B点的距离,然后分
区进行时差补偿。

只要多分区,误差就可以不断减少。

时差补偿之后对A、B两点所测的时间差进行简单的
比较,若:
->0
说明没有到达中线,电动车继续向前走;当图1.2.2 系统模型原理图
-=0
说明已到达Ox线,因为Ox在以AB为底的等腰三角形的中线上,中线到两角的距离相等。

定位W点的时候也是同样的原理。

2单元电路设计
2.1系统组成
通过以上设计方案的论证与分析,可以得出如图2.1.1所示的系统框图。

系统分为主从机控制,主机系统主要由音频接收模块、RT12864显示模块、SK-SDMP3语音模块、LM386功放模块以及ZLG7290按键模块组成,实现音频信号的采集和显示,并通过无线返回给从机,整个过程有语音提示。

机系统由声源控制模块,电机驱动模块以及声光显示模块组成。

主要实现音频信号的发生和执行控制电动车。

系统框图如图2.1.1所示。

图2.1.1系统设计框图
2.2控制器电路设计
主机控制器采用ATmega128单片机,最小系统由Atmega128单片机、复位电路、时钟电路以及接口电路组成(采用购买的模块)。

ATmega128有丰富的I/O口资源和存储空间、32个通用工作寄存器、实时时钟RTC、多通道PWM、SPI串行端口、以及六种可以选择的省电模式,可工作在低耗模式。

从机控制器采用STC89C52单片机,最小系统由STC89C52单片机、复位电路、时钟电路以及接口电路组成,最小系统原理图如附录1图2.2.1 a图所示。

STC89C52单片机具有增强型8051内核,具有较多I/O口资源,极低功耗,抗干扰能力强。

2.3音频接收电路设计
音频接收采用驻极体电容话筒,通过LM386的放大后接入比较器LM311,LM311的3脚接可调电阻,通过调节3脚的电压大小就可以选择输入信号大小,还可以抗干扰。

模拟信号经过LM311比较器之后输出数字信号。

电路设计原理图如图2.3.1所示。

图2.3.1 音频接收电路设计原理图
2.4 nRF905无线模块电路设计
无线传输模块用于从机与主机的通信。

从机和主机都采用挪威Nordic VLSI 公司推出的nRF905单片射频收发器。

本设计采用433MHz 的工作频率。

主从机都采用ShockBurst TX 工作模式,通过SPI 接口与
单片机通信,接口简单,操作方便易实现。

主机、从机电路接口图如图2.4.1所示。

图2.4.1 NRF905通讯模块接口图
2.5电机驱动电路设计
电机控制采用NEC 电子电机控制ASSP 芯片MMC-1。

MMC-1通过串行接口与STC89C52单片机连接,选用通道一和通道二控制L298驱动两个直流电机。

L298与ASSP 芯片之间采用光耦进行隔离保护,电路设计原理图如附录2图2.5.1 a 图所示。

2.6 SK-SDMP3语音模块电路设计
SK-SDMP3电路原理图如附录3图2.6.1所示。

模块的19脚和18脚分别为串口数据的输出与输入,18脚与Atmega128单片机的PE1口(串口数据输出口)相连,单片机通过串行通信控制MP3模块,模块的2脚和3脚分别为左声道、右声道输出。

音频信号从NE5534的4脚输入,用来调节输入信号阻抗,为反馈电容。

NE5534
采用同相放大,这里放大倍数取决于可调电阻
的大小:
=
+1
(式2.5)
第二级采用LM386功率放大电路,3脚为输入端,5脚输出,1脚与8脚为增益调整,这里接入10µF 的电容和1k 的电阻。

2.7 其他硬件模块介绍
键盘输入采用ZLG7290键盘/LED 专用驱动模块,电路原理图见附录4图2.7.1a 图;液晶显示模块采用RT12864模块,音频发声电路采用华兴机电有限公司生产的电子蜂鸣器,声光显示模块采用蜂鸣器和发光二极管,采用三极管驱动。

3. 软件设计
3.1开发软件介绍
软件编程工具采用ICCAVR 和KEIL ,使用C 语言编程,程序设计方便,可移植性强。

STC89C52单片机nRF905无线模块接口
TRX_CE AM MISO SCK TX_EN
POW_UP
CD
DR
MOSI
C SN
ATmega128单片机nRF905无线模块接口TRX_CE AM MISO SCK TX_EN POW_UP CD DR MOSI C SN
3.2系统程序设计
3.2.1主机系统主程序
主机系统的主程序流程图如图3.2.1所示,程序初始化之后主机发送给从机一个发声命令,同时打开外部中断,等待外部音频信号是输入。

由音频信号触发定时器计时,当下一次音频信号到达的时候关闭定时器和外部中断,由于三个不同方向的距离不同,所以音频信号到达的时间也不同,由计时器记得的时间可以计算出时间差值,由时间差值即可判断小车是否已经定位,若已经定位好了,主机通过无线发送命令给从机控制小车停止,若没有定位,则继续进入下一次音频信号接收时间的比较与计算。

3.2.2从机系统主程序
从机系统的主程序流程图如图3.2.2所示,Array程序开始后等待接收主机通过无线发来的指
令,如果没有接收到指令,则一直等待。

如果
接收到指令,则进行指令判断,是小车运动指
令还是小车停止指令。

如果是小车运动指令,
则进入音频发声函数并通过ASSP芯片MMC-1
控制小车的前进与后退,小车在完成相应指令
之后,给主机发送一个数据,说明已经完成动
作,等待主机的下一个指令;如果是小车停止
指令,则停转电机,并发出相应的声光显示,
标志已经到达定位点。

3.2.3其他子程序
从机控制器还调用了无线收发子程序、电
机调速子程序、音频信号发声子程序、声光报
警子程序,主机控制器调用了数据处理程序、图3.2.1 主机主系统流程图
无线收发、ZLG7290键盘读取程序、RT12864 Array
液晶显示、语音播报子程序。

4.系统测试
4.1测试使用的仪器及设备
测试仪器主要有示波器,秒表和卷尺,
根据系统要求可知仪器的精度要求比较高,
详细清单见附录5表4.1.1。

4.2指标测试和测试结果
声音导引系统测试分三部分测试:基本
要求数据测试、功能测试、发挥部分数据测
试。

测试场地说明:场地大小要求如题目给
出的条件,示意图见附录6图4.2.1。

(1)音频信号的测试:设计要求制作一个频率不限,脉冲周期不限的声源,采用示
波器观察的测试方法测试,测试结果:声源频图3.2.2 从机系统主程序流程图
率3.1KHz左右,脉冲周期可变,满足要求。

(2)平均速度ν的测试:可移动声源发出声音后开始运动,到达Ox线并停止,位移为s,这段运动时间为响应时间t,测量响应时间t,用下列公式计算出响应的平均速
度ν,要求平均速度大于5cm/s。

发挥部分要求平均速度大于10cm/s。

ν =;(式2)
测试数据如附录7表4.2.2所示,测试总结结果如表4.2.3所示。

平均速度ν为14.0cm/s。

表4.2.3 基本数据测试结果表
差小于3cm。

发挥部分要求小于1cm。

测试数据如附录8表4.2.4所示,测试平均误差为1.4cm。

(3)定位超调量测试:可移动声源在运动过程中任意时刻超过Ox线左侧的距离小于5cm,发挥部分要求小于2cm。

测试平均超过左侧距离为2.3cm。

(4)平均速度的测试:在完成基本要求部分移动到Ox线上后,可移动声源在Ox线处可停止5s~10s,然后利用接收器A和C,使可移动声源运动到W点,移动距离为,到达W 点以后,必须有明显的光和声指示并停止,测量响应时间,此时声源距离W的直线距离小于1cm。

整个运动过程的平均速度应大于10cm/s。

ν’ =;(式3)
测试数据如附录9表4.2.5所示,测试总结结果如表4.2.6所示。

平均速度ν’为12.9cm/s。

实物图见附录10图4.2.1。

表4.2.6基本数据测试结果表
平均速度
4.3 测试结果分析
测试结果表明,系统完成了基本要求和发挥部分,但仍有误差,分析测试数据和硬、软件结构,造成误差的主要原因有以下几点:测试时间相当比较短(平均在5s以内),而人测试需要反应时间,当对于小的测试时间,反应时间的影响就有很大了;三个音频接收电路相差只有1m,而声速有350m/s,在细微的距离变化上,时间变化更加微弱,所以会造成一定精度误差;小车本身的机械安装以及软件系统本身的计时误差都会对响应时间造成影响。

经过多次测试,基本要求部分平均速度ν为14.0cm/s,定位误差位为1.04cm,定位最大超调量为
3cm,发挥部分平均速度ν’为12.9cm/s。

5.结论
声音导引系统分为主机控制部分、从机控制部分两部分。

主机控制部分主要分为音频接收模块、语音模块、按键以及等模块;从机控制部分主要分为音频发声模块、电机驱动模块以及声光显示模块;主从机通讯由nRF905无线模块完成。

采用低功耗ATmega128单片机作为主控制器,通过比较器把音频模拟信号转化成数字信号,方便控制;采用单片机内部定时器计时,有利于精确计时;使用语音播报以及液晶显示,使设计具有人性化;使用NEC公司提供的电机控制ASSP芯片,可实现256档调速。

通过软件算法实现了小车的快速调速与定位,完成了基本部分和发挥部分的部分设计要求。

参考文献
1.黄智伟. 全国大学生电子设计竞赛系统设计[M].北京:北京航空航天大学出版社, 2006.
2.高吉祥.全国大学生电子设计竞赛培训系统教程[M].北京:电子工业出版社,2007.
3.姚福安.电子电路设计与实践[M].济南:山东科学技术出版社,2002
4.张立.现代电力电子技术基础[M].北京:高等教育出版社,1999.
5.张伟,吴红杰,徐海鹰. Protel DXP高级应用[M] .北京:人民邮电出版社.2002.
附录1图2.2.1
图2.1.1 a图 STC89C52单片机最小系统原理图
图2.1.2 b图 STC89C52单片机最小系统底层印制版图附录2图2.5.1
图2.4.1 a图电机驱动电路设计原理图
图2.4.1 b图电机驱动电路设计底层印制板图
图2.4.1 c图电机驱动电路设计顶层印制板图
图2.4.1d图电机驱动电路设计元件布局图附录3图2.6.1
图2.5.1a SK-SDMP3语音模块与原理图
图2.5.1b SK-SDMP3语音模块与底层印制板图
图2.5.1c SK-SDMP3语音模块顶层印制板图
图2.5.1d SK-SDMP3语音模块元件布局图
附录4图2.7.1
图2.7.1 a ZLG7290键盘/LED模块原理图
图2.7.1 b ZLG7290键盘/LED 底层印制板图
图2.7.1 c ZLG7290键盘/LED 顶层印制板图
图2.7.1 d TOP 元件布局图
附录5表4.1.1
表4.1.1 测试工具表
附录6图4.2.1
S 可移动声源
测试场地示意图
附录7表4.2.2
表4.2.2 基础部分平均速度测试表
附录8表4.2.4
表4.2.4 定位误差测试表
附录9表4.2.5
表4.2.2发挥部分平均速度测试表
附录10图4.2.1
图4.2.1实物图
附录10主要元件清单
附录10程序清单
#include <iom128v.h>
#include <iom128.h>
#include <macros.h>
#include <BIT.h>
#include <delay.h>
#include "NRF905.C"
#include "12864.h"
#include "zlg7290.c"
#include "pic.h"
#include "mp3.h"
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler Exter4:6 //定义外部中断向量(0~7)中断向量为(2~9)
#pragma interrupt_handler Exter5:7 //定义外部中断向量(0~7)中断向量为(2~9)
#pragma interrupt_handler Timer1:15 //定时器1溢出中断向量
uchar RxBuf[4]={0};
uchar TxBuf[4]={0}; //定义发送数组发送命令两个电机的正反转及速度hhhh
uint Time_count=0; //时间计数器
uchar start_flag=0;
uchar DAT_flag=0;
uchar XZ[3]={0};
uint dw_count=0,DAT_B=0;
uchar Exter5_flag=0,Exter4_flag=0;
uchar ox_flag=0,send_flag=0;
uchar dw_flag=0; //定义ox中线标志为0时未到达ox线为1到达ox 线
uchar rev_flag=0; //定义接收标志用来判断哪个先接收到超声波为1时表明已有接收器先接到超声波
/*******************************************
函数名称: Timer1_Init()
功能: 定时器1 定时计数模式初始化函数晶振11.0592M
主要设置输出模式
/********************************************/
void Timer1_Init()
{
TCCR1B=0X01; // 设置分频数为1 计数频率为11.0592MHZ TCNT1H=0xFF; // FF 设置计数初值每10微秒进入定时器中断处理子函数
TCNT1L=0x91; // 91 TCNT3=65536-fclk*T
TIMSK&=~BIT(2); //关闭定时器1
}
/*******************************************
函数名称: Exter_Init()
功能: 外部中断4 5 6初始化
参数: 无
返回值: 无
/********************************************/
void Exter_Init(void)
{
SEI(); //使能全局中断
EIMSK&=~(BIT(4)|BIT(5)); //使能外部中断4 5 6 EIMSK的0~7分别是外部中断0~7的使能位
EICRB|=BIT(1)|BIT(3); //外部中断4采用下降沿触发外部中断需要两位来设置ISCn1 ISCn0
//EICRA为外部中断0~3中断方式设置位EICRB为外部中断4~7中断方式设置位DDRE&=~(BIT(4)|BIT(5)); //配置中断管脚为输入D0~D3为外部中断0~3输入口E4~E7为外部中断4~7输入口
PORTE|=BIT(4)|BIT(5); //使能中断管脚的上拉
}
/*******************************************
函数名称: Timer1()
功能: 定时器1中断服务子函数
返回值: 无
/********************************************/
void Timer1()
{
TCNT1H=0xFF;// FF 设置计数初值每10微秒进入定时器中断处理子函数TCNT1L=0x91;
Time_count++;
}
void run_w()
{
uchar i;
uint speed=0;
if(DAT_B>=1955)
{
speed=80;
send_flag=2;
}
if((DAT_B>=1907)&&(DAT_B<1955))
{
speed=40;
send_flag=2;
}
if((DAT_B>=1861)&&(DAT_B<1907))
{
speed=10;
send_flag=2;
}
if((DAT_B>=1800)&&(DAT_B<1861))
{
speed=10;
send_flag=1;
}
if((DAT_B>=1760)&&(DAT_B<1800))
{
speed=40;
send_flag=1;
}
if(DAT_B<1730)
{
speed=80;
send_flag=1;
}
for(i=2;i>0;i--)
{
TxBuf[0]=0x03;//如果距离B点(外部中断5入口)较近小车前进
TxBuf[1]=0xfe;//两电机速度
TxBuf[2]=0xfe;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
delayms(160);
TxBuf[0]=send_flag;//如果距离B点(外部中断5入口)较近小车前进TxBuf[1]=0xfe; //两电机速度
TxBuf[2]=0xfe;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
delayms(speed);
TxBuf[0]=0x05; //如果距离B点(外部中断5入口)较近小车前进SetTxMode();
TxPacket(TxBuf);
SetRxMode();
tishi_data[6]=0x34;
tishi_data[7]=0x39;
for(i=0;i<9;i++) //发送开机界面语音提示
{
USART0_SendB(tishi_data[i]);
}
}
void jiaozheng()
{
if(dw_flag==1)
{
if(DAT_B>=1955)
{
XZ[0]=46;
XZ[1]=27;
XZ[2]=20;
}
if((DAT_B>=1907)&&(DAT_B<1955))
{
XZ[0]=85;
XZ[1]=65;
XZ[2]=50;
}
if((DAT_B>=1861)&&(DAT_B<1907))
{
XZ[0]=95;
XZ[1]=76;
XZ[2]=55;
}
if((DAT_B>=1800)&&(DAT_B<1861))
{
XZ[0]=95;
XZ[1]=75;
XZ[2]=57;
}
if((DAT_B>=1760)&&(DAT_B<1800))
{
XZ[0]=100;
XZ[1]=85;
XZ[2]=60;
}
if(DAT_B<1700)
{
XZ[0]=160;
XZ[1]=90;
XZ[2]=65;
}
}
}
/******************************************* 函数名称: Extint4()
功能: 外部中断4服务程序(将全局变量加一)参数: 无
返回值: 无
/********************************************/ void Exter4(void)
{
uchar i;
if(Exter4_flag==0)
{
Exter4_flag=1;
EIMSK&=~BIT(4);
if(rev_flag==0)
{
rev_flag=1;
TCNT1H=0xFf;// FF 设置计数初值每10微秒进入定时器中断处理子函数TCNT1L=0x91;// 91 TCNT3=65536-fclk*T
TIMSK|=BIT(2);//打开定时器1
}
else
{
rev_flag=0;
TIMSK&=~BIT(2);//关闭定时器1
LcdWrite_com(0x9b);
LcdWrite_data(Time_count/1000+0x30);
LcdWrite_data(Time_count%1000/100+0x30);
LcdWrite_data(Time_count%100/10+0x30);
LcdWrite_data(Time_count%10+0x30);
delayms(500);
if(start_flag)
{
if(Time_count>XZ[0])//如果超出指定范围
{
TxBuf[0]=0x01; //如果距离B点(外部中断5入口)较近小车前进
TxBuf[1]=0xfe; //两电机速度
TxBuf[2]=0xfe;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
else
{
if(Time_count>XZ[1])
{
TxBuf[0]=0x01;//如果距离B点(外部中断5入口)较近小车前进
TxBuf[1]=0xe6;//两电机速度
TxBuf[2]=0xe6;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
else
{
if(Time_count>XZ[2])
{
TxBuf[0]=0x01; //如果距离B点(外部中断5入口)较近小车前进
TxBuf[1]=0xd0;//两电机速度
TxBuf[2]=0xd0;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
else
{
tishi_data[6]=0x34;
tishi_data[7]=0x38;
for(i=0;i<9;i++) //发送开机界面语音提示
{
USART0_SendB(tishi_data[i]);
}
ox_flag=1;
TxBuf[0]=0x05;//如果到达指定范围内小车停止
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
}
}
}
else
{
start_flag=1;
TxBuf[0]=0x01;
TxBuf[1]=0x01;
TxBuf[2]=0x01;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
Time_count=0;
}
}
}
/*******************************************
函数名称: Extint5()
功能: 外部中断5服务程序(将全局变量加一)
参数: 无
返回值: 无
/********************************************/
void Exter5(void)
{
uchar i;
if(dw_flag==0)
{
TIMSK&=~BIT(2);//关闭定时器1
PORTA=0XAA;
LcdWrite_com(0x98);
LcdWrite_data(Time_count/1000+0x30);
LcdWrite_data(Time_count%1000/100+0x30);
LcdWrite_data(Time_count%100/10+0x30);
LcdWrite_data(Time_count%10+0x30);
delayms(500);
dw_count++;
if(dw_count>=5)
{
DAT_B=Time_count;
dw_flag=1;
DAT_flag=0;
jiaozheng();
EIMSK|=BIT(5)|BIT(4);
TxBuf[0]=6;SetTxMode();TxPacket(TxBuf);SetRxMode();
}
else
DAT_flag=1;
Time_count=0;
}
else
{
if(Exter5_flag==0)
{
Exter5_flag=1;
EIMSK&=~BIT(5);
if(rev_flag==0)
{
EIMSK&=~BIT(4);
rev_flag=1;
TCNT1H=0xFf;// FF 设置计数初值每10微秒进入定时器中断处理子函数
TCNT1L=0x91;// 91 TCNT3=65536-fclk*T
TIMSK|=BIT(2);//打开定时器1
EIMSK|=BIT(4);
}
else
{
rev_flag=0;
TIMSK&=~BIT(2);//关闭定时器1
LcdWrite_com(0x98);
LcdWrite_data(Time_count/1000+0x30);
LcdWrite_data(Time_count%1000/100+0x30);
LcdWrite_data(Time_count%100/10+0x30);
LcdWrite_data(Time_count%10+0x30);
delayms(500);
if(start_flag)
{
if(Time_count>XZ[0])//如果超出指定范围
{
TxBuf[0]=0x02;//如果距离A点(外部中断4入口)较近小车后退
TxBuf[1]=0xfe;//两电机速度
TxBuf[2]=0xfe;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
else
{
if(Time_count>XZ[0])
{
TxBuf[0]=0x02;//如果距离B点(外部中断5入口)较近小车前进
TxBuf[1]=0xe0;//两电机速度
TxBuf[2]=0xe0;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
else
{
if(Time_count>XZ[0])
{
TxBuf[0]=0x02;//如果距离B点(外部中断5入口)较近小车前进
TxBuf[1]=0xcf;//两电机速度
TxBuf[2]=0xcf;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
else
{
TxBuf[0]=0x05;//如果到达指定范围内小车停止
tishi_data[6]=0x34;
tishi_data[7]=0x38;
for(i=0;i<9;i++)//发送开机界面语音提示
{
USART0_SendB(tishi_data[i]);
}
ox_flag=1;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
}
}
}
else
{
start_flag=1;
TxBuf[0]=0x01;
TxBuf[1]=0x01;
TxBuf[2]=0x01;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();
}
Time_count=0;
/*TxBuf[0]=0x01;
SetTxMode();
TxPacket(TxBuf);
SetRxMode();*/
}
}
}
}
void KeyScan()
{
uchar KeyValue;
if(FlagINT) //如果有键按下
{
FlagINT = 0;//清除中断标志
ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);//读取键值
switch(KeyValue)
{
case 1: LcdWrite_com(0x90);
LcdWrite_data(0x20);
LcdWrite_data(0x10);
LcdWrite_com(0x88);
LcdWrite_data(0x20);
LcdWrite_data(0x20);
// OX_flag=1;
break;
case 2: LcdWrite_com(0x90);
LcdWrite_data(0x20);
LcdWrite_data(0x20);
LcdWrite_com(0x88);
LcdWrite_data(0x20);
LcdWrite_data(0x10);
// OY_flag=1;
break;
case 5: TxBuf[0]=5;SetTxMode();TxPacket(TxBuf);SetRxMode();break;
case 6: PORTA=0XDD;
TxBuf[0]=6;SetTxMode();TxPacket(TxBuf);SetRxMode();
TCNT1H=0xFf;// FF 设置计数初值每10微秒进入定时器中断处理子函数
TCNT1L=0x91;// 91 TCNT3=65536-fclk*T
TIMSK|=BIT(2);//打开定时器1
break;
case 7: TxBuf[0]=7;SetTxMode();TxPacket(TxBuf);SetRxMode();break;
default:break;
}
}
}
void System_Init()
{
Exter_Init();//外部中断4 5 6 初始化
Timer1_Init();//定时器1初始化
Zlg7290_Init();// ZLG7290初始化
USART0_Init(9600);
Lcd12864_Init();
nRF905Init();
SetRxMode();
}
void main()
{
uchar KeyValue,i;
DDRA=0XFF;
System_Init();
disp_pic(kaiji);
for(i=0;i<5;i++)//发送开机界面语音提示
{
USART0_SendB(volume_data[i]);
}
tishi_data[6]=0x34;
tishi_data[7]=0x37;
for(i=0;i<9;i++)//发送开机界面语音提示
{
USART0_SendB(tishi_data[i]);
}
while(!FlagINT);
FlagINT=0;
clear_dis();
Lcd_writexy(1,1,"声音导引系统");
Lcd_writexy(2,2,"OX轴定位");
Lcd_writexy(3,2," W点定位");
EIMSK|=BIT(5);
while(1)
{
if((dw_flag==1)&&(ox_flag==0))
{
if (RxPacket(RxBuf) == 1)//返回1 表明有数据包接收到
{
EIMSK|=BIT(4)|BIT(5);
Exter4_flag=0;
Exter5_flag=0;
PORTA=0XAA;
}
}
KeyScan();
if(DAT_flag==1)
{
DAT_flag=0;
TxBuf[0]=6;SetTxMode();TxPacket(TxBuf);SetRxMode();
TCNT1H=0xFf;// FF 设置计数初值每10微秒进入定时器中断处理子函数
TCNT1L=0x91;// 91 TCNT3=65536-fclk*T
TIMSK|=BIT(2);//打开定时器1
}
if(ox_flag==1)
{
ox_flag=0;
delayms(100);
run_w();
}
}
}。

相关文档
最新文档