13.2.2 寄存器仿真
51系列单片机通过寄存器来实现硬件资源控制,因此KeilµVision3集成开发环境可以支持仿真单片机内部的各种寄存器。在程序执行的时候,每一个寄存器的值都可以随时查看,这样便于实时观察程序运行的正确性。不同的硬件资源由不同的寄存器来控制,除此之外,还包含一些通用的寄存器。这里介绍通用寄存器的仿真操作。
1.寄存器的仿真界面
在KeilµVision3集成开发环境中,通用寄存器的仿真界面如图13.16所示,其中实时显示了内部通用寄存器的当前状态和实时数值。下面分别对其中各项的含义进行介绍。
❑“r0”~“r7”:8个通用工作寄存器R0~R7。
❑“a”:累加器A,一般用作运算过程中的暂存寄存器。
❑“b”:寄存器B,可以作为一般寄存器或者运算的中间结果暂存器使用。
❑“sp”:堆栈指针寄存器,用来存放堆栈栈顶的地址。
❑“sp_max”:堆栈指针最大值,用来观察程序执行时是否产生堆栈溢出。
❑“dptr”:数据指针寄存器,用来存放单片机片内ROM的地址,也可以存放片外RAM和片外ROM的地址。
图 13.16 寄存器的仿真界面
❑“PC$”:程序计数器,用来存放下一条待执行指令的地址。
❑“states”:程序执行状态数。
❑“sec”:当前已运行的时间,单位是秒。
❑“psw”:程序状态寄存器,用来存放指令执行后的相关状态。其中,各个状态标志位的含义为:“p”为奇偶校验标志位,“f1”为保留位,“ov”为溢出标志位,“rs”为工作寄存器选择标志位,“f0”为用户标志位,“ac”为辅助进位标志位,“cy”为高位进位标志位。
2.寄存器的仿真
在汇编语言的单片机程序中,需要对这些寄存器进行操作。但是,在C51语言中,没有直接对这些寄存器的操作。但C51程序在编译时均被翻译为汇编代码,仍然需要操作这些寄存器,所以仍可以实时查看各个寄存器的值。
51系列单片机包含有4组通用工作寄存器,寄存器组0~3。每组通用工作寄存器包含8个寄存器R0~R7。在程序设计时,一般只能选择4组通用工作寄存器中的一组来存放程序的中间变量。在C51语言中,可对中断服务例程或者自定义函数指名所使用的通用工作寄存器组。这样,这些代码将固定使用某一组通用工作寄存器,从而避免了访问冲突并节省了寄存器组的切换时间。
在KeilµVision3集成开发环境中,通用工作寄存器的使用及仿真操作示例如下。
(1)按照前面的方法,新建一个工程。其中,选择Atmel公司的AT89S52单片机。
(2)选择“File”→“New”命令,新建一个程序文件并保存为*.C文件,在其中输入如下的程序源代码。
include<reg51.h>//头文件
include<ctype.h>//头文件
include<stdio.h>
void T0ISR(void)interrupt 1 using 2//定时器T0中断响应函数
{
int i;
bitb;
char*p;
for(i=0;i<128;i++)//循环输出
{
b=isalpha(i);//调用isalpha函数
if(b)
p=“YES”;
else
p=“No”;
printf(“isalpha(%c)=%s\n”,i,p);//输出结果
}
TL0=0x0C;//重置计数初值
TH0=0x0F0;
}
void main(void)//主函数
{
TMOD=0x00;//设置定时器T0为模式0
TL0=0x0C;//初始化
TH0=0x0F0;
TR0=1;
ET0=1;
EA=1;//开中断
while(1)//主循环
{
}
}
在该程序中,使用了定时器T0的中断。在主函数中首先初始化定时器T0为工作模式0,接着打开相应的中断。在while主循环中不进行任何操作,CPU等待定时器中断的发生。当定时器溢出时将触发中断,程序进入中断服务例程T0ISR。此时首先输出字符的判断结果,然后重置计数初值进入下一次定时。程序中,T0的中断服务例程T0ISR由“using 2”指定使用通用工作寄存器组2。
(3)选择“Debug”→“Start/Stop Debug Session”命令,进入程序仿真调试模式。此时,在集成开发环境的左侧便可以看到寄存器的仿真界面。
(4)按F5键,开始执行程序。用户可以在反汇编窗口看到翻译后的汇编代码的执行,如图13.17所示。
(5)当执行到为通用寄存器赋值的指令时,可以看到寄存器仿真界面上对应的寄存器值改变。如图13.18所示。其中,程序状态寄存器PSW中的rs=2,表示当前使用的是通用工作寄存器组2。寄存器r0~r7为当前工作寄存器的值。
提示由于程序执行很快,因此要停止程序运行(不是停止调试状态)后才能看到PSW中的rs改变为2。
图 13.17 汇编代码
图 13.18 寄存器的仿真结果
(6)当仿真操作完毕后,可以选择“Debug”→“Start/Stop Debug Session”命令,退出程序仿真调试模式。