基于51单片机数显转速表的设计与制做 下载本文

开 始

关中断 关中断

保护现场 恢复现场

开中断 开中断

TO中断次数加 返 回

图7 定时器TO中断服务子程序流程图

外部中断INTO喽中断服务子程序对整个测速过程有着关键性的作用,中断程序设计的好与坏直接影响到测速的准确性和稳定性。具体程序设计流程图如图 开 始 TO 中断=0? 关中断 N 保护现场 定时计数值送计 Y 数存储区 开中断 关定时器TO 关中断 读取定时计数值 恢复现场 清零定时计数TO 开中断 为重启定时器 返 回 读定时器TO中断次数

定时计算时间

(4)、系统特点

本系统硬件电路简单,元器件少,工作稳定可靠。在软件设计上,采用记录定时器TO溢出次数的处理手段,极大地提高了低速测量的分辨率。使用时,不需任何设置即可稳定地测量3-9999r/min旋转体的转速值。该转速表测速范围宽、使用方便。

参考文献 : 附录:

单片机数显转速表项目元件清单 元件名称 数值 单位 型号 R1 300 Ω R2 5.1K Ω R3 1K Ω R4 4.3K Ω R5~R9 1K Ω R10 220 Ω BG1~BG5 9013 施密特触发器 74LS14 单片机芯片 AT89S52

主程序源代码: #include

unsigned char seg7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned int cnt=0,cnt1=0;/*cnt:溢出次数*/ unsigned int zs;

/**延时子程序**************************************************/ void delay (unsigned int k) {

unsigned int i,j; for (i=0;i

/**显示部分子程序**********************************************/ void display(unsigned int ZHS ) {

P1=seg7[ZHS/1000]; P2=0x01; delay(1);

P1=seg7[(ZHS00)/100]; P2=0x02; delay(1);

P1=seg7[(ZHS0)/10]; P2=0x04; delay(1);

P1=seg7[ZHS]; P2=0x08; delay(1); }

/**定时器T0中断部分子程序*************************************/ void time0 (void) interrupt 1 {

ET0=0;

TH0=0xff;//定时10us TL0=0xf7;

cnt++;//即是cnt=cnt+1; ET0=1; }

/**外部INT0口中断服务子程序***********************************/

void extern_int0(void) interrupt 0 { ET0=0;

if(cnt1==1) {

zs=1000000/(cnt*10); cnt1=0; } else { cnt1++; cnt=0; }

ET0=1; }

/**初始化initial**************************************************/ initial() {

TMOD=0x01; TH0=0xff; TL0=0xf7; EA=1; ET0=1; EX0=1; IT0=1; TR0=1; }

/**主程序******************************************************/ main() {

initial(); while (1) { display(zs); } }