嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二)

程序实验平台 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原理图
嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二)_第1张图片
查看单片机内部RAM中的内容:调试(D) -> 80C51 -> internal(IDADA) memory

二、Proteus + keil5联调

1、keil与proteus联调软件

提取码
嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二)_第2张图片
2、操作步骤

(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设置成相应的即可。
嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二)_第3张图片
嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二)_第4张图片
(5)Proteus选择支持远程调试。
嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二)_第5张图片
(6)keil进入仿真。
(7)发现可以支持keil单步调试,Proteus看到调试现象是和keil相对应。

你可能感兴趣的:(嵌入式程序结构编程 汇编+KEIL5与Proteus联调(二))