直流电机测速并显示
基于DSP的直流电机调速、测速系统设计

c r e o o s d o h u r ntm t r ba e n t e DSP
W ANG i n Hu gne n , ig a U i ri , iig8 0 1 , hn ) S ho o Mehncl n ier g Q nh i nv sy X nn 10 6 C ia i e t
转控制 、 电机 调速 、 电机 测速 和 串 口电脑 显示 四个 功能 。
l 硬 件 系 统 介 绍
硬 件 系统直接 使用 D P教学 板上 的 A D转 换 电位器 , S / 用输 入 电压 的 A D转 换 结果 直 接控 制 P / WM 的输 出脉宽 , 利用 L 9 2 8驱动 器驱 动电机 运转 实现 调速 。测速用 固定 在 电机 主轴上 的光码 盘 和光耦 电路
Th l crc lcr u ti i l r la l n r ci a . e ee tia ic i ssmp e, eib e a d p a tc 1
Ke r y wo ds: P; r c u r n tr v lc t d lto v lc t a u i g DS die tc re tmoo ; e o i mo u ain; eo i me s rn y y
第2 9卷 第 6期 21 0 1年 1 2月
青 海 大 学 学 报 (自 然 科 学 版 ) Jun l f i h i nvr t( a r Sine o ra o Qn a U ie i N t e c c ) g sy u e
V0 . 9 No 6 12 . De . 01 c2 1
Absr c To r a ie te c n r lf n t n o e o i d lto n a u i fdie tc re tno t a t: e l h o to u ci fv lc t mo u ain a d me s rng o r c u r n — z o y tr t e p af r o o ,h l t m fTMS 2 F2 7A d lDS wa s d t v lp a2 o 3 0L 40 mo e P s u e o de e o 4V o to y tm a e n c n r ls se b s d o d gtlPW M rn i l . e s se c n b o n ce o a c mp t rwih smp e s ra o ts fwa e iia p cp e Th y t m a e c n e td t o u e t i l e ilp r ot r . i
基于C51单片机直流电机测速仪设计

基于C51单片机直流电机测速仪设计摘要:电机的转速是各类电机运行过程中的一个重要监测量,测速装置在电机调速系统中占有非常重要的地位,特别是数字式测速仪在工业电机测速方面有独到的优势。
本文介绍了一种基于C51单片机的光电传感器转速测量系统的设计。
系统采用对射式光电传感器产生与齿轮相对应的脉冲信号,使用AT89C51单片机采样脉冲信号并计算每分钟内脉冲信号的数目,即电机对应的转速值,最终系统通过LCD实时显示电机的转速值。
经过软硬件系统的搭建,分别通过Protues软件系统仿真实验和实际电路搭建检查实验。
仿真实验表明本系统满足设计要求,并且结构简单、实用。
整个直流电机测速系统在降低测速仪成本,提高测速稳定性及可靠性等方面有一定的应用价值。
关键词:转速测量;光电传感器;单片机Based On C51 SCM Single DC Motor Speedometer DesignABSTRACT:Motor speed is all kinds of motor operation is an important process to monitor the amount of speed measuring device in the motor control system occupies a very important position, Especially the digital speedometer in the industrial motor speed has unique advantage. This paper describes a photoelectric sensor 51 SCM-based speed measurement system design. System uses a beam photoelectric sensor generates a pulse signal corresponding to the gear, the use of a sampling pulse signal AT89C51 SCM and calculating the pulse per minute, the number of signals that the speed of the motor corresponding to the value of the final system time through the LCD display the motor speed value.After a hardware and software system structures, respectively, through Protues software system to build the actual circuit simulation and experimental examination. Simulation results show that the system meets the design requirements, and the structure is simple and practical. DC Motor Speed entire system in reducing speedometer costs, improve reliability, speed stability and a certain application value.Keywords: Speed measurement; Photoelectric; Single chip micyoco目录1 绪论 (1)1.1 数字式转速测量系统的发展背景 (1)1.2 转速测量在国民经济中的应用 (1)1.3主要研究内容 (2)1.4 设计的目的和意义 (2)2 转速测量系统的原理 (4)2.1 转速测量原理 (4)2.2 转速测量计算方法 (5)3转速测量系统设计方案 (7)3.1 直流电机转速测量方法 (7)3.2 设计任务及方案 (8)4 直流电机测速系统设计 (9)4.1 单片机AT89C51介绍 (9)4.2 转速信号采集 (14)4.2 转速信号处理电路设计 (16)4.4 最小系统的设计 (17)4.4.1复位电路 (17)4.4.2 晶振电路 (20)4.5 显示部分设计 (20)5 直流测速系统仿真 (24)5.1 直流测速系统仿真 (24)5.1.1单片机最小系统仿真 (25)5.1.2 数码管显示仿真 (25)5.2 主程序流程设计 (26)5.2.1 主程序流程设计 (26)5.2.2 定时器的初始化 (27)5.3 实际电路实验 (28)参考文献 (30)致谢 (31)1 绪论1.1 数字式转速测量系统的发展背景在现代工业自动化高度发展的时期,几乎所有的工业设备都离不开旋转设备,形形色色的电机在不同领域发挥着很重要的作用。
无刷直流电机测速原理

