找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1873|回复: 0
打印 上一主题 下一主题
收起左侧

语音识别跳舞机器人设计论文

[复制链接]
跳转到指定楼层
楼主
ID:375381 发表于 2018-7-20 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 绪论        1
1.1 选题的背景及意义        1
1.2 国内外的研究现状以及发展趋势        1
1.3 工作的预期成果        2
1.4 主要研究内容        2
2 系统总体设计方案        2
3语音识别功能        3
3.1 LD3320语音模块的介绍        3
3.2 LD3320主要特色功能        4
3.3 内部单元模块        4
3.4 关键词的录入        5
4 单片机及各个模块的介绍        5
4.1 STC单片机简介        5
4.2 电机驱动模块        6
4.2.1 L298N芯片        6
4.2.2 PWM调速        6
4.3数码管        7
4.3.1 数码管的应用        7
4.3.2 数码管的结构        7
4.4 稳压电路        8
4.5 加速、减速        9
5 系统软、硬件设计        9
5.1 系统仿真及软件设计        9
5.2 实物图        12
结论        12
参考文献        14
附录        15
致谢        22




1 绪论
1.1 选题的背景及意义
当前,机器人只是能够对人类进行简单模仿。这远远达不到人类所需求的功能。人们一直都在寻求一种方式能让机器识别出人类语言。因此,为了适应人类科学技术的发展与对于人机交流日益增长的需求,语音识别技术应运而生。比如玩具市场,拥有高科技技术的智能化玩具发展迅速。电子化的玩具逐渐取代传统的玩具成为发展潮流。虽然我国是玩具生产大国,但在高科技玩具领域依然有很大的发展空间。所以,增加对该方面研究的重视程度,在技术的创新方面和推动我国经济快速发展的方面,都有其现实的意义。除此之外,机器人还能够取代我们完成危险性的工作或者具有重复性以及精确度高的工作。利用语音识别的方法,机器人可以把人类所说的话转化为机器人可识别命的令。与机器人进行语音交互是人类梦寐以求的事情。最近几年,语音识别技术的发展迅猛,成绩显著且逐渐步入市场。
1.2 国内外的研究现状以及发展趋势
近几年,单片机越来越便宜,使用的数量越来越多。国外机器人性能越来越强,器件集成化,模块化逐渐成为发展趋势。其不仅方便使用还在很大程度上减小维修时的工作量。基于PC机的开放型控制器逐渐代替传统的模式成为新型的高科技技术。目前机器人的特点不再是追求全自治系统而是追求人机交互技术。除此之外,新兴起的VR技术也在机器人中得到很大的应用。
机器人的制造及应用水平,代表了一个国家的制造业水平,发展机器人产业应上升到国家战略高度。机器人的广泛使用是我国从制造业大国走向制造业强国的重要手段和途径。
我国对机器人的学习起步时间相比于国外较晚,但发展迅猛,在国内外占据了一定的市场。从1970-1980的刚刚开始起步,到1980-1990进行逐步探索,再到1990至今开始应用,我国机器人发展越来越快。蛇形机器人的问世表明我国制造机器人的能力又向前迈进了一大步。
对于我国来说,机器人的制造还存在局限性。在机器人的制造时还有部分零件需要进口,不能实现独立自主的创造。所以未来的工作主要是研究机器人的核心控制器。该控制器还需具有自主性,实现从中国制造向中国创造的转变。除此之外,还应形成一个完善的标准,实现模块化的结构,以便于后期的改造集成。更好的与传感器结合,结合VR技术以及正在蓬勃发展的人机交互技术才能更好的实现智能化。
综合国内外机器人研究和应用现状,机器人的研究正在超智能化、模块化、系统化、微型化、多功能化及高性能、自诊断、自修复趋势发展,以适应多样化、个性化的需求向更大更宽广的应用领域发展。
1.3 工作的预期成果
本次设计希望能够通过LD3320语音识别模块识别语音指令并把相似度最高的关键字所代表的内容发送给单片机,以达到控制机器人前进,后退,左转,右转和加减速的目的,同时可以使数码管显示“1”,“2”,“3” 或“4”。
1.4 主要研究内容
本文主要研究当机器人加入了语音识别功能时出现的问题及解决办法。语音识别的实现分为3部分:关键字的写入,ID的设置,识别过程。除此之外,还详细描述语音识别系统将识别结果传递给主控单片机后,单片机是如何驱动电机以及如何对数码管进行控制。
根据以上内容,我们可以大致了解本次设计所需要做的工作。下面,我们着重介绍该语音识别机器人系统的总体设计方案。
2 系统总体设计方案
本次设计中,首先通过麦克风将语音信号传入语音识别芯片,当语音模块与参考模式库中的关键词列表相比对后,将识别结果传送给主控制器。然后,主控制器分别控制数码管的显示和直流电机转动。
语音识别机器人原理图如下:
图2-1 语音识别机器人原理
本次设计分为两个大的部分:语音识别部分和由STC控制的电路部分。第一步,语音识别模块部分和由STC控制的电路部分都进行初始化工作,主要包括变量的设定,设置定时器的工作方式,还有关于中断的设置等。然后对语音模块写入关键词列表,打开循环系统,检测是否有信号触发系统工作,如果是,则开始定时。在此次定时结束之前,检测是否有声音的输入,如果有,就进行匹配;没有的话,就开始下一次的循环。通过频谱分析的方法检测是否为关键词列表中的词,不是的话就进行下一次循环,是的话就作为最佳的结果输出给单片机的P3^0到P3^7引脚,并由单片机控制数码管和电机。
图2-2为实现该语音识别机器人的流程图。

