主程序的任务是对AT89C51单⽚机初始化,如设置堆栈,预置各定时器的控制字,初始化显⽰缓冲区,8155的初始化,设置标致位,清内存等;然后显⽰开机初始化状态,扫描键盘,根据按下键的功能各⾃的功能操作。3设计原理
3.1转速计算及误差分析
根据转速,周期,频率之间的关系可知:
(3-1)
(3-2)
(3-3)
式中,n—被测转速,r/min;
T-转速信号周期,s;
f-转速信号频率,Hz;
-计算计数脉冲的周期,⼜称时基,.将式(3-3)代⼊式(6-1),可得:
吸收二氧化硫
(3-4)
⽤⼗六进制数表⽰,为:
式中N已存⼊75H,74H,73H单元。利⽤除法⼦程序,即可求出转速。
下⾯计算系统得相对误差。
分别对式(3-1)和(3-3)求微分
(3-5)
(3-6)
将式(3-6代⼊(3-5),可得:
(3-7)
式中,为量化误差,个计数脉冲,⼜已知时基,故
(3-8)
由式(3-8)可知,相对误差与频率成正⽐,即相对误差随转速得升⾼⽽升⾼。因此,为了提⾼测量精度,⾼转速时需要连续测量数个周期。
本系统中为4个周期,即测得的N为4个周期内的总和,所以
优日
(3-9)
(3-10)
⽤⼗六进制数表⽰,为,对式(3-9)进⾏微分得:.
因此,可求出⾼速测量时的相对误差为。
同样,代⼊,个计数脉冲,则:
(3-11)
将式(3-11)与式(3-8)⽐较可知,采⽤多周期测量相对精度⼤⼤提⾼。
若设置系统的临界转速为3662r/min,其对应的每周期计数脉冲个数为
。开机时,⾸先按低转速测量,然后判断转速n是⾼于还是低于3662r/min。若低与此临界值,则仍然低转速测量,若⾼于它,便主动转⼊⾼转速测量,即连续测量4个周期.这样,就可以实现量程⾃动切换。
3.2转速测量
由式(3-4)和(3-10)可知,只要能够求出脉冲个数N,即可求出转速。为了得到计数脉冲,可以采⽤门控⽅式的硬件计数⽅法,也可以采⽤中断⽅式的软件计数⽅法。
3.2.1门控⽅式计数
由AT89C51定时器/计数器T0⼯作原理可知,当其⼯作在计数⽅式,只要T0引脚上有负
跳变,计数器就加1。CPU在每个机器周期的状态时,采样T0,所以需要2个机器周期才能识别⼀个T0的负跳变,即T0的周期⾄少应该等于2倍机器周期。若晶振频率为
6MHz,6分频后得到ALE信号,故ALE信号周期为,机器周期为。由此可知,
最低计数脉冲周期为,可由ALE信号经74LS74中的两个D触发器4分频后取得。
为了保证精度,要求AT89C51内部计数器0与的上跳沿同步,此时开始计数,在
的下跳沿停⽌计数。
图3.1门控脉冲与计数脉冲
5v转12v为了实现此功能,可以利⽤51单⽚机特有的定时器门控⼯作⽅式,通过指令MOV THOD,#1DH来设置定时器/计数器的⼯作⽅式。这⾥使定时器/计数器0⼯作于16位技术⽅式,并
由门脉冲进⾏控制。只有当为⾼电平时,且运⾏控制位时,计数器
0才开始⼯作。⼀旦转为低电平,计数器0即刻停⽌计数。
3.2.2中断⽅式计数
⾼转速时,为了连续测量4个输⼊脉冲周期,可以采⽤中断⽅式计数。在初始化或前⼀次测量结果时,单⽚机禁⽌”外部中断0”和”定时器0”溢出中断。设置”外部中断0”为负跳沿触发⽅式,设定”计数器
0”为⾮门控计数⽅式,然后等待中断。外部中断负脉冲⼀到,⽴刻启动”
计数器0”对T0的计数脉冲进⾏计数。计到4个测量周期时,停⽌”计数器0”⼯作,禁
⽌外”中断”,恢复测量周期常数3,并将计得的脉冲数存⼊相应的单元。
门控⽅式和中断⽅式计数,有效的解决了精度测量输⼊脉冲周期和⾼低量程⾃动切换问题,测得计数脉冲个数后,即可转⼊计算转速n⼦程序,计算结果得BCD吗存⼊相应的4个存储单元,以备显⽰。
3.3串⾏显⽰接⼝
51单⽚机的I/O⼝串⾏⼝为全双⼯接⼝,串⾏⼯作在⽅式0时,外接移位寄存器,可
将串⼝转换成8位并⼝。其显⽰的速率为,即,可以满⾜显⽰器稳定显⽰。串⾏数据的接受/发送均通过RXD,⽽由TXD输出移位脉冲。在串⼝上外接4⽚移位寄存器74LS64作为8位显⽰器的静态显⽰⼝。
变串⾏输⼊为并⾏输出,经缓冲器接⾄数码管。
4软件程序的设计
4.11s定时
本次设计选⽤定时器T0完成定时功能,选⽤⽅式1时最多也只能定时
,显然不能满⾜定时1的要求,可以⽤下⾯这种⽅法解决:
采⽤T0定时10,连续循环定时100次即可完成1定时,⽤⼀个计数单元20H存放循环的次数,每⼀次循环20H单元⾃减1,当20H单元为零时则1定时到时。
定时器T0初始化程序如下:
MOV IE,#8AH;开放T0、T1中断
MOV TMOD,#51H;T0定时,T1计数,都⼯作于⽅式⼀
MOV20H,#100;100*10ms=1s
SETB TR0
1s定时程序如下:
T0INT:
DJNZ20H,NEXT
NEXT:MOV TH0,#0DCH;1s还未到则置初值继续定时
MOV TL0,#00H
EXIT:RETI
4.2T1计数程序
设计中T1采⽤计数功能,需要注意的⼀个问题是,输⼊的待测时钟信号的频率最⾼可以达到460800Hz,但计数器最多只能计数65536次,显然需要对计数单元进⾏扩展,扩展的思路是除了计数器T1的TH1和TL1⽤于计数外,再选⽤⼀个计数单元
23H,每当计数器T1溢出回零时产⽣中断,中断程序执⾏23H单元⾃增1,这样,当⼀秒到时时采集的
计数数据,23H单元存放的是数据的最⾼位,TH1存放的是数据的次⾼位,TL1存放的是数据的最低位。当然,这⾥所说的“最⾼位”“次⾼位”以及“最低位”都是针对⼗六进制⽽⾔的。
计数器T1初始化程序如下:
MOV IE,#8AH;开放T0、T1中断
MOV TMOD,#51H;T0定时,T1计数,都⼯作于⽅式⼀
MOV TH1,#00H
MOV TL1,#00H;计数初值为零
SETB TR1
根据流程图设计的计数程序如下:
MOV21H,#0
MOV22H,#0
MOV23H,#0;此三个单元存放采集到的频率
T1INT:
咖啡玉米INC23H;计数器溢出则23H单元⾃增1
RETI
4.3频率数据采集
到1定时时,存储计数器T1以及扩充计数单元23H记录的数据即为输⼊时钟信号的频率,为了保证记录的频率精确度,到1定时后应⽴即停⽌T1的计数,因为指令的执⾏也需要时间,并且待测的时钟信号频率越⾼,指令执⾏所需要的时间就越不能忽