无刷直流电机测速原理无刷直流电机是一种常见的电机类型,其具有高效率、高功率密度、低噪音等优点,因此被广泛应用于各种领域。
测速是无刷直流电机控制中非常重要的一部分,其原理如下:1. 电机测速原理无刷直流电机的转速可以通过检测电机内部的反电动势(back EMF)来实现。
当电机运转时,由于磁场变化引起线圈内部产生反向电势,这个反向电势随着转速的增加而增加。
因此,通过检测反向电势大小可以确定电机的转速。
2. 反向电势检测原理为了实现反向电势检测,需要在驱动无刷直流电机时采用PWM调制方式。
PWM调制方式是指通过改变占空比来控制输出信号的有效值。
在PWM调制方式下,输出信号会周期性地从高状态(+V)到低状态(-V),然后再回到高状态。
当输出信号处于高状态时,线圈中会产生磁通,并且随着时间的推移这个磁通会逐渐增加。
当输出信号从高状态变为低状态时,线圈内部产生的磁通会逐渐减少,同时也会产生反向电势。
反向电势的大小与线圈中的磁通变化率成正比。
3. 反向电势检测电路原理为了实现反向电势检测,需要在无刷直流电机驱动电路中添加一个反向电势检测电路。
该电路包括一个比较器和一个滤波器。
比较器用于将反向电势信号与参考信号进行比较。
参考信号可以是一个固定的阈值,也可以是由微控制器生成的一个可变参考信号。
滤波器用于去除噪声和干扰,以保证检测到的反向电势信号稳定可靠。
常用的滤波器包括低通滤波器和带通滤波器等。
4. 反向电势测速方法通过上述原理和方法,可以实现无刷直流电机的反向电势测速。
具体步骤如下:(1)将PWM调制方式应用到无刷直流电机驱动中;(2)通过比较器将反向电势信号与参考信号进行比较;(3)通过滤波器去除噪声和干扰;(4)根据反向电势信号的大小计算出电机转速。
总之,无刷直流电机测速原理是基于反向电势检测的,通过比较器和滤波器等电路将反向电势信号转换为可靠的转速信号。
这种方法简单、可靠,广泛应用于各种无刷直流电机控制系统中。
基于proteus的直流电机测速系统仿真

第2期(总第189期)2015年04月机械工程与自动化MECHANICAL ENGINEERING & AUTOMATIONNo.2Apr.文章编号:1672‐6413(2015)02‐0214‐02基于Proteus的直流电机测速系统仿真张小石,郝秀平(中北大学机电工程学院,山西 太原 030051)摘要:介绍了由AT89C51、LCD和L256组成的直流电机测速系统,详细介绍了系统的设计框图,并通过Proteus软件实现仿真。
仿真结果表明该系统具有可控调速、显示直观等特点。
关键词:直流电机;Proteus;仿真;测速系统中图分类号:TP391畅9∶TM33 文献标识码:B收稿日期:2014‐05‐26;修订日期:2014‐12‐26作者简介:张小石(1987‐),男,山西阳泉人,在读硕士研究生,主要从事链式自动机驱动技术。
0 引言直流电机的测速系统通过LCD可视化地显示电机的转速,便于操作人员观察,使其能够更加有效地对电机进行控制。
Proteus软件提供了大量的单片机仿真元器件,相当于虚拟实验室,节省了直流电机的研制成本,缩短了研制周期。
从科学的研究角度来看,基于Proteus的直流电机仿真是必要的、合理的。
1 直流电机测速系统的硬件总体设计本设计实现的是通过LCD显示电机的转速信息。
系统采用AT89C51单片机,通过键盘控制电机并进行可控转速显示,该系统的总体结构框图如图1所示。
图1 直流电机测速系统结构框图2 直流电机测速系统的软件设计直流电机测速系统软件编程时采用了模块化的设计思想,主要功能模块被编成独立的函数,由主程序调用。
其主要的程序模块包括初始化程序、键盘信号采集及处理程序、液晶显示程序、可控调速程序、信息显示程序和超限报警程序。
系统的软件主要采用C语言编制,对单片机程序进行调试,最终实现仿真的相应功能。
3 仿真主要过程在keilc中编译程序并运行,运行结果说明程序调试成功。
程序调试图见图2。
利用电动自行车后轮无刷直流电机霍尔信号的一种测速方法