图2-2 语音识别机器人流程图
接下来,介绍本次设计中的语音识别部分的知识。
3语音识别功能
3.1 LD3320语音模块的介绍
LD3320芯片的优势是其采用了非特定人语音识别技术。即任何人在指令正确的前提下,都可以控制。基于LD3320可以轻松实现多人使用的功能。
语音识别是完成语音控制的核心技术。通过语音实现人机交互成为目前研究的难点和热点。这次设计所用到的语音模块是运用STC11L08XE单片机,配合ICRoute公司的高性能LD3320语音识别芯片,分别实现语言控制系统的主控制模块、总体结构和语音识别模块的软硬件设计。运用该模块实现了基于非特定人语音识别系统的设计。
语音的识别过程主要有两个阶段:训练阶段与识别阶段。无论是训练还是识别阶段,输入的语音都必须经过预处理和特征提取两个过程。其中训练阶段是利用用户输入的多次训练语音,通过预处理和特征提取两个过程,得到特征参数,最后利用特征参数建模,完成训练语音参考模型库的建立。识别阶段是将输入的语音特征矢量参数和参考模式库中的参考模型进行相似性度量比较,然后把相似度最高的输入特征矢量作为识别结果输出,从而达到语音识别的目的。
工作原理图如图3-1所示:

