自动避障小车课程设计.doc

上传人:小飞机 文档编号:2772478 上传时间:2023-02-24 格式:DOC 页数:44 大小:15.55MB
返回 下载 相关 举报
自动避障小车课程设计.doc_第1页
第1页 / 共44页
自动避障小车课程设计.doc_第2页
第2页 / 共44页
自动避障小车课程设计.doc_第3页
第3页 / 共44页
自动避障小车课程设计.doc_第4页
第4页 / 共44页
自动避障小车课程设计.doc_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《自动避障小车课程设计.doc》由会员分享,可在线阅读,更多相关《自动避障小车课程设计.doc(44页珍藏版)》请在三一办公上搜索。

1、精选优质文档-倾情为你奉上单片机系统课 程 设 计成绩评定表设计课题 : 自动避障小车 学院名称 : 电气工程学院 专业班级 : 自动1105 学生姓名 : 学 号 : 指导教师 : 设计地点 : 31-630 设计时间 : 指导教师意见:成绩: 签名: 年 月 日专心-专注-专业单片机系统课 程 设 计 课程设计名称: 自动避障小车 专 业 班 级 : 自动1105 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计地点: 31-630 课程设计时间: 单片机系统 课程设计任务书学生姓名专业班级学号题 目自动避障小车课题性质产品设计课题来源自拟指导教师主要内容(参数)利用增强版51

2、MCU设计一个自动避障小车,实现以下功能:1、自主判别障碍,自动避开障碍;2、识别出多障碍区和空旷区;3、能在空旷区快速行进,在多障碍区适当速度行进。任务要求(进度)第1天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。第2-5天:按照确定的方案设计电路。画出总体电路图,而且选好各个元件的参数、数量类型。然后由原理图生成PCB,用热转印法腐蚀这个电路板。 第6-7天:构建硬件系统,并且测试确认都可以正常工作。之后完成机械部分和硬件部分的搭建。第8-11天:编写程序,设计软件,并且开始撰写课程设计报告。第12-13天:整体调试,逐步完善。第14天:完成课程设计报告。主要参考资料【1】张迎新

3、单片微型计算机原理、应用及接口技术(第2版)M北京:国防工业出版社,2004【2】单片机程序设计实例清华大学出版社【3】 单片机应用设计200例【4】单片机程序设计及应用李华军,电子工业出版社审查意见系(教研室)主任签字: 年 月 日 目 录1概述1.1研究背景科技的发展趋势之一就是让几乎所有的东西具有一定的智能。这样的智能一方面可以避免人的复杂性带来的错误,另一方面,作为人的能力的延伸,快速、便捷地适应环境。本文研究的超声波自动避障小车,就是让小车具有一定的智能,可以作为有人驾驶车辆的一部分,帮助司机及早发现司机还未觉察的危险。另外,可以应用在无人控制系统里,代替人类完成信息接收、处理和判断

4、。那么这样它还有更广阔的应用和发展空间。这个月我国嫦娥三号载着玉兔号月球车踏上了月球,已经开始探索活动。玉兔号月球车可以自动寻找有价值的目标,自动避开障碍物,自动寻找最优路径等等,这些功能在原理上都差不多,只是所用仪器以及控制算法的不同。1.2设计思想及基本功能小车设计的基本思路是:不断扫描前方180左右的水平面内的物体,根据反馈的距离和方位信息确定前方的地形是开阔还是多障碍。然后根据这些信息通过路径最优算法选择前进方向。小车的基本功能是识别空旷区和多障区;自动避开障碍物;能够在空旷区快速行驶。2总体方案设计2.1方案论证首先是测距方案:方案一:激光测距优点:测速快,适应范围广,精确;不过相对

5、于自动避障小车系统,有点大材小用。激光测距是点对点的测距,一般进行远距离测距比较精确。如是近距离激光测距,必须要涉及到微小时间测量,51MCU无法胜任。因此激光测距方案否定。方案二:超声波测距优点:结构简单,成本低,便于与MCU联机工作。测量范围从5CM到几百米的距离内精度在毫米级。尽管它测量的是点到面的距离,但是定向性满足本小车系统的要求。而且,数据处理简单。可以考虑。方案三:雷达测距不太现实,受到本人技术水平限制,无法驾驭雷达测距系统,此外,雷达应用于较大范围的测量和监控,如果用于本小车,同样涉及到微小时间测量,以及雷达数据处理,51MCU难以胜任。否定!方案四:红外线测距优点:技术难度低

