工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->微机单片机电路图->单片机综合电路图->基于单片机AT89S51制作的测速表电路图

基于单片机AT89S51制作的测速表电路图

作者:dolphin时间:2012-07-25

基于单片机AT89S51制作的测速表电路图

  一。上图所示是测速器的电路图,由六位数码管和测速接口组成。
  1.测速的方法决定了测速信号的硬件连接,测速实际上就是测频,因此,频率测量的一些原则同样适用于测速。
  2.通常,可以用计数法、测脉宽法和等精度法来进行测试。所谓计数法,就是给定一个闸门时间,在闸门时间内计数输入的脉冲个数;测脉宽法是利用待测信号的脉宽来控制计数门,对一个高精度的高频计数信号进行计数。由于闸门与被测信号不能同步,因此,这两种方法都存在±1误差的问题,第一种方法适用于信号频率高时使用,第二种方法则在信号频率低时使用。等精度法则对高、低频信号都有很好的适应性。这里为简化讨论,仅采用计数法来进行测试。
  二。软件编程
  测量转速,使用霍尔传感器,被测轴安装有12只磁钢,即转轴每转一周,产生12个脉冲,要求将转速值(转/分)显示在数码管上。
  程序如下:
  DISPBUF EQU 5AH ;显示缓冲区从5AH开始[Page]
  SecCoun EQU 59H
  SpCoun EQU 57H ;速度计时器单元57H和58H,高位在前(57H单元中)
  Count EQU 56H ;显示时的计数器
  SpCalc bit 00h ;要求计算速度的标志
  Hidden EQU 16 ;消隐码
  ORG 0000H
  AJMP START
  ORG 1BH
  JMP TIMER1 ;定时中断1入口
  ORG 30H
  START: MOV SP,#5FH ;设置堆栈
  MOV P1,#0FFH
  MOV P0,#0FFH
  MOV P2,#0FFH ;初始化,所有显示器、LED灭
  MOV TMOD,#00010101B ;定时器T1工作于方式1,定时器0工作方式1 MOV TH1,#HIGH(65536-4000)
  MOV TL1,#LOW(65536-4000)
  SETB TR1
  SETB ET1 ;开定时器1中断
  SETB EA
  LOOP: JNB SpCalc,LOOP ;如果未要求计算,转本身循环
  标号: MULD功能:双字节二进制无符号数乘法
  入口条件:被乘数在R2、R3中,乘数在R6、R7中。
  出口信息:乘积在R2、R3、R4、R5中。
  影响资源:PSW、A、B、R2~R7
  堆栈需求: 2字节
  MOV R2,SpCoun
  MOV R3,SpCoun+1
  MOV R6,#0
  MOV R7,#5 ;测得的数值是每秒计数值,转为每分转速(每一转测12次,故乘5而非60)
  CALL MULD
  标号: HB2 功能:双字节十六进制整数转换成双字节BCD码整数
  入口条件:待转换的双字节十六进制整数在R6、R7中。
  出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
  影响资源:PSW、A、R2~R7 堆栈需求: 2字节
  MOV A,R4
  MOV R6,A
  MOV A,R5
  MOV R7,A ;将乘得的结果送R6R准备转换,这里结果不可能超过2字节
  CALL HB2
  CBCD:
  MOV DISPBUF,R3 ;最高位
  MOV A,R4 ;
  ANL A,#0F0H ;去掉低4位
  SWAP A ;将高4位切换到低4位
  MOV DISPBUF+1,A
  MOV A,R4
  ANL A,#0FH
  MOV DISPBUF+2,A
  MOV A,R5
  ANL A,#0F0H
  SWAP A
  MOV DISPBUF+3,A
  MOV A,R5
  ANL A,#0FH
  MOV DISPBUF+4,A
  CLR SpCalc ;清计算标志
  JMP LOOP
  主程序到此结束
  TIMER1: PUSH ACC;ACC入栈
  PUSH PSW ;PSW入栈
  SETB RS0 ;工作区1
  JNB TR0,SETTR0 ;如果T0未运行,则开启T0
  JMP GO1
  SETTR0:
  SETB TR0
  GO1:
  INC SecCoun ;秒计数器加1
  MOV A,SecCoun
  CJNE A,#251,Go2 ;如果未到1s则转
  CLR TR0 ;1s到了,则停止T0的运行
  MOV SpCoun,TH0
  MOV SpCoun+1,TL0 ;读取计数值
  CLR A
  MOV TH0,A
  MOV TL0,A ;清计数器
  SETB SpCalc ;要求主程序计算速度
  MOV SecCoun,#0 ;清秒计数器
  Go2:
  INC COUNT ;用于显示的计数器
  MOV A,COUNT
  CLR C
  SUBB A,#6
  JZ N1
  JMP N2
  N1: MOV COUNT,#0
  N2: MOV A,#DISPBUF
  ADD A,COUNT
  MOV R0,A ;指向当前要显示的显示缓冲区
  MOV A,@R0 ;取第一个待显示数
  MOV DPTR,#DISPTAB ;字形表首地址
  MOVC A,@A+DPTR ;取字形码
  MOV P0,A ;将字形码送P0位(段口)
  MOV A,COUNT
  MOV DPTR,#BitTab ;字位表首地址
  MOVC A,@A+DPTR
  ORL P2,#11111100B
  ANL P2,A
  MOV TH1,#HIGH(65536-4000)
  MOV TL1,#LOW(65536-4000)
  POP PSW
  POP ACC
  RETI
  BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH DISPTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
  三。程序分析
  主程序在对定时器、计数器、堆栈等进行初始化后即判断标志SpCalc是否为1,如果为1,说明要求对数据进行计算处理,首先将SpCalc标志清零,以保证下次能正常判断,然后进入数据处理程序,由于这里的闸门时间为1s,而显示要求为转/分,因此,要将测到的数据进行转换,转换的方法是将测得的数据乘以60,但由于转轴上安装有12只磁钢,每旋转一周可以得到12个脉冲,因此,要将测得的数据除以12,所以综合起来,将测得的数据乘以5即可得到每分钟的转速。计算得到的结果是二进制的整数,要将数据送往显示缓冲区需要将该数转化为BCD码。运算得到的是压缩BCD码,需要将其转换为非压缩BCD码,从标号CBCD开始的一段程序即作了这样的处理。需要说明的是,这里多位二进制乘法和多位二进制到BCD码的转换都是用了现成的成熟子程序,因此,首先将二进制数转换为压结合实际BCD码,然后再转换成非压缩BCD码。定时器T1用作4ms定时发生器,在定时中断程序中进行数码管的动态扫描,同时产生1s的闸门信号。1s闸门信号的产生是通过一个计数器Count,每次中断时间为4ms,每计250次即为1s,到了1s后,即清除计数器Count,然后关闭作为计数器用的T0,读出TH0、TL0中的数值,分别送入SpCoun和SpCoun+1单元,将T0中的值清空,置SpCalc标志为1,要求主程序进行速度值的计算。这里还有一个细节,用作1s闸门信号产生的Count每次中断都会加1,而T0却有一个周期是被关闭的,因此,计数值是251而不是250.



评论

技术专区