图3-1语音识别原理框图
3.2 LD3320主要特色功能
1、非特定人语音识别技术:不需要用户进行录音训练。
2、可动态编辑的识别关键词语列表:只需要把识别的关键词语以字符串的形式传送进芯片,即可以在下次识别中立即生效。比如,用户在单片机的编程中,简单地通过设置芯片的寄存器,把诸如“你好”这样的识别关键词的内容动态地传入芯片中,芯片就可以识别这样设定的关键词语了。
3、真正单芯片解决方案:不需要任何外接的辅助Flash和RAM,真正降低系统成本。
4、内置高精度A/D和D/A通道:不需要外接AD芯片,只需要把麦克风接在芯片的AD引脚上。
5、高准确度和实用的语音识别效果。
6、支持用户自由编辑50条关键词语:在同一时刻,最多在50条关键词语中进行识别,终端用户可以根据场景需要,随时编辑和更新这50条关键词语的内容。
3.3 内部单元模块
LD3320语音识别模块的主控制单元STC11L08XE能更好的处理数据且输入输出端口方便控制。其内部就包含一个很可靠的复位电路,适用于干扰大,速度要求快的环境。其内部包含CPU、程序存储器、数据存储器、定时器、计数器、输入输出接口、看门狗、片内\片外振荡电路、UART串口等。
3.4 关键词的录入
关键词列表的形成是LD3320中关键的部分。STC11L08XE单片机可以在收到外部一个触发后,启动定时识别过程并且在这个时间段内说出想要识别的关键词语。超过这个时间后,需要用户再次触发才能启动一个识别过程。也可以使用反复识别的方法,没有语音时,则识别过程定时结束后再启动一个新的识别过程。有语音时,则在根据识别作相应处理后,再次开启新的识别过程。当需要的关键词语录入完毕后,可以适当录入一些类似的词语。这些类似的词被称作“垃圾关键词语”,这是为了减少错误识别的情况。例如,针对“北京”这个词,我们可以在补充“北方”,“南京”这种类似的词。当识别出“北京”后,我们可以断定结果是正确的。如果出现“北方”,“南京”,就可以判断是由于杂音造成的错误,并且接着启动一次检测。采用该方法,可以很大程度上减少错误识别出现的情况。因为只有识别结果在所指定的关键词中才被认为是有效的词语。
关键词语的录入是通过拼音串的形式录入模块中的。在录入拼音串时要同步录入相应的ID。用这个ID指代该关键词语。相应的,语音模块识别出相似度最高的词也是通过该ID传出。终端用户在说语音指令时,可能对同一词汇有不同的发音习惯。比如“打开电灯”和“开灯”,“打开灯”,“把灯打开”。我们可以用同一个ID来指代这些意思相同的词汇。另外,还可以把添加的垃圾关键词语的ID都标记为一个值。这样在程序中就很容易识别错误的词汇。
充分利用LD3320的50条可动态编辑的关键词语,开发者可以把这些习惯发音都设置进芯片,这样无论用户怎么说,都会被识别出来,进一步增加终端用户的良好体验。
4 单片机及各个模块的介绍
4.1 STC单片机简介
单片机全称是单片微型计算机,内部主要是将5个部分集成在芯片内,这5个部分分别为中央处理器、定时/计数器、只读存储器、随机存储器以及输入和输出接口电路。
随着单片机的发展,适用于不同领域的单片机逐渐出现。单片机的优势是其在计算方面很强大并且计算用的时间很短。单片机的优势确保了其能够应用的行业非常全面,早就作为各行各业中的智能化器件,对各行各业的产品技术改造起到了不容忽视的作用。
在众多的51系列单片机中,要算国内STC公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有FLASH工艺的大容量程序存储器。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
4.2 电机驱动模块
4.2.1 L298N芯片
电机驱动模块部分所用的芯片为L298N芯片,有4通道逻辑驱动电路。内含2个H桥的高电压大电流双全桥式驱动器,接受标准TTL逻辑电平信号,可驱动46V、2A以下的电机。该芯片所采用的SMT工艺具有稳定性高的特点。该模块可以直接控制两路直流电机,方便控制直流电机速度和方向。
L298N有逻辑电源和动力电源两路电源,5V为逻辑电源,7.2V为动力电源。EN_A、EN_B控制电机是否使能,IN1、IN2、IN3、IN4控制电机的正转反转以及转速。本次使用的电机是线圈式的,从运行状态突然转换到停止状态和从顺时针状态突然转到逆时针状态时会形成很大的反向电流,在电路中加上二极管的作用就是在产生反向电流的时候进行泄流,保护芯片安全。
L298N的逻辑功能为当EN_A,EN_B均为低电平时,两个电机没有通电而不会工作或者断电处于一种刹停状态。当EN_A,EN_B均为高电平时,两个电机使能,会根据IN1、IN2、IN3、IN4的状态控制电机旋转的方向以及速度。当把“1”传进IN1端口,IN2为“0”时,电动机顺着时间指针转,当IN1为“0”,“1”信号传进IN2时,电动机就会以相反的方向转。
4.2.2 PWM调速
PWM(脉冲宽度调制)是通过控制固定电压的直流电源开关频率,改变负载两端的电压,从而达到控制要求的一种电压调整方法。PWM可以应用在许多方面,比如:电机调速、温度控制、压力控制等等。
在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并且根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来达到改变平均电压大小的目的,从而来控制电动机的转速。
图4-1 PWM调速方波图
上图的方波周期为10ms,由图显而易见每个周期的脉冲宽度并不同。这是由于每个周期的占空比不同。明显可以看出上图为数字信号,为了使其能控制模拟电路,我们可以改变该方波的周期。假设方波的周期很小很小,这时电机的转速就会显示不同的状态。假设一个时间段内都是“1”时,轮子顺时针旋转,那么如果一个时间段内“1”持续的时长是9ms,转速就会小于该时间段内都是“1”时的转速。这样就能够通过改变电平高低持续的时间来达到改变轮子转速的目的。该方法不仅化简了硬件电路而且降低设计成本。
4.3数码管
4.3.1 数码管的应用
共阴极数码管是一类数字形式的显示屏,通过对其不同的管脚输入不同的电流,会使其发亮,从而能够显示时间、日期、温度等所有可用数字表示的参数。由于它的价格便宜、使用简单、在电器,特别是家电领域应用极为广泛,空调、热水器等等。绝大多数热水器用的都是数码管,部分家电使用液晶屏与荧光屏。
4.3.2 数码管的结构
在共阴极数码管结构中,各段发光二极管的阴极连在一起并且接地,某段发光二极管输入为高电平时,该段发光。一位数码管的每一段划都由一个发光二极管点亮,所以,一位数码管有7个发光二极管构成(加上小数点有8位)。
在a-dp各个引脚分别输送高低电平,可以使数码管分别表现出“0”-“9”,如要显示“1”时,要求b、c引脚输入为高电平,a、d、e、f、g、dp输入为低电平, 16进制表示方式为“0x06”。
共阴极数码管中的0-9的16进制表示方法如下:
字符:  0     1     2      3     4     5     6     7     8     9     
字段码:0x3f  0x06  0x5b   0x4f  0x66  0x6d  0x7d  0x07  0x7f  0x6f
下图即为数码管的结构:


