基于单片机的电机测速及显示课程设计_第1页
基于单片机的电机测速及显示课程设计_第2页
基于单片机的电机测速及显示课程设计_第3页
基于单片机的电机测速及显示课程设计_第4页
基于单片机的电机测速及显示课程设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机创新设计报告设计题目:基于单片机的电机测速及显示学 院:机电工程学院专 业:测控技术与仪器班级学号:071姓 名:董新彬同组人员:李爽、朱浩波指导教师:王军 冯梅林设计时间:2010 、 10、10-2010 、10、 30单片机简介 3.1.1 单片机历史 3.1.2 AT89C51 的主要特性 4.1.3 管脚说明 5.1.4 振荡器特性 7.1.5 芯片擦除 8.二、硬件电路的设计 8.2.1 AT89C51 下载器部分 8.2.2 电机驱动部分 1.2.三、程序设计 1.6.3.1 下载器程序 1.6.3.2 电机测速程序 2.4.四、总结 3.7.五、参考文献 3.8.单片机简

2、介单片机又称单片微控制器 , 它不是完成某一个逻辑功能的芯片 ,而 是把一个计算机系统集成到一个芯片上。 概括的讲: 一块芯片就成了 一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发 提供了便利条件。 同时,学习使用单片机了解计算机原理与结构的最 佳选择。1.1 单片机历史1) 第一阶段( 1976-1978 ):单片机的控索阶段。以 Intel 公司 的 MCS 48 为代表。 MCS 48 的推出是在工控领域的控索,参与 这一控索的公司还有 Motorola 、Zilog 等,都取得了满意的效果。 这就是 SCM 的诞生年代, “单机片 ”一词即由此而来。2) 第二阶段( 19

3、78-1982 )单片机的完善阶段。 Intel 公司在 MCS 48 基础上推出了完善的、典型的单片机系列 MCS 51。它 在以下几个方面奠定了典型的通用总线型单片机体系结构。 完善的外部总线。 MCS-51 设置了经典的 8 位单片机的总线 结构,包括 8 位数据总线、 16 位地址总线、控制总线及具有很多机 通信功能的串行通信接口。 CPU 外围功能单元的集中管理模式。 体现工控特性的位地址空间及位操作方式。 指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令3)第三阶段( 1982-1990 ):8位单片机的巩固发展及 16 位单片机的推出阶段,也是单片机向微控制器发展的阶段。

4、 Intel 公司 推出的 MCS 96 系列单片机,将一些用于测控系统的模数转换器、 程序运行监视器、 脉宽调制器等纳入片中, 体现了单片机的微控制器 特征。随着 MCS 51系列的广应用, 许多电气厂商竞相使用 80C51 为内核,将许多测控系统中使用的电路技术、 接口技术、 多通道 A/D 转换部件、可靠性技术等应用到单片机中,增强了外围电路路功能, 强化了智能控制的特征。4)第四阶段( 1990 ):微控制器的全面发展阶段。随 着单片机在各个领域全面深入地发展和应用,出现了高速、 大寻址范围、强运算能力的 8 位/16 位 /32 位通用型单片机, 以及小型廉价的专用型单片机1.2 A

5、T89C51 的主要特性与 MCS-51 兼容4K字节可编程闪烁存储器寿命: 1000 写/ 擦循环 数据保留时间: 10 年全静态工作: 0Hz-24Hz三级程序存储器锁定128*8 位内部 RAM32 可编程 I/O 线两个 16 位定时器 /计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路1.3 管脚说明VCC:供电电压。GND:接地。P0口: P0口为一个 8 位漏级开路双向 I/O 口,每脚可吸收 8TTL门电流。当 P1口的管脚第一次写 1 时,被定义为高阻输入。 P0 能够用于外部程序数据存储器, 它可以被定义为数据 / 地址的第八位。 在 FIASH编程

6、时, P0 口作为原码输入口,当 FIASH 进行校验时, P0 输出原码,此时 P0 外部必须被拉高。P1口: P1口是一个内部提供上拉电阻的 8 位双向 I/O 口, P1口缓冲器能接收输出 4TTL门电流。P1口管脚写入 1 后,被内部上 拉为高,可用作输入, P1 口被外部下拉为低电平时,将输出电流, 这是由于内部上拉的缘故。在 FLASH编程和校验时, P1 口作为第八 位地址接收。P2口:P2口为一个内部上拉电阻的 8 位双向 I/O 口,P2口 缓冲器可接收, 输出 4个 TTL门电流,当 P2口被写“ 1”时,其管脚 被内部上拉电阻拉高,且作为输入。并因此作为输入时, P2 口