利用电动自行车后轮无刷直流电机霍尔信号的测速方法包括以下步骤:
1. 硬件连接:首先,将电动自行车的后轮电机与无刷直流电机相连,以便从电机中获取霍尔信号。
2. 霍尔信号采集:在电机的霍尔位置上安装霍尔传感器,以便实时监测电机的转速。
霍尔传感器将转速信号转化为电信号,然后通过线路传输到控制器或仪表盘。
3. 信号处理:在控制器或仪表盘处,使用信号处理电路对霍尔信号进行放大、滤波和整形处理,以确保信号的稳定性和准确性。
4. 速度计算:处理后的霍尔信号被送入微处理器或单片机中进行处理。
微处理器或单片机通过计算单位时间内采集到的霍尔信号数量,再结合电机的极对数,即可计算出电机的转速。
5. 显示与存储:将计算出的速度信息实时显示在仪表盘上,或者通过无线传输模块将速度信息发送到其他设备上进行显示和存储。
6. 异常处理:在测速过程中,如果出现异常情况,如霍尔传感器故障、信号干扰等,系统会进行相应的故障诊断和处理,以确保系统的稳定性和可靠性。
以上是利用电动自行车后轮无刷直流电机霍尔信号的一种测速方法,具有简单、方便、准确等优点。
基于EL-MUT-III实验箱的直流电动机的测速和调速

科 技 视 界
科技・ 探索・ 争鸣
基于 E L — MU T — I I I 实验箱的直流电动机的 测速和调速
张 云 刘 害鑫 曹贯 强 ( 中国矿业大学< 北京> 机 电与信息工程学院 , 中国 北京 1 0 0 0 0 0 )
e l a b o r a t e s t h e b a s i c s t r u c t ur e . wo r k i n g p in r c i p l e a s we l l a s h a r dwa r e a n d s o f t wa r e d e s i g n o f t h e s p e e d c o n t r o l s y s t e m o f t h e DC mo t o r .I n t h e p r e s e n t s y s t e m. t h e i mp u l s e s i g n a l i s o u t p u t b y t h e Ha l l e l e me n t a n d c o u n t e d b y t h e 8 0 C5 1 e x t e r na l i te n r r u p t I NT0 ,S O t h a t t e h mo t o r s p e e d c a n b e me a s u l  ̄ d
【 摘 要】 本文设计基 于 E L — MU T — I I I 实验 箱以及 K e i l C环境 下的 c语 言编程, 阐述 了直流 电机测速调 速 系统的基本结构 、 工作 原理及 其 硬 件设计和软件设计 本 系统采用霍 尔元器件输 出脉冲信号 S I G N A L , 利用 8 0 C 5 1 外部 中断 I N T 0对 S I G N A L 进行 计数 , 测得 电动机 的转速 , 并 通过 L E D显示 使 用 H D 8 2 7 9 . 从键盘输入设 定转速 并经 L E D显示。通过实测转速 与设定转速比较 , 经过 闭环 系 统 变步长调速 , 改变 D A C 0 8 3 2 输 出模拟 电压值 . 来控制直流电动机 的转速。 【 关 键词】 直流电动机 ; 单片机 ; c语 言; 测速 ; 调速
实验13--直流电机测速实验