图4-2 数码管原理图
4.4 稳压电路
三端稳压集成电路LM7805。顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。
图4-3 电源模块原理图
外接一个电容用于稳定LM7805内部放大器的工作状态,同时改善电压调整的过渡响应。它的数值为生产厂家规定值,不得小于0.1微法,它的连接必须尽可能紧连LM7805的3脚。
4.5 加速、减速
整个系统的加速减速主要是通过两个按键进行控制,按键按下时,系统的速度就会改变。下图即为原理图,当按下上边的按键时,系统减速,按下下边按键时,系统加速。
图4-4 加、减速原理图
下一章,我们将会介绍各个模块如何相连接,并且通过什么方式控制机器人的各种状态显示。
5 系统软、硬件设计
语音控制机器人的结构中,占首要地位的电子元器件为STC89C52单片机。其次为LD3320语音模块,两个直流电机和L298N模块,以LM7805芯片为核心的稳压电路模块,以共阴极数码管为主的显示电路和各种小器件。
5.1 系统仿真及软件设计
该系统中麦克风收到的语音指令传入到LD3320芯片后,通过频谱分析进行特征提取,然后与关键词列表进行对比。最后,将识别结果传输给STC单片机,然后由主控单片机控制数码管的显示以及两个电机,使机器人完成设计所要求的前进,后退,左转,右转,加减速等运动状态并且同步显示“1”,“2”,“3”或“4”。
图5-1 LD3320功能框图
下面介绍的是我的设计中,编程的主函数的一部分。
while(1)
  {
        if(Y1==0&&Y2==1&&Y3==1&&Y4==1&&Y5==1){car_go(20+level*10,20+level*10);num=1;}//前进
         else
if(Y1==1&&Y2==0&&Y3==1&&Y4==1&&Y5==1){car_back(20+level*10,20+level*10);num=2;}//后退        
         else
        if(Y1==1&&Y2==1&&Y3==0&&Y4==1&&Y5==1){car_go(20+level*10,0+level*10);num=3;}//左转
         else
        if(Y1==1&&Y2==1&&Y3==1&&Y4==0&&Y5==1){car_go(0+level*10,20+level*10);num=4;}//右转
        }