7、的管 脚被外部拉低,将输出电流。这是由于内部上拉的缘故。 P2 口当用 于外部程序存储器或 16 位地址外部数据存储器进行存取时, P2口输 出地址的高八位。在给出地址“ 1”时,它利用内部上拉优势,当对 外部八位地址数据存储器进行读写时, P2 口输出其特殊功能寄存器 的内容。 P2 口在 FLASH编程和校验时接收高八位地址信号和控制信 号。P3口: P3口管脚是 8 个带内部上拉电阻的双向 I/O 口,可 接收输出 4个 TTL门电流。当P3口写入“ 1”后,它们被内部上拉为 高电平,并用作输入。作为输入,由于外部下拉为低电平, P3 口将 输出电流( ILL )这是由于上拉的缘故。P3

8、口也可作为AT89C51的一些特殊功能口,如下表所示:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断 0)P3.3 /INT1(外部中断 1)P3.4 T0 (记时器 0 外部输入)P3.5 T1 (记时器 1 外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3 口同时为闪烁编程和编程校验接收一些控制信号RST:复位输入。当振荡器复位器件时,要保持RST脚两个 机器周期的高电平时间。ALE/PRO:G当访问外部存储器时, 地址锁存允许的输出电平用于锁存 地址的地位字节。 在 FLASH编程期间, 此引脚用于

9、输入编程脉冲。 在 平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频 率的 1/6 。因此它可用作对外部输出的脉冲或用于定时目的。然而要 注意的是: 每当用作外部数据存储器时, 将跳过一个 ALE脉冲。如想 禁止 ALE的输出可在 SFR8EH地址上置 0。此时, ALE 只有在执行 MOV,X MOVC指令是 ALE 才起作用。另外,该引脚被略微拉高。如果微处理 器在外部执行状态 ALE 禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取 指期间,每个机器周期两次 /PSEN有效。但在访问外部数据存储器时, 这两次有效的 /PSEN信号将不出现。/EA/

10、VPP:当 /EA 保持低电平时,则在此期间外部程序存储 器( 0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA 将内部锁定为 RESE;T 当/EA 端保持高电平时,此间内部程 序存储器。在 FLASH编程期间,此引脚也用于施加 12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。1.4 振荡器特性XTAL1和 XTAL2分别为反向放大器的输入和输出。 该反向放大器可以 配置为片内振荡器。 石晶振荡和陶瓷振荡均可采用。 如采用外部时钟 源驱动器件, XTAL2应不接。有余输入至内部时钟信号要通过一

11、个二 分频触发器, 因此对外部时钟信号的脉宽无任何要求, 但必须保证脉 冲的高低电平要求的宽度。1.5 芯片擦除整个 PEROM阵列和三个锁定位的电擦除可通过正确的控制信号 组合,并保持 ALE管脚处于低电平 10ms 来完成。在芯片擦操作中, 代码阵列全被写“ 1”且在任何非空存储字节被重复编程以前,该操 作必须被执行。此外, AT89C51设有稳态逻辑,可以在低到零频率的条件下静态 逻辑,支持两种软件可选的掉电模式。 在闲置模式下, CPU停止工作。 但 RAM,定时器, 计数器,串口和中断系统仍在工作。 在掉电模式下, 保存 RAM的内容并且冻结振荡器, 禁止所用其他芯片功能, 直到下一

12、 个硬件复位为止。二、硬件电路的设计2.1 AT89C51 下载器部分SP-51Pro(即 Easy51pro )编程器可以烧录 Atmel 公司系列单片 机芯片,具有性能稳定 ,烧录速度快 ,性价比高等优点。 产品性能介绍 如下: 支持的芯片支持目前最为经典和市场占有量最大的ATMEL公司生产的AT89C51、C52、C55和最新的 S51、S52;AT89C1051、2051、4051 等 芯片。产品特点1. 使用串口通讯 , 芯片自动判别,编程过程中的擦除、烧写、校验各 种操作完全由编程器上的监控芯片 89C51控制,不受 PC配置及其主频 的影响, 因此烧写成功率高可以达到 100,烧

13、写速度很快并且烧写 速度和微机的档次无关。2. 采用 57600高速波特率进行数据传送 , 编程速度可以和一般并行编 程器相媲美 , 经测试,烧写一片 4K ROM的 AT89C51仅需要 9.5S, 而读 取和校验仅需要 3.5S 。3. 体积小巧 , 省去笨重的外接电源适配器 ,直接使用 USB端口 5V电源, 携带方便,非常初学者学习 51 单片机的要求。4. 软件界面友好 , 菜单、工具栏、快捷键齐全 , 全中文操作,提供加密 功能,可以保护您的创作产权。可以说是麻雀虽小,五脏俱全!5. 功能完善 , 具有编程、读取、校验、空检查、擦除、加密等系列功 能;6.40pin 和 20pin

14、 锁紧插座 , 所有器件全部以第一脚对齐 , 无附加跳线 , 对于 DIP 封装芯片无需任何适配器 ;7. 采用优质万用锁紧插座,和接触不良等问题彻底说再见,可烧写40 脚单片机芯片和 20 脚单片机芯片8. 改进的烧写深度确保每一片 C51系列芯片的反复烧写次数都能达 到 1000 以上!内部数据至少保存 10 年。9. 因为采用了 9针传口通讯,这样一来就不会再和打印机抢一个打印 口,随时随地想烧就烧,让芯片编程成为一种快乐!(3) 硬件连接1. 通讯电缆与编程器连接好,2. 将串口插头插入电脑串口,3. USB 插头插入电脑任一个 USB口,此时编程器上 LED点亮,表明电 源接通。4.

15、 接着安装软件,本软件支持 Win9x/me/2000/NT, 标准 Window操作 界面。本软件属于绿色软件, 不需要安装, 直接把相关的软件拷贝到 硬盘中,运行其中的 Easy 51Pro 2_0 程序即可。 软件使用程序启动后,会自动检测硬件及连接, 状态框中显示“就绪” 字样,表示编程器连接和设置均正常。 否则请检查硬件连接和端口设 置。把单片机芯片正确地放到编程器的相应插座上,注意,芯片的缺 口要朝向插座的把手方向。芯片放好后,就可以对芯片进行读写操作了,读写操作按下面的 步骤进行:1 、程序运行,请先选择器件(点下选框)2、用“打开文件”选择打开要编写的 .HEX 和 .BIN

16、文件3、用“保存文件”可以保存读出来的文件4、用“擦除器件”擦除芯片5、用“写器件”编程6、用“读器件”读取芯片中的程序,加密的读不出来7、用“校验数据”检查编程的正确与否8、用“自动完成”自动执行以上各步骤9、用“加密”选择加密的级数 2.12 电机驱动部分2.2 电机驱动部分图 4-3 中所示为一个典型的直流电机控制电路。电路得名于“ H 桥驱动电路”是因为它的形状酷似字母 H。4 个三极管组成 H的 4 条 垂直腿,而电机就是 H 中的横杠(注意:图 4.12 及随后的两个图都 只是示意图, 而不是完整的电路图, 其中三极管的驱动电路没有画出 来)。如图所示, H 桥式电机驱动电路包括

17、4 个三极管和一个电机。要使电 机运转,必须导通对角线上的一对三极管。 根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机, 从而控制电机的转 向。图 4-3 H 桥简易驱动电路要使电机运转, 必须使对角线上的一对三极管导通。 例如,如图 4-4 所示,当 Q1管和 Q4管导通时,电流就从电源正极经 Q1从左至 右穿过电机,然后再经 Q4回到电源负极。按图中电流箭头所示,该 流向的电流将驱动电机顺时针转动。 当三极管 Q1和 Q4导通时,电流 将从左至右流过电机, 从而驱动电机按特定方向转动 (电机周围的箭 头指示为顺时针方向) 。图 4-4 H 桥电路驱动电机顺时针转动图 4-

18、5 所示为另一对三极管 Q2 和 Q3导通的情况,电流将从右至 左流过电机。当三极管 Q2和 Q3导通时,电流将从右至左流过电机, 从而驱动电机沿另一方向转动 (电机周围的箭头表示为逆时针方向)图 4-5 H 桥驱动电机逆时针转动驱动电机时,保证 H桥上两个同侧的三极管不会同时导通非常重 要。如果三极管 Q1和 Q2同时导通,那么电流就会从正极穿过两个三 极管直接回到负极。此时,电路中除了三极管外没有其他任何负载, 因此电路上的电流就可能达到最大值(该电流仅受电源性能限制) , 甚至烧坏三极管。 基于上述原因, 在实际驱动电路中通常要用硬件电 路方便地控制三极管的开关。图 4-6 所示就是基于

19、这种考虑的改进电路,它在基本 H 桥电路 的基础上增加了 4 个与门和 2个非门。 4个与门同一个“使能”导通 信号相接,这样,用这一个信号就能控制整个电路的开关。 而 2个非 门通过提供一种方向输人, 可以保证任何时候在 H桥的同侧腿上都只 有一个三极管能导通。(与本节前面的示意图一样, 图 4.15 所示也不 是一个完整的电路图, 特别是图中与门和三极管直接连接是不能正常工作的。)采用以上方法,电机的运转就只需要用三个信号控制:两个方向 信号和一个使能信号。如果 DIRL 信号为 0,DIRR 信号为 1,并 且使能信号是 1,那么三极管 Q1和 Q4导通,电流从左至右流经电机 (如图 4

20、.-7 所示);如果 DIRL信号变为 1,而 DIRR信号变为 0, 那么 Q2和 Q3将导通,电流则反向流过电机。图 4-7 使能信号与方向信号的使用实际使用的时候, 用分立元件制作 H桥是很麻烦的, 好在现在市 面上有很多封装好的 H桥集成电路,接上电源、 电机和控制信号就可 以使用了,在额定的电压和电流内使用非常方便可靠。比如常用的 L293D、L298N、TA7257P、SN754410等。三、程序设计3.1 下载器程序#include BYTE ComBuf18;/ 串口通讯数据缓存,发送和接收都使用UINT nAddress;/ROM 中地址计数UINT nTimeOut;/ 超

21、时计数ProWork pw;/ 编程器一般操作void Delay_us(BYTE nUs)/ 微秒级延时 255usTH0=0;TL0=0;TR0=1;while(TL0nUs)/ 利用 T0做定时计数器, 循环采样,直到达到定 时值TR0=0;void Delay_ms(UINT nMs)/ 豪秒级的延时 65535msUINT n=0;TR0=1;while(nnMs)/ 利用 T0做定时计数器, 循环采样,直到达到定 时值TH0=0;TL0=20; while(TH04) n+;TR0=0;BOOL WaitComm()/等待上位机的命令 ,18 字节BYTE n=0;RI=0;whi

22、le(!RI)/ 等待第一个字节ComBufn=SBUF;RI=0;n+;for(n;n10000)/ 后 17 个字节都有超时限制 return 0;ComBufn=SBUF;RI=0;return 1;BOOL WaitResp()/ 等待上位机回应 ,1 字节, 有超时限制nTimeOut=0;RI=0;while(!RI) nTimeOut+; if(nTimeOut50000) return 0;RI=0;ComBuf0=SBUF;return 1;BOOLW aitData()/ 写器件时等待上位机数据, 18 字节,有超时限制 BYTE n;RI=0; for(n=0;n1000

23、0) return 0;RI=0;ComBufn=SBUF;return 1;void SendData()/ 发送数据或回应操作完成 ,18 字节 BYTE n=0; for(n;n=17;n+)TI=0;SBUF=ComBufn; while(!TI)TI=0;void SendResp()/ 回应上位机 1 个字节, 在写器件函数中使用 TI=0;SBUF=ComBuf0; while(!TI)TI=0;void SetVpp5V()/ 设置 Vpp 为 5vP3_4=0;P3_3=0;void SetVpp0V()/ 设置 Vpp 为 0vP3_3=0;P3_4=1;void SetV

24、pp12V()/ 设置 Vpp为 12vP3_4=0;P3_3=1;void RstPro()/ 编程器复位pw.fpProOver();/ 直接编程结束SendData();/ 通知上位机, 表示编程器就绪, 可以直接用此函数 因为协议号( ComBuf0 )还没被修改,下同void ReadSign()/ 读特征字pw.fpReadSign();SendData();/ 通知上位机,送出读出器件特征字void Erase()/ 擦除器件pw.fpErase();SendData();/ 通知上位机,擦除了器件void Write()/ 写器件BYTE n;pw.fpInitPro();/

25、编程前的准备工作SendData();/ 回应上位机表示进入写器件状态,可以发来数据 while(1)if(WaitData()/ 如果等待数据成功if(ComBuf0=0x07)/ 判断是否继续写 for(n=2;n=17;n+)/ComBuf217 为待写入数据块 if(!pw.fpWrite(ComBufn)/ 调用写该 器件一个单元的函数 pw.fpProOver();/ 出错了就结束编程 ComBuf0=0xff;SendResp();/ 回应上位机一个字节,表示写数 据出错了WaitData();/ 等待上位机的回应后就结束 return; nAddress+;/ 下一个单元 Co

26、mBuf0=1;/ 回应上位机一个字节, 表示数据块顺利 完成,请求继续SendResp();else if(ComBuf0=0x00)/写器件结束break;else/ 可能是通讯出错了pw.fpProOver();return;else/ 等待数据失败pw.fpProOver(); return;pw.fpProOver();/ 编程结束后的工作 Delay_ms(50);/ 延时等待上位机写线程结束 ComBuf0=0;/ 通知上位机编程器进入就绪状态 SendData();void Read()/ 读器件BYTE n;pw.fpInitPro();/ 先设置成编程状态 SendData

27、();/ 回应上位机表示进入读状态 while(1)if(WaitResp()/ 等待上位机回应 1 个字节if(ComBuf0=0)/ComBuf0=0 表示读结束break;else if(ComBuf0=0xff)/0xff表示重发 nAddress=nAddress-0x0010; for(n=2;n=17;n+)/ComBuf217 保存读出的数据块 ComBufn=pw.fpRead();/ 用写该器件一个单元的函数nAddress+;/ 下一个单元 ComBuf0=6;/ 向上位机发送读出的数据块SendData();elsebreak;/ 等待回应失败pw.fpProOver(

28、);/ 操作结束设置为运行状态ComBuf0=0;/ 通知上位机编程器进入就绪状态 SendData();void Lock()/ 写锁定位pw.fpLock();SendData();所支持的 FID, 请在这里继续添加编程器编程器编程器extern void PreparePro00();/FID=00:AT89C51extern void PreparePro01();/FID=01:AT89C2051extern void PreparePro02();/FID=02:AT89S51void main()SP=0x60;SetVpp5V();/ 先初始化 Vpp 为 5vSCON=0x

29、00;TCON=0x00;/PCON=0x00;/ 波特率 *2IE=0x00;/TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0/ 0 0 1 0 0 0 0 1 TMOD=0x21;/T0用于延时程序TH1=0xff;TL1=0xff;/ 波特率 28800*2, 注意 PCON /SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI/ 0 1 0 1 0 0 0 0SCON=0x50;TR1=1;Delay_ms(1000);/ 延时 1 秒后编程器自举ComBuf0=0; SendData();while(1)/ 串口通讯采用查询方式if(!

30、WaitComm()/ 如果超时 , 通讯出错 Delay_ms(500); ComBuf0=0;/ 让编程器复位 , 使编程器就绪switch(ComBuf1)/ 根据 FID 设置 (ProWork)pw 中的函数指 针case 0:/at89c51 编程器 PreparePro00(); break;case 1:/at89c2051 编程器 PreparePro01(); break;case 2:/at89s51 编程器 PreparePro02(); break;/case 3: 支持新器件时,请继续向下添加/ break;/case 4:/ break; default: Com

31、Buf0=0xff; ComBuf1=0xff;/ 表示无效的操作 break;switch(ComBuf0)/ 根据操作 ID 跳到不同的操作函数case 0x00: RstPro();/ 编程器复位 break;case 0x01:ReadSign();/ 读特征字 break;case 0x02:Erase();/ 擦除器件 break;case 0x03:Write();/ 写器件 break;case 0x04:Read();/ 读器件 break;case 0x05:Lock();/ 写锁定位 break;default: SendData(); break;3.2 电机测速程序/

32、*LED.C12864 LED 驱动程序头文件*/#ifndef LED_H_#define LED_H_#include/ 定义背光控制信号 sbit LED_BL=P14;/ 点亮背光灯 void LEDLightOn();/ 熄灭背光灯void LEDLightOff();/ 清屏void LEDClear();/ 初始化void LEDInit();/ 显示 ASC码void LEDPutChar(unsigned char c);/ 显示字符串void LEDPuts(unsigned char*s);#endif /LED_H_/*LED.C12864 LED 驱动程序*/#inc

33、lude #include /#include LED.H/ 定义屏幕光标(取值 063,光标本身不可见) unsigned char LEDCursor;int i,j;/*函数: LEDLightOn()功能:点亮背光灯*/void LEDLightOn()LED_BL = 1;/*函数: LEDLightOff() 功能:熄灭背光灯*/void LEDLightOff()LED_BL = 0;/*函数: LEDGetBF() 功能:读出状态位 BF 返回:BF=1,表示忙,不可进行任何操作BF=0,表示不忙,可以进行正常操作*/bit LEDGetBF()unsigned char da

34、t;dat = XBYTE0xD002; /XBYTE 的定义见 return (bit)(dat & 0x80);/*函数: LEDWriteCmd()功能:向 LED发送命令参数:cmd:命令字,详见器件的数据手册*/void LEDWriteCmd(unsigned char cmd)while ( LEDGetBF() );XBYTE0xD000 = cmd;/*函数: LEDWriteDat()功能:向 LED写入数据参数: dat ,要写入的数据说明:目标地址由地址计数器 AC隐含指定,写完后 AC自动加 1 */void LEDWriteDat(unsigned char dat

35、)while ( LEDGetBF() );XBYTE0xD001 = dat;/*函数: LEDReadDat()功能:从 LED读出数据 返回:读出的数据*/*unsigned char LEDReadDat()volatile unsigned char dat;while ( LEDGetBF() );dat = XBYTE0xD003;dat = XBYTE0xD003; / 需要连续执行两次才能够读出真正的 数据return dat;*/*函数: LEDSetAC()功能:设置 DDRA(M显示数据 RAM)的 AC(地址计数器)值 参数:ac:地址计数器值,范围 063*/voi

36、d LEDSetAC(unsigned char ac)ac &= 0x3F;ac |= 0x80;LEDWriteCmd(ac);/*函数: LEDClear()功能: LED清屏,并使光标回到 0*/ void LEDClear() LEDWriteCmd(0x01); / 清屏命令 LEDCursor = 0; /* 函数: LEDDelay() 功能:延时 (t*100) 个机器周期 */ void LEDDelay(unsigned char t) unsigned char n; do n = 49; while ( -n != 0 ); while ( -t != 0 ); /*

37、 函数: LEDInit() 功能: LED初始化 */ void LEDInit() /设置基本指令集LEDWriteCmd(0x30); LEDDelay(3);/设置基本指令集(需要再执行一次)LEDWriteCmd(0x30); LEDDelay(1);/开启显示LEDWriteCmd(0x0C); LEDDelay(3);/清屏LEDClear(); LEDDelay(250);/ 设置进入点LEDWriteCmd(0x06); LEDDelay(10); /* 函数: LEDCheckAC()功能:根据光标位置调整 AC*/void LEDCheckAC()switch ( LED

38、Cursor )case 16:LEDSetAC(16); break;case 32:LEDSetAC(8); break;case 48:LEDSetAC(24); break;case 64: LEDCursor = 0; LEDSetAC(0); break;default: break;/*函数: LEDPutChar() 功能:显示 ASCII 码 参数:c 为可显示的 ASCII 码( 0x200x7F) */ void LEDPutChar(unsigned char c) LEDWriteDat(c);LEDCursor+;LEDCheckAC();/*函数: LEDPutH

39、Z() 功能:显示汉字参数:ch,cl :汉字编码*/void LEDPutHZ(unsigned char ch, unsigned char cl)if ( LEDCursor & 0x01 )/ 显示汉字时,必须偶地址对准,即光标位置不能是奇数LEDPutChar( ); / 额外输出一个空格LEDWriteDat(ch);LEDWriteDat(cl);LEDCursor += 2;LEDCheckAC();/*函数: LEDPuts() 功能:显示字符串参数:*s :要显示的字符串(可同时包含 ASCII 码和汉字)*/void LEDPuts(unsigned char *s)un

40、signed char ch, cl;for (;)ch = *s+;if ( ch = 0 ) break;if ( ch 0x80 ) LEDPutChar(ch);elsecl = *s+;LEDPutHZ(ch,cl);/*显示主程序*/#includeLED.H#include/#include DELAY.H /* 包 含 延 时 函 数 的 头 部 文 件 delay_us();delay_ms(); */*函数: Delay()延时 1ms 65.53st0 时,延时( t*0.001 ) st=0 时。延时 65.53s*/*/unsigned char SD4=1,2,3,

41、4;/速度设定unsigned char FK4=2,2,3,4;/速度反馈int D=0;/ 方向控制中间变量unsigned int Pwm=0;/ 速度产生中间变量unsigned int p=0;unsigned int Value=0;unsigned int Pwm_Value=0;unsigned int m;/unsigned int a,b,c,d;sbit KEY1=P20;sbit KEY2=P21;sbit KEY3=P22;sbit MotorA=P16;sbit MotorB=P17;bit SWTR;bit SWTF;unsigned int SWTV;#define Pwm_MAX 255void Delay(unsigned int T)SWTV=T;SWTR=1;while(!SWTF);SWTR=0;SWTF=0;void KEY()if(KEY1=0)Value=Value+1;if(KEY2=0)Value=Value-1;if(Value

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论