|
汇编频率计的所有资料下载:
频率计.zip
(110.65 KB, 下载次数: 135)
源程序:
- //************************************济南大学 赵向坤 数字频率计 功能:每隔1s(忽略了lcd显示所需时间,实际大于1s)刷新显示测量频*************************************//
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //内部RAM的120,121,122,123,124,125存储单元用于暂存显示频率数值。120,122,124依此存储TL0,TL0计满100,122计满100的次数,使用BACI程序转换成非压缩的ASCII码
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- RS EQU P2.0 ;数据/命令选择端
- RW EQU P2.1 ;读/写选择端
- E EQU P2.2 ;使能控制
- LCD EQU P0 ;LCD的数据口,对应DB0-DB7
- ORG 0000H
- AJMP START ;转向主程序
- ORG 000BH
- LJMP INTTF0 ;转向计数器0
- ORG 001BH
- LJMP INTTF1 ;转向计数器1
- ORG 0100H
- START: ;START用于LCD初始显示LCD第一行显示FRQC: ,第一行显示 WAIT
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //复位后SP=07,为防止与堆栈区占用工作寄存器区域0-31地址,需要重新设置堆栈区域
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- MOV SP,#60H ;设置堆栈区域
- //--------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //LCD液晶初始化设置,并使LCD第一行显示FRQC:,第二行显示 WAIT HZ
- //---------------------------------------------第一行显示FRQC:---------------------------------------------------------------------------------------------------------
- CALL INTI_LCD ;初始化液晶
- MOV A,#99
- MOV 120,A
- MOV 122,A
- MOV 124,A
- CALL BACI
- MOV A,#0C0H ;设置写入数据到LCD的开始地址
- CALL WRITE_COMMAND
- MOV DPTR,125 ;字符表首地址送DPTR
- LINE1:
- MOV A,@DPTR ;将TAB1中数据送至A
- ACALL WRITE_DATA ;调用写数据到LCD程序
- DEC DPTR
- CJNE DPTR,#120H,LINE1 ;是否写满5个
- NN: SJMP MM
- SJMP NN
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //B-A是将以120为首地址存放的压缩BCD频率数据转换成ASCI码,方便LCD显示
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- BACI:
- MOV R0,#120 ; DPTR指向RAM120存储单元
- BACIW:
- MOV A,@R0
- DA A
- MOV B,A
- ANL A,#0FH
- ORL A,#30H
- MOV @R0,A
- INC R0
- MOV A,B
- SWAP A
- ANL A,#0FH
- ORL A,#30H
- MOV @R0,A
- INC R0
- MOV A,R0
- CJNE A,#126,BACIW
- DEC R0
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- AGAIN1:
- MOV A,@R0
- CJNE A,'0',BAEE
- MOV @R0,' ' ;将高位的显示数字0转换为空格
- DEC R0
- CJNE R0,#120,AGAIN1 ;若要显示的数字全部为零,则只显示最后一个120存储单元中的0
- BAEE: RET
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //LCD服务程序
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- INTI_LCD:
- MOV A,#38H ;显示模式设置
- CALL WRITE_COMMAND
- CALL CHECK_BUSY ;判忙
- MOV A,#01H ;清屏
- CALL WRITE_COMMAND
- MOV A,#0CH ;显示开及光标设置
- CALL WRITE_COMMAND
- MOV A,#06H ;显示光标移动设置
- CALL WRITE_COMMAND
- RET
- CHECK_BUSY:
- CLR RS
- SETB RW
- WAIT:
- SETB E ;E=1,允许送数据周期
- MOV R7,#5
- CALL DELAYR7MS
- MOV A,LCD ;将LCD中数据送到A
- MOV R7,#5
- MOV R7,#5
- CALL DELAYR7MS
- CLR E ;E=0,结束送数据周期
- ANL A,#80H ;检查LCD是否忙碌
- JNZ WAIT ;是,返回TO继续检查,否则返回原程序地址
- RET
- WRITE_COMMAND:
- CLR RW
- CLR RS
- SETB E
- MOV LCD,A ;将命令字写入LCD
- CLR E
- MOV R7,#5
- CALL DELAYR7MS
- RET
- WRITE_DATA:
- SETB RS
- CLR RW
- SETB E
- MOV LCD,A ;将数据送到LCD
- CLR E
- MOV R7,#5
- CALL DELAYR7MS
- RET
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //定时计数器初始模式设置
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- STMOD:
- SETB EA
- MOV TMOD,#26H ;设置TMOD=26H,计数器0工作于计数工作方式2,初值为0
- MOV TH1,#(256-100) ;定时100us次溢出中断
- MOV TL1,#(256-100)
- MOV TH0,#(256-100) ;计数100次溢出中断
- MOV TL0,#(256-100)
- SETB ET1 ;开计数器1中断
- SETB ET0 ;开计数器0中断
- SETB TR1 ;启动计数器0
- SETB TR0 ;启动计数器0
- RET
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //延时子程序(延时时间=R7*1MS)
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- DELAYR7MS: ;延时1ms*R7
- DL1:
- MOV R6,#8EH
- DL0:
- MOV R5,#02H
- DJNZ R5,$
- DJNZ R6,DL0
- DJNZ R7,DL1
- RET
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- //用于LCD查表显示
- //---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- TAB1: DB "FRQC:"
- TAB2: DB "WAIT"
- TAB3: DB "HZ"
- END
复制代码
|
评分
-
查看全部评分
|