武汉绘芯科技有限公司欢迎您!
10余年经验沉淀展览展示运动控制的专家
全国咨询热线:027-87052087
联系我们
武汉绘芯科技有限公司
电话:027-87052087
手机:13329706647
邮箱:956693667@qq.com
地址:武汉市江夏区藏龙岛谭湖一路8号
联系人:黄先生
您的位置: 滑轨屏|绘芯科技 > 知识库 >
知识库

单片机智能转速表系统设计

日期:2016-07-30 14:42:34 来源:未知 点击

1.前言

单片微型计算机简称单片机,又称为微控制器MCU20世纪70年代中期发展起来的一种面向控制的大规模集成电路模块,具有功能强、体积小、可靠性高、价格低廉等特点,在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度。单片机在我国大规模的应用已有十余年历史,单片机技术的研究和推广正方兴未艾。

MSC-51系列单片机是国内目前应用最广泛的一种8位单片机之一。经过20多年的推广与发展,51系列单片机形成了一个规模庞大、功能齐全、资源丰富的产品群。随着嵌入式系统、片上系统等概念的提出和普遍应用,MCS-51系列单片机的发展又进入了一个新的阶段。

我们使用的89C51单片机是目前各大高校及市场上应用最广泛的单片机型.其内部包含: 一个8位的CPU;4K的程序存储空间ROM;128字节的RAM数据存储器;两个16位的定时/计数器;可寻址64KB外部数据存储器和64KB外部程序存储器空间的控制电路;32条可编程的I/O线;具有两个优先级嵌套的中断结构的5个中断源。

本次课程设计便是设计一个基于89C51单片机转速表系统。要求进行电路硬件设计和系统软件编程,硬件电路要求动手制作并能够完成系统硬件和软件调试。

 

2 智能转速表的系统设计

2.1 系统硬件设计

2.1.1方案选择

   由于单片机所具有的特性,它特别适用于各种智能仪器仪表,家电等领域中,可以减少硬件以减轻仪表的重量,便于携带和使用,同时也可能低存本,提高性能价格之比。

    该转速表选用MCS-51系列单片机的8031芯片,外部扩展4KB EPROM8155作为显示器的接口。该系统的整体结构框图见下图2.1所示:

 

 

 

 

 


















2.1智能转速表总结构流程图



2.1.2仪器各部分组成

1)传感器

   传感器为红外光电式传感器。其中一个发光二极管发出红外波长的光,可不受室内自然光的影响,此光照到旋转物体上反射回后,被光敏三极管接收。光敏三极管接受到此信号后,经放大,整形转换为矩形脉冲信号送入MCS-51单片机的外部中断输入端INTOINT1上。

2)键盘

键盘由功能键,数字键,存入键,取出键,单双键路选择键,启动停止键等组成。为了减少键的数目,以减少故障率,采用了一键多用的复用键方案,但软件相对复杂一些。

键盘于8031P1口直接相连,以加快对键盘的扫描速度。也可以用8155等芯片作为键盘的输入接口,但扫描速度比前者慢一些。

3)显示器

    8LED数码管作显示器,它通过可编程并行I/O接口芯片81558031相连。8155A口通过反相驱动(754527406)作为显示器位选口;B口通过同相驱动器(7407)作显示器段选口。

在进行不同测量时,除在LED显示器上以英文字母提示外,在运行过程中还以不同的发光二极管指示测量的内容。发光二极管由8155C口驱动。

4)程序存储器

系统的监控程序和运算处理程序存放在外接4K字节的EPROM2732中。

5)数据存储器

    数据存储器由8031片内的低128字节和8155内部256字节的RAM组成.8031的内部RAM主要用于堆栈,工作寄存器,显示缓冲器,各测量参数的计算缓冲器和标致位等。而8155内部的RAM除上部4个单元外,全部用于存放转速和线速度值,其存储空间划分如图2-2所示,共分为三组,每组84个单元,可存入4216位二进制数据,即42416进制数据。如下图2.1为外部RAM存储器空间划分图。

 

 

 

 

 

 

 