该程序的含义为设置一个无限循环,对Y1、Y2、Y3、Y4、Y5进行实时监测,不同状态执行不同命令。Y1、Y2、Y3、Y4、Y5即为LD3320芯片接收到指令并且识别正确后向主控单片机输出的信号。比如当Y1=0、Y2=1、Y3=1、Y4=1、Y5=1时,执行car_go(20+level*10,20+level*10)命令,机器人前进。
如下图5-3即为仿真中Y1=0、Y2=1、Y3=1、Y4=1、Y5=1时的运动状态和数码管的显示:
图5-2 语音识别机器人仿真
图5-3 语音模块输出实际仿真
语音识别部分的实质也是通过输入指令后,模块输出相应的二进制字符串。如上图可以看出语音识别模块的输出分别与主控单片机的P3^0,P3^1,P3^2,P3^3,P3^6连接,并向其输入Y1、Y2、Y3、Y4、Y5的值。
电机驱动模块的实物中2个电动机分别分布于机器人底部的左右两边,而且可以在底部的前端加上一个万向轮,其中电机支配的是位于前端2个轮子,后端轮子的功能主要是固定,撑起整个硬件。由下图中右图可以看出,L298N芯片的IN1与主控单片机的P1^2连接,IN2与P1^3连接,IN3与P1^4连接,IN4与P1^5连接,达到控制电机的转向与速度的目的。控制电机是否已经通电的EN_A,EN_B引脚与主控单片机的P1^0,P1^1连接。
下图中,左图为单片机最小系统。单片机的最小系统就是由尽可能简单的电子元器件搭配起一个能够正常工作的系统。本次单片机最小系统应用的电子器件有晶振,电容,电阻等。
图5-4 单片机最小系统及电机模块仿真图
图5-5 数码管显示电路
通过P0口输出的值控制数码管的显示。主控单片机的2^4引脚,2^5引脚,2^6引脚,2^7引脚与数码管的1,2,3,4相连来选择数码管是否通电。
5.2 实物图

图5-6 实物图
结论
人工智能正在逐渐改变人类周围的环境,不再只是电影上的设想。不管是一个小小的快递分拣机器人,还是可以简单与人类交流的机器人,都对人类的生活起到了不可小觑的作用。浙江是我国快递流动量最大的地方,最近在网络上大量被转载的一个视频中,小小的机器人每小时可以处理将近2000个快递包裹。这种小机器人能够井然有序的将快递搬到需要投递的地方,大大增加了快递运输的时效性。它们不仅能够减少人工分拣时容易出现的错误情况,还能大大减少人类的工作量。这个例子很好的说明智能机器人紧紧围绕我们的生活,而且越来越大众化。机器人的使用让生产力大大地提高,能够帮助人类完成一些复杂重复性的工作。
通过仿真结果,可以看出当显示“1”,电动机均正转,机器人前进,显示“2”,电动机均反转,机器人后退,显示“3”或“4”,电动机一个正转一个反转,机器人左转或右转,显示“0”,机器人刹停。本次设计利用了LD3320芯片去完成语音识别的机器人的设计,省去了复杂的键盘输入控制。并且可以实现非特定人控制的目的,大大提高了实用性,以便于以后投入市场。
毕业设计是对大学对好的总结,不但考核了我们对于大学知识的学习是否牢固,而且考验了我们对于已经掌握的知识使用是否灵活。同样,这也是我们学习知识的过程,在完成毕业设计的同时,我们能接触到我们没有接触过的领域。这也是我们完善知识储备的一个过程。


