6、,数据处理简单,但是测量开关信号比较好,测量连续信号不够准确。测量的精度有点低。因此不是一种较好的测距方法。综合各因素,选用超声波测距。其次是微控制器的选择:可选的微控制器有:系列的STC89C52RC、STC12C5A60S2;公司的MSP430G2553;飞思卡尔的MC9S12XS128MAL;意法的STM32F407-Discovery;(这些玩儿过一点,而且最小系统板手边都有)根据本系统的需求,需要两路同频率(50hz)的PWM控制两个舵机、一路PWM频率约几千赫兹控制电机、三个个定时器做脉冲捕捉、至少两个外部中断输入、一个并行6800总线接口。除了系列的两款,其他一片足以胜任。而且对

7、于意法的F407显得大材小用。飞思卡尔的S12比较合适;TI的G2553的引脚有点少(20个),外围电路设计的会复杂一点,成本也会高一点。60S2用两片比较合适; 用89C52比较麻烦,两片也不够。根据个人能力,以及时间和进度方面考虑选用60S2,60S2呢,它的资源有:完全兼容51 的两个定时器T0、T1和两个外部中断;两路拥有独立波特率的串行口;一个PCA定时器,可产生两路同频的PWM;八个10位精度的AD 转换通道; 一个硬件SPI接口。2.2系统框图 系统框图如图2.2所示图2.2系统框图2.3 总体方案设计两片60S2一个做主机,一个做从机,通过串行口通信,传递数据。主机用到的功能有

8、:()、定时器T1和外部中断INT1,作用是:测脉宽,用到的IO是P33;P20作为超声波测距模块的触发功能引脚;()、定时器T0和PCA产生两路同频率的PWM,作用是:T0的溢出率作为PCA的计数脉冲产生50HZ的PWM控制两路舵机。使用T0作为PCA的时钟源,可以通过改变T0的溢出率改变输出的频率。用到的IO是P13和P14;()、外部中断INT0接一个按键。()、串口一使用独立波特率发生器,与从机通P30和P31;()、并行数据接口:P0口作为6800并行总线的数据总线P27、P26和P25作为控制总线,分别为:EN(总使能)、RW(读写控制)、CD(命令数据控制);地址总线CS接地,一

9、直处于选通状态。从机用到的功能:()、串行口一使用独立波特率发生器P30和P31与主机通讯;()、PCA产生一路PWM,P12共同控制电机速度。()、定时器T0和T1作为编码器脉冲计数和测脉宽使用,测量电机的转速。3硬件电路设计首先是单片机的最小系统如图3.1、3.2所示图3.1 单片机的最小系统 图3.2 单片机的最小系统 然后是各个模块电路:3.1电源电路本系统由7.5V可充电电池供电,由开关电源LM2596转换成5V电压给单片机和测距模块供电。出于对系统的稳定性、可靠性和成本的考虑,选用了开关电源模块作为转换电路。电源部分电路如图3.3 图3.3 电源部分电路图3.4 电源模块实物 3.

10、2晶振电路虽然60S2内部有RC振荡电路作为时钟电路的输入源,但是外部连接一个无源晶振电路,可以使单片机的时钟频率更稳定,因而工作更可靠。电路参数:四个电容均为22PF,作为石英晶振频率的微调。石英晶振的频率为12MHZ。3.3复位电路复位电路是单片机必不可少的基本电路,在调试阶段,可以按下复位按键,使复位引脚保持两个机器周期的低电平,就可以使单片机内部所有电路初始化。电路参数:电容1UF只要保证电容的时间常数大于两个机器周期即可。电阻值为1K欧。3.4键盘电路键盘电路如图3.5所示图3.5键盘电路可以利用外部中断法或查询法检测按键是否按下。这里都采用外部中断的方法检测。3.5显示电路 显示电

