📄 atm89c2051rts.asm
字号:
;***************************;
; 数控调频手动控制器 ;
;***************************;
;发射控制芯片BH1415F
;P2和P0扫描显示LED
WEISHU EQU 30H ;位数指示
XIANSHI EQU 31H ;位指示
CONBITL EQU 21H ;频率控制字节低8位
CONBITH EQU 22H ;频率控制字节高8位
KEYWORD EQU 23H ;存放键扫描时P1口值
Muting EQU P1.4 ;发射静音
DATAF EQU P1.6 ;发射数据
CLOCKF EQU P1.7 ;发射时钟
CSCEF EQU P1.5 ;发射片选
;
;
ORG 0000H ;程序开始地址
LJMP START ;转START执行
ORG 0003H ;
RETI ;不用中断程序
ORG 000BH ;
RETI ; 不用中断程序
ORG 0013H ;
RETI ; 不用中断程序
ORG 001BH ;
RETI ; 不用中断程序
ORG 0023H ;
RETI ; 不用中断程序
ORG 002BH ;
RETI ; 不用中断程序
;
;初始化程序
CLEARMEN: MOV R0,#20H ;20H-34H循环清0
MOV R1,#12H ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P1,#0FFH ;
MOV P0,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CLR Muting ;发射开音BH1415禁止操作
CLR DATAF ;发射数据
CLR CLOCKF ;发射时钟
CLR CSCEF ;发射片选
CLEAR1: MOV PCON,#00H ;控制寄存器清0
MOV 29H,#01H ; 置初始值为110.0MHZ倍频后220MHZ
MOV 28H,#00H ;
MOV 27H,#06H ;
MOV 26H,#05H ;
LCALL DISPUPDAT ;写入BH1415芯片(修改发送频率)
MOV WEISHU,#05H
RET
;主程序
START: LCALL CLEARMEN ;上电初始化
MAIN: LCALL KEYFUN00 ;调查键子程序
LCALL DINGSHI
LCALL DISPLAY ;LED显示一次
AJMP MAIN ;转MAIN循环
NOP ;PC出错处理
NOP ;
AJMP START ;重新初始化
;位数指示
JIESHUZHIIN: MOV A,WEISHU
CJNE A,#01H,NAGEAIQU111
MOV 31H,#14H
MOV 32H,#0AH
MOV 33H,28H
MOV 34H,#14H
AJMP JIESHUZHOUT555
NAGEAIQU111: CJNE A,#02H,NAGEAIQU222
MOV 31H,#14H
MOV 32H,27H
MOV 33H,#14H
MOV 34H,#14H
AJMP JIESHUZHOUT555
NAGEAIQU222: CJNE A,#03H,NAGEAIQU333
MOV 31H,26H
MOV 32H,#0AH
MOV 33H,#14H
MOV 34H,#14H
AJMP JIESHUZHOUT555
NAGEAIQU333: CJNE A,#04H,JIESHUZHOUT444
MOV 31H,#14H
MOV 32H,#0AH
MOV 33H,#14H
MOV 34H,29H
AJMP JIESHUZHOUT555
JIESHUZHOUT444: CJNE A,#05H,JIESHUZHOUT555
MOV 31H,26H
MOV 32H,27H
MOV 33H,28H
MOV 34H,29H
JIESHUZHOUT555:RET
;
KEYFUN00: JB P3.2,DSFSFAS
KEYFUN0011: LCALL DISPLAY
JNB P3.2,KEYFUN0011
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JNB P3.2,KEYFUN0011
INC WEISHU ;个位数加1
MOV A,WEISHU ;
CLR C ;
CJNE A,#06H,JHLLURYEE ;判断是否小于10
JHLLURYEE: JC DSFSFAS ;小于10转FUN02OUT
MOV WEISHU,#01H ;大于或等于10清为0
DSFSFAS: RET ;
;
;
DINGSHI: JB P3.3,RGERRTHRTH
DINGSHI1: LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JNB P3.3,DINGSHI1
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
LCALL DISPLAY
JNB P3.3,DINGSHI1
MOV A,WEISHU
CJNE A,#01H,NAGEAIQU1
KEYFUN01: CLR A
INC 28H ;百位数加1
MOV A,28H ;入A
CLR C ;清进位标志
CJNE A,#04H,FUN001 ; ;百位小于2转FUNOO0UT
MOV 28H,#08H
AJMP FUN0013 ;大于等于2清为0(百位只能是0或1)
FUN001: CJNE A,#09H,FUN0012
MOV 28H,#09H
AJMP FUN0013
FUN0012: CJNE A,#0AH,FUN0013
MOV 28H,#00H
FUN0013: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU1: CJNE A,#02H,NAGEAIQU2
CLR A
INC 27H ;个位数加1
MOV A,27H ;
CLR C ;
CJNE A,#0AH,FUN02 ;判断是否小于10
FUN02: JC FUN02OUT ;小于10转FUN02OUT
MOV 27H,#00H ;大于或等于10清为0
FUN02OUT: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU2: CJNE A,#03H,NAGEAIQU3
CLR A
INC 26H ;个位数加1
MOV A,26H ;
CLR C ;
CJNE A,#0AH,FUN03 ;判断是不小于10
FUN03: JC FUN03OUT ;小于10转FUN03OUT
MOV 26H,#00H ;大于或等于10清为0
FUN03OUT: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
AJMP NAGEAIQU
NAGEAIQU3: CJNE A,#04H,NAGEAIQU
CLR A
INC 29H ;个位数加1
MOV A,29H ;
CLR C ;
CJNE A,#02H,FUN04 ;判断是不小于10
FUN04: JC FUN04OUT ;小于10转FUN03OUT
MOV 29H,#00H ;大于或等于10清为0
FUN04OUT: LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
NAGEAIQU: LCALL DISPLAY
RGERRTHRTH: RET
; 将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT: LCALL BCDB ; 调BCD码转为十六进制数程序
LCALL CONCOMMAND ; 调与5位控制码合成操作码程序
LCALL PUTBIT ; 发控制字至BH1415
RET ;返回
;
; 将BCD码转为十六进制数程序
BCDB: MOV A,#00H
MOV CONBITL,#00H ; 控制字清0
MOV CONBITH,#00H ; 控制字清0
MOV CONBITL,26H ;小数位数放入控制字低8位
MOV A,27H ;个位数乘10操作
MOV B,#10 ;
LCALL MULLOOP ;调乘法子程序
MOV A,28H ;十位数乘100操作
MOV B,#100 ;
LCALL MULLOOP ; 调乘法子程序
MOV A,29H ;
JNZ ADD3E8 ;百位数为1转ADD3E8(加1000操作)
RET ; 百位数为0退出
ADD3E8: CLR C ;清进位档标志
MOV A,#0E8H ;低8位加法
ADD A,CONBITL ;累加
MOV CONBITL,A ;放回CONBITL
MOV A,#03H ; 高8位加法
ADDC A,CONBITH ;控制字高8位处理
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;乘法及累加处理程序(将四位显示的十进制BCD码转为1个二进制数)
MULLOOP: MUL AB ;乘法
CLR C ;清进位标志
ADD A,CONBITL ;积低8位与CONBITL相加
MOV CONBITL,A ;放回CONBITL
MOV A,CONBITH ;
ADDC A,B ;积高8位与CONBITH带进位累加
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;频率控制数据与5位控制码合成BH1415控制字
CONCOMMAND: ANL CONBITH,#07H ;高四位为0
MOV A,#40H ;控制字放入A
ORL A,CONBITH ;合成控制字
MOV CONBITH,A ;放回CONBITH
RET ;返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT: MOV A,CONBITL ;低8位控制字入A
SETB CSCEF ;片选 ;BH1415使能(允许写)
LCALL PUT
MOV A,CONBITH ; 高8位控制字入A
LCALL PUT ; 发送8位
CLR CSCEF ;片选 ; BH1415写禁止
CLR DATAF ;复位
CLR CLOCKF ;复位
RET ;返回
;
;字节发送子程序
PUT: MOV R3,#8 ;发送8位控制
CLR C ;清C
PUT1: RRC A ;带进位位右移(先发低位)
MOV DATAF,C ;低位送至P3.0口
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
SETB CLOCKF ;锁存数据(上升沿时锁存数据)
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
CLR CLOCKF ;
DJNZ R3,PUT1 ;8位未发完转PUT1再发
RET ; 8位发完结束
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: LCALL JIESHUZHIIN
MOV A,#0AH
ADD A,32H
MOV 32H,A
MOV R1,#31H ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P3口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P1口
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
ENDOUTA: JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P2.5 ;一次显示结束,P3口复位
MOV P2,#0FFH ;P3.7口为0时转时间调整程序
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,0BFH
;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9""不亮"
;
;513微秒延时子程序
DL513: MOV R3,#0FFH
DL513LOOP: DJNZ R3,DL513LOOP
RET
;
;1毫秒延时子程序(LED点亮用)
DL1MS: MOV R4,#02H
DL1MSLOOP: LCALL DL513
DJNZ R4,DL1MSLOOP
RET
;
;10毫秒延时子程序(消抖动用)
DL10MS: MOV R6,#0AH
DL10MSLOOP: LCALL DL1MS
DJNZ R6,DL10MSLOOP
RET
;
DL05S: LCALL DL10MS
LCALL DL10MS
RET
;
END ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -