第一篇:(第1章) 单片机教案
§1概论
§1.1 单片机特点及发展概况
一、什么是单片机
二、单片机的特点
三、单片机的应用
四、单片机的发展概况
§1.2 常用8位单片机系列介绍
一、Zilog公司Z8系列单片机
二、Motorola公司M6800系列单片机
三、51系列单片机
a)Intel公司MCS51、96系列单片机 b)Atmel公司AT89C51系列单片机
本课程主要内容:以编程应用为中心学习单片机 学习特点:软件为主,硬件为辅;
围绕软件,了解硬件; 软硬结合,解决问题
§2 51系列单片机 结构及工作原理
§2.1 51系列单片机整机结构
一、内部结构
CPU、RAM、ROM、I/O接口、CTC
二、外部引脚
从内部了解51系列单片机,为编程服务 从外部认识51系列单片机,为接线服务
了解CPU控制器的4个组成部分: 1 程序计数器PC:Program Counter 2 数据指针DPTR:Data Pointer 3 指令译码器 4 指令寄存器
了解运算器的组成,认识累加器ACC 明确51系列单片机一般组成: CPU、(ROM)、256B RAM、2×16位CTC、5个中断源、4 ×8位并行I/O 接口、1个全双工串行接口
MCS8031单片机:无ROM型,需要外接ROM或EPROM作
程序存贮器
这里ROM是广义的程序存贮器,既包括真正的ROM:Read Only Memory,又包括EPROM:Erasable Programmable Read Only
Memory,还包括最新的闪存FPEROM:Flash Programmable and Erasable Read Only Memory,优盘的核心 MCS8031单片机:无ROM,不是真正的单片机 MCS8051单片机:4K ROM MCS8751单片机:4K EPROM AT89C51单片机:4K FPEROM,以及AT89S51 AT89C2051单片机:2K FPEROM,2×8位并行I/O 接口,20脚,以及AT89S2051
重点掌握PC、DPTR、PSW、ACC 了解指令译码器、指令寄存器、算术逻辑单元ALU(Arithmetic Logic Unit)
PC:16 bit Program Counter, 16位程序计数器,功能:为CPU提供程序存贮器的地址。
特点:程序执行时自动加1计数:加1、2或3; 程序跳转时赋入新数:直接赋值。DPTR:16 bit Data Pointer, 16位数据指针
功能:寻址
特点:可用指令MOV DPTR,#DATA16整体赋值; 可用INC DPTR指令加1。PSW: Program State Word 功能:指示指令执行后各部状态
特点:指令执行后自然影响,或由指令直接赋值 ACC: Accumulator 功能:存贮指令执行前的已知数据; 存贮指令执行后的中间结果。
§2.2 51系列单片机存贮器结构
一、存贮器划分方法
二、程序存贮器
三、数据存贮器
四、内部RAM的分区
五、堆栈Stack及堆栈指针Stack Pointer
建立特殊功能寄存器SFR:Special Function Register, 栈Stack、字节寻址、位寻址等概念 了解51系列单片机存贮器划分
了解程序存贮器的组成及其特殊单元的定义
7FHFFHF0H寄存器BE0H累加器A用户RAM区D0H程序状态字PSW堆栈、数据暂存等B8H中断优先级控制字IPB0H并行I/O口P3A8H中断控制字A0H并行I/O口P230H99H串行口缓冲器2FH98H串行口控制字可位寻址区90H并行I/O口P18DH定时器T1的高8位位地址00H~7FH8CH定时器T0的高8位20H8BH定时器T1的低8位1FHR78AH位18H3组工作寄存器区定时器T0的低8R089H定时器组合模式控制字17HR72组工作寄存器区88H定时器工作方式控制字10HR087H电源控制字0FHR783H位08H1组工作寄存器区数据指针高8R082H数据指针低8位07HR700HR00组工作寄存器区81H堆栈指针80H并行I/O口P0
图1 RAM的分区、SFR及堆栈
堆认识RAM的分区、SFR及堆栈
明确51系列单片机存贮器从物理上分为4个空间: 内部RAM、内部ROM、外部RAM、外部ROM 从逻辑上分为3个空间:内RAM,外RAM,内ROM和外ROM 明确51系列单片机一般组成:CPU、(ROM)、256B RAM、2×16位CTC、5个中断源、4×8位并行I/O 接口、1个全双工串行接口
程序存贮器特殊单元:0000H:主程序入口;
0003H:0号外部中断服务子程序入口;
000BH:0号CTC中断服务子程序入口; 0013H:1号外部中断服务子程序入口; 001BH:1号CTC中断服务子程序入口; 0023H:串行口中断服务子程序入口。
明确程序存贮器起始单元中只有0000H单元的用途主程序入口是硬性规定,其余都是弹性规定。此处弹性规定的含义是:没有相应的中断服务子程序时,该地址可以灵活运用。
明确位寻址区有两种寻址方法可用:字节(整体)寻址和按位独立寻址
知道堆栈先进后出的特点及应用 知道内部RAM的分区
作业: AT89C51单片机片内包含那些主要逻辑功能部件。2 51系列单片机的EA端子有何用途。3 简答51系列单片机存贮器的4个物理空间和3个逻辑空间,如何访问不同的存贮空间。简述51系列单片机片内RAM的空间分配。
§2.3 51系列单片机并行I/O端口结构
一、P1口结构及功能
Ucc5V内部读锁存器信号缓冲器50k内部DBDQ锁存器MOS电子开关内部写信号CPQT1P1.XX0~7缓冲器内部读引脚信号P1口线内部结构图2
功能:准双向I/O口
作输入之前要先输出1,断开下拉电子开关
有读锁存器功能,可防止误读
拉电流能力:<0.1mA 灌电流能力:<10mA
二、P2口结构及功能 功能:准双向I/O口
作输入之前要先输出1,断开下拉电子开关
有读锁存器功能,可防止误读
拉电流能力:<0.1mA 灌电流能力:<10mA 第二功能:高8位地址线A15~8
内部读锁存器信号缓冲器内部控制信号内部地址信号Ucc5V50k内部DBDQ锁存器单刀双掷电子开关内部写信号MOS电子开关T1反相器P2.XX0~7CPQ缓冲器内部读引脚信号P2口线内部结构
图3
三、P3口结构及功能
功能:准双向I/O口
作输入之前要先输出1,断开下拉电子开关
有读锁存器功能,可防止误读
拉电流能力:<0.1mA 灌电流能力:<10mA 第二功能:串行口等
Ucc5V内部读锁存器信号缓冲器第二输出功能50k内部DBDQ锁存器内部写信号MOS电子开关T1P3.XX0~7CPQ缓冲器与非门内部读引脚信号第二输入功能P3口线内部结构
图4
四、P0口结构及功能
功能:1.准双向I/O口 2.数据总线
3.低8位地址总线A7~0
内部读锁存器信号缓冲器地址/数据控制Ucc5V与门T1内部DBDQMOS电子开关T2锁存器P0.XX0~7内部写信号CPQ单刀双掷电子开关缓冲器内部读引脚信号控制0:与门被封锁,电子开关下掷,T1截止,作开漏口线控制1:与门敞开,电子开关上掷,作地址/数据线P0口线内部结构图5
明确某口线作输入之前要先输出1—准双向含义 知道P0、P2、P3口线的第二功能
明确P1、P2、P3口线内部有约50k的上拉电阻
知道NMOS电子开关的特性:栅极接受高电平时导通; 接受低电平时断开。
§2.4 51系列单片机时序和复位
一、晶振频率fosc
fosc6MHz,11.0592
S1MHz,12MHz
S4S5S6S2S3foscP1P251系列单片机振荡频率及时钟频率发生器石英晶体C2二分频器振荡器C1
图6
二、时钟频率P、时钟周期(状态周期)
fP1fP20.5fosc,fP1与fP2错开180。时钟频率的倒数称为时钟周期,也叫。
三、机器周期
六个状态周期组成一个。
四、指令周期
机器周期是指令周期的基本单位。
就是说,1个指令周期最少包括1个机器周期。
按照包括机器周期的个数,实际指令周期分为单周期、1,P2双周期和四周期共三种。
总结
建立晶振频率、时钟频率、时钟周期、机器周期、指令周期等概念
知道晶振频率二分频为两相时钟频率; 知道一个机器周期包括两个时钟周期;
知道一个指令周期包括1个、2个或4个机器周期; 知道51系列单片机使用了指令交叉执行技术,即在当前指令尚未执行完毕前已经开始下一条指令的取指操作。所以51系列单片机很多指令长度为双字节,但执行时间为单周期。大大提高了工作速度。
§2.5 51系列单片机的复位
一、复位要求
给Reset引脚一个脉宽不小于2个机周的正脉冲 例:晶振频率fosc=12MHz时,机器周期T1s,则要求加在Reset引脚的脉宽不小于2s。
在正脉冲期间,单片机完成复位任务,使有关的寄存器、计数器等成为特定状态。
正脉冲结束时,单片机开始执行程序。Button5VR11kC1F9AT89C51ResetR10kUR5V2Vot1t
图7 复位电路
二、复位方法
uc(0)0 uc()5V
按照三要素法
uc(t)uc()[uc(0)uc()]et/
代入uc(0)0和uc()5V有
uc(t)5(1et/)V
电阻R上的电压即AT89C51单片机Reset引线的输入电压为
uR(t)5Vuc(t)5et/V
在刚上电时,uR(t)5V。随着时间进行,uR(t)要按照负指数曲线下降。当下降到uR(t1)2V时,高电平变为低电平,单片机开始执行程序。t1就是有效复位时间。令 uR(t1)5et/1t/1V2V
由此求出
e2.5
t1ln2.5
例:晶振频率fosc=12MHz时,机器周期T在Reset引脚的脉宽t12s,则有
21061s,要求加s
若电阻RC210101010k,则可求出电容值
6321010F200pF
为保险起见,通常取电容C=1F。
电阻R2以电容放电不过快为宜,通常取R11k。
三、复位影响
除SBUF以外的20个SFR
四、复位结果
P0~P3口全1,SP=07H,其余有效位全0。
五、上电复位与带电复位的比较
上电复位后内部RAM数值不定 带电复位后内部RAM数值不变
复位要求:给Reset引脚一个脉宽不小于2个机周的正脉冲
复位方法:上电复位: RC自然充电
带电复位: 手压按钮强迫电容放电,松开后再次自然充电
复位影响:除SBUF以外的20个SFR 复位结果:大部为0,小部为1 上电复位与带电复位的比较:
上电复位后内部RAM数值不定 带电复位后内部RAM数值不变
作业: 9 12 13 14
第二篇:2013单片机实验教案
单片机技术实验
教
案
冯
杰 实验一(1)顺序结构程序设计
一、实验目的
掌握汇编语言设计和调试方法。
二、实验内容
把外部RAM中2000h单元的内容拆开,高位送2001h单元,低位送2002h单元,2001h、2002h高位清零,一般本程序用于把数据送显示缓冲区时用。
三、程序流程
四、实验步骤
1、LED环境
⑴在“P.”状态下按“0→EV/UN”,装载实验所需的代码程序。
⑵在“P.”状态下键入0000,然后按“STEP”或“EXEC”进入实验项目的调试与运行。
2、PC环境
在与PC联机状态下,编译、连接、下载PH51se02.asm,用连续或单步方式运行程序。
3、运行结果检查
⑴在单步运行时每走一步可观察其运行结果。
⑵在连续运行状态下,应按“暂停图标”或实验箱上的“暂停按钮”,使系统无条件退出用户运行状态返回监控,然后再用相应的命令键观察与检查2000~2002h中内容变化情况。
五、思考
如何用断点方式调试本程序。
ORG 0000H LJMP START
ORG 0030H START: MOV DPTR,#2000H
MOVX A,@DPTR ANL A,#0F0H SWAP A MOV DPTR,#2001H MOVX @DPTR,A
MOV DPTR ,#2000H MOVX A,@DPTR ANL A,0FH MOV DPTR,#2002H MOVX @DPTR,A SJMP $ END 实验一(2)循环结构程序设计
一、实验目的
熟悉MCS-51指令系统,掌握程序设计方法。
二、实验内容
编写并调试一个排序子程序,其功能为用冒泡法将内容RAM中几个单元字节无符号的正整数,按从小到大的次序重新排列。
三、程序框图
四、实验步骤
1、LED环境
⑴在“P.”状态下按“0→EV/UN”,装载实验所需的代码程序。
⑵对片内RAM地址50h~5AH进行不规则置数。
⑶在“P.”状态下键入0000,然后按“STEP”或“EXEC”进入实验项目的调试与运行。
2、PC环境
在与PC联机状态下,编译、连接、下载PH51se05.asm,用连续或单步方式运行程序。
3、运行结果检查
⑴在单步运行时每走一步可观察其运行结果。
⑵在连续运行状态下,应按“暂停图标”或实验箱上的“暂停按钮”,使系统无条件退出用户运行状态返回监控,然后再用相应的命令键观察与检查片内50~5Ah中内容是否按从 小到大排列。
五、思考:修改程序把50~5Ah中内容按从小到大排列。
ORG 0000H LJMP START ORG 0030H MOV R7,#09H MOV R6,#00H;清除标志 CLR C MOV A,@R0 INC R0 SUBB A,@R0 JC LOOP1 MOV R6,#01H DEC R0 MOV A,@R0 INC R0 XCH A,@R0 MOV @R0,A DJNZ R7,START1 CJNE R6,#00H,START SJMP $ END START:
MOV R0,#50H START1:
DEC R0
INC R0 LOOP1:
实验一(3)选择结构程序设计
一、实验目的
掌握汇编语言的编程。
二、实验内容
编写程序,根据送入的数据转移运行。
三、程序框图
四、实验步骤
1、LED环境
⑴在“P.”状态下按“0→EV/UN”,装载实验所需的代码程序。⑵在20H中分次送入00、01、02、03。
⑶在“P.”状态下键入0A10,然后按“STEP”或“EXEC”进入实验项目的调试与运行。
2、PC环境
在与PC联机状态下,编译、连接、下载PH51se08.asm,用连续或单步方式运行程序。
3、运行结果检查
(1)在单步运行时每走一步可观察其运行结果。
(2)在连续运行状态下,应按“暂停图标”或实验箱上的“暂停按钮”,使系统无条件退出用户运行状态返回监控,然后观察每次运行程序后,数码管上数字循环情况。
ORG 0000H
LJMP START
ORG 0030H START: MOV 20H,#00H MOV A,20H MOV B,#03H
MUL AB
MOV DPTR,#TAB
JMP @A+DPTR
SJMP $ ORG 3000H TAB:
LJMP LOOPA
LJMP LOOPB
LJMP LOOPC
LOOPA: MOV A,#01H LOOPA1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPA1
LOOPB: MOV A,#03H LOOPB1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPB1
LOOPC: MOV A,#05H LOOPC1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPC1
DELAY1S: DELAY1S3: DELAY1S2: DELAY1S1:
MOV R7,#10 MOV R6,#200 MOV R5,#250 DJNZ R5,DELAY1S1 DJNZ R6,DELAY1S2 DJNZ R7,DELAY1S3 RET END
实验二 中断实验
一、实验目的
熟悉单片机中断概念及中断编程方法。
二、实验内容
编写程序,从P3.3输入脉冲,记录输入脉冲个数,并用P1口外部链接的发光二极管显示技术结果。
二、参考程序
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1_COUNT
ORG 0030H START:
MOV SP,#60H
MOV A,#00H
SETB IT1;下降边沿触发方式
SETB EX1;开启INT1中断
SETB EA
SJMP $ INT1_COUNT:
INC A
MOV P1,A
RETI
END
实验三 LED显示实验
一、实验要求
利用实验系统提供的显示设备,动态显示一行数据。
二、实验目的
⑴了解数码管动态显示的原理; ⑵了解用总线方式控制数码管显示。
三、实验说明
本实验系统提供了8位七段码LED显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
四、程序框图
ORG 0000H LJMP START ORG 0030H START: MOV SP,#60H MOV 50H,#8CH;显示字符P.MOV 51H,#40H MOV 52H,#79H MOV 53H,#24H MOV 54H,#30H MOV 55H,#19H MOV 56H,#12H MOV 57H,#02H
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符码
TAB1: DB 8CH;P.TAB2: DB 7FH;END 的字符码的字符码
空,不显示的字符
键盘电路实验
电路图:
程序:
;用int1中断实现按键功能,键值存放在4fh单元中;通过P1口输出按键值,用发光二极管显示按键值;通过P2.4--P2.6和三八译码器输出八列按键扫描码;通过P2.0---P2.3读入按键的行值;行列值组合,就是按键的键值 ORG 0000H LJMP START ORG 0013H LJMP key_value ORG 0030H START: MOV 4fH,#00h;存放按键键值单元 MOV P1,#00H MOV P2,#0FFH setb ex1 setb it1 setb ea KEY_SCAN: MOV P2,#0FH LCALL DELAY5MS
MOV P2,#1FH LCALL DELAY5MS
MOV P2,#2FH LCALL DELAY5MS
MOV P2,#3FH LCALL DELAY5MS
MOV P2,#4FH LCALL DELAY5MS
MOV P2,#5FH LCALL DELAY5MS
MOV P2,#6FH LCALL DELAY5MS
MOV P2,#7FH LCALL DELAY5MS
LJMP KEY_SCAN
DELAY5MS: MOV R7,#40 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV A,P2 MOV 4FH,A MOV P1,A POP PSW POP ACC RETI END
LED和键盘综合实验
电路图:
参考程序:
ORG 0000H LJMP START ORG 0013H LJMP KEY_VALUE ORG 0030H START: MOV SP,#60H
MOV 4fH,#00h;存放按键键值单元 MOV P2,#0FFH setb ex1 setb it1 setb ea
MOV 50H,#0CH;显示字符P.MOV 51H,#0CH MOV 52H,#7FH MOV 53H,#7FH MOV 54H,#7FH MOV 55H,#7FH MOV 56H,#7FH MOV 57H,#0CH
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS
MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV 4FH,P2 LCALL KEY_VALUE_DISP POP PSW POP ACC RETI
KEY_VALUE_DISP: MOV A,4FH ANL A,#0F0H SWAP A MOV DPTR,#TAB MOVC A,@A+DPTR MOV 56H,A MOV A,4FH ANL A,#0FH MOVC A,@A+DPTR MOV 57H,A RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6的字符码 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符码
TAB1: DB 8CH;P.的字符码
TAB2: DB 7FH;空,不显示的字符 END
实验四 A/D转换实验
一、实验目的
(1)掌握A/D转换与单片机接口的方法;(2)了解A/D芯片0809转换性能及编程方法;(3)通过实验了解单片机如何进行数据采集。
二、实验内容
利用实验系统上的0809做A/D转换器,实验系统上的电位器提供模拟量输入,编制程序,将模拟量转换成数字,通过数码管显示出来。
三、程序框图
四、实验电路
五、实验步骤
把0809的零通道INT0用插针接至AINl孔,0809CS位FFE0孔,运行程序,数码管显示0809.XX,后二位显示当前采集的电压转换的数字量,调节W1,该二位将随着电压变化而相应变化。
六、思考
修改程序,用其它通道轮流采样显示。
实验五 电脑时钟(定时器、中断综合实验)
一、实验目的
熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用实时程序的设计与调试技巧。
二、实验内容
编写程序,从本实验系统键盘上输入时间初值,用定时器产生0.1S定时中断,对时钟计数器计数,并将数值实时地送数码管显示。
三、程序框图
四、实验步骤
连续运行程序,在键盘上输入时间初值,按执行键EXEC执行,数码管上实时显示时间值。
五、思考
(1)电子钟走时精度和程序中那些常数有关?
(2)修改程序使定时器工作方式改变,调节有关参数,进一步提高精度。
六、参考程序
ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H START: MOV 50H,#00H;时的低位字符码 MOV 51H,#00H;时的高位字符码 MOV 52H,#00H;“-”的字符码 MOV 53H,#00H;分的低位字符码 MOV 54H,#00H;分的高位字符码 MOV 55H,#00H;“-”的字符码 MOV 56H,#00H;秒的低位字符码 MOV 57H,#00H;秒的高位字符码 MOV 5FH,#00H;存放小时的单元 MOV 5EH,#00H;存放分钟的单元 MOV 5DH,#00H;存放秒的单元 MOV 5CH,#00H;存放T0中断次数,50次为1秒
MOV SP,#60H;设置堆栈栈顶 MOV TH0,#???;设置T0定时器初值 MOV TL0,#??? MOV TMOD,#00000001H;T0工作在定时方式,工作方式0
SETB ET0;开放T0中断 SETB EA;开放总中断 SETB TR0;启动定时器T0 LOOP: mov P2,#11111110H MOV R0,#50H loop1: MOV R7,#08H LOOP2: MOV A,@R0 MOV P1,A LCALL DELAY INC R0 MOV A,P2 RL A
MOV P2,A DJNZ R7, LOOP2 LJMP LOOP SJMP $
DELAY: MOV R6,#2;延时程序 DELAY1: MOV R5,#10 DELAY2: MOV R4,#100 DELAY3: DJNZ R4,DELAY3 DJNZ R5,DELAY2 DJNZ R6,DELAY1 RET 16 T0_INT: CLR TR0 PUSH ACC MOV A,5CH CJNE A,#50H,T0_INT1 MOV 5CH,#00H MOV A,5DH CJNE A,#59H,T0_INT2 MOV 5DH,#00H MOV A,5EH CJNE A,#59H,T0_INT3 MOV 5EH,#00H MOV A,5FH CJNE A,#23H,T0_INT4 MOV 5FH,#00H LJMP T0_END T0_INT1: INC 5CH LJMP T0_END T0_INT2: INC 5DH LJMP T0_END T0_INT3: INC 5EH LJMP T0_END T0_INT4: INC 5FH T0_END: MOV A,5FH
MOV B,#10 DIV AB MOV 51H,A MOV A,B MOV 50H,A MOV A,5EH MOV B,#10 DIV AB MOV 54H,A MOV A,B MOV 53H,A MOV A,5DH MOV B,#10 DIV AB MOV 57H,A MOV A,B MOV 56H,A POP ACC
MOV TH0,#??? MOV TL0,#??? SETB TR0 RETI
实验六 LCD液晶显示屏实验
一、实验目的
⑴掌握单片机扩展液晶显示接口的设计与编程。⑵利用字符式液晶显示器显示字符。
二、实验内容
编制程序,在液晶显示器上显示:
学生所在的院系的汉语拼音字母和学生的名字。分两行显示。
三、实验电路
四、参考程序
DAT1 DAT2 EQU EQU 30H;第一参数单元 31H;第二参数单元 32H;指令代码单元 0100H;指令通道地址 0000H;数据通道地址 COM EQU C_ADD EQU D_ADD EQU
org 0000h ljmp main org 0030h;主程序
MAIN: MOV SP,#60H;
lcall delay;上电延时
LCALL INT;初始化
LCALL CLEAR;清缓冲区 TEST: LCALL hgnu_disp;显示“WELCOM TO HGNU” LCALL PL_XW_ZKB;显示 “P_L :”
“X_W :”
“ZKB:” sjmp test
;上电延时子程序 delay: MOV R6,#50H;MOV R7,#00H;DELY1: NOP DJNZ R7,DELY1;上电延时
DJNZ R6,DELY1;ret;读状态字子程序
R_ST: MOV DPTR,#C_ADD;设置指令通道 MOVX A,@DPTR;RET;判断状态位STA1,STA0子程序(读写指令和数据),在指令的读,写
;数据之前这两个标志必须同时为“1” ST01: LCALL R_ST;JNB ACC.0,ST01;JNB ACC.1,ST01;RET;判断状位STA2子程序(数据自动读状态),该位
;在数据自动操作过程中取代STA0和STA1有效。在连续读过程中每读一次;之前都要确认STA2=1 ST2: LCALL R_ST;JNB ACC.2,ST2;RET;判断STA3子程序(数据自动写状态)ST3: LCALL R_ST;JNB ACC.3,ST3;RET;判断状态位STA6子程序(屏读/屏拷贝状态)ST6: LCALL R_ST;JB ACC.6,ERR;RET ERR: LJMP ST6;;出错处理
;写指令和写数据子程序..;双字节参数指令写入入口
PR1: LCALL ST01;判断状态位STA1,STA0 MOV A,DAT1;取第一参数单元数据
LCALL PR13;写入参数;单字节参数指令写入入口
PR11: LCALL ST01;判断状态位STA1,STA0 MOV A,DAT2;取第二参数单元数据 LCALL PR13;写入参数
;无参数指令写入入口
PR12: LCALL ST01;无参数指令写入入口
MOV A,COM;取指令代码单元数据
MOV DPTR,#c_ADD;设置指令通道地址/数据写入入口
LJMP PR14;写入指令代码
PR13: MOV DPTR,#D_ADD;设置数据通道地址/数据写入入口 PR14: MOVX @DPTR,A;写入操作 RET;读数据子程序 PR2: LCALL ST01;判断状态位
MOV DPTR,#D_ADD;设置数据通道地址
MOVX A,@DPTR;读数据操作 MOV DAT2,A;数据存入第二参数/数据单元
RET;初始化子程序
INT:
;显示区域设置
MOV DAT1,#00H;设置文本显示区首地址
MOV DAT2,#00h;MOV COM,#40H;LCALL PR1;双字节参数指令写入入口
MOV DAT1,#16;设置文本显示区域宽度
MOV DAT2,#00H;即一行显示所占字节数
MOV COM,#41H;LCALL PR1;双字节参数指令写入入口
MOV DAT1,#00H;设置显示区域首地址
MOV DAT2,#00H;或文本属性区域首地址
MOV COM,#42H;LCALL PR1;双字节参数指令写入入口
MOV DAT1,#10H;设置图形显示区域宽度
MOV DAT2,#00H;或为文本属性区域狂宽度
MOV COM,#43H;即一行显示所占字节数
LCALL PR1;双字节参数指令写入入口
;显示光标设置
MOV COM,#0A1H;光标形状设置
LCALL PR12;
;设置光标初始位置,是字符行和字符列,第0行第15列
MOV DAT1,#0;光标行位置
MOV DAT2,#0;光标列位置
MOV COM,#21H;LCALL PR1;双字节参数指令写入入口
;显示方式设置,使用内部字符发生器
MOV COM,#80H;显示方式设置,逻辑“或”合成 LCALL PR12;无参数指令写入入口+
MOV COM,#97H;仅用文本显示
LCALL PR12;无参数指令写入入口
;显示开关方式
RET
;写数据子程序,8*8点阵
;R6中装入显示位置的列数(字符的个数),每行16个字符,R7中装入显示位置距左上角的字符行数
;5FH单元中装入待显示的字符码 DISP: mov b,r7
mov a,#16 mul ab mov r7,a CLR C mov a,R6
ADD A,R7 MOV R6,A;R7*16+R6
MOV DAT1,R6;设置显示RAM首地址,水平方向字符数
MOV DAT2,#00H;固定送00H MOV COM,#24H;地址指针指令
LCALL PR1;MOV
dat2,5fH;取要显示的字符
MOV COM,#0c4H;数据写,地址不变 LCALL PR11;写入数据
RET;清显示缓冲区(16*8单元)clear: MOV 5FH,#00H
MOV R5,#0 CLEAR0: MOV R4,#0 CLEAR1: MOV A,R5
MOV R7,A MOV A,R4 MOV R6,A CLEAR2: LCALL DISP
INC R4 CJNE R4,#16,CLEAR1
mov r4,#00h
INC R5
CJNE R5,#8,CLEAR0 CLEAR9: RET;显示频率、相位、占空比、相位差等字符。(P_L :;PL_XW_ZKB:MOV R7,#3 MOV R6,#0 MOV
5fh,#30H;“P” LCALL DISP MOV R7,#3 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#3 MOV R6,#2 MOV
5fh,#2CH;“L”
X_W :
ZKB:)
LCALL DISP MOV R7,#3 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP MOV R6,#0 MOV
5fh,#38H;“X” LCALL DISP MOV R7,#5 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#5 MOV R6,#2 MOV
5fh,#37H;“W” LCALL DISP MOV R7,#5 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP
MOV R7,#5
MOV R7,#7 MOV R6,#0 MOV
5fh,#3AH;“Z” LCALL DISP
MOV R7,#7 MOV R6,#1 MOV
5fh,#2BH;“K” LCALL DISP MOV R7,#7 MOV R6,#2 MOV
5fh,#22H;“B ” LCALL DISP MOV R7,#7 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP RET;顶行显示“黄冈师院物科院“的英文名称。;”welcome to hgnu!“ hgnu_DISP:
MOV R7,#0;显示位置的行列数
MOV R6,#0 MOV
5fh,#37H;”W“ LCALL DISP MOV R7,#0 MOV R6,#1 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#2 MOV
5fh,#2CH;”L“ LCALL DISP MOV R7,#0 MOV R6,#3 MOV
5fh,#23H;”C“ LCALL DISP MOV R7,#0 MOV R6,#4 MOV
5fh,#2FH;”0“ LCALL DISP MOV R7,#0 MOV R6,#5 MOV
5fh,#2DH;”M“ LCALL DISP MOV R7,#0 MOV R6,#6 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#7 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#8 MOV
5fh,#34H;”T“ LCALL DISP MOV R7,#0 MOV R6,#9 MOV
5fh,#2FH;”O“ LCALL DISP MOV R7,#0 MOV R6,#10 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#11 MOV
5fh,#28H;”H“ LCALL DISP
MOV R7,#0 MOV R6,#12 MOV
5fh,#27H;”G“ LCALL DISP MOV R7,#0 MOV R6,#13 MOV
5fh,#2EH;”N“ LCALL DISP MOV R7,#0 MOV R6,#14 MOV
5fh,#35H;”U“ LCALL DISP RET tab: db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h;”0-----9“
db 21h,22h,23h,24h,25h,26h;”A-----F" end
实验七 直流电机转速测量与控制实验
一、实验目的
1.掌握直流电机的驱动原理。2.了解直流电机调速的方法。
二、实验内容
1.用0832 D/A转换电路后的输出经放大后驱动直流电机。
2.编制程序改变0832输出经放大后的方波信号的占空比来控制电机转速。本实验中 D/A输出为双极性输出,因此电机可以正反向旋转。
三、程序流程
三、实验电路
五、参考程序
DATA_TH0 EQU 00H DATA_TL0 EQU 00H;信号周期为130ms DATA_TH1 EQU 20H DATA_TL1 EQU 00H;高电平时间65ms ORG 0000H LJMP MAIN ORG 0003H LJMP INT_0;启动电机按键
ORG 000BH LJMP T_0;T0确定输出信号的周期(或者频率)ORG 0013H LJMP INT_1;电机转动方向控制按键 ORG 001BH LJMP T_1;T1确定输出信号高电平的时间期
ORG 0030H MAIN: MOV SP,#60H
CLR P1.0 CLR P1.1;关闭电机
setb 20h.0;初始化电机正转
clr 20h.1;初始状态时,电机停止转动 MOV TMOD,#11H SETB IT0 SETB EX0 SETB IT1 SETB EX1 SETB ET0 SETB ET1 SETB EA
SJMP $
T_0: JNB 20H.1,T_01;
MOV TH1,#DATA_TH1
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0 MOV TL0,#DATA_TL0 SETB TR0 JNB 20H.0,T_02 setb P1.0 clr P1.1 LJMP T_05 T_02: clr P1.0 setb P1.1 LJMP T_05 T_01: CLR P1.0
CLR P1.1 CLR TR0 CLR TR1 RETI CLR TR1 T_05: T_1: clr p1.0 clr p1.1 RETI int_1: CPL 20H.1;电机启动标志求反,开启电机或者关闭电机
JNB 20H.1,INT_11;启动标志不为1,则停止电机,关闭定时器
MOV TH1,#DATA_TH1;启动标志为1,则开启定时器1和定时器2,输出PWM波
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0
MOV TL0,#DATA_TL0 SETB TR0 JNB 20H.0,INT_12;转动方向标志不为1,则反转,否则正转 setb P1.0 clr P1.1 LJMP INT_19 setb P1.1 LJMP INT_19 INT_12: clr P1.0 INT_11: CLR P1.0 CLR P1.1 CLR TR0 CLR TR1 INT_19: RETI 26
INT_0: CPL 20H.0 RETI END
实验八 步进电机控制实验
一、实验目的
1.了解步进电机控制的基本原理。2.掌握步进电机转动编程方法。
二、实验内容
从键盘上输入正、反转命令,转速参数和转动步数显示在显示器上,CPU再读取显示器上显示的正、反转命令,转速级数(16级)和转动步数后执行。转动步数减为零时停止转动。
三、实验电路图
四、参考程序
ORG 0000H
ljmp main ORG 000BH LJMP COUNT0 ORG 001BH LJMP COUNT1 ORG 0100H MAIN: MOV P0,#0FFH;输送脉冲口,SETB P1.2;MOV R0,#1;延时变化变量 LOOP1: MOV P0,#0FCH LCALL DELAY MOV P0,#0F6H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F9H LCALL DELAY JNB P1.2,LOOP2 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP1 LOOP2: MOV P0,#0FCH LCALL DELAY MOV P0,#0F9H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F6H LCALL DELAY JB P1.2,LOOP1 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH 28 SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP2 SJMP $ COUNT0: MOV TH0,#0FFH;减速中断 MOV TL0,#0FFH CJNE R0,#9,L4 JMP L5 L4: INC R0
L5: setb TR0 RETI COUNT1: MOV TH1,#0FFH;加速中断 MOV TL1,#0FFH CJNE R0,#1,L6 JMP L7 L6: DEC R0 L7: setb TR1 RETI DELAY: MOV A,R0;延时 MOV R1,A L1: MOV R2,#50 L2: MOV R3,#250 L3: DJNZ R3,L3 DJNZ R2,L2 DJNZ R1,L1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;显示程序查表,共阴 END
第三篇:单片机公开课教案
MCS-51单片机指令的寻址方式教案
教者:达雯
班级:0703
课时:1课时
教学目标:掌握MCS-51七种寻址方式的含义和特点
能识别指令中操作数所采用的寻址方式
能根据寻址方式确定操作数的来源
教学重点:直接寻址、立即寻址、寄存器寻址、寄存器间接寻址的特点 教学难点:能识别指令中操作数所采用的寻址方式
能根据寻址方式确定操作数的来源
教学过程:
一、复习导入
汇编语言的指令格式?
标号:操作码助记符 [(目的操作数),(源操作数)];注释
二、新授:
寻址方式的概念:如何找到存放被操作数据的位置(地址)的方法
1、立即寻址:由指令直接给出操作数:8位和16位。数值前加“#”表示
例如:MOVA,#30H2、直接寻址:指令直接给出操作数地址的寻址方式。
例如:MOVA,3AH3、寄存器寻址:以通用寄存器的内容为操作数的寻址方式
例如:MOVA,R14、寄存器间接寻址:以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。例如:MOVA,@R15、变址寻址:以DPTR或者PC作为基址寄存器,其内容为基地址,以累加器A作为变址寄存器,其内容为变址,并将两个寄存器内容也就是基址和变址相加,形成16位操作数地址。然后在程序存储器中找到该地址所对应的单元,其内容即为操作数。
6、相对寻址:以当前PC的内容为基址,加上指令给出的相对偏移量形成新的PC值的寻址方式
7、位寻址:对位地址中的内容作位操作的寻址方式
例如:MOVC,37H
三、寻址方式中的常用符号注释
四、课堂练习
五、小结:七种寻址方式
第四篇:单片机实验教案
实验一
数据传送
一、实验目的
1、熟悉单片机指令系统,掌握单片机循环程序设计方法
2、掌握单片机数据排序方法.二.实验内容:
预先向单片机内部RAM 50H 开始填入一批数据,以00H结尾.编这批数据按从小到大的顺序进行排序.三、实验步骤:
a.先向单片机内部RAM50H开始填入一批数据,以00H结尾
b.编程求出这批数据的长度,存入R7中,编程将这批数据按从小到大顺序
四、参考程序:
ORG 0030H
MOV R0,#50H
MOV R7,#00H
CLR 00H
LOOP2:CJNE @R0,#00H ,TB
LJMP MAIN
TB: INC R7
INC R0
LJMP LOOP2
MAIN:MOV R0,#50H
DJNZ R7,LOOP3
LJMP A0
LOOP3: MOV B, R7
MOV A,@R0 LOOP:INC R0
MOV R2,A
SUBB A,@R0
MOV A,R2
JC NEXT
SETB 00H
XCH A,@R0
DEC R0
XCH A,@R0
INC R0 NEXT:MOV A,@R0
DJNZ B,LOOP
JB 00H,MAIN
A0 :SJMP $
END 实验二 循环结构程序设计
一、实验目的
1、熟悉单片机指令系统,掌握单片机循环程序设计方法
2、掌握单片机数据排序方法.二.实验内容:
预先向单片机内部RAM 50H 开始填入一批数据,以00H结尾.编这批数据按从小到大的顺序进行排序.三、实验步骤:
a.先向单片机内部RAM50H开始填入一批数据,以00H结尾
b.编程求出这批数据的长度,存入R7中,编程将这批数据按从小到大顺序
四、参考程序: ORG 1000H MOV R0,#50H MOV R7,#00H LOOP: MOV A,@R0
INC R0 CJNE A, #00H,LOOP1 SJMP LOOP2 LOOP1:INC R7 SJMP LOOP LOOP2:MOV R0, #50H CLR 00H;(00H)=00H为标志位
MOV A,R7 MOV R6,A LOOP3:MOV A,@R0 INC R0 MOV 30H,@R0 CJNE A,30H,LOOP4 LOOP4:JC LOOP5
XCH A,@R0 DEC R0 XCH A,@R0 INC R0 SETB 00H INC R0 LOOP5:DJNZ R6,LOOP3 JB 00H,LOOP2 SJMP $ END
实验三 信号灯控制
一、实验目的
(1)学习P1口的使用方法;
(2)学习延时子程序的编写。
(3)掌握proteus仿真软件的基本使用。
二、实验内容
做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。
三、程序流程图:
四、参考程序 ORG 0 START: MOV R2,#8 MOV A,#0FEH SETB C LOOP: MOV P1,A LCALL DELAY RLC A DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#20;D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END
实验四 脉冲计数实验
一、实验目的:
1)掌握定时计数器的使用。2)学习延迟程序的编写和使用。
3)熟悉proteus仿真软件的使用方法。
二、实验内容:
1)开始时,显示“00”,第一次按下SP1后就开始计时。2)第二次按下SP1后,计时停止。3)
第三次按下SP1时,计时归零。
三、主程序流程图
四、中断服务程序流程图如下:
五、参考程序如下: TCNTA EQU 30H TCNTB EQU 31H SEC EQU 32H KEYCNT EQU 33H SP1 BIT P3.5 ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV KEYCNT,#00H MOV SEC,#00H MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A MOV TMOD,#02H SETB ET0 SETB EA WT: JB SP1,WT LCALL DELY10MS JB SP1,WT INC KEYCNT MOV A,KEYCNT CJNE A,#01H,KN1 SETB TR0 MOV TH0,#06H MOV TL0,#06H MOV TCNTA,#00H MOV TCNTB,#00H LJMP DKN KN1: CJNE A,#02H,KN2 CLR TR0 LJMP DKN KN2: CJNE A,#03H,DKN MOV SEC,#00H MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A MOV KEYCNT,#00H DKN: JNB SP1,$ LJMP WT DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: INC TCNTA MOV A,TCNTA CJNE A,#100,NEXT MOV TCNTA,#00H INC TCNTB MOV A,TCNTB CJNE A,#4,NEXT MOV TCNTB,#00H INC SEC MOV A,SEC CJNE A,#100,DONE MOV SEC,#00H DONE: MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A NEXT: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
实验五 8255控制交通灯
一、实验目的
进一步了解8255芯片的结构及编程方法,学习模拟交通控制的实现方法。
二、实验内容
用8255做输出口,控制十二个发光二极管燃灭,模拟交通灯管理。
四、参考程序如下: ;交通灯
ORG 0030H
JOD0:MOV SP,#60H
MOV DPTR,#0FFDBH
MOV A,#88H
;8255初始化
MOVX @DPTR,A
MOV DPTR,#0FFD8H
MOV A,#0B6H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A;点亮4个红灯
MOV R2,#25H;延时
LCALL DELY
JOD3:MOV DPTR,#0FFD8H
MOV A,#75H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A
;东西绿灯亮,南北红灯亮
MOV R2,#55H
LCALL DELY
;延时
MOV R7,#05H
;闪烁次数
JOD1:MOV DPTR,#0FFD8H
MOV A,#0F3H
MOVX @DPTR,A
INC DPTR
MOV A,#0CH
MOVX @DPTR,A
;东西黄灯亮,南北红灯亮
MOV R2,#20H
LCALL DELY
;延时
MOV DPTR,#0FFD8H
MOV A,#0F7H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A
;南北红灯亮
MOV R2,#20H
LCALL DELY
;延时
DJNZ R7,JOD1
;闪烁次数未到继续
MOV DPTR,#0FFD8H
MOV A,#0AEH
MOVX @DPTR,A
INC DPTR
MOV A,#0BH
MOVX @DPTR,A;东西红灯亮,南北绿灯亮
MOV R2,#55H
LCALL DELY
;延时
MOV R7,#05H
;闪烁次数
JOD2:MOV DPTR,#0FFD8H
MOV A,#9EH
MOVX @DPTR,A
INC DPTR
MOV A,#07H
MOVX @DPTR,A
;东西红灯亮,南北黄灯亮
MOV R2,#20H
LCALL DELY
;延时
MOV DPTR,#0FFD8H
MOV A,#0BEH
MOVX @DPTR,A
INC DPTR
MOV A,#0FH
MOVX @DPTR,A
;东西红灯亮
MOV R2,#20H
LCALL DELY
;延时
DJNZ R7,JOD2
;闪烁次数未到继续
LJMP JOD3
ORG 0213H
DELY:PUSH 02H
DEL2:PUSH 02H
DEL3:PUSH 02H
DEL4:DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
实验六 A/D转换
一、实验目的
1.掌握A/D转换与单片机的接口方法 2.了解A/D芯片0809性能及编程方法 3.通过实验了解单片机如何进行数据采集
二、实验内容
1.利用proteus软件仿真,实现A/D转换实验。
2.实验要求通过电位器提供模拟量的输入,编写程序,将模拟量转换成数字量,通过数码管显示出来。
三、参考程序如下: LED_0 EQU 30H
;存放三个数码管的段码 LED_1 EQU 31H LED_2 EQU 32H
ADC EQU 35H;存放转换后的数据 ST BIT P3.2 OE BIT P3.0 EOC BIT P3.1 ORG 00H
START: MOV LED_0,#00H MOV LED_1,#00H MOV LED_2,#00H MOV DPTR,#TABLE;送段码表首地址
SETB P3.4 SETB P3.5 CLR P3.6
;选择ADC0808的通道3
WAIT: CLR ST SETB ST CLR ST
;启动转换
JNB EOC,$
;等待转换结束
SETB OE
;允许输出
MOV ADC,P1
;暂存转换结果
CLR OE
;关闭输出
;MOV A,ADC
;将AD转换结果转换成BCD码
;MOV B,#100;DIV AB;MOV LED_2,A;MOV A,B;MOV B,#10;DIV AB;MOV LED_1,A;MOV LED_0,B lcall
intov LCALL DISP
;显示AD转换结果
SJMP WAIT
intov:;mov a,led_1;m;ov b,#10;mul ab
;add a,led_0;mov r1,a;mov a,led_2;mov b,#100;mul ab;add a,r1 mov dptr,#tab mov a,adc
movc a,@a+dptr mov b,#2 div ab mov r1,b mov b,#10 div ab mov led_2,a mov led_1,b cjne r1,#01,kk1
mov led_0,#05 back:
ret kk1:
mov led_0,#00
ajmp back
DISP: mov
dptr,#table
MOV A,LED_0
MOVC A,@A+DPTR
CLR P2.3 MOV P0,A LCALL DELAY SETB P2.3
mov
dptr,#table MOV A,LED_1 MOVC A,@A+DPTR CLR P2.2 MOV P0,A LCALL DELAY SETB P2.2
mov
dptr,#table MOV A,LED_2 MOVC A,@A+DPTR setb
acc.7 CLR P2.1
;数码显示子程序 MOV P0,A LCALL DELAY SETB P2.1 RET DELAY: MOV R6,#10
;延时5毫秒 D1: MOV R7,#250 DJNZ R7,$ DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH
tab:db 0, 0 ,0 , 1, 0, 2, 0, db 4, 0, 0, 5, 0, 6, 0, 0, 7, 0 db 8, 0, 0, 9, 0, 0, 10, 0, 11, 0 db 0, 12, 0, 13, 0, 0, 14, 0, 15, 0 db 0, 16, 0, 17, 0, 0, 18, 0, 19, 0 db 0, 20, 0, 0, 21, 0, 22, 0, 0, 23 db 0, 24, 0, 0, 25, 0, 26, 0, 0, 27 db 0, 28, 0, 0, 29, 0, 0, 30, 0, 31 db 0, 0, 32, 0, 33, 0, 0, 34, 0, 35 db 0, 0, 36, 0, 37, 0, 0, 38, 0, 39 db 0, 0, 40, 0, 0, 41, 0, 42, 0, 0 db 43, 0, 44, 0, 0, 45, 0, 46, 0, 0 db 47, 0, 48, 0, 0, 49, 0, 50, 0, 0 db 51, 0, 0, 52, 0, 53, 0, 0, 54, 0 db 55, 0, 0, 56, 0, 57, 0, 0, 58, 0 db 59, 0, 0, 60, 0, 0, 61, 0, 62, 0 db 0, 63, 0, 64, 0, 0, 65, 0, 66, 0 db 0, 67, 0, 68, 0, 0, 69, 0, 70, 0 db 0, 71, 0, 0, 72, 0, 73, 0, 0, 74 db 0, 75, 0, 0, 76, 0, 77, 0, 0, 78 db 0, 79, 0, 0, 80, 0, 0, 81, 0, 82 db 0, 0, 83, 0, 84, 0, 0, 85, 0, 86 db 0, 0, 87, 0, 88, 0, 0, 89, 0, 90 db 0, 0, 91, 0, 0, 92, 0, 93, 0, 0 db 94, 0, 95, 0, 0, 96, 0, 97, 0, 0 db 98, 0, 99, 0, 0, 100, 0, 0, 0
END
0, 3, 0
第五篇:单片机实验教案
实验一 集成开发环境keil c51的使用与调试
Keil C51 u Vision2 是德国Keil公司开发的基于Windows环境的8051软件开发平台,它集项目管理、源程序编辑、程序调试于一体,是一个强大的集成开发环境。
u Vision2 支持Keil的各种8051工具,包括:C编译器,宏汇编译器、连接/定位器及Object-hex转换程序,可以帮助用户快速有效的实现嵌入式系统的设计与调试。
1.1 硬件安装
1、连接51CPU板,在实验箱右下角有三个插座:J1、J2、J3,用来连接51CPU板,在51CPU板上有一个小拨码开关:J18,是单片机的EA脚,是用来选择读片内还是片外ROM的,拨向左边为读片内ROM;拨向右边为读片外ROM。
2、KEIL仿真器与实验箱的连接:将KEIL仿真器40芯的排线连到51CPU板的40芯插座上,仿真器的USB连接线连到微机的USB口。
3、八段数码管右上角的两个拨码小开关是用来设置工作模式的,将两个拨码小开关同时拨向右边是选择51单片机工作模式,此时应拨向右边。
1.2 新建一个项目文件
首先点击 Keil uVision2,进入uVision2界面。点击工具栏Project选项中的New Project,准备开始建立自己的项目。
输入工程文件名称,并选择保存工程文件的目录。
为项目文件选择一个目标器件(如ATMEL89C51),如图所示。
用鼠标对项目工作区的目标1,点击右键在弹出的菜单中选择“为目标‘目标1’设置选项”如下图所示。
在“为目标‘目标1’设置选项”中,点击“调试”菜单,在此菜单中可选择是使用硬件仿真,还是软件仿真,连接实验箱做实验时选择硬件仿真,点击硬件仿真选项后面的[设置]选项,在此对对话框中选择串口和波特率,串口根据所连电脑来决定。波特率为38400。
软件仿真 硬件仿真 选择串口 选择波特率
点击“文件/新建”创建源程序文件并输入程序代码。
在文本框中输入原程序,如下图所示
点击“文件/保存“对程序进行保存
用鼠标对项目工作区的目标1,点击右键在弹出的菜单中选择添加文件到原代码组,如下图所示
在弹出的添加文件框中,选择需要添加到项目中的文件
点击编译连接的图标,对项目文件进行编译
点击“调试/启动/停止调试”进入调试界面
在调试界面中可以对程序进行单步或者全速运行的调试
连机/停止 全速运行
单步
若要查看内存中的数据,点击“视图/存储器窗口”
在此地址框中,输入不同的指令查看内部数据
如果需要查看一些内部数据,在菜单栏点击[视图/存储窗口]。
C:0X地址 显示程序存储区数据 X:0X地址 显示数据存储区中数据 D:0X地址 显示CPU内部存储区中数据
注意:仿真器使用者使用时应注意:
Keil C仿真器用户程序在全速运行时,如果需暂停运行,请按实验仪键盘“RST”,此时仿真器存储器数据清零。如果您要再次运行您所编写的程序,就必须重新装载运行。
1.3 实验指导使用说明
点击“帮助/使用手册”打开“HK系列实验指导”
选择“软件实验”右边的下三角可选择实验类别或者芯片查询
点击实验目的、实验电路、实验连线、实验程序可查看关于实验的具体介绍
在芯片查询中,可查看常用芯片的管脚定义
实验二 程序设计实验
C51中进行绝对地址访问:
(1)在头文件中加入
#include
XWORD PBYTE DWORD 指向内存空间的绝对地址。(具体看课本Page 71~72)
(3)使用指针进行绝对地址访问(具体看课本Page68~71,课后用指针对下面实验程序进行修改)
例如:
#define ADDR
XBYTE[0x8000]
定义ADDR为 片外RAM地址0x8000的内容
Segment = CBYTE[0x0002]
将程序存储器的0002H地址的内容赋值给Segment
Segment = XBYTE[0x0002]
将向片外RAM的0002H地址的内容赋值给Segment
XBYTE[0x0002]=57
将57赋值给片外RAM0002H绝对地址
实验1:将片外8000H中的内容拆开,高位送8001H地址低位,低位送8002H的地址低位,8001H和8002H地址单元的高位清零。#include
#define a0 XBYTE[0x8000] #define a1 XBYTE[0x8001] #define a2 XBYTE[0x8002]
void main(){ a0 = 0xab;a1 = a0 & 0x0f;a2 = a0 >> 4;}
实验2:使用绝对地址进行char型数组赋值,数组的首地址为片外8000H #include
for(i=0;i<10;i++){
XBYTE[0x8000+i]=i;} }
请对上述实验进行修改:使用绝对地址进行int型数组赋值,数组的首地址为片外8000H
实验3:将内部RAM中的50H-5AH中的无符号数,按照从小到大的次序重新排列
#include
#define uint unsigned int #define uchar unsigned char uint i,j;uchar temp;void main(){ for(i=0;i<=10;i++)//赋初值
{
DBYTE[0x50+i]=10-i;} for(i=0;i<=10;i++){
for(j=i+1;j<10;j++)
{
if(DBYTE[0x50+i]>DBYTE[0x50+j])
{
temp=DBYTE[0x50+i];
DBYTE[0x50+i]=DBYTE[0x50+j];
DBYTE[0x50+j]=temp;
}
} } } 实验三
单片机I/O接口实验
1.看懂电路图
2.用开关分别控制,左边4盏灯同时亮,右边的4盏熄灭,开关导向另一边,左边4盏熄灭,右边4盏点亮。#include
//查阅sbit和bit 的区别 #define uint unsigned int #define uchar unsigned char void main(){ While(1){ if(P3_0 == 0)
{
P0 = 0x0f;} else P0=0xf0;} }
3.下面按照实验书本的要求做实验,并调试程序延时时间。
实验四
八段数码管滚动显示程序设计
1.了解扩展电路的基本结构。
2. 清楚8155各个寄存器的物理地址是怎么得到的。
3.弄清楚8155、74LS164、UA2003三块芯片的各个引脚的基本功能。
4.74LS164的串行输入的程序代码的编写
/* “验证式"?实验十一
八段数码管显示
*/ #include
XBYTE[0xe103] /* 键盘读入口 */
unsigned char LEDBuf[LEDLen];/* 显示缓冲 */ code unsigned char LEDMAP[] = { /* 八段管显示码 */
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 };
void Delay(unsigned char CNT){
unsigned char i;
while(CNT--!=0)
for(i=100;i!=0;i--);}
void DisplayLED(){
unsigned char i, j;
unsigned char Pos;
unsigned char LED;
Pos = 0x20;/* 从左边开始显示 */
for(i = 0;i < LEDLen;i++)
{
OUTBIT = 0;
/* 关所有八段管 */
LED = LEDBuf[i];
for(j = 0;j < 8;j++)
{
/*送164*/
if(LED & 0x80)DAT164 = 1;
else DAT164 = 0;
CLK164 = CLK164|0x02;
CLK164 = CLK164&0xfd;
LED <<= 1;
}
OUTBIT = Pos;/* 显示一位八段管 */
Delay(1);
Pos >>= 1;
/* 显示下一位 */
}
OUTBIT = 0;
/* 关所有八段管 */ }
void main(){
unsigned char i = 0;
unsigned char j;
CAddr = mode;
while(1){
LEDBuf[0] = LEDMAP[ i
& 0x0f];
LEDBuf[1] = LEDMAP[(i+1)& 0x0f];
LEDBuf[2] = LEDMAP[(i+2)& 0x0f];
LEDBuf[3] = LEDMAP[(i+3)& 0x0f];
LEDBuf[4] = LEDMAP[(i+4)& 0x0f];
LEDBuf[5] = LEDMAP[(i+5)& 0x0f];
i++;
for(j=0;j<30;j++)
DisplayLED();
/* 延时 */
} }
集成开发环境详细设置解说
在第二章中,我们已经简介了单片机软件Keil C51的开发过程。即: 1.建立一个工程项目,选择芯片,确定选项。2.建立汇编源文件或C源文件。3.用项目管理器生成各种应用文件。4.检查并修改源文件中的错误。5.编译连接通过后进行软件模拟仿真。6.编译连接通过后进行硬件模拟仿真。7.编程操作。8.应用。
这里我们介绍工程的较详细设置及常用调试方法。20.1
工程项目的建立、源程序文件的建立及加载
Keil C51软件UVision打开后,程序窗口的左边有一个项目工作区管理窗口,该窗口有3个标签,分别是Files、Regs和Books,这3个标签页分别显示当前项目的文件结构、CPU的寄存器及部分特殊功能寄存器的值(调试时才出现)和所选CPU的附加说明文件,如果是第一次启动Keil C51,那么这3个标签页全是空的(图20-1)。
图20-1
Keil C51打开后界面
20.1.1
建立工程文件
在单片机项目开发中,有时有多个的源程序文件,并且还要为项目选择CPU以确定编译、汇编、连接的参数,指定调试的方式等。为便于管理,Keil C51使用工程项目(Project)的方法,将这些参数设置和所需的所有文件都放在一个工程项目中,只能对工程项目而不能对单一的源程序进行编译(汇编)和连接等操作。
先在硬盘上建立一个需保存工程文件的目录(例如在“我的文档” 中建立一个test的文件夹),为便于管理及使用,目录名称可与工程名称一致。选择“工程>新工程”菜单(图20-2)。弹出对话框,要求给将要建立的工程起一个名字,可以在编辑框中输入一个名字(例如test),扩展名不必输入(默认的扩展名为.uv2)。点击“保存”按钮(图20-3)。随后弹出一个“为目标target选择设备”(Select Device for Target “Target1”)对话框,这个对话框要求选择目标CPU(即你所用单片机芯片的型号),Keil C51支持的CPU很多,我们选择Atmel公司的AT89C51(或AT89S51)芯片,用鼠标单击Atmel前的“+”号,选择“AT89C51(或AT89S51)”单片机后按确定(图20-4)。随即系统弹出是否拷贝8051启动代码到工程项目并添加到当前项目组的提示(Copy Standard 8051 Startup Code to Project Folder and Add File to Project ?),我们选否。此时,在工程窗口的文件页中,出现了“Target 1”,前面有“+”号,点击“+”号展开,可以看到下一层的“Source Group1”。
图20-2
选择“工程>新工程”菜单界面
图20-3
建立新工程界面
图20-4
选择单片机型号界面
20.1.2
源程序文件的建立
使用菜单“文件>新建”或者点击工具栏的新建文件按钮(图20-5),即在右侧打开一个新的文本编辑窗口,在该窗口中可以输入汇编语言源程序或C语言源程序(图20-6)。程序输入完成后,选择“文件”,在下拉菜单中选中“另存为”,将该文件以扩展名为.asm格式(汇编语言源程序)或.c格式(C语言源程序)保存在刚才所建立的一个文件夹中(test),这里假设源程序文件名为test.asm(图20-7)。
图20-5
新建源程序文件界面
图20-6
打开新的文本编辑窗口
图20-7
“另存为” 对话框
源程序文件也可以使用任意的文本编辑器编写。20.1.3
添加文件到当前项目组中
这时的工程项目还是一个空的工程,里面什么文件也没有,把刚才编写好的源程序test.asm加载进工程。单击工程管理器中“Target 1”前的“+”号,出现“Source Group1”后再单击,加亮后右击。在出现的下拉窗口中选择“Add Files to Group‘Source Group1’”(图20-8)。注意,该对话框下面的“文件类型”默认为C source file(*.c),也就是以C为扩展名的文件,如我们的文件是以asm为扩展名的,那么在列表框中找不到test.asm,要将文件类型改掉。点击对话框中“文件类型”后的下拉列表,找到并选中“Asm Source File(*.a51,*.asm)”,这样在列表框中就可以找到test.asm文件了(图20-9)。我们可以在增加文件窗口中选择刚才以asm格式(或c格式)编辑的文件,鼠标单击“ADD”按钮,这时源程序文件便加入到Source Group1这个组里了,随后关闭此对话窗口。点击 “ Source Group1”前的“+”号,可以看到test.asm文件已在其中(图20-10)。双击后,即可打开该源程序。
图20-8
Add Files to Group‘Source Group1’界面
图20-9
Add Files to Group‘Source Group1’对话框
图20-10
test.asm文件
20.2
工程项目的详细设置 工程建立好以后,还要对工程进行进一步的设置,以满足要求。
首先点击左边窗口的Target1,然后使用菜单“项目>目标‘target1’选项 ”即出现对工程设置的对话框,共有8个页面,默认为对象页面(图20-11)。绝大部分设置项通常可以采用默认值。
图20-11
对象页面
20.2.1
对象页面
时钟(MHz)后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频率值,对于AT89C51而言是24MHz,而AT89S51是33MHz。该数值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你实际所用的晶振频率相同。
储存器模式用于设置RAM使用情况,有3个选择项,Small:是所有变量都在单片机的内部RAM中。Compact:变量存储在外部RAM里,使用8位间接寻址。Large:变量存储在外部RAM里,使用16位间接寻址,可以使用全部外部的扩展RAM。
1.Small:一般使用Small来存储变量,此时单片机优先将变量存储在内部RAM里,如果内部RAM空间不够,才会存到外部RAM中。
2.Compact:Compact的方式要通过程序来指定页的高位地址,编程较复杂,如果外部RAM很少,只有256字节,那么对该256字节的读取就比较快。如果超过256字节,而且需要不断地进行切换,就较麻烦,Compact模式适用于比较少的外部RAM的情况。
3.Large:Large模式是指变量会优先分配到外部RAM里。需要注意的是,3种存储方式都支持内部256字节和外部64KB的RAM。因为变量存储在内部RAM里,运算速度比存储在外部RAM要快得多,大部分的应用都是选择Small模式。
代码ROM大小用于设置ROM空间的使用,也有3个选择项,Small、Compact及Large。1.Small:只用低于2K的程序空间,适用于AT89C2051这些芯片,2051只有2K的代码空间,所以跳转地址只有2KB,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL LJMP指令。如果代码地址跳转超过2K,那么会出错。
2.Compact:单个函数的代码量不能超过2K,整个程序可以使用64K程序空间。3.Large:可用全部64K空间,表示程序或子函数代码都可以大到64KB,使用code bank还可以更大。通常都选用该方式。选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small方式。
操作系统选项中,Keil C51提供了两种操作系统:Rtx tiny和Rtx full,通常我们不使用任何操作系统,用该项的默认值:None(不使用任何操作系统)。Use on-chip ROM(0x0-0xFFF)选择项,表示使用片上的ROM(选中该项并不会影响最终生成的目标代码量),该选项取决于单片机应用系统,如果单片机的EA接高电平,则选中这个选项,表示使用内部ROM,如果单片机的EA接低电平,表示使用外部ROM,则不选中该选项。
片外代码(CODE)储存器:表示片外ROM的开始地址和大小,如果没有外接程序存储器,那么不需要填任何数据。这里假设使用一个片外ROM,地址从0x7000开始,一般填16进制的数,Size(尺寸)为片外ROM的大小。假设外接ROM的大小为0x2000字节,则最多可以外接3块片外ROM。
片外数据(XDATA)储存器:用于确定系统扩展RAM的地址范围,可以填上外接Xdata外部数据存储器的起始地址和大小,这些选择项必须根据所用硬件来决定。如果仅仅是89C51单片应用,未进行任何扩展,那么无需设置。
代码分段:是使用Code Banking技术。Keil C51可以支持程序代码超过64KB的情况,最大可以有2MB的程序代码。如果代码超过64KB,那么就要使用Code Banking技术,以支持更多的程序空间。
20.2.2
输出页面
输出页面中(图20-12),按钮“选择目标(OBJ)目录”是用来选择最终的目标文件所在的文件夹,默认是与工程文件在同一个文件夹中。
图20-12
Output页面
“可执行文件名”:设置生成的目标文件的名字,缺省情况下和项目的名字一样。Create Executable:如果要生成OMF以及HEX文件,一般选中“调试信息”和“浏览信息”。选中“调试信息”将会产生调试信息,这些信息用于调试,如果需要对程序进行调试,应当选中该项。“浏览信息”是产生各种信息,该信息可以用菜单“查看” 进行浏览,一般取默认值。“生成hex文件”用于生成可执行代码文件,默认情况下该项未被选中,如果要烧录芯片做硬件实验,就必须选中该项。
Create Library:选中该项时将生成lib库文件,一般的应用是不生成库文件的。构造后操作栏中有以下几个设置。
完成时“嘀”一声提示:编译完成之后发出“咚”的声音。
开始调试:马上启动调试(软件仿真或硬件仿真),根据需要来设置,一般是不选中。运行用户程序#
1、运行用户程序#2:这个选项可以设置编译完之后所要运行的其他应用程序(比如有些用户自己编写了烧写芯片的程序,编译完便执行该程序,将Hex文件写入芯片),或者调用外部的仿真程序。可根据自己的需要设置。
20.2.3
列表页面
列表页面用于调整生成的列表文件选项。在汇编或编译完成后将产生(*.lst)的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是“C Compile Listing”下的“汇编代码”项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码(图20-13)。
图20-13
Listing页面
20.2.4
C51页面
C51页面用于对Keil C51软件的C51编译器的编译过程进行控制(图20-14),其中比较常用的是“代码优化选项”组,该组中级别是优化等级,C51在对源程序进行编译时,可以对代码多至9级优化,默认使用第8级,一般不必修改,如果在编译中出现一些问题,可以降低优化级别再试。“侧重”是选择编译优先方式,第一项是代码大小优化(最终生成的代码量小),第二项是执行速度优先(最终生成的代码速度快),第三项缺省。默认的是速度优先,可根据需要更改。
图20-14
C51页面
20.2.5
调试页面
调试页面中(图20-15)有两类仿真形式可选:“使用模拟器”和“Keil Monitor-51 Driver”,前一种是纯软件仿真,后一种是带有Monitor-51目标仿真器的仿真。对于没有Monitor-51目标仿真器的用户,只有采用软件仿真。默认方式下的仿真是软件仿真(使用模拟器)。
图20-15
Debug页面 启动时加载程序:选择这项之后,Keil C51会自动装载程序代码。
一直运行到main():调试C语言程序时可以选择这一项,PC会自动运行到main程序处。
工程设置对话框中的其他各页面与C51编译选项、A51的汇编选项、BL51连接器的连接选项等用法有关,这里均取默认值。
设置完成后按确认返回主界面,工程文件就建立、设置完毕了。20.3
编译、连接
在设置好工程后,即可进行编译、连接。选择主菜单栏中的“项目”,在下拉菜单中选中“构造对象”(图20-16),对当前工程进行编译、连接,这时输出窗口出现源程序的编译结果。如果选择“重新构造所有对象文件”将会对当前工程中的所有文件重新进行编译,然后再连接,这样最终产生的目标代码是最新的。
图20-16
编译、连接操作
以上操作也可以通过工具栏按钮直接进行。
编译过程中的信息将出现在输出窗口中的构造页中,如果源程序中有语法错误,将提示错误ERROR(S)的类型和行号,双击该行,可以定位到出错的位置。对源程序进行修改没有语法错误后,重新进行编译、连接,编译成功后,最终可得到hex格式的文件(如test.hex),该文件可被编程器读入并写到芯片中,同时还会产生一些其他相关的文件,可被用于Keil C51的仿真与调试。20.4
Keil C51集成开发环境软件的调试方法 20.4.1
常用调试命令
在对工程成功地进行编译(汇编)、连接以后,在主菜单中打开“调试”栏,点击“开始/停止调试模式”,即可进入软件模拟仿真调试状态,Keil C51内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能非常强大,可以在没有硬件和仿真器的情况下进行程序的调试,但是在时序上,软件模拟仿真是达不到硬件的时序的。进入调试状态后,“调试”栏菜单项中原来不能用的命令现在已经可以使用了。“调试”栏菜单上的大部分命令可以在调试界面上找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令(图20-17)。
图20-17
软件模拟仿真调试状态
使用菜单“单步到之外”或相应命令或功能键F10可以用“单步跳过”形式执行命令,所谓“单步跳过”,是指将汇编语言中的子程序或高级语言中的函数作为一个语句一步执行完。使用菜单“单步”或相应的命令按钮或使用快捷键F11可以单步执行程序(即一条一条语句执行),通过单步执行程序,可以找出一些问题的所在,但是仅依靠单步执行来查错效率较低。
20.4.2
断点设置
程序调试时,一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定的值、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就要使用到程序调试中的另一种非常重要的方法:断点设置。断点设置的方法有多种,常用的是在某一程序行设置断点(图20-18),设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此时观察有关变量值,以确定问题所在。在程序行设置/移除断点的方法是将光标定位于需要设置断点的程序行,使用菜单:“调试>设置/取消断点”设置或移除断点,也可以用鼠标在该行双击实现同样的功能;另外“使能/禁止断点”用来开启或暂停光标所在行的断点功能;其它还有“禁止所有断点”、“取消所有断点”等设置。这些功能也可以用工具条上的快捷按钮进行设置。
图20-18
断点设置
20.4.3
在线汇编
在进入Keil C51的调试环境以后,若发现程序有错,可以直接对源程序进行修改,但是要使修改后的代码起作用,必须先退出调试环境,重新进行编译、连接后再次进入调试。如果调试时只是需要对某些程序行进行临时的试验修改(如修改参数以得到所需的延时时间),那么这样的重复过程显得太麻烦,为此Keil C51软件提供了在线汇编的能力。将光标定位于需要修改的程序行上,用菜单“调试>在线汇编”即可出现如图20-19所示的对话框,在“输入新指令”后面的编缉框内直接输入需更改的程序语句,输入完后键入回车将自动指向下一条语句,可以继续修改。如果不再需要修改,可以点击右上角的关闭按钮关闭窗口。
图20-19
在线汇编对话框
20.4.4
程序调试时的常用窗口 Keil C51软件在调试程序时提供了多个窗口,主要包括输出窗口(Output Windows)、查看和呼叫堆栈窗口(Watch & Call Statck Windows)、存储器窗口(Memory Window)、反汇编窗口(Dissambly Window)和串行窗口(Serial Window)等。进入调试模式后,可以通过菜单“查看”(View)下的相应命令打开或关闭这些窗口。图20-20是输出窗口、查看和呼叫堆栈观察窗口和存储器窗口,各窗口的大小可以使用鼠标调整。进入调试程序后,输出窗口自动切换到Command页。
图20-20
输出窗口、查看和呼叫堆栈窗口和存储器窗口
存储器窗口
存储器窗口中可以显示系统各种内存中的值,通过在“地址”(Address)后的编缉框内输入“字母:数字”即可显示相应内存值,其中字母可以是C、D、I、X,分别代表代码存储空间、直接寻址的片内存储空间、间接寻址的片内存储空间、扩展的外部RAM空间,数字代表想要查看的地址。例如输入“D:0x20”即可观察到地址20H开始的片内RAM单元值;键入“C:0x100”即可显示从100H开始的ROM单元中的值,即查看程序的二进制代码。该窗口的显示值可以以各种形式显示,如十进制、十六进制、字符型等,改变显示方式的方法是点鼠标右键,在弹出的快捷菜单中选择,该菜单用分隔条分成三部分,其中第一部分与第二部分的三个选项为同一级别,选中第一部分的任一选项,内容将以整数形式显示,而选中第二部分的ASCII项则将以字符型式显示,选中Float项将以相邻四字节组成的浮点数形式显示,选中Double项则将相邻8字节组成双精度形式显示。第一部分又有多个选择项,其中Decimal项是一个开关,如果选中该项,则窗口中的值将以十进制的形式显示,否则按默认的十六进制方式显示。Unsigned和Signed后分别有三个选项:Char、Int、Long分别代表以单字节方式显示、将相邻双字节组成整型数方式显示、将相邻四字节组成长整型方式显示,而Unsigned和Signed则分别代表无符号形式和有符号形式,究竟从哪一个单元开始的相邻单元则与你的设置有关。以整型为例,如果你输入的是“I:0”,那么00H和01H单元的内容将会组成一个整型数,而如果你输入的是“I:1”,01H和02H单元的内容会组成一个整型数,依此类推。第三部分的Modify Memory at X:xx用于更改鼠标处的内存单元值,选中该项即出现如图20-21所示的对话框,可以在对话框内输入要修改的内容。
图20-21
更改内存单元值 工程窗口寄存器页
图20-22是工程窗口寄存器页的内容,寄存器页包括了当前的工作寄存器组和系统寄存器组。系统寄存器组有一些是实际存在的寄存器,如A、B、DPTR、SP、PSW等,有一些是实际中并不存在或虽然存在却不能对其操作的,如PC、States等。每当程序中执行到对其寄存器的操作时,该寄存器会以反色(蓝底白字)显示,用鼠标单击然后按下F2键,即可修改该值。
图20-22
工程窗口寄存器页 查看和呼叫堆栈观察窗口
这也是很重要的一个窗口,工程窗口中不仅可以观察到工作寄存器和有限的寄存器如A、B、DPTR等,如果需要观察其他寄存器的值或者在高级语言编程时需要直接观察变量,还要借助于这个窗口了。
一般情况下,我们仅在单步执行时才对变量值的变化感兴趣,全速运行时,变量的值是不变的,只有在程序停下来之后,才会将这些值的最新变化反映出来。但是,在一些特殊场合我们也可能需要在全速运行时观察变量的变化,此时可以点击查看>定期窗口更新,确认该项处于被选中状态,即可在全速运行时动态地观察有关值的变化。但是,选中该项,将会使程序模拟执行的速度变慢。
Keil C51提供了串行窗口,我们可以直接在串行窗口中键入字符,该字符虽不会被显示出来,但却能传递到仿真CPU中,如果仿真CPU通过串行口发送字符,那么这些字符会在串行窗口显示出来,用该窗口可以在没有硬件的情况下用键盘模拟串口通信。由于该项涉及到高级语言编程,这里就不具体介绍了。
20.5
外围接口工具
为了能够比较直观地了解单片机中定时器、中断、并行端口、串行端门等常用外设的使用情况,Keil C51提供了一些外围接口对话框,通过“外围设备”菜单选择。“外围设备”的下拉菜单内容与你建立项目时所选的CPU有关。如果是选择的89C51这一类单片机,那么将会有Interrupt(中断)、I/O Ports(并行I/O口)、Serial(串行口)、Timer(定时/计数器)这四个外围设备菜单(图20-23)。打开这些对话框,列出了外围设备的当前使用情况,各标志位的情况等,可以在这些对话框中直观地观察和更改各外围设备的运行情况。
图20-23
外围设备菜单 20.5.1
P1□作为输入端□
程序每执行一个循环之前,修改一次P1端口的值(图20-24),观察变量的值是直接观看屏幕右下角的变量表;另外的方法是将鼠标移动到源程序的变量处,等待大约1秒钟左右,屏幕上即可弹出该变量的相关信息。
图20-24
P1□作为输入端□ 20.5.2
P1□作为输出端□
执行循环时观察P1口的输出。由于P1口只用于输出,故无须修改端口值(图20-25)。
图20-25
P1□作为输出端□
20.5.3
外部中断INT0 外部中断INT0对应于P3.2口线,因此,用鼠标单击“外设>Port3”窗口从右向左数第三位(P3.2口线对应的位),每单击一下,即产生一次中断,原因是外部中断是下降沿或低电平有效(图20-26)。
图20-26
外部中断INT0 另外,也可以点击“外设>Interrupt”,在出现图20-27所示中断对话界面后,进行设置。
图20-27
中断对话界面 20.5.4
定时器/计数器0 MCS-51系列单片机有两至三个定时器/计数器,均可以作为定时器或计数器使用。点击“外设>Timer0”即出现图20-28所示定时/计数器0的外围接口界面,可以直接选择Mode组中的下拉列表以确定定时/计数工作方式(0~3四种工作方式,设定定时初值等),点击选中TR0,status后的stop(停止)就变成了run(运行)。如果全速运行程序,此时TH0、TL0后的值也快速地开始变化(要求“定期窗口更新”处于选中状态),直观地演示了定时/计数器的工作情况。
图20-28
定时/计数器0的外围接口界面