?? file11.asm
字號:
;該信號源可以產生 多種波形,包括:占空比為1:1的方波,頻率可調節(1 -- 50 Hz)
;調制波,載波頻率為1k,備調制頻率 (1 -- 50 Hz)
;高頻信號 : 高電平 5V, 低電平 0V 頻率 500K;
;按鍵1選擇 輸出波形方式 1 ->非載波(LED3亮,LED1指示輸出情況) 2 -> 載波(LED2亮,LED1指示輸出);
;按鍵2選擇 輸出頻率
;按鍵3 啟動\停止
beep bit p3.7
led1 bit p1.0
led2 bit p1.1
led3 bit p1.2
led4 bit p1.3
led5 bit p1.4
led6 bit p1.5
led7 bit p1.6
led8 bit p1.7
s1 bit p0.0
s2 bit p0.1
s3 bit p0.2
s4 bit p0.3
s5 bit p0.4
s6 bit p0.5
s7 bit p0.6
s8 bit p0.7
t_l equ 41h ;定時初值低位
t_h equ 42h ;定時初值高位
mode equ 43h ;輸出方式
fre equ 44h ;輸出頻率
dis_h equ 45h ;顯示高位
dis_l equ 46h ;顯示低位
intcout equ 47h ;需要定時的次數
start bit 00h
flag bit 01h
outmode bit 02h
outh bit 03h
led_data equ p2
key1 bit p3.3
key2 bit p3.4
key3 bit p3.5
key equ 46h
; ****************** 以上預定義部分
org 00h
jmp main
org 0bh
jmp tim0 ;定時器T0中斷服務程序
org 1bh
jmp tim1 ;定時器T1中斷服務程序
org 030h
main:mov sp,#30h
clr beep
lcall rest
lcall timer ;設置定時器工作方式
lp:lcall process ;分析命令
lcall out
jnb start,lp
lcall display
clr beep
jmp lp
; ********* 初始化 ************
rest: mov a,#00h ;寄存器初始化
mov b,#00h
mov fre,#00h
setb outmode ;帶調制輸出
clr outh ;輸出低電平
mov mode,#01h ;工作模式 1
mov p0,#0 ;禁止數碼管
mov p2,#255 ;
mov p1,0ffh ;禁止 LED
clr beep ;禁止蜂鳴器
clr start ;清除開始標志
mov dis_h,#00h ;清除頻率值
mov dis_l,#00h ;
ret ;返回
;*********** 定時器T1中斷服務程序 ****************
tim1: mov th1,t_h ;定時20ms
mov tl1, t_l ;
mov r0,intcout
djnz r0,tin1
cpl flag
tin1:clr flag
reti
;*********** 定時器T0中斷服務程序 ****************
tim0: mov th0,0fch ;定時1ms
mov tl0, 17h ;
jnb flag,t_end ;flag運行標志,=1標示允許輸出
jnb outh,t_end ;outh 表示輸出高電平的狀態
cpl p1.0
t_end:reti
; ************* 波形輸出 ****************************
; 根據用戶的輸入指令,讀入相應的數據,以產生不同頻率的波形
; 數據表格存在 data_tab中
out: jnb start,o_end ; 開關狀態,關閉則返回
jb outmode,out12
clr tr0 ;模式0,非載波輸出
jnb flag,out11 ;查看定時器T1工作狀態
setb p1.0 ;定時器T1前半周期,輸出高電平
out11: clr p1.0 ;定時器T1后半周期,輸出低電平
jmp o_end ;返回
out1: jnb flag,out12 ;工作方式1
setb tr0 ;定時器前半周期,定時器T0輸出
out12: clr p1.0 ;定時器后半周期,輸出低電平
o_end: ret ;返回
; ************ 讀入數據 *****************************
indata: mov a,fre
mov b,#3
mul ab
mov a,b
mov dptr,#data_tab ;數據表頭
movc a,@a+dptr ;讀取數據
mov t_h,a ;保存數據高位
inc dptr ;找下一個
movc a,@a+dptr ;讀取第二個數據
mov t_l,a ;保存低位
inc dptr
movc a,@a+dptr
mov intcout,a
ret ;返回
; ************ 工作協調子程序 **********************
process: mov key,#00h ;設置鍵值
lcall pro_key ;查詢鍵盤
mov a,key ;得到鍵值
jz pro_end ;用戶沒有按鍵,直接返回
cjne a,#1,pro1 ;用戶按 1 鍵
mov key,#00h ;重新設置鍵值
clr led3 ;點亮LED3指示燈
setb led2 ;熄滅LED2指示燈
inc mode ;設置輸出模式
mov a,mode ;如果模式大于2
cjne a,#2,pro_end ;修改為 0
mov mode,#00h ;模式不能大于2
pro1:cjne a,#2,pro3 ;功能2設置頻率
mov key,#00h ;清除鍵盤結果
inc fre ;頻率自增
mov a,fre ;顯示頻率值
cjne a,#51,pro_end ;限制頻率不大于50
mov fre,#00h ;
pro3: mov a,#03h ;運行狀態設置
setb led3 ;設置指示燈狀態
setb led2 ;
mov key,#00h ;清除鍵盤內容
cpl start ;如果沒有設置啟動狀態,設置
pro_end: ret ;如果設置了啟動狀態
; ********* 碼型變換 *************
bcd: mov b,#10
div ab
mov dis_h,a
mov dis_l,b
ret
; ********** 顯示 **************
display: mov a,fre
mov b,#10
div ab
mov dis_h,a
mov dis_l,b
mov dptr,#tab_nu
mov a,dis_h
movc a,@a+dptr
mov led_data,a
setb s2
clr s1
lcall m_del
mov a,dis_l
movc a,@a+dptr
mov led_data,a
setb s1
clr s2
lcall m_del
ret
; ************ 鍵盤程序 *****************************
pro_key: ;鍵盤查詢子程序
setb key1 ;首先輸出低電平,檢測高電平的到來
setb key2 ;不同電路,可能檢測方式不一樣
setb key3
jb key1,ke1 ;如果用戶沒有按第一個鍵,到第下個處理部分,
mov key,#1 ;表示用戶按了第一個鍵
lcall delay20ms ;軟件延時,防止干擾
jmp pro_key ;重新查詢,直到用戶釋放按鍵
ke1:jb key2,ke2 ;處理第二個按鍵,如果沒有到下一個處理部分
mov key,#2 ;以下和第一個處理單元相似。
lcall delay20ms
jmp pro_key
ke2:jb key3,ke3
mov key,#3
lcall delay20ms
jmp pro_key
ke3:
ret
; *********** 設置定時器T1 ************
timer:
mov tmod,#11h ;設置定時器T1為一個16位定時器
mov t_h,#0d8h
mov t_l, #0efh
mov th1,#0d8h ;定時10ms
mov tl1,#0efh ;
mov th0,#0fch ;定時1ms
mov tl0,#17h ;定時器T0
setb ea ;
setb et0 ;
clr tr0 ;定時器T1停止工作
ret ;返回
;************ 定時20 ms *************
delay20ms: push psw ; 保存原來的寄存器單元
clr psw.3 ; 設置新的寄存器
setb psw.4 ;
mov r0,#2 ; 延時參數1
mov r1,#250 ; 延時參數2
mov r2,#1 ; 延時參數3
dl1:djnz r0,dl1 ; 延時循環1
mov r0,#250 ; 重新設置循環數據
dl2:djnz r1,dl1 ; 開始第二道循環
mov r0,#240 ;
mov r1,#248 ;
dl3:djnz r2,dl1 ; 第三道循環
nop ; 修正定時精度
pop psw ; 恢復原來的寄存器組
ret ; 返回
;*********** end *******************
; ******* 顯示定時 10 uS ****************
m_del: push psw
clr psw.3
setb psw.4
mov r7,#4
del1: nop
djnz r7,del1
pop psw
ret
; ******* data_tab 數據表格 **************
; th1, tl1,intcount ......
; ^ ^ ^
data_tab: db 12h, 00h, 01h,00h,01h,02h
db 00h
;***************************************************************************8
;這是數字顯示表格,其中 帶小數點的數字比不帶小數點的數字大16
; 比如 0 的顯示代碼為 0;那么 0.的顯示代碼為 16;如此類推
tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 數字0-7 不帶小數點代碼
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 數字8-f 不帶小數點代碼
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 數字0-7 帶小數點代碼
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 數字8-f 帶小數點代碼
end ;告訴編譯器本程序到此結束,一定需要加上,否則編譯通不過。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -