📄 单片机应用技术讲座(17)源程序.txt
字号:
单片机应用技术讲座(17)源程序
例1:
主程序通信参数的初始化:
M_Address DATA 76H
Syn DATA 0EBH
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP Serial-com
MAIN:.......
ORL SCON, #50H
MOV TMOD,#21H ;
MOV PCON, #80H
MOV TH1, #0E6H;定义通信速率
CLR ET1 ;禁止定时器中断
....... 略
SETB EA
SETB ES ;开中断
SETB TR1 ;启动定时器1
.......略。
上述代码中,“M_Address EQU 76H”是伪指令定义,定义地址为76H,“Syn”同步字的定义同上。在单片机的中断系统那一讲里,我们曾向读者介绍,89C51单片机的串行通信口的中断入口地址是0023H,因此在0023H地址处安排跳转指令 AJMP Serial-com,当中断发生时执行Serial-com中断子程序的任务。
串行ADC TLC2543与单片机的接口源程序
进行AD采样的51汇编程序如下:
;管脚定义
CLK EQU P1.3
DIN EQU P1.1
DOUT EQU P1.2
CS EQU P1.0
MOV R1,#00H ;0通道方式/通道数据
CLR CLK ;
SETB CS ;
CLR CS ;
MOV R4,#08 ;
MOV A, R1 ;
LOOP1:
MOV C,DOUT ;读转换结果
RLC A ;A寄存器左移,移入结果数据位,移出方式/通道控制位
MOV DIN,C ;输出方式/通道位
SETB CLK ;设置I/O时钟为高
CLR CLK ;清I/O时钟
DJNZ R4,LOOP1 ;R4不为0,则返回LOOP1
MOV R2,A ;转换结果的高8位放到R2中
MOV A,#00H ;复位A寄存器
MOV R4,#04 ;再读低4位
LOOP2:
MOV C,DOUT ;读转换结果
RLC A ;A寄存器左移,移入结果数据位
SETB CLK ;设置I/O时钟为高
CLR CLK ;清I/O时钟
DJNZ R4,LOOP2 ;R4不为0,则返回LOOP2
MOV R3,A ;转换结果的低4位放到R3中
SETB CS ;
STOP:AJMP STOP
介绍一种4×4键盘程序的设计源程序
附:源程序KeyBord.asm
K0 equ 01h
K1 equ 02h
K2 equ 03h
K3 equ 04h
K4 equ 05h
K5 equ 06h
K6 equ 07h
K7 equ 08h
K8 equ 09h
K9 equ 0ah
Ka equ 0bh
Kb equ 0ch
Kc equ 0dh
Kd equ 0eh
Ke equ 0fh
Kf equ 010h
;***************************************************************变量定义
KeyData equ 30h ;存放键码
KeyClick equ KeyData+1 ;去抖动延时变量
KeyDBClick equ KeyClick+1 ;连击延时变量
KeyMode equ KeyDBClick+1;键译程序的任务指针
;***************************************************************常量定义
Click20mS equ 2 ;20mS延时(主程序执行时间=10mS)
DBClick3S equ 0 ;连击延时3S
DBClick100mS equ 10 ;连击间隔时间100mS
KeyPort equ p1 ;键盘连接的端口
KeyAnlData equ 0f0h ;掩膜码
;*************************************************************************
KeyBord:
mov a,KeyMode
cjne a,#0,key_bo1
;read port for key
mov KeyData,#0
mov r2,#04d
mov r3,#01d
scan:
mov a,r3
cpl a
mov KeyPort,a
mov a,KeyPort
anl a,#KeyAnlData
cjne a,#KeyAnlData,key_bo12
mov a,r3
rl a
mov r3,a
djnz r2,scan
ret
key_bo12:
mov KeyClick,#Click20mS
mov KeyMode,#01
ret
;****************************
key_bo1:
cjne a,#1,key_bo2
;jb Click20mS
djnz KeyClick,key_bo1_end
;count KeyData
mov KeyData,#0
mov r2,#04d
mov r3,#01d
scan1:
mov a,r3
cpl a
mov KeyPort,a
mov a,KeyPort
anl a,#KeyAnlData
cjne a,#KeyAnlData,key_bo24
mov a,r3
rl a
mov r3,a
djnz r2,scan1
mov KeyMode,#0
setb beep;12.10
key_bo1_end:
ret
key_bo24:
;*** beep
clr Beep ;打开蜂鸣器
;****count KeyData
call CountKeyData
mov KeyClick,KeyDubClick ;3s
mov KeyMode,#02
key_bo22:
ret
;*****************************
key_bo2:
cjne a,#2,key_bo3
djnz KeyClick,key_bo32
;********setb KeyData.6=1
mov a,KeyData
setb acc.6
;**** d7 =1
setb acc.7
;************
mov KeyData,a
;****
mov KeyDubClick,#DBClick100mS
sjmp key_bo33
key_bo32:
;***** 判别释放
;;;;!!!!!!!!!!!!
mov r2,#04d
mov r3,#01d
scan2:
mov a,r3
cpl a
mov KeyPort,a
mov a,KeyPort
anl a,#KeyAnlData
cjne a,#KeyAnlData,key_bo3;没有释放
mov a,r3
rl a
mov r3,a
djnz r2,scan2
;***** use KeyData
mov a,KeyData
setb acc.7
mov KeyData,a
mov KeyDubClick,#DBClick3S
key_bo33:
mov KeyMode,#0
key_bo3:
ret
;***********************************
CountKeyData:
cpl a
add a,r3
mov r4,a
mov a,r4
cjne a,#97h,no_1
mov KeyData,#K0
no_1:
cjne a,#57h,no_2
mov KeyData,#k1
no_2:
cjne a,#37h,no_3
mov KeyData,#k2
no_3:
cjne a,#93h,no_4
mov KeyData,#k3
no_4:
cjne a,#53h,no_5
mov KeyData,#k4
no_5:
cjne a,#33h,no_6
mov KeyData,#k5
no_6:
cjne a,#91h,no_7
mov KeyData,#k6
no_7:
cjne a,#51h,no_8
mov KeyData,#k7
no_8:
cjne a,#31h,no_9
mov KeyData,#k8
no_9:
cjne a,#90h,no_10
mov KeyData,#k9
no_10:
cjne a,#23h,no_11
mov KeyData,#ka
no_11:
cjne a,#21h,no_12
mov KeyData,#kb
no_12:
cjne a,#50h,no_13
mov KeyData,#Kc
no_13:
cjne a,#30h,no_14
mov KeyData,#Kd
no_14:
cjne a,#27h,no_15
mov KeyData,#Kf
no_15:
ret
;***************************************************
proc KeyJmp ;用户键功能处理程序
KeyJmp:
;*****************
mov a,KeyData
jbc acc.7 ,use_k1
ret
use_k1:
jbc acc.6 ,use_k_3s
;*** click do
mov KeyData,#0
;单击处理。。。
use_k_3s: ;delay 3s click do
mov KeyData,#0
;** DubClick Kc 0.1s
;连击处理。。。
key_jmpend:
ret
end
程序使用说明
(1) 为了便于修改各按键对应的功能,以及提高键扫描的效率,在程序的开头定义了一个键值表,只需改动K0-Kf的上下位置即可(右边的十进制代码,不能改动!)。在用户的键散转处理程序中,用#K0-#Kf代替按键值。
K0 equ 01h
K1 equ 02h
K2 equ 03h
K3 equ 04h
K4 equ 05h
K5 equ 06h
K6 equ 07h
K7 equ 08h
K8 equ 09h
K9 equ 0ah
Ka equ 0bh
Kb equ 0ch
Kc equ 0dh
Kd equ 0eh
Ke equ 0fh
Kf equ 010h
(2)键译程序使用的变量、常量说明
;*******变量定义
KeyData ;存放键码
KeyClick ;去抖动延时变量
KeyDBClick ;连击延时变量
KeyMode ;键译程序的任务指针
;******常量定义
Click20mS ;20mS延时(主程序执行时间=10mS)
DBClick3S ;连击延时3S
DBClick100mS ;连击间隔时间100mS
KeyPort ;键盘连接的端口
(3) 单击、连击的判别
在KeyData变量的D6位代表:0=单击、1=连击;D7位代表此键码是否有效。(见图四)
(4)在主程序中蕴涵键译程序:include “KeyBord.asm”
(5)根据实际情况修改常量的数值。
作者联系信箱:E-mail:lj87c196@163.com
程序说明:此文档是该系统操作运行的所有程序,所提供的程序均在DICE-51单片仿真机上调试仿真,并已经全部通过。
源程序:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP KEYS
ORG 000BH
AJMP PTT0
ORG 001BH
AJMP PTT1 ;中断入口及优先级
MAIN: MOV SP,#60H
CLR 5EH
CLR 5FH ;清上、下限越限标志
MOV A,#00H
MOV R7,#09H
MOV R0,#28H
LP1: MOV @R0,A
INC R0
DJNZ R7,LP1
MOV R7,#06H
MOV R0,#39H
LP2: MOV @R0,A
INC R0
DJNZ R7,LP2 ;清变量暂存单元
MOV R7,#06H
MOV R0,#50H
LP3: MOV @R0,A
INC R0
DJNZ R7,LP3 ;清显示缓冲区
MOV 33H,#H
MOV 34H,#H ;赋Kp高、低字节
MOV 35H,#H
MOV 36H,#H ;赋Ki高、低字节
MOV 37H,#H
MOV 38H,#H ;赋Kd高、低字节
MOV 42H,#H
MOV 43H,#H ;赋K高、低字节(风扇参数)
MOV TMOD,#56H ;T0方式2,T1方式1计数
MOV TL0,#06H
MOV TH0,#06H ;T0赋初值
MOV 25H,#28H ;设定值默认为40摄氏度
SETB TR0 ;键盘高优先级
SETB ET0
SETB EX0
SETB EA ;开键盘、T0、T1中断
LOOP: MOV R0,#56H
MOV R1,#55H
LCALL SCACOV ;调用标度转化-BCD转化子程序
MOV R0,#53H
LCALL DIR
NOP
LCALL DLY10MS
NOP
LCALL DLY10MS
AJMP LOOP ;等待中断,循环显示当前温度
;****************************************************************************
KEYS: CLR EX0 ;[键盘子程序]
CLR EA
PUSH PSW
PUSH ACC ;关中断,压栈
LCALL DLY10MS ;消抖
CC: JB P3.2,AA
SETB 5DH ;置“显示设定温度”标志
MOV A,25H ;取运算位的值(默认为40度)
MOV B,#10 ;进行BCD码转化
DIV AB
MOV 52H,A
MOV A,B
MOV 51H,A
MOV R0,#50H
LCALL DIR ;显示设定温度
NOP
LCALL DLY10MS
NOP
LCALL DLY10MS
JB P1.7,BB
MOV R1,#25H
LCALL DAAD1 ;加一操作
NOP
LCALL DLY10MS
AJMP CC
BB: JB P1.6,CC
MOV R1,#25H
LCALL DEEC1 ;减一操作
NOP
LCALL DLY10MS
AJMP CC
AA: POP ACC
POP PSW
SETB EX0
SETB EA ;出栈,开中断
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -