找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2098|回复: 0

基于单片机控制的锁相环调频立体声发射机

[复制链接]
发表于 2009-7-4 01:10:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
采用 BH 1417F 制作的锁相环调频发射板。发射频率非常稳定,该板常用于控制调频立体声发射机。但其发射频率仅有 14 个频点,无法满足广大制作爱好者的需求。为此,可以采用性能更优的 BHl 415F 来制作调频发射机。
BH 1415F 和 BH 1417F 的外围电路基本相同,元件封装也相同,故制作爱好者可以将 BH 1415F 直接替换 BH 1417F 。二者的主要区别在于频率的控制方式不同. BH 1415F 采用单片机控制,频点可达 500 个之多。
与 BH 1417F 相比, BH 1415F 对 ~ 脚赋予了新的定义。具体如下:
脚: CHIP ENABLE ,简称 CE 。传送使能端,要改变 BH 1415F 的工作状态,必须将此脚置为高电平。
脚: CLOCK ,简称 CK ,传送时钟端。
脚: DATA ,简称 DA ,传送数据端。
脚: MUTE ,静音控制端,用于关闭音频信号。
本文介绍的单片机锁相环控制器,主要是用于控制 BHl 415F 发射板的工作频率。文中分析了控制器的工作原理和制作方法,并给出了相应的控制程序,供读者制作参考。
一、电路原理
图 l 是采用 AT89S51 单片机的控制器电路原理图.采用四只 0.5 英寸 红色 LED 数码管显示 BH 1415F 的发射频率,用 4 × 4 矩阵键盘来调整和预置发射频率。
晶振 JT1 ,电容 C3 、 C4 构成单片机的时钟电路; R1 、 C2 构成单片机复位电路; R5 ~ R16 、 VT1 ~ VT4 、四只 LED 共阳数码管构成动态显示电路,用于显示发射机的工作频率:按钮 KO ~ K15 构成 4x4 键盘,用于调整发射频率和预置发射频率。整个电路非常简洁,安装调试也十分简单。
⑤脚插座 J1 是该控制器与 BHl 415F 发射板的连接插座。一方面从 BH 1415F 发射板上获取 5V 的电源为单片机供电,另一方面将单片机的控制数据送往 BH 1415F 。 IC2 、 R3 、 R4 是预留的存储器电路,可以用于本锁相环控制器的升级。 LED1 、 R2 用作“立体声/单声道”指示,本次制作中没有使用。
单片机锁相环控制器的印刷电路如图 2 所示,图中没有排立体声指示灯。
图 3 是元件装配图。 LED 发光数码管可以选用其他颜色的.但必须用共阳数码管。 IC1 AT89S51 不要直接焊接在电路板上,应该先在电路板上焊一只 40 脚的 IC 插座,以便今后修改软件,增加控制器的功能。
整个电路比较简单,只要元件选择正确,安装无误,焊接可靠,不需要做任何调试即可制作成功。
二、控制软件
为了便于广大电子制作爱好者和调频发烧友制作本文介绍的数控锁相环发射机,笔者已经将 汇编源程序进行了编译,得到的 HEX 文件和 BIN 文件 , 读者可将其用编程器写入 AT89S51 单片机芯片.然后将芯片插入 40 脚插座,再通过插座 J1 连接控制器电路板和 BHl 415F 发射板.经仔细检查无误后即可通电试机。
三、使用方法
面板上的 16 只按键用于设置发射机的工作频率。最上一行的 +100 、 +10 、 +l 、 +O . 1 四只按键,配合红色数码管的显示,分别用于调整发射频率的百位、十位、个位和小数位。第二、三行以及第四行的前 3 个按键,共计 11 只按键,用于预置频率的设置,通过这 11 只按键,可以快速切换发射频率。第四行最后一只按键 S / M 用于调整立体声/单声道模式.本文提供的软件只使用了面板的部分按键。
[img]/qzone/newblog/v5/editor/css/loading.gif[/img]

[img]/qzone/newblog/v5/editor/css/loading.gif[/img]