4562、由DAC0832经功放电路驱动直流电机,计数光电开关通关次数并经过换算得出直流电机的转速,并将转速显示在LED上。
3、G5区的0、1号按键控制直流电机转速快慢, (最大转速≈96r/s,5V,误差±1r/s)六、演示程序(完整程序见目录SPEED);键盘、LED显示子程序请参阅综合实验一.MODEL TINYEXTRN CMD_8279:WORD, DATA_8279:WORDEXTRN Display8:NEAR, SCAN_KEY:NEAR,GetKeyA:NEARPCIBAR1 EQU 14H ;PCI9052 I/O基地址(用于访问局部配置寄存器)PCIBAR3 EQU 1CH ;8位I/O空间基地址(它就是实验仪的基地址,;也为DMA & 32 BIT RAM板卡上的8237提供基地址) PCIIPR EQU 3CH ;IRQ号INTCSR EQU 4CH ;PCI9052 INTCSR地址mask_int_9052 EQU 24HVendor_ID EQU 10EBH ;厂商ID号Device_ID EQU 8376 ;设备ID号VoltageOffset EQU 5 ;0832调整幅度.STACK 200.DATAIO8259_0 DW 00F0HIO8259_1 DW 00F1HRD_IO8259 DW 0000HCon_8253 DW 00E3HT0_8253 DW 00E0HT1_8253 DW 00E1HDA0832 DW 00D0HIO_Bit8_BaseAddress DW ?PCI_IO_BaseAddress0 DW ?PCI_IRQ_NUMBER DB ?INT_MASK DB ?INT_Vector DB ?INT_CS DW ? ;保护原中断入口地址INT_IP DW ?msg0 DB 'BIOS不支持访问PCI $'msg1 DB '找不到Star PCI9052板卡 $'msg2 DB '读PCI9052 I/O基地址时出错$'msg3 DB '读8位I/O空间基地址时出错$'msg4 DB '读IRQ号出错$'buffer DB 8 DUP(0) ;显示缓冲区,8个字节buffer1 DB 8 DUP(0) ;显示缓冲区,8个字节VOLTAGE DB 0 ;转换电压数字量Count DW 0 ;一秒转动次数NowCount DW 0 ;当前计数值kpTime DW 0 ;保存上一次采样时定时器的值bNeedDisplay DB 0 ;需要刷新显示.CODESTART: MOV AX,@DATAMOV DS,AXMOV ES,AXNOPCALL InitPCICALL ModifyAddress ;根据PCI提供的基地址,将偏移地址转化为实地址CALL ModifyVector ;修改中断向量、允许中断MOV bNeedDisplay,1 ;显示初始值MOV VOLTAGE,99H ;初始化转换电压输入值,99H-3.0VMOV Count,0 ;一秒转动次数MOV NowCount,0 ;当前计数值MOV kpTime,0 ;保存上一次采样时定时器的值CALL DAC0832 ;初始D/ACALL Init8253CALL Init8259STIMAIN: CALL IfExitCALL GetKeyA ;按键扫描JNB Main1JNZ Key1Key0: MOV AL,VoltageOffset ;0号键按下,转速提高ADD AL,VOLTAGECMP AL,VOLTAGEJNB Key0_1MOV AL,0FFH ;最大Key0_1: MOV VOLTAGE,AL ;D/ACALL DAC0832JMP Main2Key1: MOV AL,VOLTAGE ;1号键按下,转速降低SUB AL,VoltageOffsetJNB Key1_1XOR AL,AL ;最小Key1_1: MOV VOLTAGE,ALCALL DAC0832 ;D/AJMP Main2Main1: CMP bNeedDisplay,0JZ MAINMOV bNeedDisplay,0 ;1s定时到刷新转速Main2: CALL RateTest ;计算转速/显示JMP MAIN ;循环进行实验内容介绍与测速功能测试;转速测量/显示RateTest: MOV AX,CountMOV BL,10DIV BLCMP AL,0JNZ RateTest1MOV AL,10H ;高位为0,不需要显示RateTest1: MOV buffer,AHMOV buffer+1,ALMOV AL,VOLTAGE ;给0832送的数据AND AL,0FHMOV buffer+4,ALMOV AL,VOLTAGEAND AL,0F0HROR AL,4MOV buffer+5,ALMOV buffer+2,10H ;不显示MOV buffer+3,10HMOV buffer+6,10HMOV buffer+7,10HLEA SI,bufferLEA DI,buffer1MOV CX,8REP MOVSBLEA SI,bufferCALL Display8 ;显示转换结果RETTimer0Int: MOV bNeedDisplay,1MOV AX,NowCountSHR AX,1SHR AX,1MOV Count,AX ;转一圈,产生四个脉冲,Count = NowCount/4MOV NowCount,0RETIntProc: PUSH AXPUSH DXCALL ClearIntMOV DX,RD_IO8259IN AL,DXIN AL,DX ;判断由哪个中断源引起的中断CMP AL,08HJNZ IntProc1CALL Timer0IntJMP IntProc2IntProc1: CMP AL,0FHJNZ IntProc2CALL CountIntIntProc2: MOV DX,IO8259_0MOV AL,20HOUT DX,ALPOP DXPOP AXIRETCountInt: MOV DX,Con_8253MOV AL,40HOUT DX,AL ;锁存MOV DX,T1_8253IN AL,DXMOV AH,ALIN AL,DXXCHG AL,AH ;T1的当前值XCHG AX,kpTimeSUB AX,kpTimeCMP AX,100JB CountInt1 ;前后二次采样时间差小于100,判断是干扰INC NowCountCountInt1: RETInit8253 PROC NEARMOV DX,Con_8253MOV AL,34HOUT DX,AL ;计数器T0设置在模式2状态,HEX计数MOV DX,T0_8253MOV AL,12HOUT DX,ALMOV AL,7AHOUT DX,AL ;CLK0=31250Hz,1s定时MOV DX,Con_8253MOV AL,74HOUT DX,AL ;计数器T1设置在模式2状态,HEX计数MOV DX,T1_8253MOV AL,0FFHOUT DX,ALMOV AL,0FFHOUT DX,AL ;作定时器使用RETInit8253 ENDPInit8259 PROC NEARMOV DX,IO8259_0MOV AL,13HOUT DX,ALMOV DX,IO8259_1MOV AL,08HOUT DX,ALMOV AL,09HOUT DX,ALMOV AL,7EHOUT DX,ALRETInit8259 ENDP;数模转换,A-转换数字量DAC0832 PROC NEARMOV DX,DA0832MOV AL,VOLTAGEOUT DX,ALRETDAC0832 ENDP;IfExit、InitPCI、ModifyAddress、ModifyVector、ClearInt、Exit子程序请参阅8259实验END START七.实验扩展及思考题实验内容:在日光灯或白炽灯下,将转速调节到25、50、75,观察转盘有什么现象出来。
课程设计实验报告-直流电机测速 (1)