参考文献
[1] 李磊.移动机器人技术研究现状与未来[J].机器人,2002,24(5):475-480.
[2] 赵匀,武传宇,胡旭东等.智能机器人的研究发展及存在的问题[J].农业工程学报,2003,19(1):20-22.
[3] 刘幺和,宋庭新.语音识别与控制应用技术[M].北京:科学出版社,2008,24-30.
[4] 涂时亮.单片微机软件设计技术[M].北京:科学技术文献出版社重庆社分社,1988,24-25.
[5] 朱谨强,王宣因.机器人技术及其应用[J].计算机应用与软件,2004,21(2):47-49.
[6] 陆子明.单片机设计与应用教程[M]. 电子工业出版社.2003.5
[7] 张晨燕,孙成立.非特定人孤立词语音识别系统的片上实现[J].计算机工程与应用,2007(13):194-196.
[8] 丁向荣.STC系列增强型8051单片机原理与应用[M].北京:电子工业出版社.2011.6
[9] 陈国呈编著.PWM逆变技术及应用[M].中国电力出版社.2007.7.
[10] 谢自美.电子线路设计.实验.测试[M]. 华中理工大学出版社.2006.9
[11] 宋庆环,才卫国,高志.89C51单片机在直流电动机调速系统中的应用[M]。唐山学院,2008.4.
[12] 陈锟,危立辉.基于单片机的直流电机调速器控制电路[J],中南民族大学学报(自然科学版),2003.9.
[13] 李维军,韩小刚,李晋.基于单片机用软件实现直流电机PWM调速系统[J],维普资讯,2007.9.
[14] 张鑫.单片机原理与应用[M]. 电子工业出版社.2001.5
[15] 耿德根,詹卫前,李青. 单片机创新开发与机器人制作[M]. 北京航天航天大学.2004.7
[16]潘永雄.新编单片机原理与应用[M]. 西安电子科技大学出版社.2002.9