基于单片机控制的锁相环调频立体声发射机源程序
简介:1、控制采用MCS51,采用最小化应用系统设计,外围电路很简单!16个按键设计,可控制80.0~109.9MHz频率范围;
2、4位共阳LED显示频率;
功能:1、能独立设定百位、十位、个位、小数点的频率;
2、发射频率预置;
3、单声道/立体声控制;带立体声发射指示;
---------------------------------------------------------------------------------------
;***************************;
;                数控FM控制器                  ;
;***************************;
;
;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 000BH ;
RETI ; 不用中断程序
ORG 0013H ;
RETI ; 不用中断程序
ORG 001BH ;
RETI ; 不用中断程序
ORG 0023H ;
RETI ; 不用中断程序
ORG 002BH ;
RETI ; 不用中断程序
;
;初始化程序
CLEARMEN: MOV R0,#20H ;20H-29H循环清0
MOV R1,#0AH ;
CLEARLOOP: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CLEARLOOP ;
MOV P0,#0FFH ;四端口置1
MOV P1,#0FFH ;
MOV P2,#0FFH ;
MOV P3,#0FFH ;
CLR P3.0 ;BH1415禁止操作
CLR P3.1 ;
CLR P3.2 ;
LCALL KEYFUN15 ;置立体声发射方式,开立体声发射指示灯
CLEAR1: MOV PCON,#00H ;控制寄存器清0
MOV 29H,#00H ; 置初始值为88MHZ(显示为088.0)
MOV 28H,#08H ;
MOV 27H,#08H ;
MOV 26H,#00H ;
LCALL DISPUPDAT ;写入BH1415芯片(修改发送频率)
RET ;子程序返回
;
;主程序
START: LCALL CLEARMEN ;上电初始化
MAIN: LCALL KEYWORK ;调查键子程序
LCALL DISPLAY ;LED显示一次
AJMP MAIN ;转MAIN循环
NOP ;PC出错处理
NOP ;
AJMP START ;重新初始化
;
; 4*4行列扫描查键子程序
KEYWORK: MOV P1,#0FFH ;
CLR P1.0 ;
MOV A,P1 ;
ANL A,#0F0H ;
CJNE A,#0F0H,KEYCON ;
SETB P1.0 ;
CLR P1.1 ;
MOV A,P1 ;
ANL A,#0F0H ;
CJNE A,#0F0H,KEYCON ;
SETB P1.1 ;
CLR P1.2 ;
MOV A,P1 ;
ANL A,#0F0H ;
CJNE A,#0F0H,KEYCON ;
SETB P1.2 ;
CLR P1.3 ;
MOV A,P1 ;
ANL A,#0F0H ;
CJNE A,#0F0H,KEYCON ;
SETB P1.3 ;
RET ;
KEYCON: LCALL DL10MS ;消抖处理
MOV A,P1 ;
ANL A,#0F0H ;
CJNE A,#0F0H,KEYCHE ;
KEYOUT: RET ;干扰,子程序返回
KEYCHE: MOV A,P1 ;
MOV KEYWORD,A ;
CJLOOP: LCALL DISPLAY ;
MOV A,P1 ;
ANL A,#0F0H ;
CJNE A,#0F0H,CJLOOP ;
MOV R7,#00H ;
MOV DPTR,#KEYTAB ;
CHEKEYLOOP: MOV A,R7 ;
MOVC A,@A+DPTR ;
XRL A,KEYWORD ;
JZ KEYOK ;为0(相等)转KEYOK
INC R7 ;不等,查表次数加1
CJNE R7,#10H,CHEKEYLOOP ;
RET ;
;
KEYOK: MOV A,R7 ;
MOV B,A ;放入B
RL A ;左移
ADD A,B ;相加(键号乘3处理JMP 3字节指令)
MOV DPTR,#KEYFUNTAB ;
JMP @A+DPTR ;
KEYFUNTAB: LJMP KEYFUN00 ;
LJMP KEYFUN01 ;
LJMP KEYFUN02 ;
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号键功能程序
RET ;散转出错返回
;
;键号对应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 ;
CJNE A,#02H,FUN00 ;
FUN00: JC FUN00OUT ;
MOV 29H,#00H ;
FUN00OUT: MOV A,29H ;
XRL A,#01H ;
JNZ F00OUT1 ;
MOV 28H,#00H ;
AJMP F00OUT ;
F00OUT1: MOV 28H,#08H ;
F00OUT: LCALL DISPUPDAT ;
RET ;返回
;
;01号键功能程序
KEYFUN01: INC 28H ;
MOV A,28H ;
CLR C ;
CJNE A,#0AH,FUN01 ;
FUN01: JC FUN01OUT ;
MOV 28H,#00H ;
FUN01OUT: MOV A,29H ;
XRL A,#01H ;
JNZ F01OUT ;
MOV 28H,#00H ;
AJMP F001OUT ;
F01OUT: MOV A,28H ;
XRL A,#08H ;
JZ F001OUT ;
MOV A,28H ;
XRL A,#09H ;
JZ F001OUT ;
MOV 28H,#08H ;
F001OUT: LCALL DISPUPDAT ;
RET ;返回
;
;02号键功能程序
KEYFUN02: 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 ;写入控制芯片(修改发射频率)
RET ;
;
;03号键功能程序
KEYFUN03: 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 ;写入控制芯片(修改发射频率)
RET ;返回
;
;04号键功能程序(频率预置键)
KEYFUN04: MOV 29H,#01H ; 预置109.0MHZ发射频率
MOV 28H,#00H
MOV 27H,#09H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;05号键功能程序(频率预置键)
KEYFUN05: MOV 29H,#01H ; 预置108.0MHZ发射频率
MOV 28H,#00H
MOV 27H,#08H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;06号键功能程序(频率预置键)
KEYFUN06: MOV 29H,#01H ; 预置105.0MHZ发射频率
MOV 28H,#00H
MOV 27H,#05H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;07号键功能程序(频率预置键)
KEYFUN07: MOV 29H,#01H ; 预置100.0MHZ发射频率
MOV 28H,#00H
MOV 27H,#00H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;08号键功能程序(频率预置键)
KEYFUN08: MOV 29H,#00H ; 预置98.0MHZ发射频率
MOV 28H,#09H
MOV 27H,#08H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;09号键功能程序(频率预置键)
KEYFUN09: MOV 29H,#00H ; 预置96.0MHZ发射频率
MOV 28H,#09H
MOV 27H,#06H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;10号键功能程序(频率预置键)
KEYFUN10: MOV 29H,#00H ; 预置94.0MHZ发射频率
MOV 28H,#09H
MOV 27H,#04H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;11号键功能程序(频率预置键)
KEYFUN11: MOV 29H,#00H ; 预置92.0MHZ发射频率
MOV 28H,#09H
MOV 27H,#02H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;12号键功能程序(频率预置键)
KEYFUN12: MOV 29H,#00H ; 预置90.0MHZ发射频率
MOV 28H,#09H
MOV 27H,#00H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;13号键功能程序(频率预置键)
KEYFUN13: MOV 29H,#00H ; 预置88.0MHZ发射频率
MOV 28H,#08H
MOV 27H,#08H
MOV 26H,#00H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;14号键功能程序(频率预置键) ; 预置87.0MHZ发射频率
KEYFUN14: MOV 29H,#00H
MOV 28H,#08H
MOV 27H,#07H
MOV 26H,#08H
LCALL DISPUPDAT ;写入控制芯片(修改发射频率)
RET
;
;15号键功能程序(立体声/单声道设置键)
KEYFUN15: CPL 03H ;
JNB 03H,MONO ;
CLR P3.3 ;
LCALL PUTBIT ;
RET ;返回
MON SETB P3.3 ;
LCALL PUTBIT ;
RET ;返回
;
; 将BCD码转为十六进制数,与5位控制码合成操作码,写入控制芯片
DISPUPDAT: LCALL BCDB ;
LCALL CONCOMMAND ;
LCALL PUTBIT ; 发控制字至BH1415
RET ;返回
;
; 将BCD码转为十六进制数程序
BCDB: 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 ;
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 ;
MOV A,20H ;
ORL A,CONBITH ;
MOV CONBITH,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 ;不是,左移一位
MOV R5,A ;放回R5
SETB P0.7 ;关小数点
AJMP PLAY ;转PLAY循环
ENDOUT: MOV P2,#0FFH ;显示结束,关显示输出口
MOV P0,#0FFH ;
RET ;返回
;
;0-9共阳段码表
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 发送控制字节子程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
PUTBIT: MOV A,CONBITL ;低8位控制字入A
SETB P3.2 ;BH1415使能(允许写)
LCALL PUT ;发送8位
MOV A,CONBITH ; 高8位控制字入A
LCALL PUT ; 发送8位
CLR P3.2 ; BH1415写禁止
CLR P3.0 ;复位
CLR P3.1 ;复位
RET ;返回
;
;字节发送子程序
PUT: MOV R3,#8 ;发送8位控制
CLR C ;清C
PUT1: RRC A ;带进位位右移(先发低位)
MOV P3.0,C ;低位送至P3.0口
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
SETB P3.1 ;锁存数据(上升沿时锁存数据)
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
CLR P3.1 ;
DJNZ R3,PUT1 ;8位未发完转PUT1再发
RET ; 8位发完结束
;
;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
;
;
END  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|维修人员 ( 鲁ICP备17033090号 )

GMT+8, 2024-12-22 13:05 , Processed in 0.212995 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表