11、路如图3.6所示图3.6显示电路采用1603液晶屏显示数字和字符。1603与1602的硬件接口完全一样。不同之处在于1603的RAM区的内容可以全部同时显示在屏幕上,没有屏幕内容的位移切换。可以显示四行。状态指示灯如图3.7所示图3.7 状态指示灯这几个LED灯是作为状态指示用的,方便调试。3.6超声波测距电路 超声波测距模块如图3.8所示 图3.8超声波测距模块这是超声波模块的接口电路。这个超声波的工作原理是:(1)采用 IO 触发测距,给至少 10us 的高电平信号;(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过 IO 输出一高电平,高电平持

12、续的时间就是(4)超声波从发射到返回的时间测试距离=(高电平时间*声速(340M/S)/2;超声波模块测距工作时序图:触发信号(由单片机产生一个宽度大于10US的高脉冲,触发模块工作一次):_|_|模块内部发出的信号(循环发出8个40KHZ的脉冲):_|_|_|_|_|_|_|_|_输出回响信号(回响信号的高电平持续时间正比于检测的距离):_|_3.7舵机电路 舵机电路如图3.9所示图3.9舵机电路舵机驱动电路。舵机接口是信号线、电源正、地。信号线一般可以直接接到单片机的IO上,但是接多了就不行了,电流太大。这里用了一级三极管驱动。通常用的这种舵机,控制信号是一个周期为20ms占空比在2.5%

13、12.5%之间的PWM信号,分别对应舵机的控制角为0180之间。舵机本身有反馈调节,因此,单片机给出一个占空比,舵机就到某一个角度。3.8电机驱动电路 电机驱动电路如图3.10所示 图3.10电机驱动模块电机的控制采用的是L298N全桥驱动电路。驱动电路如图3.11所示 图3.11 驱动电路电机正反转原理:IO: _|电流流向: PWM: |_|_|_|_|_|_|_|_|_|_|_|_ |假设此时电机正转| 该时刻电机反转|3.9电机转速测量电路 电机转速测量电路如图3.12所示图3.12电机转速测量电路编码器输出信号:AB两相输出矩形正交脉冲,电路输出为NPN集电极开路输出型,此种输出类型

14、可以和带内部上拉电阻的单片机。接线方式:黄=A相,蓝=B相,红=Vcc正电源,黑=V0地。 编码器输出信号图如图3.13所示图3.13信号图3.10设计PCB和腐蚀电路板这是原始的PCB图和单面的腐蚀电路板,红色的TOPLAYER层作为跳线。PCB如图3.14所示图3.14 PCB图图3.15 打印PCB负片图图3.16 腐蚀效果图4系统软件设计主程序的流程图如图4.1所示。图4.1主程序流程图主程序流程说明:电路主要分为以下几个部分,分别是电源部分、显示部分、按键部分、步进电机控制部分、超声波检测模块、舵机模块、单片机主控器件部分,各部分具有不同的子程序。系统初始化流程如图4.2所示: 图4

15、.2 系统初始化流程图4.1分模块程序设计4.1.1键盘程序 小车系统需要的按键不多,有两个,采用中断法。在系统中的作用是启动小车。4.1.2舵机驱动程序和电机驱动程序控制原理部分在叙述硬件时已介绍。这里说说具体怎么实现。产生50HZ的PWM控制舵机:时钟频率Fosc=HZ,定时器T0的溢出率Ft0作为PCA定时器的时钟输入。60S2工作在51模式下。设TO的初值为X,自动重装模式,T0、PCA均无中断。计算方法为:X*(12/Fosc)*256=0.02s可以得出X=72,TH0=0xB7。再计算占空比:PCA的中心计数器每(72*12/Fosc)秒记一个数,记256个数(即一个八位计数器)

16、溢出再从零开始。比较寄存器的取值是:256*0.025和256*0.125之间,对应的转角在0到180度。在实际情况下,舵机不够精密,最大旋转角没有180度,而且比较寄存器只能比较写入整数。实际的取值为729,控制方向的舵机取值为1721(分级明显,转向不够舒畅啊)。电机的频率没有严格的要求,因此,选用简单的处理:对时钟进行256*12分频,是3.6KHZ。4.1.3超声波测距程序超声波测距实现原理就是测量高电平脉冲持续的时间。用到了51定时器启停由外部控制的功能。GATE=1,TRn=1,定时器由外部中断引脚电平控制,上升沿之后开始计数,下降沿之后停止计数。同时打开相应的外部中断,在下降沿到

17、来后进入外部中断服务程序,记录停止计数时的数值。这里应当注意一个问题是:如果测量的距离较远,定时器可能就溢出了,对这个不处理,结果将是错误的。因此同时开启定时器中断,在溢出时,记下溢出的次数。距离的计算方法是:距离=【Number*(12/Fosc)+N*65536*(12/Fosc)】/2void Int1_Routine(void) interrupt 2T=(TH1*256+TL1);TH1=0;TL1=0;juli=(float)T1_Count)*11141.12+0.*(float)T);LCD_Write_Number(0,2,juli,5);T1_Count=0;T1_F=1;

