数控调频发射台的设计
题目:基于单片机的数控调频发射台
功能:本数控调频发射器可在80.0 MHZ 至109.9MHZ 范围内任意设置发
射频率,可预置11 个频道,发射频率调整最小值为0.1MHZ ,具有单声道/立体声控制,可广泛应用于学校无线广播、电视现场导播、汽车航行、无线演说等场所。
设计过程:
一、系统硬件电路的设计
(1)单片机控制部分
单片机采用AT89C52,采用最小化应用系统设计,P0 口和P2 口作为共阳LED 数码管驱动用,P1 口作为16 键的键盘接口,其中T0—T3 分别为百位、十位、个位、小数位的频率操作键。百位数只能是0 或1,当百位数为0 时,十位数为8 或9。当百位数为1 时,十位数只能为0。个位及小数位为09之中任意数。T4—T14 为发射频率预置键, T15 为单声道/立体声控制键。P3.0、P3.1、P3.2 作为与BH1415 的通讯端口,用于传送发射频率控制数据,P3.3 用于立体声发射批示。采用12MHZ 晶振,模拟串口通讯。单片机控制部分电路如下图一。
(2)调频调制发射部分
采用Rohm 公司最新生产的调频发射专用集成电路BH1415F ,内含立体声信号调制、调频广播信号发射电路,BH1415F 内有前置补偿电路、限制器电路、低通滤波电路等,因此具有良好的音色,内置PLL 系统调频发射电路,传输频率非常稳定。调频发射频率可用单片机通过串行口直接控制。BH1415F 各引脚的功能如表1,应用电路如图2。从11 脚输出的调频调制信号经高频放大后由天线发射输出,后级高频放大器的功率可根据接收的距离范围考虑。
BH1415F 的频率控制码为16 位,其传送格式要求如图5,其中D0—D10 为频率控制数据,其值乘0.1 即为BH1415F 的输出频率(单位MHZ )。D11—D15 为控制位,其中D11(MONO )位为单声道/立体声控制位,0 时为单声道发射模式,1时为立体声发射模式。D12(PD0)、D13(PD1)位用于相位控制,通常为0,当分别为01 和10 时可使发射频率在最低和最高处。D14(T0)和D15(T1)为测试模式控制用,通常为00,当为10 时为测试模式。
(3)电源系统
采用单片机控制的数字调频台功耗很小,可用7805 三端稳压块分
别对单片机和BH1415F 电路单独供电,电源变压器功率大于10W 即可。集成块电源脚应就近接0.1μF 的瓷片电容。
二、 内存单元的使用要求
26H-29H 用来存放显示个、十、百、千位的BCD 码数据,24H-25H 放频率控制数据(十六进制),21H 用来存放频率控制字节低8 位数据,22H 用来存放频率控制字节高8 位数据,23H 用来存放键扫描时P1 端口的值。
三、系统主要程序的设计
(1)键盘扫描程序
采用4*4 行列式查询法。方法是对P1.0—P1.3 行线口分别置0,然
后读入P1 口高四位的值,若不为1111 则说明有键按下,根据读入的P1 口值与键号表进行查表对照,从而取得按键的键号值。其程序流程图见图3。
(2)显示程序
采用动态扫描法显示4 位频率数字值。
(3)串行通讯程序
由十进制BCD 码转十六进制程序、16 位频率控制字节合成程序、
模拟异步串行发送程序组成。模拟异步串行发送程序是根据BH1415F 的的传送要求编写的,
四、数控调频台控制器源程序:
;26H-29H 放显示小数位、个位、十位、百位 BCD 码数,24H-25H 放频率控制数据(十六进制)
;
初始化程序 CONBITL EQU 21H ; 频率控制字节低 8 位 CONBITH EQU 22H ; 频率控制字节高 8 位 KEYWORD EQU 23H ; 存放键扫描时 P1 口值 ORG 0000H ; 程序开始地址 LJMP START ; 转 START 执行 ORG 0003H RETI 程序 ORG RETI ORG 0013H RETI ORG 001BH RETI ORG 0023H RETI ORG RETI 002BH ; ; 不用中断000BH ; ; 不用中断程序 ; ; 不用中断程序 ; ; 不用中断程序 ; ; 不用中断程序 ; ; 不用中断程序
CLEARMEN: MOV R0,#20H
MOV
INC R1,#0AH ;20H-29H 循环清 0 ;
; 四端口置 1
;BH1415 禁止操作
;
; CLEARLOOP: MOV @R0,#00H ; R0 MOV P0,#0FFH MOV P2,#0FFH MOV P3,#0FFH CLR P3.0 CLR P3.1 CLR P3.2
CLEAR1:
MOV 29H,#00H
MOV 28H,#08H
MOV 27H,#08H
MOV 26H,#00H
LCALL DISPUPDAT
RET
;主程序
START: LCALL CLEARMEN
MAIN: LCALL KEYWORK
LCALL DISPLAY
AJMP MAIN
NOP
NOP ; 上电初始化 ; 调查键子程序 ;LED 显示一次 ; 转 MAIN 循环 ;PC 出错处理 ;
; 重新初始化
; 置 P1 口为输入状态 ; 置初始值为 88MHZ(显示为 088.0) ; ; ; ; 写入 BH1415 芯片(修改发送频率) ; 子程序返回 DJNZ R1,CLEARLOOP ; MOV P1,#0FFH ; LCALL KEYFUN15 ; 置立体声发射方式, 开立体声发射指示灯 MOV PCON,#00H ; 控制寄存器清 0 AJMP START ; 4*4 行列扫描查键子程序 KEYWORK: MOV P1,#0FFH
CLR P1.0
MOV
ANL A,P1 A,#0F0H ; 扫描第一行(第一行为 0) ; 读入 P1 口值 ; 低四位为 0
P1.0 ; 扫描第二行(第二行为 0)
;
; 读入 P1 口值 ANL
; 低四位为 0
P1.1 ; 扫描第三行(第三行为 0)
;
; 读入 P1 口值
; 低四位为 0
P1.2 ; 扫描第四行(第四行为 0)
;
; 读入 P1 口值
; 低四位为 0
P1.3 ; 结束行扫描
; 子程序返回
; 消抖处理
; 再读入 P1 口值
; 低四位为 0
; 干扰, 子程序返回
; 读 P1 口值
; 放入 23H 暂存
; 调显示子程序
; 读 P1 口值
; 低四位为 0 CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB CLR P1.1 MOV A,P1 A,#0F0H CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB CLR P1.2 MOV ANL A,P1 A,#0F0H CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB CLR P1.3 MOV ANL A,P1 A,#0F0H CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB RET KEYCON: LCALL DL10MS MOV ANL KEYCHE KEYOUT: KEYCHE: CJLOOP: MOV MOV MOV ANL A,P1 A,#0F0H RET A,P1 KEYWORD,A A,P1 A,#0F0H CJNE A,#0F0H,KEYCHE ; 高四位不为全 1, 确有键按下, 转 LCALL DISPLAY
CJNE A,#0F0H,CJLOOP ; 高四位为全 1(键还按着), 转
CJLOOP 等待释放
MOV
MOV
CHEKEYLOOP: MOV R7,#00H A,R7 ; 键释放, 置 R7 初值为#00H(查表次数) ; 查表次数入 A DPTR,#KEYTAB ; 取键值表首址
KEYOK:
KEYFUNTAB:MOVC A,@A+DPTR ; 查表 XRL A,KEYWORD ; 查表值与 P1 口读入值比较 JZ KEYOK ; 为 0(相等) 转 KEYOK INC R7 ; 不等, 查表次数加 1 CJNE R7,#10H,CHEKEYLOOP ; 查表次数不超过16次转CHEKEYLOOP 再查 RET ;16 次到, 退出 MOV A,R7 ; 查表次数入 A(即键号值) MOV B,A ; 放入 B RL A ; 左移 ADD A,B ; 相加(键号乘 3 处理JMP 3字节指令) MOV DPTR,#KEYFUNTAB ; 取键功能散转表首址 JMP @A+DPTR ; 查表 LJMP KEYFUN00 ; 键功能散转表。跳至0号键功能程
序 LJMP KEYFUN01 ; 跳至 01号键功能程序
LJMP KEYFUN02 ; 跳至 02 号键功能程序
LJMP KEYFUN03
LJMP KEYFUN04
LJMP KEYFUN05
LJMP KEYFUN06
LJMP KEYFUN07
LJMP KEYFUN08
LJMP KEYFUN09
LJMP KEYFUN10
LJMP KEYFUN11
LJMP KEYFUN12
LJMP KEYFUN13
LJMP KEYFUN14
LJMP KEYFUN15 ; 跳至 15 号键
;
; 键号对应 P1 口数值表(同时按下两键为无效操作) KEYTAB:
DB
0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
DB 0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;0 号键功能程序 KEYFUN00: INC 29H
MOV
A,29H CLR C
FUN00:
JC MOV
FUN00OUT 29H,#00H
;百位数加 1 ;入 A ;清进位标志
;百位小于 2 转 FUNOO0UT
;大于等于 2 清为 0(百位只能是0A,29H ; 判断百位是 0 还是 1 ;
;若百位为 0 转 FOOOUT1 ;若百位为 1,十位为 0 ;
;若百位为 0,十位数改为 8 ; 写入控制芯片(修改发射频 ;返回 ;十位数加 1 ;入 A ;清进位标志
CJNE A,#02H,FUN00 ;
或1) FUN00OUT: MOV
XRL A,#01H JNZ MOV
F00OUT1: MOV F00OUT:
F00OUT1 28H,#00H 28H,#08H
AJMP F00OUT L CALL DISPUPDAT 率) RET
;01 号键功能程序 KEYFUN01: INC 28H
MOV
A,28H CLR C
FUN01:
JC
CJNE A,#0AH,FUN01 ;判断是否小于 10
FUN01OUT ;十位数小于 10 转 FUN01OUT MOV
;十位数大于或等于 10 清
为 0
FUN01OUT: MOV
A,29H
;判断百位数是 0 不是 1 ; ;
;百位数为 1 时,十位数为 0
XRL A,#01H JNZ F01OUT MOV
28H,#00H
28H,#00H
F01OUT: 9
XRL A,#08H JZ MOV JZ MOV RET
;02 号键功能程序 KEYFUN02: INC 27H
MOV
A,27H CLR C
FUN02:
JC MOV
FUN02OUT 27H,#00H F001OUT A,28H F001OUT 28H,#08H MOV
A,28H
; 百 位为 0 时,十位数只能是 8 或 ;判断是不是 8 ;十位数是 8 转 F001OUT ;
;判断是不是 9 ;十位数是 9 转 F001OUT
;不是 8 也不是 9,十位赋值为 8 ; 写入控制芯片(修改发射频率) ;返回 ;个位数加 1 ; ;
;小于 10 转 FUN02OUT ;大于或等于 10 清为 0
; 写入控制芯片(修改发射频率) ;
;个位数加 1 ; ;
;小于 10 转 FUN03OUT MOV ;大于或等于 10 清为 0 ; 写入控制芯片(修改发射频率) ; 返回
; 预置 109.0MHZ 发射频率
XRL A,#09H
F001OUT: LCALL DISPUPDAT
CJNE A,#0AH,FUN02 ;判断是否小于 10
FUN02OUT: L CALL DISPUPDAT
RET
;03 号键功能程序 KEYFUN03: INC 26H
MOV
A,26H CLR C
FUN03:
JC
FUN03OUT 26H,#00H
CJNE A,#0AH,FUN03 ;判断是不小于 10
FUN03OUT: L CALL DISPUPDAT
RET
KEYFUN04: MOV 29H,#01H
MOV 28H,#00H
;04 号键功能程序(频率预置键)
MOV 26H,#00H LCALL DISPUPDAT 射频率) RET
;05 号键功能程序(频率预置键) KEYFUN05: MOV 29H,#01H
MOV 28H,#00H MOV 27H,#08H MOV 26H,#00H LCALL DISPUPDAT RET
;06 号键功能程序(频率预置键) KEYFUN06: MOV 29H,#01H
发射频率 MOV MOV 27H,#05H MOV 26H,#00H LCALL DISPUPDAT RET
;07 号键功能程序(频率预置键) KEYFUN07: MOV 29H,#01H
发射频率 MOV MOV 27H,#00H MOV 26H,#00H LCALL DISPUPDAT RET
;08 号键功能程序(频率预置键) KEYFUN08: MOV 29H,#00H
MOV 28H,#09H MOV 27H,#08H MOV 26H,#00H LCALL DISPUPDAT RET
; 写入控制芯片(修改发射频率) ; 预置 98.0MHZ 发射频率 ; 写入控制芯片(修改发射频率) ; 预置 100.0MHZ 28H,#00H
; 写入控制芯片(修改发射频率) ; 预置 105.0MHZ 28H,#00H
; 写入控制芯片(修改发射频率) ; 预置 108.0MHZ 发射频率 ; 写入控制芯片(修改发
;09 号键功能程序(频率预置键) KEYFUN09: MOV 29H,#00H
发射频率 MOV MOV 27H,#06H MOV 26H,#00H LCALL DISPUPDAT RET
;10 号键功能程序(频率预置键) KEYFUN10: MOV 29H,#00H
MOV 28H,#09H MOV 27H,#04H MOV 26H,#00H LCALL DISPUPDAT RET
;11 号键功能程序(频率预置键) KEYFUN11: MOV 29H,#00H
发射频率 MOV MOV 27H,#02H MOV 26H,#00H LCALL DISPUPDAT 射频率) RET
;12 号键功能程序(频率预置键) KEYFUN12: MOV 29H,#00H
MOV 28H,#09H MOV 27H,#00H MOV 26H,#00H LCALL DISPUPDAT RET
;13 号键功能程序(频率预置键) KEYFUN13: MOV 29H,#00H
MOV 28H,#08H MOV 27H,#08H
; 预置 88.0MHZ 发射频率 ; 写入控制芯片(修改发射频率) ; 预置 90.0MHZ 发射频率 ; 写入控制芯片(修改发; 预置 92.0MHZ 28H,#09H
; 写入控制芯片(修改发射频率) ; 预置 94.0MHZ 发射频率 ; 写入控制芯片(修改发射频率) ; 预置 96.0MHZ 28H,#09H
MOV 26H,#00H LCALL DISPUPDAT 射频率) RET
;
;14 号键功能程序(频率预置键) ; 预置 87.0MHZ 发射频率 KEYFUN14:
MOV H H H
LCALL DISPUPDAT 射频率) RET
;
;15 号键功能程序(立体声/单声道设置键) KEYFUN15: CPL 03H
JNB
03H,MONO
道 MONO CLR
; 立体/单声标志取反 ; 为 0 转单声P3.3 ; 为 1 开控制字至 BH1415
RET
MONO:
SETB P3.3 LCALL PUTBIT RET
;
; 将 BCD 码转为十六进制数,与 5 位控制码合成操作码,写入控制芯片 DISPUPDAT: LCALL BCDB ; 调 BCD 码转为十六进制数程序
LCALL CONCOMMAND
; 调与 5 位控制码合成
操作码程序 LCALL PUTBIT ; 发控制字至
; 返回
; 关立体声指示灯 ; 发控制字至 BH1415 ; 返回
; 写入控制芯片(修改发
28H,#08
MOV 27H,#07
MOV 26H,#08
MOV 29H,#00H
; 写入控制芯片(修改发
立体声指示灯 LCALL PUTBIT ; 发送
BH1415 RET
;
; 将 BCD 码转为十六进制数程序 BCDB:
MOV CONBITL,#00H ; 控制字清 0 ; 返回
ADD3E8: MOV CONBITH,#00H MOV CONBITL,26H
低 8 位 MOV
操作 MOV B,#10 LCALL MULLOOP MOV
A,28H
操作 MOV LCALL MULLOOP 子程序 MOV JNZ ADD3E8 1000 操作) RET
CLR C
; 控制字清 0 ; 小数位数放入控制字A,27H ; 个位数乘 10 ;
; 调乘法子程序 ; 十位数乘 100 B,#100 ; ; 调乘法A,29H ;
; 百位数为 1 转 ADD3E8(加 ; 百位数为 0 退出 ; 清进位档标志
178
设计实例
MOV ADD MOV
A,#0E8H A,CONBITL CONBITL,A
; 低 8 位加法 ; 累加 ; 放回 A,#03H ; ; 控制字高 8 CONBITH,A ; 放回 ; 返回
CONBITL MOV 高 8 位加法 ADDC A,CONBITH 位处理 MOV CONBITH RET
;
;乘法及累加处理程序(将四位显示的十进制 BCD 码转为 1 个二进制数) MULLOOP:
CLR C ADD
A,CONBITL CONBITL 相加 MOV CONBITL MOV
A,CONBITH
;
; 积高 8 位与 CONBITH 带CONBITH,A ; 放回 CONBITH ; 返回
ADDC A,B 进位累加 MOV RET
;
;频率控制数据与 5 位控制码合成 BH1415 控制字 CONCOMMAND: ANL
; 高四位为 0 MOV A,20H ORL
A,CONBITH
制字 MOV
; 控制字放入 A ; 合成控CONBITH,A ; 放回 CONBITH CONBITH,#07HMUL AB ; 乘法 ; 清进位标志 ; 积低 8 位与 CONBITL,A ; 放回
RET
;
; 返回
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;
显示程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ; 共阳 LED 显示,P0 口输出段码,P2 口输出扫描字 DISPLAY: MOV
R1,#26H ; 显示首址 MOV R5,#0FEH ; 设扫描字 PLAY:
MOV A,R5 ; 放入 A MOV P2,A ;P2 口输出 MOV A,@R1 ; 取显示
数据 MOV DPTR,#TAB ; 取段码表首址 MOVC A,@A+DPTR ; 查段码 MOV P0,A ; 从 P0 输出 MOV A,R5 ; 读入扫描字
JB ACC.1,PLAY1 ; 不是十位(LED ),不显示小数点 CLR P0.7
; 是十位, 显示小数点 PLAY1:
LCALL DL1MS ; 点亮 1 毫秒 INC R1
; 指向下一显示
数据 JNB ACC.3,ENDOUT ; 是第四位
LED ,退出
RL A
; 不是,左移一位
179
设计实例
MOV R5,A SETB P0.7 AJMP PLAY
ENDOUT:
MOV P2,#0FFH 输出口 MOV RET
;
;0-9 共阳段码表
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH ;
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;
发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;
PUTBIT: MOV A,CONBITL
SETB P3. 2 LCALL PUT MOV A,CONBITH 制字入 A LCALL PUT CLR P3.2 禁止 CLR CLR P3.1 位 RET 返回
;
;字节发送子程序
; 低 8 位控制字入 A ;BH1415 使能(允许写) ; 发送 8 位 ; 高 8 位控; 发送 8 位 ; BH1415 写P3.0 ; 复位 ; 复 ; ; 放回 R5 ; 关小数点 ; 转 PLAY 循环 ; 显示结束,关显示P0,#0FFH ; ; 返回
PUT: MOV R3,#8 CLR C PUT1:
RRC A 低位) MOV P 3.0 口 NOP 微秒 NOP NOP NOP ; SETB P3.1 NOP 微秒 NOP NOP NOP CLR P3.1
; DJNZ R3,PUT1 再发 RET 束
;
;513 微秒延时子程序 DL513: MOV R3,#0FFH
; 发送 8 位控制 ; 清 C
; 带进位位右移(先发P3. 0,C ; 低位送至 ; 延时 4 ; ;
; 锁存数据(上升沿时锁存数据); 延时 4 ; ;8 位未发完转 PUT1 ; 8 位发完结
180
; ;
MCS 51 系列单片机设计实例
DL513LOOP: DJNZ R3,DL513LOOP
RET
;
;1 毫秒延时子程序(LED 点亮用) DL1MS: M OV R4,#02H
DL1MSLOOP: LCALL DL513
DJNZ
R4,DL1MSL
OOP RET
;
;10 毫秒延时子程序(消抖动用) DL10MS: MOV R6,#0AH
DL10MSLOOP: LCALL DL1MS
DJNZ
R6,DL10MSL
OOP RET
;
;
END
; 程序结束
数控调频发射台的设计
题目:基于单片机的数控调频发射台
功能:本数控调频发射器可在80.0 MHZ 至109.9MHZ 范围内任意设置发
射频率,可预置11 个频道,发射频率调整最小值为0.1MHZ ,具有单声道/立体声控制,可广泛应用于学校无线广播、电视现场导播、汽车航行、无线演说等场所。
设计过程:
一、系统硬件电路的设计
(1)单片机控制部分
单片机采用AT89C52,采用最小化应用系统设计,P0 口和P2 口作为共阳LED 数码管驱动用,P1 口作为16 键的键盘接口,其中T0—T3 分别为百位、十位、个位、小数位的频率操作键。百位数只能是0 或1,当百位数为0 时,十位数为8 或9。当百位数为1 时,十位数只能为0。个位及小数位为09之中任意数。T4—T14 为发射频率预置键, T15 为单声道/立体声控制键。P3.0、P3.1、P3.2 作为与BH1415 的通讯端口,用于传送发射频率控制数据,P3.3 用于立体声发射批示。采用12MHZ 晶振,模拟串口通讯。单片机控制部分电路如下图一。
(2)调频调制发射部分
采用Rohm 公司最新生产的调频发射专用集成电路BH1415F ,内含立体声信号调制、调频广播信号发射电路,BH1415F 内有前置补偿电路、限制器电路、低通滤波电路等,因此具有良好的音色,内置PLL 系统调频发射电路,传输频率非常稳定。调频发射频率可用单片机通过串行口直接控制。BH1415F 各引脚的功能如表1,应用电路如图2。从11 脚输出的调频调制信号经高频放大后由天线发射输出,后级高频放大器的功率可根据接收的距离范围考虑。
BH1415F 的频率控制码为16 位,其传送格式要求如图5,其中D0—D10 为频率控制数据,其值乘0.1 即为BH1415F 的输出频率(单位MHZ )。D11—D15 为控制位,其中D11(MONO )位为单声道/立体声控制位,0 时为单声道发射模式,1时为立体声发射模式。D12(PD0)、D13(PD1)位用于相位控制,通常为0,当分别为01 和10 时可使发射频率在最低和最高处。D14(T0)和D15(T1)为测试模式控制用,通常为00,当为10 时为测试模式。
(3)电源系统
采用单片机控制的数字调频台功耗很小,可用7805 三端稳压块分
别对单片机和BH1415F 电路单独供电,电源变压器功率大于10W 即可。集成块电源脚应就近接0.1μF 的瓷片电容。
二、 内存单元的使用要求
26H-29H 用来存放显示个、十、百、千位的BCD 码数据,24H-25H 放频率控制数据(十六进制),21H 用来存放频率控制字节低8 位数据,22H 用来存放频率控制字节高8 位数据,23H 用来存放键扫描时P1 端口的值。
三、系统主要程序的设计
(1)键盘扫描程序
采用4*4 行列式查询法。方法是对P1.0—P1.3 行线口分别置0,然
后读入P1 口高四位的值,若不为1111 则说明有键按下,根据读入的P1 口值与键号表进行查表对照,从而取得按键的键号值。其程序流程图见图3。
(2)显示程序
采用动态扫描法显示4 位频率数字值。
(3)串行通讯程序
由十进制BCD 码转十六进制程序、16 位频率控制字节合成程序、
模拟异步串行发送程序组成。模拟异步串行发送程序是根据BH1415F 的的传送要求编写的,
四、数控调频台控制器源程序:
;26H-29H 放显示小数位、个位、十位、百位 BCD 码数,24H-25H 放频率控制数据(十六进制)
;
初始化程序 CONBITL EQU 21H ; 频率控制字节低 8 位 CONBITH EQU 22H ; 频率控制字节高 8 位 KEYWORD EQU 23H ; 存放键扫描时 P1 口值 ORG 0000H ; 程序开始地址 LJMP START ; 转 START 执行 ORG 0003H RETI 程序 ORG RETI ORG 0013H RETI ORG 001BH RETI ORG 0023H RETI ORG RETI 002BH ; ; 不用中断000BH ; ; 不用中断程序 ; ; 不用中断程序 ; ; 不用中断程序 ; ; 不用中断程序 ; ; 不用中断程序
CLEARMEN: MOV R0,#20H
MOV
INC R1,#0AH ;20H-29H 循环清 0 ;
; 四端口置 1
;BH1415 禁止操作
;
; CLEARLOOP: MOV @R0,#00H ; R0 MOV P0,#0FFH MOV P2,#0FFH MOV P3,#0FFH CLR P3.0 CLR P3.1 CLR P3.2
CLEAR1:
MOV 29H,#00H
MOV 28H,#08H
MOV 27H,#08H
MOV 26H,#00H
LCALL DISPUPDAT
RET
;主程序
START: LCALL CLEARMEN
MAIN: LCALL KEYWORK
LCALL DISPLAY
AJMP MAIN
NOP
NOP ; 上电初始化 ; 调查键子程序 ;LED 显示一次 ; 转 MAIN 循环 ;PC 出错处理 ;
; 重新初始化
; 置 P1 口为输入状态 ; 置初始值为 88MHZ(显示为 088.0) ; ; ; ; 写入 BH1415 芯片(修改发送频率) ; 子程序返回 DJNZ R1,CLEARLOOP ; MOV P1,#0FFH ; LCALL KEYFUN15 ; 置立体声发射方式, 开立体声发射指示灯 MOV PCON,#00H ; 控制寄存器清 0 AJMP START ; 4*4 行列扫描查键子程序 KEYWORK: MOV P1,#0FFH
CLR P1.0
MOV
ANL A,P1 A,#0F0H ; 扫描第一行(第一行为 0) ; 读入 P1 口值 ; 低四位为 0
P1.0 ; 扫描第二行(第二行为 0)
;
; 读入 P1 口值 ANL
; 低四位为 0
P1.1 ; 扫描第三行(第三行为 0)
;
; 读入 P1 口值
; 低四位为 0
P1.2 ; 扫描第四行(第四行为 0)
;
; 读入 P1 口值
; 低四位为 0
P1.3 ; 结束行扫描
; 子程序返回
; 消抖处理
; 再读入 P1 口值
; 低四位为 0
; 干扰, 子程序返回
; 读 P1 口值
; 放入 23H 暂存
; 调显示子程序
; 读 P1 口值
; 低四位为 0 CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB CLR P1.1 MOV A,P1 A,#0F0H CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB CLR P1.2 MOV ANL A,P1 A,#0F0H CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB CLR P1.3 MOV ANL A,P1 A,#0F0H CJNE A,#0F0H,KEYCON ; 高四位不为全 1(有键按下) 转 KEYCOON SETB RET KEYCON: LCALL DL10MS MOV ANL KEYCHE KEYOUT: KEYCHE: CJLOOP: MOV MOV MOV ANL A,P1 A,#0F0H RET A,P1 KEYWORD,A A,P1 A,#0F0H CJNE A,#0F0H,KEYCHE ; 高四位不为全 1, 确有键按下, 转 LCALL DISPLAY
CJNE A,#0F0H,CJLOOP ; 高四位为全 1(键还按着), 转
CJLOOP 等待释放
MOV
MOV
CHEKEYLOOP: MOV R7,#00H A,R7 ; 键释放, 置 R7 初值为#00H(查表次数) ; 查表次数入 A DPTR,#KEYTAB ; 取键值表首址
KEYOK:
KEYFUNTAB:MOVC A,@A+DPTR ; 查表 XRL A,KEYWORD ; 查表值与 P1 口读入值比较 JZ KEYOK ; 为 0(相等) 转 KEYOK INC R7 ; 不等, 查表次数加 1 CJNE R7,#10H,CHEKEYLOOP ; 查表次数不超过16次转CHEKEYLOOP 再查 RET ;16 次到, 退出 MOV A,R7 ; 查表次数入 A(即键号值) MOV B,A ; 放入 B RL A ; 左移 ADD A,B ; 相加(键号乘 3 处理JMP 3字节指令) MOV DPTR,#KEYFUNTAB ; 取键功能散转表首址 JMP @A+DPTR ; 查表 LJMP KEYFUN00 ; 键功能散转表。跳至0号键功能程
序 LJMP KEYFUN01 ; 跳至 01号键功能程序
LJMP KEYFUN02 ; 跳至 02 号键功能程序
LJMP KEYFUN03
LJMP KEYFUN04
LJMP KEYFUN05
LJMP KEYFUN06
LJMP KEYFUN07
LJMP KEYFUN08
LJMP KEYFUN09
LJMP KEYFUN10
LJMP KEYFUN11
LJMP KEYFUN12
LJMP KEYFUN13
LJMP KEYFUN14
LJMP KEYFUN15 ; 跳至 15 号键
;
; 键号对应 P1 口数值表(同时按下两键为无效操作) KEYTAB:
DB
0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH
DB 0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH
;0 号键功能程序 KEYFUN00: INC 29H
MOV
A,29H CLR C
FUN00:
JC MOV
FUN00OUT 29H,#00H
;百位数加 1 ;入 A ;清进位标志
;百位小于 2 转 FUNOO0UT
;大于等于 2 清为 0(百位只能是0A,29H ; 判断百位是 0 还是 1 ;
;若百位为 0 转 FOOOUT1 ;若百位为 1,十位为 0 ;
;若百位为 0,十位数改为 8 ; 写入控制芯片(修改发射频 ;返回 ;十位数加 1 ;入 A ;清进位标志
CJNE A,#02H,FUN00 ;
或1) FUN00OUT: MOV
XRL A,#01H JNZ MOV
F00OUT1: MOV F00OUT:
F00OUT1 28H,#00H 28H,#08H
AJMP F00OUT L CALL DISPUPDAT 率) RET
;01 号键功能程序 KEYFUN01: INC 28H
MOV
A,28H CLR C
FUN01:
JC
CJNE A,#0AH,FUN01 ;判断是否小于 10
FUN01OUT ;十位数小于 10 转 FUN01OUT MOV
;十位数大于或等于 10 清
为 0
FUN01OUT: MOV
A,29H
;判断百位数是 0 不是 1 ; ;
;百位数为 1 时,十位数为 0
XRL A,#01H JNZ F01OUT MOV
28H,#00H
28H,#00H
F01OUT: 9
XRL A,#08H JZ MOV JZ MOV RET
;02 号键功能程序 KEYFUN02: INC 27H
MOV
A,27H CLR C
FUN02:
JC MOV
FUN02OUT 27H,#00H F001OUT A,28H F001OUT 28H,#08H MOV
A,28H
; 百 位为 0 时,十位数只能是 8 或 ;判断是不是 8 ;十位数是 8 转 F001OUT ;
;判断是不是 9 ;十位数是 9 转 F001OUT
;不是 8 也不是 9,十位赋值为 8 ; 写入控制芯片(修改发射频率) ;返回 ;个位数加 1 ; ;
;小于 10 转 FUN02OUT ;大于或等于 10 清为 0
; 写入控制芯片(修改发射频率) ;
;个位数加 1 ; ;
;小于 10 转 FUN03OUT MOV ;大于或等于 10 清为 0 ; 写入控制芯片(修改发射频率) ; 返回
; 预置 109.0MHZ 发射频率
XRL A,#09H
F001OUT: LCALL DISPUPDAT
CJNE A,#0AH,FUN02 ;判断是否小于 10
FUN02OUT: L CALL DISPUPDAT
RET
;03 号键功能程序 KEYFUN03: INC 26H
MOV
A,26H CLR C
FUN03:
JC
FUN03OUT 26H,#00H
CJNE A,#0AH,FUN03 ;判断是不小于 10
FUN03OUT: L CALL DISPUPDAT
RET
KEYFUN04: MOV 29H,#01H
MOV 28H,#00H
;04 号键功能程序(频率预置键)
MOV 26H,#00H LCALL DISPUPDAT 射频率) RET
;05 号键功能程序(频率预置键) KEYFUN05: MOV 29H,#01H
MOV 28H,#00H MOV 27H,#08H MOV 26H,#00H LCALL DISPUPDAT RET
;06 号键功能程序(频率预置键) KEYFUN06: MOV 29H,#01H
发射频率 MOV MOV 27H,#05H MOV 26H,#00H LCALL DISPUPDAT RET
;07 号键功能程序(频率预置键) KEYFUN07: MOV 29H,#01H
发射频率 MOV MOV 27H,#00H MOV 26H,#00H LCALL DISPUPDAT RET
;08 号键功能程序(频率预置键) KEYFUN08: MOV 29H,#00H
MOV 28H,#09H MOV 27H,#08H MOV 26H,#00H LCALL DISPUPDAT RET
; 写入控制芯片(修改发射频率) ; 预置 98.0MHZ 发射频率 ; 写入控制芯片(修改发射频率) ; 预置 100.0MHZ 28H,#00H
; 写入控制芯片(修改发射频率) ; 预置 105.0MHZ 28H,#00H
; 写入控制芯片(修改发射频率) ; 预置 108.0MHZ 发射频率 ; 写入控制芯片(修改发
;09 号键功能程序(频率预置键) KEYFUN09: MOV 29H,#00H
发射频率 MOV MOV 27H,#06H MOV 26H,#00H LCALL DISPUPDAT RET
;10 号键功能程序(频率预置键) KEYFUN10: MOV 29H,#00H
MOV 28H,#09H MOV 27H,#04H MOV 26H,#00H LCALL DISPUPDAT RET
;11 号键功能程序(频率预置键) KEYFUN11: MOV 29H,#00H
发射频率 MOV MOV 27H,#02H MOV 26H,#00H LCALL DISPUPDAT 射频率) RET
;12 号键功能程序(频率预置键) KEYFUN12: MOV 29H,#00H
MOV 28H,#09H MOV 27H,#00H MOV 26H,#00H LCALL DISPUPDAT RET
;13 号键功能程序(频率预置键) KEYFUN13: MOV 29H,#00H
MOV 28H,#08H MOV 27H,#08H
; 预置 88.0MHZ 发射频率 ; 写入控制芯片(修改发射频率) ; 预置 90.0MHZ 发射频率 ; 写入控制芯片(修改发; 预置 92.0MHZ 28H,#09H
; 写入控制芯片(修改发射频率) ; 预置 94.0MHZ 发射频率 ; 写入控制芯片(修改发射频率) ; 预置 96.0MHZ 28H,#09H
MOV 26H,#00H LCALL DISPUPDAT 射频率) RET
;
;14 号键功能程序(频率预置键) ; 预置 87.0MHZ 发射频率 KEYFUN14:
MOV H H H
LCALL DISPUPDAT 射频率) RET
;
;15 号键功能程序(立体声/单声道设置键) KEYFUN15: CPL 03H
JNB
03H,MONO
道 MONO CLR
; 立体/单声标志取反 ; 为 0 转单声P3.3 ; 为 1 开控制字至 BH1415
RET
MONO:
SETB P3.3 LCALL PUTBIT RET
;
; 将 BCD 码转为十六进制数,与 5 位控制码合成操作码,写入控制芯片 DISPUPDAT: LCALL BCDB ; 调 BCD 码转为十六进制数程序
LCALL CONCOMMAND
; 调与 5 位控制码合成
操作码程序 LCALL PUTBIT ; 发控制字至
; 返回
; 关立体声指示灯 ; 发控制字至 BH1415 ; 返回
; 写入控制芯片(修改发
28H,#08
MOV 27H,#07
MOV 26H,#08
MOV 29H,#00H
; 写入控制芯片(修改发
立体声指示灯 LCALL PUTBIT ; 发送
BH1415 RET
;
; 将 BCD 码转为十六进制数程序 BCDB:
MOV CONBITL,#00H ; 控制字清 0 ; 返回
ADD3E8: MOV CONBITH,#00H MOV CONBITL,26H
低 8 位 MOV
操作 MOV B,#10 LCALL MULLOOP MOV
A,28H
操作 MOV LCALL MULLOOP 子程序 MOV JNZ ADD3E8 1000 操作) RET
CLR C
; 控制字清 0 ; 小数位数放入控制字A,27H ; 个位数乘 10 ;
; 调乘法子程序 ; 十位数乘 100 B,#100 ; ; 调乘法A,29H ;
; 百位数为 1 转 ADD3E8(加 ; 百位数为 0 退出 ; 清进位档标志
178
设计实例
MOV ADD MOV
A,#0E8H A,CONBITL CONBITL,A
; 低 8 位加法 ; 累加 ; 放回 A,#03H ; ; 控制字高 8 CONBITH,A ; 放回 ; 返回
CONBITL MOV 高 8 位加法 ADDC A,CONBITH 位处理 MOV CONBITH RET
;
;乘法及累加处理程序(将四位显示的十进制 BCD 码转为 1 个二进制数) MULLOOP:
CLR C ADD
A,CONBITL CONBITL 相加 MOV CONBITL MOV
A,CONBITH
;
; 积高 8 位与 CONBITH 带CONBITH,A ; 放回 CONBITH ; 返回
ADDC A,B 进位累加 MOV RET
;
;频率控制数据与 5 位控制码合成 BH1415 控制字 CONCOMMAND: ANL
; 高四位为 0 MOV A,20H ORL
A,CONBITH
制字 MOV
; 控制字放入 A ; 合成控CONBITH,A ; 放回 CONBITH CONBITH,#07HMUL AB ; 乘法 ; 清进位标志 ; 积低 8 位与 CONBITL,A ; 放回
RET
;
; 返回
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;
显示程序
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ; 共阳 LED 显示,P0 口输出段码,P2 口输出扫描字 DISPLAY: MOV
R1,#26H ; 显示首址 MOV R5,#0FEH ; 设扫描字 PLAY:
MOV A,R5 ; 放入 A MOV P2,A ;P2 口输出 MOV A,@R1 ; 取显示
数据 MOV DPTR,#TAB ; 取段码表首址 MOVC A,@A+DPTR ; 查段码 MOV P0,A ; 从 P0 输出 MOV A,R5 ; 读入扫描字
JB ACC.1,PLAY1 ; 不是十位(LED ),不显示小数点 CLR P0.7
; 是十位, 显示小数点 PLAY1:
LCALL DL1MS ; 点亮 1 毫秒 INC R1
; 指向下一显示
数据 JNB ACC.3,ENDOUT ; 是第四位
LED ,退出
RL A
; 不是,左移一位
179
设计实例
MOV R5,A SETB P0.7 AJMP PLAY
ENDOUT:
MOV P2,#0FFH 输出口 MOV RET
;
;0-9 共阳段码表
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH ;
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;
发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;; ;
PUTBIT: MOV A,CONBITL
SETB P3. 2 LCALL PUT MOV A,CONBITH 制字入 A LCALL PUT CLR P3.2 禁止 CLR CLR P3.1 位 RET 返回
;
;字节发送子程序
; 低 8 位控制字入 A ;BH1415 使能(允许写) ; 发送 8 位 ; 高 8 位控; 发送 8 位 ; BH1415 写P3.0 ; 复位 ; 复 ; ; 放回 R5 ; 关小数点 ; 转 PLAY 循环 ; 显示结束,关显示P0,#0FFH ; ; 返回
PUT: MOV R3,#8 CLR C PUT1:
RRC A 低位) MOV P 3.0 口 NOP 微秒 NOP NOP NOP ; SETB P3.1 NOP 微秒 NOP NOP NOP CLR P3.1
; DJNZ R3,PUT1 再发 RET 束
;
;513 微秒延时子程序 DL513: MOV R3,#0FFH
; 发送 8 位控制 ; 清 C
; 带进位位右移(先发P3. 0,C ; 低位送至 ; 延时 4 ; ;
; 锁存数据(上升沿时锁存数据); 延时 4 ; ;8 位未发完转 PUT1 ; 8 位发完结
180
; ;
MCS 51 系列单片机设计实例
DL513LOOP: DJNZ R3,DL513LOOP
RET
;
;1 毫秒延时子程序(LED 点亮用) DL1MS: M OV R4,#02H
DL1MSLOOP: LCALL DL513
DJNZ
R4,DL1MSL
OOP RET
;
;10 毫秒延时子程序(消抖动用) DL10MS: MOV R6,#0AH
DL10MSLOOP: LCALL DL1MS
DJNZ
R6,DL10MSL
OOP RET
;
;
END
; 程序结束