2.1 外部RAM存储器空间划分

2.2 系统软件设计

系统监控程序的主程序流程框图见图2.2系统软件采用模块式结构,由主程序及多个功能模块子程序组成,可使程序清楚,易编易读,便于调试和修改。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2监控主程序流程图

主程序的任务是对8031单片机初始化,如设置堆栈,预置各定时器的控制字,初始化显示缓冲区,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个周期,即测得的N4个周期内的总和,所以

                                    (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门控方式计数

8031定时器/计数器T0工作原理可知,当其工作在计数方式,只要T0引脚上有负跳变,计数器就加1CPU在每个机器周期的状态时,采样T0,所以需要2个机器周期才能识别一个T0的负跳变,即T0的周期至少应该等于2倍机器周期。若晶振频率为6MHz6分频后得到ALE信号,故ALE信号周期为,机器周期为。由此可知,最低计数脉冲周期,可由ALE信号经74LS74中的两个D触发器4分频后取得。

为了保证精度,要求8031内部计数器0的上跳沿同步,此时开始计数,在的下跳沿停止计数。

 

 

 

3.1 门控脉冲与计数脉冲

为了实现此功能,可以利用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.1 1s定时

本次设计选用定时器T0完成定时功能,选用方式1时最多也只能定时,显然不能满足定时1的要求,可以用下面这种方法解决:

采用T0定时10,连续循环定时100次即可完成1定时,用一个计数单元20H存放循环的次数,每一次循环20H单元自减1,当20H单元为零时则1定时到时。

定时器T0初始化程序如下:

MOV IE,#8AH     ;开放T0T1中断

MOV TMOD,#51H   ;T0定时,T1计数,都工作于方式一

MOV 20H,#100    ;100*10ms=1s

SETB TR0

1s定时程序如下:

T0INT:

DJNZ 20H,NEXT

NEXT:MOV TH0,#0DCH   ;1s还未到则置初值继续定时

MOV TL0,#00H

EXIT:RETI

 

4.2 T1计数程序

设计中T1采用计数功能,需要注意的一个问题是,输入的待测时钟信号的频率最高可以达到460800Hz,但计数器最多只能计数65536次,显然需要对计数单元进行扩展,扩展的思路是除了计数器T1TH1TL1用于计数外,再选用一个计数单元23H,每当计数器T1溢出回零时产生中断,中断程序执行23H单元自增1,这样,当一秒到时时采集的计数数据,23H单元存放的是数据的最高位,TH1存放的是数据的次高位,TL1存放的是数据的最低位。当然,这里所说的最高位”“次高位以及最低位都是针对十六进制而言的。

计数器T1初始化程序如下:

    MOV IE,#8AH     ;开放T0T1中断

MOV TMOD,#51H   ;T0定时,T1计数,都工作于方式一

MOV TH1,#00H

MOV TL1,#00H    ;计数初值为零

    SETB TR1

根据流程图设计的计数程序如下:

    MOV 21H,#0

MOV 22H,#0

MOV 23H,#0            ;此三个单元存放采集到的频率

T1INT:

INC 23H          ;计数器溢出则23H单元自增1

RETI

 

4.3 频率数据采集

1定时时,存储计数器T1以及扩充计数单元23H记录的数据即为输入时钟信号的频率,为了保证记录的频率精确度,到1定时后应立即停止T1的计数,因为指令的执行也需要时间,并且待测的时钟信号频率越高,指令执行所需要的时间就越不能忽略,这里采用的指令为CLR TR1

数据采集程序如下:

    CLR TR0

MOV 22H,TH1     ;1s定时到则采集数据

MOV 21H,TL1

AJMP EXIT

 

 

4.4 进制转换

从计数器采集到的频率数据是十六进制的,如果直接把这些数据送给数码管显示显然很不直观,因此需要把这些数据向十进制转换。转换的算法有两种,第一种算法的思想是对该十六进制数除以100,商为百位,余数再除以10,再得到的商为十位,余数为个位。这种算法虽然程序的编写非常简单,但是它的局限性也非常明显,即它只能对不大于两位的十六进制数进行转换,对于大于两位的十进制数则无能为力。这次设计的频率计频率范围远不止两位十六进制数就能记得下,所以这里采用第二种方法。

第二种方法算法的编程实现非常复杂,但是可以对任意长度的十六进制数向十进制转换。这种算法的基本思路是:第一步将最高位的高半字节提出来,除以10,把商存储起来,余数与最高位的低半字节组合成一个字节,再除以10,再存储商,余数以此类推,直到最后一次计算得到的余数即为十进制数的个位;第二步把第一步存储的商组合成一个字节,依次除以10,仍然把每次得到的商存储起来,以此类推最后一次得到的余数即为十进制数的十位;以后也是以此类推得到十进制数的百位、千位……以上算法必须要注意的一个为题是,每次得到的余数与低位的半字节组合成一个字节时,余数必须放在该字节的高半字节,否则计算错误。该本次频率计系待测的时钟信号的最高频率为460800Hz,对应的十六进制数为70800H,这里就以70800H转换为十进制数为例来说明这种算法。

第一步:用7H除以10,商0H7H,把商0存储在24H单元,余数7H与下一个字节08H的高半字节0H组合成一个字节70H70H除以10,商BH2H,把商BH存储在25H单元,余数2H8H组合成一个字节28H28H除以10,商4H0H,把商4H存储在26H单元,余数0H0H组合成一个字节00H00H除以10,商0H0H,把商0H存储在27H单元,余数0H0H组合成一个字节00H00H除以10,商0H0H,把商0H存储在28H单元,余数0即为所需十进制数的个位。

第二步:把存储在24H25H单元的商组合成一个字节0BH0BH除以10,同第一步,存储商,余数与下一个商组合成一个字节,再除以10,一次类推得到十进制数的十位0

第三步:方法同第二步,得到十进制数的百位8

第四步:方法同第三步,得到十进制数的千位0

第五步:方法同第四步,得到十进制数的万位6和十万位4

最后得到了十进制数4608004.3详细的展示了这种进制转换算法的过程。

这种算法的编程实现如下,转换后的十进制数由低到高依次存放再50H—60H单元中。


ZHUANHUAN:;向十进制转换

MOV A,23H

MOV B,#0AH

DIV AB

MOV 24H,A ;存储第一位商

;---------------

MOV A,B

MOV 30H,22H

ANL 30H,#0F0H

ADD A,30H

SWAP A

MOV B,#0AH

DIV AB

MOV 25H,A ;存储第二位商

;---------------

MOV A,B

SWAP A

ANL 22H,#0FH

ADD A,22H

MOV B,#0AH

DIV AB

MOV 26H,A ;存储第三位商

;---------------

MOV A,B

MOV 30H,21H

ANL 30H,#0F0H

ADD A,30H

SWAP A

MOV B,#0AH

DIV AB

MOV 27H,A ;存储第四位商

;---------------

MOV A,B

SWAP A

ANL 21H,#0FH

ADD A,21H

MOV B,#0AH

DIV AB

MOV 28H,A ;存储第五位商

MOV 50H,B ;存储十进制数个位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 24H,A ;存储第一位商

;---------------

MOV A,B

SWAP A

ADD A,26H

MOV B,#0AH

DIV AB

MOV 25H,A ;存储第二位商

;---------------

MOV A,B

SWAP A

ADD A,27H

MOV B,#0AH

DIV AB

MOV 26H,A ;存储第三位商

;---------------

MOV A,B

SWAP A

ADD A,28H

MOV B,#0AH

DIV AB

MOV 27H,A ;存储第四位商

MOV 51H,B ;存储十进制数十位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 24H,A ;存储第一位商

;---------------

MOV A,B

SWAP A

ADD A,26H


MOV B,#0AH

DIV AB

MOV 25H,A ;存储第二位商

;---------------

MOV A,B

SWAP A

ADD A,27H

MOV B,#0AH

DIV AB

MOV 26H,A ;存储第三位商

MOV 52H,B ;存储十进制数百位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 24H,A ;存储第一位商

;---------------

MOV A,B

SWAP A

ADD A,26H

MOV B,#0AH

DIV AB

MOV 25H,A ;存储第二位商

MOV 53H,B ;存储十进制数千位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 54H,B ;存储十进制数万位

MOV 55H,A ;存储十进制数十万位


4.5 数码显示

将采集到的频率转换为十进制数后,还不能直接将这些数送给数码显示,因为七段LED数码管内部由7个条形发光二极管和一个小圆点发光二极管组成,根据各管的亮暗组合成字符。本次设计所给数码管十进制数显示代码如下所示。

4.1  LED十进制字形显示代码表

 

 

 

 

 

 

 

 

 

 


将十进制数转换为相应的LED显示的代码,最容易实现的编程方法就是查表,因数码管最多只需要显示六位,只需要查六次表就可以了。

编写的程序如下:

MOV R0,#50H

MOV R1,#5FH

MOV DPTR,#TAB

NEXT3:MOV A,@R0

MOVC A,@A+DPTR

INC R0

INC R1

MOV @R1,A ;把即将数码管显示的数据送入以60H为首的单元

DJNZ R2,NEXT3

TAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H

得到十进制数的LED显示代码以后,就可以把这些代码送入数码管显示了,方法是50单片机先通过通信的方式把显示代码发送给数码管管理芯片ZLG7290相应的显示区域,就可以通过数码管显示频率了。51单片机通过通信传送数据的过程如图5.5所示。

具体程序实现如下:  


    NUMBYT  EQU 5DH


SLA     EQU 5EH

MTD     EQU 5FH

SCL     EQU P1.0

SDA     EQU P1.1

   

    MOV MTD,#10H  ;字节数据发送

MOV NUMBYT,#09H

MOV SLA,#70H

LCALL WRNBYT

WRNBYT:

PUSH  PSW

WRNBYT1:

MOV PSW,#18h

CALL STA

MOV A,SLA

CALL WRB

CALL CACK

JB  F0,WRNBYT

MOV  R0,#MTD

MOV  R5,NUMBYT

WRDA:

MOV  A,@R0

LCALL  WRB

LCALL CACK

JB  F0,WRNBYT1

INC  R0

DJNZ  R5,WRDA

LCALL  STOP

POP  PSW

RET

 

WRB:MOV  R7,#8

WLP:RLC  A

JC  WR1

CLR  SDA

SETB  SCL

NOP

NOP

NOP

NOP

CLR  SCL

DJNZ  R7,WLP

RET

WR1:SETB  SDA

SETB  SCL

NOP

NOP

NOP

NOP

CLR  SCL

CLR  SDA

DJNZ  R7,WLP

RET

 

CACK: ;应答位检查

SETB  SDA

SETB  SCL

NOP

NOP

MOV  C,SDA

MOV  F0,C

CLR  SCL

NOP

NOP

RET

 

STA:

SETB  SDA;发送起始位

SETB  SCL

NOP

NOP

NOP

NOP

CLR  SDA

NOP

NOP

NOP

NOP

CLR  SCL

RET

STOP:

CLR  SDA ;发送停止位

SETB  SCL

NOP

NOP

NOP

NOP

SETB  SDA

NOP

NOP

NOP

NOP

CLR  SCL

RETI


 

 


 

5 软件设计总体程序

各单元子程序已经设计完毕,将各子程序通过适当的指令链接起来,总程序的第一部分为T0T1初始化,第二部分为1定时,第三部分为计数,第四部分为采集频率,第五福分为进制转化,第六部分为数码显示,这几部分构成了转速表软件系统的总体程序,如下所示:


 

NUMBYT  EQU 5DH

SLA     EQU 5EH

MTD     EQU 5FH

SCL     EQU P1.0

SDA     EQU P1.1

 

ORG 0000H

AJMP START

ORG 000BH       ;T0中断入口

AJMP T0INT

ORG 001BH       ;T1中断入口

AJMP T1INT

ORG 0030H

 

START:

MOV SP,#70H

MOV IE,#8AH     ;开放T0T1中断

MOV TMOD,#51H  ;T0定时,T1计数

MOV TH0,#0DCH

MOV TL0,#00H    ;定时10ms

MOV 20H,#100    ;100*10ms=1s

MOV TH1,#00H

MOV TL1,#00H

MOV 21H,#0

MOV 22H,#0

MOV 23H,#0;存放采集到的频率

SETB TR1

SETB TR0

WAIT:AJMP WAIT ;等待中断

 

T1INT:

INC 23H;计数器溢出则23H单元自增1

RETI 

 

T0INT:  ;定时10ms产生中断

DJNZ 20H,NEXT1

CLR TR1

CLR TR0

MOV 22H,TH1 ;1s时间到则采集数据

MOV 21H,TL1

ACALL DISPLAY

AJMP EXIT

NEXT1:MOV TH0,#0DCH  ;继续定时

MOV TL0,#00H

EXIT:RETI

 

DISPLAY:

MOV R0,#60H

MOV R1,#08H  ;60H-67H单元清零

NEXT2:MOV @R0,#0

INC R0

DJNZ R1,NEXT2  

 

ZHUANHUAN:    ;进制转换

MOV A,23H

MOV B,#0AH

DIV AB

MOV 24H,A      ;存储第一位商

;---------------

MOV A,B

MOV 30H,22H

ANL 30H,#0F0H

ADD A,30H

SWAP A

MOV B,#0AH

DIV AB

MOV 25H,A       ;存储第二位商

;---------------

MOV A,B

SWAP A

ANL 22H,#0FH

ADD A,22H

MOV B,#0AH

DIV AB

MOV 26H,A       ;存储第三位商

;---------------

MOV A,B

MOV 30H,21H

ANL 30H,#0F0H

ADD A,30H

SWAP A

MOV B,#0AH

DIV AB

MOV 27H,A       ;存储第四位商

;---------------

MOV A,B

SWAP A

ANL 21H,#0FH

ADD A,21H

MOV B,#0AH

DIV AB

MOV 28H,A       ;存储第五位商

MOV 50H,B       ;存储十进制数个位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 24H,A       ;存储第一位商

;---------------

MOV A,B

SWAP A

ADD A,26H

MOV B,#0AH

DIV AB

MOV 25H,A       ;存储第二位商

;---------------

MOV A,B

SWAP A

ADD A,27H

MOV B,#0AH

DIV AB

MOV 26H,A       ;存储第三位商

;---------------

MOV A,B

SWAP A

ADD A,28H

MOV B,#0AH

DIV AB

MOV 27H,A       ;存储第四位商

MOV 51H,B      ;存储十进制数十位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 24H,A       ;存储第一位商

;---------------

MOV A,B

SWAP A

ADD A,26H

MOV B,#0AH

DIV AB

MOV 25H,A       ;存储第二位商

;---------------

MOV A,B

SWAP A

ADD A,27H

MOV B,#0AH

DIV AB

MOV 26H,A       ;存储第三位商

MOV 52H,B       ;存储十进制数百位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 24H,A       ;存储第一位商

;---------------

MOV A,B

SWAP A

ADD A,26H

MOV B,#0AH

DIV AB

MOV 25H,A       ;存储第二位商

MOV 53H,B     ;存储十进制数千位

;;;;;;;;;;;;;;;;;

MOV A,24H

SWAP A

ADD A,25H

MOV B,#0AH

DIV AB

MOV 54H,B     ;存储十进制数万位

MOV 55H,A     ;存储十进制数十万位

 

PINBI:      ;将高位的0屏蔽不显示

MOV R3,#0

MOV R0,#55H

ST2:MOV A,@R0

JZ ST1

AJMP SHUMA

ST1:INC R3

DEC R0

AJMP ST2

 

SHUMA:

MOV A,#6

CLR C

SUBB A,R3

MOV R2,A  ;将需要显示的位数存入R2

MOV R0,#50H

MOV R1,#5FH

MOV DPTR,#TAB

NEXT3:MOV A,@R0

MOVC A,@A+DPTR

INC R0

INC R1

MOV @R1,A

DJNZ R2,NEXT3

MOV MTD,#10H

MOV NUMBYT,#09H

MOV SLA,#70H

LCALL WRNBYT

RET

 

WRNBYT:

PUSH  PSW

WRNBYT1:

MOV PSW,#18h

CALL STA

MOV A,SLA

CALL WRB

CALL CACK

JB  F0,WRNBYT

MOV  R0,#MTD

MOV  R5,NUMBYT

WRDA:

MOV  A,@R0

LCALL  WRB

LCALL CACK

JB  F0,WRNBYT1

INC  R0

DJNZ  R5,WRDA

LCALL  STOP

POP  PSW

RET

 

WRB:MOV  R7,#8 ;字节数据发送

WLP:RLC  A

JC  WR1

CLR  SDA

SETB  SCL

NOP

NOP

NOP

NOP

CLR  SCL

DJNZ  R7,WLP

RET

WR1:SETB  SDA

SETB  SCL

NOP

NOP

NOP

NOP

CLR  SCL

CLR  SDA

DJNZ  R7,WLP

RET

 

CACK:

SETB  SDA

SETB  SCL

NOP

NOP

MOV  C,SDA

MOV  F0,C

CLR  SCL

NOP

NOP

RET

 

STA:

SETB  SDA    ;发送起始位

SETB  SCL

NOP

NOP

NOP

NOP

CLR  SDA

NOP

NOP

NOP

NOP

CLR  SCL

RET

STOP:

CLR  SDA    ;发送停止位

SETB  SCL

NOP

NOP

NOP

NOP

SETB  SDA

NOP

NOP

NOP

NOP

CLR  SCL

RETI

TAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H

END


 


6 程序调试

编写的转速表软件总体程序编译成HEX文件,烧写入51单片机内,P3.5角输入一定频率(较小)的时钟信号,观察数码管显示的频率与输入信号的频率相符,逐渐增大输入信号的频率,数码显示的频率开始出现误差,并且误差随着输入信号频率的增加而增加,当输信号达到频率计所允许输入的最高频率时,误差达到了650Hz,即误差

此误差很小可以认误差在允许的范围内,即频率计的计频功能满足要求。

另外在观察数码管显示的时候,发现高位的“0”仍然能够显示,而通常十进制的高位的“0”通常是省略的。显示“0”的原因是没有考虑到频率值小于六位十进制数的情况,当频率小于六位十进制数时,传送到ZLG7290显示区的数据仍然是六位,高位由“0”填充,因此会出现高位显示“0”的情况。为了解决这个问题,需要另外添加一段屏蔽高位的“0”的程序。解决的思想是把高位“0”的个数记下,设为n,那么只需要传送给管理芯片的数据位数为6-n

 

7 心得体会

在此次单片机课程设计,我学到很多很多的东西:不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题。同时在设计的过程中也发现了自己的不足:对以前所学过的知识理解得不够深刻,掌握得不够牢固,焊接的工艺不够好,对单片机汇编语言掌握得不牢...通过这次课程设计使我巩固了原来的知识,同时也懂得了理论与实际相结合是很重要的。

这次课程设计终于顺利完成了,在此期间中不仅提高自己的实际动手能力也锻炼了独立思考的能力。在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于完成了课程设计的要求。我想这会给我以后的单片机设计实验打下基础,为我的课程实践铺下成功之路!

 

 

 

 

参考文献

[1] 李群芳.单片微型计算机与接口技术(第二版).北京:电子工业出版社,2005

[2] 蒋立培.单片危机系统使用教程.北京:机械工业出版社,2004

[3] 凌玉华.单片机原理及应用系统设计.长沙:中南大学出版社,2006

[4] 王琼.单片机原理及应用实践教程.合肥:合肥工业大学出版社,2005

[5] 刘丹.例说8051.北京:人民邮电出版社,2006


 

 


在线客服
联系方式

热线电话

13329706647

上班时间

周一到周五

公司电话

027-87052087

二维码
线