资源描述
`武汉理工大学《电子系统设计与调试》课程设计说明书
目录
1.前言 1
2 智能转速表的系统设计 1
2.1 系统硬件设计 1
2.1.1方案选择 1
2.1.2仪器各部分组成 2
2.2 系统软件设计 3
3 设计原理 5
3.1转速计算及误差分析 5
3.2转速测量 6
3.2.1门控方式计数 6
3.2.2中断方式计数 7
3.3串行显示接口 7
4 软件程序的设计 8
4.1 1s定时 8
4.2 T1计数程序 8
4.3 频率数据采集 9
4.4 进制转换 10
4.5 数码显示 13
5 软件设计总体程序 15
6 总程序调试 21
7 心得体会 21
参考文献 22
1.前言
单片微型计算机简称单片机,又称为微控制器(MCU)是20世纪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 EPROM和8155作为显示器的接口。该系统的整体结构框图见下图2.1所示:
图2.1智能转速表总结构流程图
2.1.2仪器各部分组成
(1)传感器
传感器为红外光电式传感器。其中一个发光二极管发出红外波长的光,可不受室内自然光的影响,此光照到旋转物体上反射回后,被光敏三极管接收。光敏三极管接受到此信号后,经放大,整形转换为矩形脉冲信号送入MCS-51单片机的外部中断输入端INTO和INT1上。
(2)键盘
键盘由功能键,数字键,存入键,取出键,单双键路选择键,启动停止键等组成。为了减少键的数目,以减少故障率,采用了一键多用的复用键方案,但软件相对复杂一些。
键盘于8031的P1口直接相连,以加快对键盘的扫描速度。也可以用8155等芯片作为键盘的输入接口,但扫描速度比前者慢一些。
(3)显示器
8个LED数码管作显示器,它通过可编程并行I/O接口芯片8155与8031相连。8155的A口通过反相驱动(75452或7406)作为显示器位选口;B口通过同相驱动器(7407)作显示器段选口。
在进行不同测量时,除在LED显示器上以英文字母提示外,在运行过程中还以不同的发光二极管指示测量的内容。发光二极管由8155的C口驱动。
(4)程序存储器
系统的监控程序和运算处理程序存放在外接4K字节的EPROM2732中。
(5)数据存储器
数据存储器由8031片内的低128字节和8155内部256字节的RAM组成.8031的内部RAM主要用于堆栈,工作寄存器,显示缓冲器,各测量参数的计算缓冲器和标致位等。而8155内部的RAM除上部4个单元外,全部用于存放转速和线速度值,其存储空间划分如图2-2所示,共分为三组,每组84个单元,可存入42个16位二进制数据,即42个4位16进制数据。如下图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个周期,即测得的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门控方式计数
由8031定时器/计数器T0工作原理可知,当其工作在计数方式,只要T0引脚上有负跳变,计数器就加1。CPU在每个机器周期的状态时,采样T0,所以需要2个机器周期才能识别一个T0的负跳变,即T0的周期至少应该等于2倍机器周期。若晶振频率为6MHz,6分频后得到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 ;开放T0、T1中断
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次,显然需要对计数单元进行扩展,扩展的思路是除了计数器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
根据流程图设计的计数程序如下:
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,商0H余7H,把商0存储在24H单元,余数7H与下一个字节08H的高半字节0H组合成一个字节70H。70H除以10,商BH余2H,把商BH存储在25H单元,余数2H与8H组合成一个字节28H。28H除以10,商4H余0H,把商4H存储在26H单元,余数0H与0H组合成一个字节00H。00H除以10,商0H余0H,把商0H存储在27H单元,余数0H与0H组合成一个字节00H。00H除以10,商0H余0H,把商0H存储在28H单元,余数0即为所需十进制数的个位。
第二步:把存储在24H与25H单元的商组合成一个字节0BH。0BH除以10,同第一步,存储商,余数与下一个商组合成一个字节,再除以10,一次类推得到十进制数的十位0。
第三步:方法同第二步,得到十进制数的百位8。
第四步:方法同第三步,得到十进制数的千位0。
第五步:方法同第四步,得到十进制数的万位6和十万位4。
最后得到了十进制数460800。图4.3详细的展示了这种进制转换算法的过程。
这种算法的编程实现如下,转换后的十进制数由低到高依次存放再50H—60H单元中。
22
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十进制字形显示代码表
0 --------------------------- FC 1 --------------------------- 60
2 --------------------------- DA 3 -------------------------- F2
4 --------------------------- 66 5 -------------------------- B6
6 --------------------------- BE 7 --------------------------- E0
8 --------------------------- FE 9 --------------------------- E6
将十进制数转换为相应的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 软件设计总体程序
各单元子程序已经设计完毕,将各子程序通过适当的指令链接起来,总程序的第一部分为T0、T1初始化,第二部分为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 ;开放T0、T1中断
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
目 录
第一章 总论 1
一、项目概况 1
二、项目提出的理由与过程 6
三、项目建设的必要性 8
四、项目的可行性 12
第二章 市场预测 15
一、市场分析 15
二、市场预测 16
三、产品市场竞争力分析 19
第三章 建设规模与产品方案 22
一、建设规模 22
二、产品方案 22
三、质量标准 22
第四章 项目建设地点 25
一、项目建设地点选择 25
二、项目建设地条件 25
第五章 技术方案、设备方案和工程方案 28
一、技术方案 28
二、产品特点 30
三、主要设备方案 32
四、工程方案 32
第六章 原材料与原料供应 35
一、原料来源及运输方式 35
二、燃料供应与运输方式 35
第七章 总图布置、运输、总体布局与公用辅助工程 37
一、总图布置 37
二、 运输 38
三、总体布局 38
四、公用辅助工程 39
第八章 节能、节水与安全措施 44
一、主要依据及标准 44
二、节能 44
三、节水 45
四、消防与安全 45
第九章 环境影响与评价 47
一、法规依据 47
二、项目建设对环境影响 48
三、环境保护措施 48
四、环境影响评价 49
第十章 项目组织管理与运行 50
一、项目建设期管理 50
二、项目运行期组织管理 52
第十一章 项目实施进
展开阅读全文