18、4.2主程序设计主程序里主要是避障程序。我的思路是,把区域三部分:近距离20CM以内,适中区域(20CM150CM),远距离(150CM以外)。得到22组数据后首先是根据区域分类,然后记各区域的角度大小,当远距离的角度范围最大时,判断为空旷区,其他是多障碍区。然后根据角度大小排序,当适中区最大时,走的方向为适中区集中的方向。当最大区域为近距离或远距离时,走远距离区,具体方向为最远点方向。速度总是由最近的障碍物距离计算得出。5系统调试首先是分模块调试。把各个模块的功能分开实现。然后是部分的组合到一起使用,如超声波测距和1603显示、两路舵机同时控制。在软件调试的时候,出现了RAM区不够用。原因出

19、在避障算法上。定义的数组多,而且长。用户128RAM不够用。可以有两个解决办法:一是改进代码,使用指针;二是扩展RAM区。考虑到代码优化不是一天两天就弄好的,而且我的C语言编程水平实在浅薄,指针依然是用不好,一用就报错。那只好扩展RAM。查查60S2的数据手册,它取消了外部扩展RAM和ROM的功能,但是内部增加了1的RAM,用法是在定义变量时,加前缀“XDATA”,告诉编译器把后面的变量定义在扩展RAM区。此外我还了解到“DATA”、“PDATA”、“IDATA”都是51系统编译器允许的关键字,具体的解释是:dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度

20、最快,生成的代码也最小。 idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,Rx.(不重要的补充:c中idATa做指针式的访问效果很好) xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,Rx读写。硬件方面的调试主要在模块调试方面。因为基本上都用的现有的模块电路,自己设计的电路基本没有(自己还差的很远唉!),没有

21、什么难的。小车主板:图5.1 小车主板整车图片:图5.2 整车鸟瞰图6总结两周的单片机课程设计很快就结束了,但是在进军单片机领域,这仅仅是个开始。学习单片机最重要的是实践。要投入必要的成本。一块开发板必不可少,还有一大堆配套的硬件软件。作为有志于今后继续在单片机方面发展的我,学会使用51单片机,远远不够,世界上51系列占的市场份额并不多。流行的单片机,其功能远远好于51,因此,学习51单片机重点在于利用它简单易学的特点掌握单片机的各种通用性的东西,深刻理解和掌握它的工作原理和使用方式,这样可以快捷的掌握其他单片机的使用。把单片机作为改变生活的万能工具。学习单片机,离不开编程,离不开软件。语言作

22、为一种高级语言,与硬件联系紧密。因此在单片机领域,基本都用的是语言。灵活运用语言,对单片机学习带来极大的便利。今后还得继续深入学习语言。还有一点,非常重要,把软件工程的思想融入到单片机的编程中。比如分层和封装思想。这个课程设计中所有的程序,并不是都在这两周写的,有一些以前玩过类似的模块,当然有可靠地例程,在这里,修改一下硬件接口,修改一下工作方式,就可以用了。由此看出,单片机学习是可以积累的。除了掌握大量的知识,还有个人的单片机例程、软件、电路设计库,这样会越来越容易。参考文献:【1】单片微型计算机原理、应用及接口技术(第2版)张迎新M北京:国防工业出版社,2004【2】 夏路易 石宗义Pro

23、tel 99se电路原理图与电路板设计教程北京:北京希望电子出版社,2004【3】单片微型计算机原理、应用及接口技术(第2版)张迎新M北京:国防工业出版社,2004【4】宏晶STC12单片机技术手册附录A硬件电路图图A.1 整车鸟瞰图附录B 源程序 工程文件结构:图B.1 整车鸟瞰图STC12C5A60S2增加的特殊功能寄存器与地址的映射:#ifndef _REG52_H_#define _REG52_H_/* BYTE Registers */sfr AUXR = 0x8E;/*stc12c5a60s2*/sfr WAKE_CLK0=0x8F;/*stc12c5a60s2*/sfr P1M1

