51单片机实验代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、 实验目的 掌握汇编语言设计和调试方法,熟悉键盘操作。
二、 实验内容把2000H~20FFH 的内容清零。
三、 实验程序框图
四、 实验步骤 用连续或单步的方式运行程序,检查 2000~20FF 中执行程序前后的内容变化。
五、 思考假使把2000H~20FFH 中的内容改成 FF ,如何修改程序。
六、程序清单文件名:
ORG 0000H LJMP SE01 ORG 0640H
SE01: MOV R0,#00H
MOV DPTR,#2000H
LOO1: CLR A
MOVX @DPTR,A INC DPTR INC RO
CJNE R0,#00 H,L OO1
LOOP: SJMP LOOP
END
;(0000H )送 DPTR
;0 送(DPTR
;DPTR+1 ;字节数加1 ;不到FF 个字节再清
一、实验目的掌握汇编语言设计和调试方法
二、实验内容把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。
三、实验程序框图
四、实验步骤用连续或单步方式运行程
序,检查
2000H~2002 H中内容变化情况。
五、思考如何用断点方式调试本程序
六、程序清单文件名:
ORG 0000H
LJMP SE02
ORG 0660H
SE02: MOV DPTR,#2000H
MOVX A,@DPTR
MOV B,A SWAP A ANL A,#0FH INC DPTR ;(2000) T A^ B ;交换
;屏蔽高位
MOVX @DPTR,A
INC DPTR MOV A,B ANL A,#0FH MOVX
@DPTR,A LOOP: JMP LOOP
END
;送2001H
;(2000)内容屏蔽高位;送2002H
四、实验步骤在R2、R3中输入源首址(例如OOOOH), R4 R5中输入的目的地址(例如2000H),R6
R7中输入字节数(例如仆FFH,运行程序,检查0000H~1FFFH中内容是否和2000H~3FFFH中内容完全一致。
五、程序清单文件名
ORG 0000H
LJMP SE22
ORG 07B0H
SE22: MOV DPL,R3
MOV DPH,R2
MOVX A,@DPTR
MOV DPL,R5
MOV DPH,R4
MOVX @DPTR,A
CNE R3,#0F FH,L O42
INC R2
LO42: INC R3
CJNE R5,#0F FH,L
O43
INC R4
;建立源程序首址;取数
;目的地首址
;传送
;源地址加1
LO43: INC R5
CJNE R7,#00 H,
LO44 ;目的地址加1
实验四数据区传送子程序
一、实验目的掌握RAM中的数据操作
二、实验内容把R2、R3源RAM区首地址内的R6 R7字节数据传送到R4 R5目的RAM区。
三、实验程序框图
;字节数减 1
CJNE R6,#00H,LO45
LOOP: SJMP LOOP
NOP
LO44:DEC R7
SJMP SE22
LO45:DEC R7
DEC R6
SJMP SE22 ;未完继续
END
实验五简单I/O 口应用
一、 实验目的 掌握P1 口作为I/O 口的使用方法,理解读引脚和读锁存器的区别。
二、 实验要求 运行不同的程序,观察发光二极管的亮灭状态,比较程序的特点,了解汇编语言设计
的基本思路和指令应用。
三、思想描述 流程图:
延时
延时
;程序:所有发光二极管不停地闪动
LED_PORT EQU P1 ORG 0000H
;程序从地址 0000H 开始存放
LJMP START ORG 0100H START:
CLR EA
;关闭所有中断
MOV LED_PORT,#OOH ;点亮所有发光二极管 LCALL DELAY ;延时
MOV LED_PORT,#0FFH ;灭掉所有发光二极管
LCALL DELAY SJMP START ;重复闪动 DELAY:
MOV R3,#7FH ;延时子程序
DEL2:
MOV R4,#0FFH DEL1:
NOP
DJNZ R4,DEL1 DJNZ R3,DEL2
立即数00H 送P1 口,点亮8个发光二极管
立即数OFFH 送P1 口,熄灭8个发光二极管
程序流程图
1 r
RET END
; 程序 : 用于关控制发二极管的显示方式 LED_PORT EQU P1 ORG 0000H LJMP START ORG 0100H START: CLR EA MOV P3,#B MOV A,P3
ANL A,#00010000B JZ DDPING MOV LED_PORT,#00H SJMP START DDPING: MOV LED_PORT,#55H SJMP START ; 关闭所有中断 ; 使 P3 口锁存器置位
;读P3 口引脚线信
号
; 逻辑与操作 , 屏蔽掉无关位
;判断是否接地,若是,跳转到DDPING^行
; 否则 , 高电平 , 点亮所有发光二极管
; 接地 , 发光二极管交叉亮灭
END
只
1 1Kx8
3 2
U1
18 2 9
D5
3 17 74LS240
+5V
a
5.1k
U3B
74ALS00
D2
R3 5.1k
U3A
I B - L 12-^°
1
Pp 7
5 D3 5 D4
D7K
*
+5V
1Y1
1A1 1Y2 1A2 1Y3 1A3 1Y4 1A4 2Y1 2A1
2Y2 2A2 2Y3 2A3 2Y4
2A4
1G
2G
4 2 6~ ~3~ 8 4 1 11
5 1 6
15 ―8"
1
30pF
9
30pF
19 18
U2
P1.0/T P0.0/AD0
P1.1/T P0.1/AD1 .P1.2 P0.2/AD2 P1.3 P0.3/AD3 .P1.4 P0.4/AD4 .P1.5
P0.5/AD5 .P1 6 P0 6/AD6 .P1.7
P0.7/AD7
P3.3/INT1
P2.0 P3.2INT0
P2.1
P2.2 .P3 5/T1 P2 3 ,P3 4/T0
P2 4
P2.5 .TA/VP
P2.6 P2.7
]XLAT1
& XLAT2 P3.0/RXD P3.1/TXD
.RESET ALE/P PSEN
P3.77RD P3.6/WR
15 14 31
MCU8052
13
12 0 - e 39 38 37 36
33 32 21 22 23 25 26 28 10 11 30
Title
Size A4
Number Revision
Date: 2-Aug-2004 Sheet of File: EJZV2 ddb Drawn By •
实验六P3 口输入P1 口输出实验
一、实验目的P3 口输入P1 口输出,实现I/O控制。
二、实验要求撰写实验报告,给出输入输出实现方式,画出实验原理图,给出程序流程及实现的全部代
码。
三、思想描述:
系统板上硬件连线
(1. 把“单片机系统”区域中的—端口用8芯排线连接到“动态静态数码显示模块”区域中的a—h端
口上;要求:对应着a,对应着b,……,对应着h o
(2. 把“单片机系统”区域中的端口用8芯排线连接到“动态数码显示模块”区域中的任一个公共端
上。
实验原理
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。
只要通过设置特殊功能寄存器TMOD即可完成。
定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536US,即,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms 即要定时1秒需要经过20次的50ms的定时。
对于这20次我们就可以采用软件的方法来统计了。
因此,我们设定TM09 00000001B,即TMO b 01H
下面我们要给T0定时/计数器的THO, TL0装入预置初值,通过下面的公式可以计算出TH0=( 216—50000) / 256
16
TL0=( 2 —50000) MOD 256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF0= 1表示定时时间已到。
实验结果
汇编源程序SECOND TCOUNT
START: DISP: WAIT:
NEX: NEXT: TABLE:
汇编源程序SECOND TCOUNT
START: INT0X: 查询法)
EQU 30H
EQU 31H
ORG 00H
SETB
MOV SECOND,#00H
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
JNB TF0,WAIT
CLR TF0
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
LJMP DISP
LJMP WAIT
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
中断法)
EQU 30H
EQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP INT0X
SETB
MOV SECOND,#00H
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB ET0
SETB EA
SJMP $
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE MOVC A,@A+DPTR
MOV P0,A
NEXT: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
实验7外部中断实验
一、实验目的中断实验输出控制,学习中断程序设计方法,理解中断机制理解下降沿中断和低电平中断的区别。
二、实验要求编写主程序实现系统的初始化,若有不同的初始化方式,应有状态指示;编写中断服务程序,服务程序操作以能明确判断发生一次中断为准,且有声光指示作为人机界面。
实验前必须认真复习中断相关内容,并在实验报告上写出预习报告,给出实验方案,经过实验指导教师检查合格后,方可进行实验。
实验结束后撰写实验报告画出实验原理图,给出程序流程及实现的全部代码。
实验原理
用8051单片机设计一交通信号灯模拟控制系统,能够完成正常情况下的轮流放行以及特殊情况和紧急情况下的红绿灯控制
1•掌握单片机中断系统、定时/计数器的编程应用。
2•通过对交通灯控制程序的编写与调试,掌握中断程序的结构。
3•正常情况下A B道(A B道交叉组成十字路口,A是主道,B是支道)轮流放行,A道放行1分钟(其中5秒用于警告),B道放行30秒(其中5秒用于警告)。
4.一道有车而另一道无车时,使有车车道放行,K5键按下表示A道有车,K1键按下表示B道有车。
5. K9键按下表示有紧急车辆通过时,A、B道均为红灯。
(二)实验连线表
(三)实验结果
BANK0_REG EQU 00H ;选择第0组寄存器 BANK1_REG EQU 08H ;选择第1组寄存器 BANK2_REG EQU 10H ;选择第2组寄存器 BANK3_REG EQU 18H ;选择第3组寄存器 ;指向主程序
;指向紧急车辆出现中断程序
外部中断0
;指向一道有车另一道无车中断程序
外部中断1
ORG 0100H
MOV PSW,#BANK0_REG ;置外部中断0为高优先级中断 ;置外部中断0,1为电平触发 ;置定时器1为方式1
;开CPU 中断,开外中断0,1中断
紧急情况时的中断服务程
序(INTO )
主程序
一道有车、一道无车时的中
断服务程序(INT1) 交通信号灯模拟控制系统程序流程图
中断响应
A 红灯、
B 红灯
延
时 20s
~~T"
恢复现场
保护现场
返回
MAIN: 程序:
ORG 0000H LJMP MAIN ORG 0003H LJMP EMERG ORG 0013H LJMP ONEBUSY
MOV SP,#0DFH SETB PX0 MOV TCON,#00H MOV TMOD,#10H MOV IE,#85H
DISP:
WARN2:
CPL ;B 绿灯闪烁
LCALL DELAY DJNZ R2,WARN2
MOV P1,#0EEH ;A 红灯 ,B 黄灯 MOV R2,#04H
YEL2:
LCALL DELAY DJNZ R2,YEL2 LJMP DISP
; 循环执行主程序
; 紧急情况中断子程序 EMERG:
PUSH P1 PUSH 03H PUSH TH1 PUSH TL1
MOV P1,#0F6H MOV R5,#28H
DELAY0:
LCALL DELAY DJNZ R5,DELAY0 POP TL1 ; 弹栈恢复现场
MOV
P1,#0F3H
;A 绿灯放行 ,B 红灯禁止 MOV R2,#6EH
; 置秒循环次数
LCALL DELAY ; 调用秒延时子程序
DJNZ R2,DISP1 ;55 秒不到继续循环
MOV
R2,#06
;置A 绿灯闪烁循环次数
CPL ;A 绿灯闪烁
LCALL DELAY
DJNZ R2,WARN1 ; 闪烁次数未到继续循环 MOV
P1,#0F5H
;A 黄灯警告 ,B 红灯禁止
MOV R2,#04H
LCALL DELAY
DJNZ
R2,YEL1
;2 秒未到继续循环
MOV P1,#0DEH ;A 红灯,B 绿灯
MOV R2,#32H
LCALL
DELAY
DJNZ R2,DISP2 ;25 秒未到继续循环
MOV R2,#06H
DISP1:
WARN1:
YEL1:
DISP2:
;P1 口数据压栈 ;R3 寄存器压栈
;TH1 压栈 ;TL1 压栈 ;A,B 道均为红
;20 秒未到继续循环
POP TH1
POP 03H
POP P1
RETI ; 返回主程序J
; 路有车一路无车中断子程序ONEBUSY
J
ONEBUSY:
CLR EA 5关中断
PUSH P1 ; 压栈
PUSH 03H
PUSH TH1
PUSH TL1
SETB EA ; 开中断
JNB ,BP 5A 道无车转向
MOV P1,#0F3H ;A 绿灯,B 红灯
SJMP DELAY1 ; 转向5 秒延时BP:
JNB ,EXIT ; B 道无车退出中断
MOV P1,#0DEH ;A 红灯,B 绿灯DELAY1:
MOV R6,#0AH ; 置秒循环初值NEXT:
LCALL DELAY
DJNZ R6,NEXT ;5 秒未到继续循环EXIT:
CLR EA
POP TL1 5弹栈恢复现场
POP TH1
POP 03H
POP P1
SETB EA
RETI
J
; 延时子程序
DELAY:
MOV R3,#0AH
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
LP1:
JBC TF1,LP2
SJMP LP1
LP2:
MOV TH1,#3CH
MOV TL1,#0B0H DJNZ R3,LP1 RET
END
实验八定时器/计数器应用试验
一、实验目的掌握定时器/计数器编程方法,掌握相关寄存器的初始化及其意义;理解定时器/计数器的
本质,掌握定时器/计数器应用的两种方法:查询和中断。
二、实验要求利用定时器实现一秒定时,或计数外部脉冲,分别采用查询和中断两种方式实现,加深对中断的理解
加强对相关寄存器各个位的灵活应用能力。
人机界面方案自行设计。
实验前必须认真复习定时计数器相关内容,并在实验报告上写出定时计数器的初始化步骤,给出人机界面实现方案,经过实验指导教师检查合格后,方可进行试验。
实验结束后撰写实验报告画出实验原理图,给出程序流程及实现的全部代码。
实验连线表
单片机MC8 按键
+5V/GND +5V/GND +5V/GND
SCL
SDA
GND KC1
KR1
KR2
KR3
(三)程序流程图
闹钟修改功能子程序FTI0N1流程框图
程序清单:
数字时钟制作------------------ BANK0_REG EQU 00H ;选择第0 组寄存器
BANK1_REG EQU 08H ;选择第 1 组寄存器
BANK2_REG EQU 10H ;选择第 2 组寄存器
BANK3_REG EQU 18H ;选择第 3 组寄存器
LED_MAX_BITS EQU 06H ;LED 最大位数
LED_SCL EQU
LED_SDA EQU
HD_K0 EQU
HD_K1 EQU
HD_K2 EQU
HD_CBP EQU
K0_FLAG EQU 00H
K1_FLAG EQU 01H
K2_FLAG EQU 02H
SEC_FLAG EQU 03H
MIN_FLAG EQU 04H
HOUR_FLAG EQU 05H
RMIN_FLAG EQU 06H
RHOUR_FLAGEQU 07H RTIM_FLAG EQU 08H
ARM_FLAG EQU 09H TIMDATA EQU 3OH RTIMDATA EQU 31H
MSEC1 EQU 32H MSEC2 EQU 33H HOUR EQU 34H MIN EQU 35H
SEC EQU 36H RHOUR EQU 37H RMIN
EQU 38H RSEC EQU 39H COUNT EQU 3AH
LED_DIS _ PTR EQU 3BH
; 时钟修改记忆单元
; 闹钟修改记忆单元清零
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIMER_INT
ORG 0100H
MAIN:
CLR EA
MOV PSW,#BANK0_REG
MOV SP,#0DFH
MOV R0,#20H
MOV R7,#80H-20H
; 定时器中断服务程序
LCALL PUB_CLEAR_RAM1
LCALL LED_CLR
MOV LED_DIS_PTR,#HOUR LCALL LED_DISP_DATA
MOV TMOD,#02H
MOV TL0,#06H
MOV TH0,#06H
SETB EA
SETB ET0
SETB TR0
;清ORAM单元
; 定时器T0 方式2,
; 定时25Ous 初始值; 中断允许
; 启动定时器
; 定义各标识位符号地址; 是否设定闹钟标识
BEGIN:
LCALL KEY_TEST ; 调用判别键入测试程序
JC RETEST ; 有键输入则转去抖程序
JNB ARM _FLAG,BEGIN ; 判别闹钟设定标识位, 未设定则返回
LCALL ALARM ; 调闹钟程序
LJMP BEGIN ; 返回
RETEST:
LCALL KEY_SCAN
JB K0_FLAG,PRO_K0 ; 判别是否时钟修改功能键
JB K1_FLAG,PRO_K1 ; 判别是否闹钟修改功能键
JB K2_FLAG,PRO_K2 ; 判别是否加1 功能键
SJMP BEGIN
PRO_K0:
LCALL FTION0 ; 是时钟参数修改功能键则调用时钟修改程序
SJMP BEGIN
PRO_K1:
LCALL FTION1 ; 是闹钟参数修改功能键则调用闹钟设定程序
SJMP BEGIN
PRO_K2:
LCALL CUM ; 是加 1 功能键则调用加 1 修改程序
SJMP BEGIN
; 时钟参数修改子程序FTION0
; 功能: 根据时钟修改功能键按下的次数
;分别将时钟修改标识位SECBIT, MIN_FLAG,HOURBIT置1
; 入口:TIMDAT
; 出口:TIMDAT
FTION0:
JB RMIN_FLAG,BACK_B
JB RHOUR_FLAG,BACK_B ; 当正在设置闹钟不能设置时间, 需先结束闹钟设置状态CLR TR0 ; 关定时器
CLR SEC_FLAG ; 时钟秒标识位清零
CLR MIN_FLAG ; 时钟分标识位清零
CLR HOUR_FLAG ; 时钟小时标识位清零
MOV LED_DIS_PTR,#HOUR ;将时钟小时单元设为显示首地址
MOV RTIMDATA,#00H ;清闹钟修改位置标识记录
INC TIMDATA ; 将时钟修改记录值加1
MOV A,TIMDATA
CJNE A,#01H,TW0 ; 若记录值为1 则将时钟秒修改标识置1
SETB SEC_FLAG ; 时钟秒标识位置 1
SJMP BACK_C
TW0:
CJNE A,#02H,THREE0 ; 若记录值为2 则将时钟分修改标识置1
SETB MIN_FLAG ; 时钟分标识位置 1
SJMP BACK_C
THREE0:
CJNE A,#03H,BACK_A ; 若记录值为3 则将时钟小时修改标识置1
SETB HOUR_FLAG ; 时钟小时标识位置1
SJMP BACK_C
BACK_A:
MOV TIMDATA,#00H ; 若按4 次则清时钟单元修改位置记录
SETB TR0 ; 定时器重新启动
BACK_B:
RET
BACK_C:
LCALL LED_DISP_DATA
RET ; 闹钟参数修改功能键设定子程序FTION1
; 功能: 根据闹钟修改功能键按下的次数
;分别将闹钟修改标识位RMINBIT ,RHOURBIT置1
; 入口:RTIMDAT
; 出口:RTIMDAT,ARM_FLAG,B
FTION1:
JB SEC_FLAG,FTION1_A
JB MIN_FLAG,FTION1_A
JB HOUR_FLAG,FTION1_A ;当处于设置时间状态时不能设置闹钟,需先结束时间设置状态CLR RMIN_FLAG ; 将闹钟分单元修改标识位
CLR RHOUR_FLAG ; 将闹钟小时单元修改标识位清零
MOV LED_DIS_PTR,#RHOUR; 将闹钟单元地址设为显示首地址
MOV TIMDATA,#00H
INC RTIMDATA ; 将闹钟修改记录值加1
MOV A,RTIMDATA
CJNE A,#01H,TOW1
SETB RMIN_FLAG ; 若记录值为 1 则将闹钟分单元修改标识位
LJMP FTION1_B ;置1
TOW1:
CJNE A,#02H,THREE1
SETB RHOUR_FLAG ; 若记录值为2, 将闹钟小时单元修改标识位置 1
LJMP FTION1_B
THREE1:
SETB ARM_FLAG ;F0 标识位为 1 表示闹钟已设定
MOV LED_DIS_PTR,#HOUR ;恢复时钟显示单元首地址
MOV RTIMDATA,#00H ;将闹钟修改记录值清零
FTION1_A:
RET
FTION1_B:
LCALL LED_DISP_DATA
RET ;加1 键修改子程序CUM
;功能:根据时钟和闹钟修改标识位的状态,将时钟或闹钟对应RAM内容+1
; 入口:SEC_FLAG, MIN_FLAG ,HOUR_FLAG,RSECBIT, RMIN_FLAG ,RHOUR_FLAG CUM:
JNB SEC_FLAG,CUM0 ; 若时钟秒修改标识位为1 则秒单元内
MOV A,SEC ; 容加1
ADD A,#01H
DA A
MOV SEC,A
CJNE A,#60H,CUMEND
MOV SEC,#00H
LJMP CUMEND
CUM0:
JNB MIN_FLAG,CUM1 ; 若时钟分修改标识位为1,则分单元
MOV A,MIN ; 内容加1
ADD A,#01H
DA A
MOV MIN,A
CJNE A,#60H,CUMEND
MOV MIN,#00H
LJMP CUMEND
CUM1:
JNB HOUR_FLAG,CUM2 ; 若时钟小时修改标识位为1,则小时
MOV A,HOUR ; 单元内容加1
ADD A,#01H
DA A
MOV HOUR,A
CJNE A,#24H,CUMEND
MOV HOUR,#00H
LJMP CUMEND
CUM2:
JNB RMIN_FLAG,CUM3 ; 若闹钟分修改标识位为1,则分单元
MOV A,RMIN ; 内容加1
ADD A,#01H
DA A
MOV RMIN,A
CJNE A,#60H,CUMEND
MOV RMIN,#00H
LJMP CUMEND
CUM3:
JNB RHOUR_FLAG,CUMEND; 若闹钟小时修改标识位为1,则小MOV A,RHOUR ; 时单元内容加1
ADD A,#01H
DA A
MOV RHOUR,A
CJNE A,#24H,CUMEND
MOV RHOUR,#00H
CUMEND:
LCALL LED_DISP_DATA
RET
; 闹钟判断与启动子程序ALARM
; 功能: 判断闹钟是否设定, 控制闹钟的启, 停
; 入口:MIN ,RMIN ,HOUR ,RHOUR
; 出口:HD_BP,ARM_FLAG
ALARM:
MOV A,RMIN
CJNE A,MIN,DONT0 ;比较分单元内容, 若相同则继续比较小时单
MOV A,RHOUR ; 元内容, 否则返回
CJNE A,HOUR,DONT0
CLR HD_CBP
SETB RTIM_FLAG ; 启动闹钟
; 设置闹钟计时标时, 时钟开始10 秒计时DONT0:
MOV A,COUNT CJNE A,#10,DONT MOV COUNT,#00H SETB HD_CBP CLR ARM_FLAG CLR RTIM_FLAG ; 取闹钟保持计时时间
; 判断闹钟保持10 秒时间到否; 清除闹钟保持10 秒计时
; 清除闹钟
; 清闹钟标识, 取消闹钟设置
; 清闹钟计时标识,
DONT:
RET
; 时钟修正中断服务子程序
; 功能: 通过定时器中断, 自动修改时钟参数
; 入口:MSEC1 ,MSEC2,,SEC,MIN,HOUR
; 出口:MSEC1 ,MSEC2,,SEC,MIN,HOUR
TIMER_INT:
CLR EA ; 关中断
PUSH PSW ; 保护现场
PUSH ACC
MOV PSW,#BANK3_REG
INC MSEC1
MOV A,MSEC1
CJNE A,#28H,TIMER_INT_EXIT ; 到10 毫秒否MOV MSEC1,#00H
INC MSEC2
MOV A,MSEC2
CJNE A,#64H,TIMER_INT_EXIT ; 到1 秒否
MOV MSEC2,#00H
JNB RTIM_FLAG,TIMER_INT_A ; 由标识位判别闹钟启动否INC COUNT TIMER_INT_A:
MOV A,SEC
ADD A,#01H ; 时钟秒单元内容加1
DA A
MOV SEC,A
CJNE A,#60H,TIMER_INT_B ; 到1 分钟否
MOV SEC,#00H
MOV A,MIN
ADD A,#01H ; 分单元内容加1
DA A
MOV MIN,A
CJNE A,#60H,TIMER_INT_B ; 到1 小时否
MOV MIN,#00H
MOV A,HOUR
ADD A,#01H ; 小时单元内容加1
DA A
MOV HOUR,A
CJNE A,#24H,TIMER_INT_B ; 到24 小时否MOV HOUR,#00H
TIMER_INT_B:
LCALL LED_DISP_DATA TIMER_INT_EXIT:
POP ACC ; 恢复现场
POP PSW
SETB EA ; 开中断
RETI ; 中断返回
; 测键入子程序
; 功能: 判断是否有键输入
; 入口: 按键
; 出口:A
KEY_TEST:
JNB ,KEY_TEST_OK
JNB ,KEY_TEST_OK
JNB ,KEY_TEST_OK
CLR C
RET
KEY_TEST_OK:
SETB C
RET
; 键盘扫描程序
KEY_SCAN:
CLR K0_FLAG
CLR K1_FLAG
CLR K2_FLAG
JNB ,KEY_SCAN_K0
JNB ,KEY_SCAN_K1
JNB ,KEY_SCAN_K2
SJMP KEY_SCAN_END KEY_SCAN_K0: SETB K0_FLAG
JNB ,$
SJMP
KEY_SCAN
_
END
KEY_SCAN _ K1:
SETB K1_FLAG JNB ,$
SJMP KEY_SCAN
_ END
KEY_SCAN _ K2:
SETB K2_FLAG JNB ,$
SJMP KEY_SCAN
_ END
KEY_SCAN _ END:
RET
; 发送一字节数据
; 入口:ACC
LED_DISP_BYTE:
PUSH ACC
CLR LED_SCL
MOV R7,#8
LED_DISP_BYTE1:
RLC A
MOV LED_SDA,C
NOP
NOP
SETB LED_SCL
NOP
NOP
CLR LED_SCL
DJNZ R7,LED_DISP_BYTE1
POP ACC
RET
;发送LED_MAX_BI■字节
;入口:LED_DIS_PTR:起始地址
LED_DISP_DATA:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#BANK2_REG
MOV A,LED_DIS_PTR
ADD A,#LED_MAX_BITS/2-1
MOV R0,A
MOV R6,#3
MOV DPTR,#DIS_TAB
LED_DISP_DATA_A:
MOV A,@R0
ANL A,#0FH
MOVC A,@A+DPTR
CJNE R6,#3,LED_DISP_DATA_B ; 是在显示秒吗
JNB SEC_FLAG,LED_DISP_DATA_D
ANL A,#07FH ; 设置显示小数点指示操作位置
SJMP LED_DISP_DATA_D
LED_DISP_DATA_B:
CJNE R6,#2,LED_DISP_DATA_C ; 是在显示分吗
ANL A,#07FH
JB MIN_FLAG,LED_DISP_DATA_D
JB RMIN_FLAG,LED_DISP_DATA_D
ORL A,#80H
SJMP LED_DISP_DATA_D
LED_DISP_DATA_C:
ANL A,#07FH
JB HOUR_FLAG,LED_DISP_DATA_D
JB RHOUR_FLAG,LED_DISP_DATA_D
ORL A,#80H
LED_DISP_DATA_D:
LCALL LED_DISP_BYTE
MOV A,@R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
LCALL LED_DISP_BYTE
DEC R0
DJNZ R6,LED_DISP_DATA_A POP DPL
POP DPH
POP ACC
POP PSW
RET
; 清除LED 上的显示内容
LED_CLR:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#BANK2_REG
MOV R6,#6
LED_CLR_A:
MOV A,#0FFH
LCALL LED_DISP_BYTE
DJNZ R6,LED_CLR_A
POP DPL
POP DPH
POP ACC
POP PSW
RET
DIS_TAB: ; 字形表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH ; 阳极LED
NOP9:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;清除指定的RAM单元
; 入口: R0: 源地址R7: 长度
PUB_CLEAR_RAM1:
CJNE R7,#0,PUB_CLEAR_RAM1_1
SJMP PUB_CLEAR_RAM1_E
PUB_CLEAR_RAM1_1:
MOV @R0,#0
INC R0
DJNZ R7,PUB_CLEAR_RAM1_
1
PUB_CLEAR_RAM1_E:
RET
END
实验九A\D 转换实验
实验目的(1)掌握A\D 转换与单片机接口的方法;(2)了解A\D 芯片0809 转换性能及编程方法;
(3)通过实验了解单片机如何进行数据采集
二、实验内容利用实验系统上的0809做A\D转换器,实验系统上的电位器提供模拟量输入,编制程序, 将模拟量
转换成数字,通过数码管显示出来。
三、实验接线图
四、试验程序框图
五、实验步骤把0809的零通道INTO用插针接至AOUT1孔,CS4接8000H孔,JX0接JX6,运行程序,数
码管上显示,后二位显示当前采集的电压转换的数字量,调节W1该而为将随着电压变化而相应变化。
六、思考修改程序,用其他通道轮流采样显示
七、程序清单文件名:
ORG 0000H
LJMP SE11
ORG 05A0H
SE11: MOV SP,#53H
MOV A,#43H
MOV DPTR,#0FF20H
MOVX @DPTR,A
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#00H
MOV 7BH,#09H
MOV 7AH,#10H
MOV 79H,#10H
LO18: LCALL SSEE
MOV A,#00H
MOV DPTR,#8000H
MOVX @DPTR,A
MOV R7,#0FFH
LO17: DJNZ R7, LO17
MOVX A,@DPTR
MOV R0,#79H
LCALL PTDS
SJMP LO18
ORG 05D0H
PTDS: MOV R1,A
ACALL PTDS1
MOV A,R1
SWAP A
PTSD1: ANL A,#0FH
MOV @R0,A
INC R0
RET
ORG 0D50H
SSEE: SETB RS1
MOV R5,#05H
SSE2: MOV 30H,#20H
MOV 31H,#7EH
MOV R7,#06H
SSE1: MOV R1,#21H
MOV A,30H
CLP A
MOVX @R1,A
MOV R0,31H
MOV A,@R0
MOV DPTR,#DDFF
MOVC A,@A+DPTR
MOV R1,#22H
MOVX @R1,A
MOV A,30H
RR A
MOV 30H,A
DEC 31H
MOV A,#0FFH
MOVX @R1,A
DJNZ R7,SSE1
DJNZ R5,SSE2
CLR RS1
RET
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH END
实验十D\A 转换
一、实验目的 (1) 了解D\A转换与单片机的接口方法;(2) 了解D\A转换芯片0832的性能及编程方法;
(3) 了解单片机系统中扩展D\A转换芯片的基本方法。
二、实验内容利用0832输出一个从0V开始逐渐升至5V再降至0V的可变电压。
三、实验接线图
四、实验程序框图
五、实验步骤把0832译码线CS5接至8000孔,JX0接JX2,运行程序,数码管上显示不断加大或减小的数字
量,用万用表测试D\A输出孔AOUT应也能测出不断加大或减小的电压值。
六、思考修改程序,使能产生锯齿波
七、程序清单文件名:
ORG 0000H
LJMP SE13
ORG 05E0H
SE13: MOV SP,#53
MOV A,#43H
MOV DPTR,#0FF20H
MOVX@DPTR,A
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#03H
MOV 7BH,#02H
LO20: MOV R6,#00H
LO21: MOV DPTR,#8000H
MOV A,R6
MOVX @DPTR,A
MOV R0,#79H
LCALL PTDS
LCALL SSEE
MOV R2,#08H LCALL DELYA INC R6 CJNE R6,#0FFH,LO21 MOV DPTR,#8000H DEC R6 MOV A,R6 MOVX @DPTR,A MOV R0,#79H LCALL PTDS LCALL SSEE MOV R2,#08H LCALL DELYA CJNE R6,#00H,LO22 SJMP LO20 ORG0620H MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SETB RS1 MOV R5,#05H MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H MOV R1,#21H MOV A,30H CPL A MOVX @R1,A MOV R0,31H
MOV A,@R0
MOV DPTR,#DDFF MOVC A,@A+DPTR MOV R1,#22H MOVX @R1,A MOV A,30H RR A
MOV 30H,A DEC 31H
MOV A,#0FFH
MOVX @R1,A
LO22:
PTDS:
PTDS1:
SSEE:
SSE2:
SSE1:
DJNZ R7,SSE1 DJNZ R5,SSE2 CLR,RS1 RET DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DELYD
LCALL SSEE POP 02H
DJNZ R2,DELYC POP 02H
DJNZ R2,DELYB POP 02H
DJNZ R2,DELYA RET
END DDFF: DELYA: DELYB: DELYC: DELYD:。