|
匯編頻率計的所有資料下載:
頻率計.zip
(110.65 KB, 下載次數: 135)
2016-9-25 17:09 上傳
點擊文件名下載附件
源程序:
- //************************************濟南大學 趙向坤 數字頻率計 功能:每隔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
復制代碼
|
評分
-
查看全部評分
|