附录
//主函数
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <DELAY.h>
#include <Robot_car.h>
#include <shumaguan.h>
#define uchar unsigned char
#define uint unsigned int
sbit Y1=P3^0;
sbit Y2=P3^1;
sbit Y3=P3^2;
sbit Y4=P3^3;
sbit Y5=P3^6;
sbit K1=P2^1;
sbit K2=P2^0;
char num=0;
char level=1;
void main(void)
{
  car_init();         
  Y1=Y2=Y3=Y4=Y5=1;         
  while(1)
  {
if(Y1==0&&Y2==1&&Y3==1&&Y4==1&&Y5==1){car_go(20+level*10,20+level*10);num=1;}//前进
         else
if(Y1==1&&Y2==0&&Y3==1&&Y4==1&&Y5==1){car_back(20+level*10,20+level*10);num=2;}//后退        
         else
        if(Y1==1&&Y2==1&&Y3==0&&Y4==1&&Y5==1){car_go(20+level*10,0+level*10);num=3;}//左转
         else
        if(Y1==1&&Y2==1&&Y3==1&&Y4==0&&Y5==1){car_go(0+level*10,20+level*10);num=4;}//右转
         else
        if(Y1==1&&Y2==1&&Y3==1&&Y4==1&&Y5==0){car_go(20+level*10,0);num=5;delayus(100000);
car_back(20+level*10,20+level*10);num=6;         delayus(100000);
        car_go(0,20+level*10);num=7;          delayus(100000);
        car_go  (20+level*10,20+level*10);num=8;          delayus(100000); }//停止
         xianshi2(level,num);
         if(K1==0)
         {        level++;if(level>3) level=1;
                 while(K1==0);
         }
         if(K2==0)
         {        level--;if(level<1) level=3;
                 while(K2==0);
         }
   }
}
//延时函数
#ifndef __delay_H__
#define __delay_H__
#define uchar unsigned char
#define uint unsigned int
unsigned char  flag=0;
uchar  l2=0;
uchar  l3=0;
void DELAY_MS(unsigned int a)//延时函数 1MS/次        
{unsigned int i;
while( --a != 0)
{               
  for(i = 0; i < 600; i++); //一个 ; 表示空语句,CPU空转。
}                                           //i 从0加到125,CPU大概就耗时1毫秒
}
void delayus(uint a)                           //延时1us左右
{
        uchar b;
        for(;a>0;a--)
                for(b=12;b>0;b--);
}
void delay(int num)
{//延时函数
while(num--) ;
}
#endif
//数码管显示部分
#ifndef _shumaguan_H_
#define        _shumaguan_H_
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit qian=P2^7;
sbit bai=P2^6;
sbit shi=P2^5;
sbit ge=P2^4;
uchar TB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
void delay1(uchar tt)
{
uchar i,j;
while(tt!=0)
{
  for(i=0;i<10;i++)
  for(j=10;j>0;j--);
  tt--;
}
}
void xianshi1(uint TT,uint YY)
{
  qian=0;
  P0=TB[TT%100/10];
  delay1(5);
  qian=1;
  bai=0;
  P0=TB[TT%10];
  delay1(5);
  bai=1;
  if(YY==1)          //H
{
  ge=0;
  P0=0x76;        //       0111 0110
  delay1(5);
  ge=1;
}
else        //L
{
  ge=0;
  P0=0X38;  // 0                                  0011 1000
  delay1(5);
  ge=1;
}
}
void xianshi(uchar x,uint S)
{
  qian=0;
  P0=TB[x%10];
  delay1(5);
  qian=1;
  bai=0;
  P0=0x40;
  delay1(10);
  bai=1;
  shi=0;
  P0=0x40;
  delay1(10);
  shi=1;
  ge=0;
  P0=TB[S%10];
  delay1(10);
  ge=1;
}
void xianshi2(uint x,uint y)
{
  qian=0;
  P0=TB[x%10];
  delay1(10);
  qian=1;
  ge=0;
  P0=TB[y%10];
  delay1(10);
  ge=1;
}
#endif
//电机函数
#ifndef _robot_car_H_
#define        _robot_car__H_
#include "delay.h"
#define  uchar unsigned char                  //0~255
#define  uint unsigned int                          //0-65536
sbit PWM1=P1^2;
sbit PWM2=P1^3;
sbit PWM3=P1^4;
sbit PWM4=P1^5;
sbit EN1=P1^0;
sbit EN2=P1^1;
uchar data t_0;
uchar data motor_r;
uchar data motor_l;
uchar data Value;
uchar data mid;
void motor_r_z(void)//右边电动机正转
{
  motor_r=0x64+Value;
  EN1=1;
}
void motor_l_z(void)//左边电动机正转
{
  motor_l=0x64-Value;
  EN2=1;
}
void motor_r_f(void)//右边电动机反转
{
  motor_r=0x64-Value;
  EN1=1;
}
void motor_l_f(void)//左边电动机反转
{
  motor_l=0x64+Value;
  EN2=1;
}
void car_go(uchar left_motor,uchar right_motor)//直行
{
  Value=right_motor;
  motor_r_z();
  Value=left_motor;
  motor_l_z();
}
void car_back(uchar left_motor,uchar right_motor)//后退
{
  Value=right_motor;
  motor_r_f();
  Value=left_motor;
  motor_l_f();  
}
void car_stop(void)//停止
{
  EN2=0;
  EN1=0;
}
void car_init(void)//小车初始化函数
{
TMOD=0x10; //T1工作在方式1
TH1=0xff; //装入T1初值
TL1=0xf6;
TR1=1;//开T0中断
ET1=1;//T0允许中断
EA=1;
t_0=0;
EN1=EN2=0;
}
void time1(void) interrupt 3 using 2
{
TR1=0;
TH1=0xff;
TL1=0xf6;
++t_0;
ACC=t_0;
CY=0;
ACC-=motor_r;
if(CY==1)
{
PWM1=1;
PWM2=0;
goto PWM_2;
}
PWM1=0;
PWM2=1;
PWM_2:
ACC=t_0;
CY=0;
ACC-=motor_l;
if(CY==1)
{
PWM3=1;
PWM4=0;
goto HIGHT;
}
PWM3=0;
PWM4=1;
HIGHT:
ACC=t_0;


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表