程序实验平台 AT89C51 KEIL5MDK Proteus8 Professional
一、汇编程序编写
1、利用定时器T0的方式1编制一段程序。在某一I/O输出引脚(如P1.0)输出一个方波控制一个红色指示灯。
①输出周期为40ms的方波,观察指示灯的变化,并采用示波器观察输出波形。
LED EQU P1.0
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP INT_1
MAIN: SETB IT1 ;下降沿触发
SETB EX1 ;开外部中断
SETB EA
CLR LED ;亮绿灯
SJMP $
INT_1:SETB LED ;亮红灯
JNB P3.3,$
CLR LED ;亮绿灯
RETI ;中断返回
END
②输出周期为200ms的方波,观察指示灯的变化,并采用示波器观察输出波形。
NUM EQU 5
CLOCK EQU 30H
LED EQU P1.0
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TI_0
MAIN: CLR LED
MOV CLOCK,#0H
MOV TMOD, #01H
MOV TL0, #0E0H
MOV TH0, #0B1H
SETB ET0
SETB EA
SETB TR0 ;开启计数器
SJMP $
TI_0: PUSH PSW
PUSH ACC
INC CLOCK
MOV A, CLOCK
CJNE A, #NUM, GOON
CPL LED
MOV CLOCK,#0H
GOON: MOV TL0, #0E0H
MOV TH0, #0B1H
POP ACC
POP PSW
RETI ;中断返回
END
2、设单片机的时钟为12MHz,请利用定时器T0编出使P1.0引脚输出2ms的矩形波程序,要求占空比系数为1:3。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TI_0
MAIN: CLR P1.0
MOV TMOD, #01H
MOV TL0, #24H
MOV TH0, #0FAH
SETB ET0
SETB EA ;开中断
SETB TR0 ;开计数器
SJMP $
TI_0: CPL P1.0
JB P1.0, M1
MOV TL0, #24h ;1500
MOV TH0, #0FAH
RETI
M1: MOV TL0, #0CH ;500
MOV TH0, #0FEH
RETI
END
3、利用计数器T1(P3.5)记录脉冲的个数。每计满10个脉冲,使灯亮1秒,然后重新计数,循环以上操作。
CLOCK EQU 30H
NUM EQU 20
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TI_0
ORG 001BH
LJMP TI_1
MAIN: SETB P1.0
MOV CLOCK,#0H
MOV TMOD, #61H ;T1计数T2计时
MOV TL0, #0B0H ;50MS(16 BIT)
MOV TH0, #3CH
MOV TL1, #0F6H ;(8 BIT重装载)
MOV TH1, #0F6H
SETB PT1 ;T1优先级高
CLR PT0
SETB ET0
SETB ET1
SETB EA ;开中断
SETB TR0 ;开计数器
SETB TR1 ;
SJMP $
TI_0: PUSH PSW ;进栈
PUSH ACC
INC CLOCK
MOV A, CLOCK
CJNE A, #NUM, GOON
CPL P1.0 ;计时1S后,取反
MOV CLOCK,#0H
RETI
GOON: MOV TL0, #0B0H
MOV TH0, #3CH
POP ACC
POP PSW ;退栈
RETI
TI_1: CPL P1.0 ;积满10个pulse
RETI ;返回,进T0中断
END
4、采用两台单片机应用系统。甲机发送内存中以TR_BUF为首地址的10个数据串,乙机把接收到的数据存入以RC_BUF为首地址的内存单元中。设甲、乙两机的振荡频率为12MHz,串行口均工作在方式1下。要求甲机用查询方式发送数据,乙机用中断方式接收数据。通信波特率采用9600、8位数据位、无校验。
甲机发送程序
;使用T0计数器方式二,串口方式一
TR_BUF EQU 30H
LEN EQU 20H
LED EQU P1.0
ORG 0000H
MOV R0, #TR_BUF;数据块首地址
MOV LEN, #10 ;数据块长度
LOOP: INC A
MOV @R0, A
INC R0
DJNZ LEN, LOOP
MOV R0, #TR_BUF
MOV LEN, #10
MOV PCON, #00H ;SMOD=0
MOV TMOD, #20H ;T0,方式二
MOV TL1, #0FDH ;初始值
MOV TH1, #0FDH ;重装值
CLR ET1 ;禁止T0产生中断,仅用于产生波特率信号
SETB TR1 ;启动T0,开始产生波特率
CLR ES ;查询式发送,禁止中断
MOV SCON, #40H ;方式一,禁止中断接收REN=0 T0 = 0
SETB LED ;熄灯
M1: MOV SBUF, @R0 ;发送数据
JNB TI, $ ;等待发送(判断BIT位)
CLR TI
INC R0
DJNZ LEN, M1 ;判断是否发送完
CLR LED ;点亮发送结束指示灯
SJMP $
END
乙机接收程序
RC_BUF EQU 30H
LEN EQU 20H
LED EQU P1.0
ORG 0000H
LJMP MAIN
ORG 0023H ;串行口中断
LJMP ESS1
MAIN: ;MOV SP, #70H
MOV LEN, #10
MOV R0, #RC_BUF
MOV PCON, #00H ;SMOD=1
MOV TMOD, #20H ;T0,方式二
MOV TL1, #0FDH ;初始值
MOV TH1, #0FDH
CLR ET1 ;禁止T0中断,仅用于产生波特率
SETB TR1 ;开定时器0
MOV SCON, #50H ;方式一接收
SETB EA ;开总中断
SETB ES ;开串口中断
CLR RI ;启动接收
SETB LED ;灭灯
SJMP $
ESS1: CLR RI ;接收中断标志置0,为下次接收做准备
MOV @R0, SBUF
INC R0
DJNZ LEN, RETURN ;判断是否接收完数据,反之跳回主程序
CLR LED ;点灯,表示接收完毕
CLR ES ;关串口中断
CLR EA ;关总中断
RETURN: RETI ;返回主程序
END
Proteus原理图
查看单片机内部RAM中的内容:调试(D) -> 80C51 -> internal(IDADA) memory
二、Proteus + keil5联调
1、keil与proteus联调软件
(1)将提取文件中的 VDM51.dll 复制到keil的目录D:\KEIL5\C51\BIN中。
(2)记事本打开D:\KEIL5\TOOLS.INI,然后在【c51】后面加上:
TDRV10=BIN\VDM51.DLL (“Proteus VSM Monitor-51 Driver”)
这里的“10”要根据实际情况修改,只要和之前的不重复,就可以。
(3)新建keil工程。
(4)设置软件仿真,选择Proteus驱动,并设置对应的IP,如果是自己电脑,可设置如下,如果不是同一台电脑,就将IP设置成相应的即可。
(5)Proteus选择支持远程调试。
(6)keil进入仿真。
(7)发现可以支持keil单步调试,Proteus看到调试现象是和keil相对应。