24、 = 0x91;/*stc12c5a60s2*/sfr P1M0 = 0x92;/*stc12c5a60s2*/sfr P0M1 = 0x93;/*stc12c5a60s2*/sfr P0M0 = 0x94;/*stc12c5a60s2*/sfr P2M1 = 0x95;/*stc12c5a60s2*/sfr P2M0 = 0x96;/*stc12c5a60s2*/sfr CLK_DIV=0x97;/*stc12c5a60s2*/Clock Divdersfr S2CON = 0x9A;/*stc12c5a60s2*/sfr S2BUF = 0x9B;/*stc12c5a60s2*/sfr B

25、RT = 0x9C;/*stc12c5a60s2*/sfr BUS_SPEED=0xA1;/*stc12c5a60s2*/sfr AUXR1 = 0xA2;/*stc12c5a60s2*/sfr IE2 = 0xAF;/*stc12c5a60s2*/sfr P3M1 = 0xB1;/*stc12c5a60s2*/sfr P3M0 = 0xB2;/*stc12c5a60s2*/sfr P4M1 = 0xB3;/*stc12c5a60s2*/sfr P4M0 = 0xB4;/*stc12c5a60s2*/sfr IP2 = 0xB5;/*stc12c5a60s2*/sfr IP2H = 0xB6;

26、/*stc12c5a60s2*/sfr IPH = 0xB7;/*stc12c5a60s2*/Interrupt Priority Highsfr P4SW = 0xBB;/*stc12c5a60s2*/P4 I/O Switchsfr ADC_CONTR=0xBC;/*stc12c5a60s2*/sfr ADC_RES=0xBD;/*stc12c5a60s2*/sfr ADC_RESL=0xBE;/*stc12c5a60s2*/A/D Result Lowsfr P4 = 0xC0;/*stc12c5a60s2*/P4 I/Osfr WDT_CONTR=0xC1;/*stc12c5a60s2

27、*/Watch-Dog-Timer Cotrol Registersfr IAP_DATA=0xC2;/*stc12c5a60s2*/ISP/IAP Flash Data Registersfr IAP_ADDRH=0xC3;/*stc12c5a60s2*/ISP/IAP Flash Address Highsfr IAP_ADDRL=0xC4;/*stc12c5a60s2*/ISP/IAP Flash Address Lowsfr IAP_CMD= 0xC5;/*stc12c5a60s2*/ISP/IAP Flash Command Registersfr IAP_TRIG=0xC6;/*s

28、tc12c5a60s2*/ISP/IAP Flash Command Triggersfr IAP_CONTR=0xC7;/*stc12c5a60s2*/ISP/IAP Control Registersfr P5 = 0xC8;/*stc12c5a60s2*/P5 I/Osfr P5M1 = 0xC9;/*stc12c5a60s2*/sfr P5M0 = 0xCA;/*stc12c5a60s2*/sfr TL2 = 0xCC; /*8052*/sfr SPSTAT= 0xCD;/*stc12c5a60s2*/SPI Control Registersfr SPCTL = 0xCE;/*stc

29、12c5a60s2*/SPI Status Registersfr SPDAT = 0xCF;/*stc12c5a60s2*/SPI Data Registersfr CCON = 0xD8;/*stc12c5a60s2*/PCAsfr CMOD = 0xD9;/*stc12c5a60s2*/PCAsfr CCAPM0= 0xDA;/*stc12c5a60s2*/PCAsfr CCAPM1= 0xDB;/*stc12c5a60s2*/PCAsfr CL = 0xE9;/*stc12c5a60s2*/sfrCCAP0L= 0xEA;/*stc12c5a60s2*/sfrCCAP1L= 0xEB;

30、/*stc12c5a60s2*/sfr PAC_PWM0=0xF2;/*stc12c5a60s2*/PCA PWMsfr PAC_PWM1=0xF3;/*stc12c5a60s2*/PCA PWMsfr CH = 0xF9;/*stc12c5a60s2*/sfr CCAP0H= 0xFA;/*stc12c5a60s2*/sfr CCAP1H= 0xFB;/*stc12c5a60s2*/* BIT Registers */*CCON*/sbit CF =CCON7;sbit CR =CCON6;sbit CCF1 =CCON1;sbit CCF0 =CCON0;#endifLCD1603显示程序