直流电机测速摘要设计一种直流电机调速系统,以STC89C52 为控制核心,通过ULN2003 驱动电机,使用ST151 测量转速,实现了按键输入、电机驱动、转速控制、转速显示等功能。
关键词:直流电机, 80C51, ULN2003, 转速控制第一章题目描述直流小电机调速系统:采用单片机、ul n2003 为主要器件,设计直流电机调速系统,实现电机速度开环可调。
要求:1、电机速度分30r /m、60r /m、100r /m共3 档;2、通过按选择速度;3、检测并显示各档速度。
所需器件:实验板(中号)、直流电机、STC89C52、电容(30pFⅹ2、10uF ⅹ2)、数码管(共阳、四位一体)、晶振(12M H z )、小按键(4 个)、ST151、电阻、发光二极管等。
第二章方案论述按照题给要求,我们最终设计了如下的解决方案:用户通过键盘键入控制指令(开关),微控制器在收到指令后改变输出的 PW M波,最终在 U LN2003 的驱动下电机转速发生改变。
通过 ST151 传感器测量电机扇叶的旋转情况,将转速显示在数码管上。
在程序主循环中实现按键扫描与转速显示,将定时器0 作为计数器,计数ST151 产生的下降沿,可算出转速,并送至数码管显示。
第三章硬件部分设计系统硬件部分包含输入模块、显示模块、控制模块、测速模块等。
在硬件搭建前,先通过Pr ot eus Pr o 7. 5 进行硬件仿真实现。
1. 时钟电路系统采用12M 晶振与两个30pF 电容组成震荡电路,接STC89C52 的 XTAL1 与 XTAL2 引脚,为微控制器提供时钟源2. 按键电路四个按键分别控制电机的不同转速,即控制 PW M波高电平的占空比,以实现电机的速度控制,采用开环控制方法,不是十分精确,但控制简单,易实现,代码编写简单3. 显示部分系统采用4 位共阴极数码管实现转速显示。
数码管的位选端1~4 分别接STC89C52 的P2. 0~P2. 3 管脚,端选段A~G与 D P分别接 STC89C52 的 P0. 0~P0. 7 管脚。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可实现功能:1 可控制左右旋转2 可控制停止转动3 有测速功能,即时显示在液晶上4 有速度档位选择,分五个档次,但不能精确控速5 档位显示在液晶上用到的知识:1 用外部中断检测电机送来的下降沿,在一定时间里统计脉冲个数,进行算出转速。
2 通过改变占空比可改变电机速度,占空比的改变可以通过改变定时器的重装初值来实现。
3 要想精确控制速度,还需要用自动控制理论里的PID算法,但参数难以选定,故在此设计中没有涉及!#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit PW1=P1^0 ;sbit PW2=P1^1 ; //控制电机的两个输入sbit accelerate=P0^2 ; //调速按键sbit stop=P0^3 ; //停止按键sbit left=P0^4 ; //左转按键sbit right=P0^5 ; //右转按键sbit detect=P3^2; //检测脉冲sbit lcdrs=P0^0;sbit lcden=P0^1;#define Da P2uint temp; //保存检测到的电平数据以便比较uint count; //用于计数uint aa,bb; //用于计数uint speed; //用来计算转速uint a=25000;uint t0=25000,t1=25000; //初始时占空比为50%uchar flag=1; //此标志用于选择不同的装载初值uchar dflag; //左右转标志uchar sflag=1; //用来标志速度档位#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void write_(uchar ); //液晶写指令void write_data(uchar date); //液晶写数据void lcd_init(); //液晶初始化void display(uint rate); //显赫速度void int0_init(); //定时器0初始化void keyscan(); //键盘扫描程序void judge_derection();void main(){time_init(); //定时器的初始化lcd_init(); //液晶初始化int0_init(); //定时器0初始化while(1){}}void time_init(){TMOD=0x11; //两个定时器都设定为工作方式1 十六位定时计数器 EA=1; //开启总中断TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;TH1=(65536-a)/256;TL1=(65536-a)%256;ET1=1;TR1=0;}void int0_init(){EX0=1;//外部中断源可以申请中断IT0=1;//外部中断源下降沿触发}void timer0() interrupt 1 using 0{TH0=(65536-50000)/256;TL0=(65536-50000)%256; //装载初值keyscan(); //键盘扫描程序aa++;if(aa==5){aa=0;temp=count*0.5*60*2*2*100/24; //计算转速,每分转多少圈count=0; //重新开始计数脉冲数display(temp); //把计算得的结果显示出来}}void timer1() interrupt 3 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH1=(65536-a)/256;TL1=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}else{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH1=(65536-a)/256;TL1=(65536-a)%256; //重装载初值}}/*******外部中断*******************/void service_int0() interrupt 0{count++; //来一个下降沿沿就计一个脉冲数}/*******显示函数***********/void display(uint rate){uchar wan,qian, bai,shi,ge;wan=rate/10000;qian=rate/1000%10;bai=rate/100%10;shi=rate/10%10;ge=rate%10;write_(0x80);write_data('0'+wan);write_data('0'+qian);write_data('0'+bai);write_data('.');write_data('0'+shi);write_data('0'+ge);}/******延时函数********/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--) ;}/************写指令************/void write_(uchar ){lcdrs=0;Da=;delay(1);lcden=1;delay(1);lcden=0;}/************写数据**********/void write_data(uchar date){lcdrs=1;Da=date;delay(1);lcden=1;delay(1);lcden=0;}/************液晶初始化**********/void lcd_init(){lcden=0;write_(0x38) ; //初始化write_(0x0c) ; //打开光标 0x0c不显示光标 0x0e光标不闪,0x0f光标闪write_(0x01) ; //清显示write_(0x80+0x40);write_data('0');write_data(' ');write_data('G');write_data('e');write_data('a');write_data('r');}/***********键盘扫描程序**********/void keyscan(){if(stop==0){TR1=0; //关闭定时器0 即可停止转动end_turn; // 停止供电write_(0x80+0x40);write_data('0');}if(left==0){TR1=1;dflag=1; //转向标志置位则左转write_(0x80+0x40);write_data('0'+sflag);}if(right==0){TR1=1;dflag=0; //转向标志复位则右转write_(0x80+0x40);write_data('0'+sflag);}if(accelerate==0){delay(10) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手sflag++;if(sflag==2){t0=20000;t1=30000; //占空比为百分之60write_(0x80+0x40);write_data('2');}if(sflag==3){t0=15000;t1=35000; //占空比为百分之70 write_(0x80+0x40);write_data('3');}if(sflag==4){t0=10000;t1=40000; //占空比为百分之80 write_(0x80+0x40);write_data('4');}if(sflag==5){t0=5000;t1=45000; //占空比为百分之90 write_(0x80+0x40);write_data('5');}if(sflag>=6){sflag=0;t0=25000;t1=25000;write_(0x80+0x40);write_data('1');}}} }。