单片机应用设计实例

数控调频发射台的设计

题目:基于单片机的数控调频发射台

功能:本数控调频发射器可在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

; 程序结束


相关文章

  • 单片机教案
  • 吴允志 单 片 机 1 2011年2月21日 08高职电子2班 2 单片机概述(一) 通过本讲教学,要求学生了解单片机的概念及组成.单片机 与通用微机的区别与联系,单片机的特点及其广泛应用.了解本课程的性质.任务及其在本专业中的地位,结合单 ...查看


  • 单片机的发展趋势与应用实例
  • 单片机发展趋势 单片微型计算机,简称单片机,就是将微处理器.存储器ROM 和RAM .定时/计数器.中断系统.I/O接口.总线和其他多功能器件集成在一块芯片上的微型计算机.由于单片机的重要领域为智能化电子产品,一般需要嵌入仪器设备内,故又称 ...查看


  • 基于PROTEUS的单片机串口通信的实例设计与仿真
  • 2011年第9期SCIENCE&TECHNOLOGYINFORMATION ○IT论坛○科技信息 基于PROTEUS的单片机串口通信的 实例设计与仿真 陈海霞徐智 (三江学院电气与自动化工程学院江苏 南京 210012) [摘要]本 ...查看


  • 公路收费站车流量统计系统的研制任务书
  • 一.毕业设计(论文)的内容(400字以上) 车流量统计是智能交通领域的重要研究课题之一,是实现交通智能化管理的重要环节.本课题任务是设计.制作一套车流量统计系统,具体研究内容如下: 1.通过图书馆.网络等途径搜集相关资料,掌握车流量统计的原 ...查看


  • 电子报合订本2009索引
  • 电子报合订本2009索引 2009(上)目录 一.新闻言论与专题类 狠抓文章"有用度"„„„„„„„„1 形影不离<电子报>„„„„„„„„41 读书成才用知识改变命运„„„„„211 高校需要<电子报 ...查看


  • 工业PC机技术的发展前景及应用实例
  • 科技信息○百家争鸣○SCIENCE&TECHNOLOGYINFORMATION2008年第24期 工业PC机技术的发展前景及应用实例 刘陆平 (江西交通职业技术学院江西 南昌 330013) 摘要:计算机控制技术是计算机的一个重要应 ...查看


  • 电气工程与自动化毕业论文论文
  • 黑龙江信息技术职业学院 毕业设计(论文)说明书 系 部 专 业 年 级姓 名 指导教师 年 月 日 一.原始依据(包括设计或论文的工作基础.研究条件.应用环境.工作目的等) 二.参考文献 [1] 李叶紫.王喜斌.胡辉.孙东辉.编著MCS_5 ...查看


  • 为何要学编程
  • 一.为何要学编程? 每个人的动机不一样.大致有: 1.为了找个好工作:或为了有更好的机会和更好的发展. 2.看到别人超厉害,所以也想学. 3.实际工作中很多场合需要. 4.从小就立志做个程序员,做软件工程师. 5.振兴中国的软件事业. .. ...查看


  • 交通信号灯设计与仿真
  • 天津理工大学 电信学院 专业设计 题 目 项目成员 俞东 专业班级 信息二班 学 院 电信学院 完成日期 20014年,12月3日 交通信号灯设计与仿真 摘要 十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊.那么靠什么来实现这井然 ...查看


热门内容