31、文件:#includereg52.h#includedefine.h#includedelay.h#include1603.hbit LCD_Check_Busy(void) u8 result;EN=0;DataPort= 0xFF; D_C=0; R_W=1;delay_ms(1); EN=1;result=(DataPort & 0x80);EN=0;return result;void LCD_Write_Comm(u8 comm) while(LCD_Check_Busy();EN=0;D_C=0; R_W=0; EN=1; delay_ms(1);DataPort=comm; EN

32、=0;void LCD_Write_Data(u8 dat) while(LCD_Check_Busy();EN=0;D_C=1; R_W=0; EN=1; delay_ms(1);DataPort=dat; EN=0;void LCD_Write_Char(u8 x,u8 y,u8 Data) switch(y)case 1:LCD_Write_Comm(0x80+x);break;case 2:LCD_Write_Comm(0xC0+x);break;case 3:LCD_Write_Comm(0x90+x); break;case 4:LCD_Write_Comm(0xD0+x); br

33、eak; LCD_Write_Data(Data); void LCD_Write_String(u8 x,u8 y,u8 *s) switch(y)case 1:LCD_Write_Comm(0x80+x);break;case 2:LCD_Write_Comm(0xC0+x);break;case 3:LCD_Write_Comm(0x90+x); break;case 4:LCD_Write_Comm(0xD0+x); break; while(*s) LCD_Write_Data(*s); s+; void LCD_Write_Number(u8 x,u8 y,u32 number,u

34、8 Nbit) u8 dat,ten,hun,thu,tenthu,hunthu;hunthu=48+(number/);tenthu=48+(number%/10000);thu=48+(number%10000/1000);hun=48+(number%1000/100);ten=48+(number%100/10);dat=48+(number%10);switch(y)case 1:LCD_Write_Comm(0x80+x);break;case 2:LCD_Write_Comm(0xC0+x);break;case 3:LCD_Write_Comm(0x90+x); break;c

35、ase 4:LCD_Write_Comm(0xD0+x); break;switch (Nbit)case 6:LCD_Write_Data(hunthu);LCD_Write_Data(tenthu);LCD_Write_Data(thu);LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 5:LCD_Write_Data(tenthu);LCD_Write_Data(thu);LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(dat);br

36、eak;case 4:LCD_Write_Data(thu);LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 3:LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 2:LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 1:LCD_Write_Data(dat);break;void LCD_Clear(void) LCD_Write_Comm(0x01); d

37、elay_ms(1);void LCD_Init(void) LCD_Write_Comm(0x01); delay_ms(1);LCD_Write_Comm(0x02);delay_ms(1);LCD_Write_Comm(0x38);delay_ms(1); LCD_Write_Comm(0x0C);delay_ms(1); LCD_Write_Comm(0x06); delay_ms(1);LCD_Write_Comm(0x80); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1

38、);LCD_Write_Comm(0x8E); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1); #ifndef _1603_H_#define _1603_H_sbit buzz=P23;sbit D_C= P10;sbit R_W= P11;sbit EN = P25;#define DataPort P0bit LCD_Check_Busy(void);void LCD_Write_Comm(u8 comm);void LCD_Write_Data(u8 dat);void L

39、CD_Write_Char(u8 x,u8 y,u8 Data);void LCD_Write_String(u8 x,u8 y,u8 *s);void LCD_Write_Number(u8 x,u8 y,u32 number,u8 Nbit);void LCD_Clear(void);void LCD_Init(void);串行口程序文件:#endif#includereg52.h#includedefine.h#includedelay.hu8 receive;u16 n;u8 flagR;u8 stopF;void COMInit(u16 bps)u8 s;EA=0;if(bps=19200)PCON|=0x80;s=1;elsePCON&=0x7F;s=0;SCON=0x50; TMOD=0x20; TH1=256-(28800*(s+1)/bps; TL1=256-(28800*(s+1)/bps;REN=1;ES=1;EA=1;TR1=1; void serial() interrupt 4 if(TI!=0)TI=0;flagR=1;elseif(RI!=0)receive=SBUF;P1=receive;if(receive=0xFF)stopF=1;elseif(rec

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号