}
}
27.利用库函数scanf编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片外数据存储器从0x240开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include
unsigned char xdata *xdpt; unsigned char i=0,temp; xdpt=0x240;
while(1) {
scanf(“%c”,&temp); if(temp==0x0d)
break;
*(xdpt+i)=temp; i++; } } 28.利用库函数putchar编写一函数,实现从单片机串行口发送数据的C51程序,发送的数据存放在片内数据存储器从0x50开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include
unsigned char data *dpt; unsigned char i=0; dpt=0x50;
while(*(dpt+i)!=0x0d) {
putchar(*(dpt+i)); i++; } } 29.利用库函数printf编写一函数,实现从单片机串行口发送数据的C51程序,发送的数据存放在片外数据存储器从0x100开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include
16
unsigned char xdata *xdpt; unsigned char i=0; xdpt=0x100;
while(*(xdpt+i)!=0x0d) {
printf(“%c”,*(xdpt+i)); i++; }
} 30.编写一定时器/计数器0定时100ms中断处理函数,使函数实现时钟的功能,即产生时钟的秒、分钟和小时。设定时初值的高、低字节分别为TIMER_H和TIMER_L。 设fosc=6mhz
#include
unsigned char data shi,fen,miao,bfm;
void main() {
TMOD=0x01;
TIMER_H=15536/16; TIMER_L=15536; ET0=1; EA=1; TR0=1; while(1); }
void time0_int() interrupt 1 {
TIMER_H=15536/16; TIMER_L=15536; bfm++;
if(bfm==10) {
bfm=0; miao++; }
if(miao==60) {
miao=0; fen++;
17
}
if(fen==60) {
fen=0; shi++; }
if(shi==24) {
shi=0; }
}
31.在Keill C的调试状态下,如何使用跟踪运行、单步运行、跳出函数运行命令?
答:Step命令和Step Over命令的区别:当遇到调用函数时,前者将跟踪进入函数,而后者是一步执行完函数。
如果用全速运行命令Go,可以使用Stop Running命令停止运行。
欲退出调试状态,可以再次点击Debug菜单下的Start/Stop Debug Session命令或相应的按钮。
32.在Keill C的调试状态下,如何设置断点和删除断点?
答:方法1:用鼠标双击。在需要设置的行的最前面,双击鼠标左键,即可设置或清除断点。
方法2:用命令或命令按钮。先将光标移到需要设置的行,然后点击Debug菜单下的Insert/Remove Breakpoint命令或工具栏中的相应按钮,即可设置或清除断点。
另外还有断点禁用和全部清除命令及按钮。
33.在Keill C的调试状态下,如何观察和修改寄存器?
答:寄存器窗口、在线帮助窗口和工程管理器是同一个窗口,在工程管理器窗口下包含3个标签,即包含3个区域。在调试状态下,点击View菜单下的Project Window命令或对应的按钮,就会显示或隐藏工程管理器窗口,然后点击窗口下边的寄存器标签,即显示出寄存器窗口。
除了sec和states之外,其它寄存器的值都可以改变。改变的方式有两种:一是用鼠标直接点击左键进行修改;二是在调试命令窗口直接输入寄存器的值,如输入“A=0x32”,则寄存器A的值立即显示0x32。
34.在Keill C的调试状态下,如何观察和修改变量?
答:在调试状态下,点击View菜单下的Watch & Call Stack Window命令或对应的按钮,就会显示出或隐藏起变量窗口。变量窗口包含有4个标签,即4个显示区,可以分别显示局部变量(Locals标签)、指定变量(Watch #1和Watch #2两个标签)、及堆栈调用(Call Stack标签)。
在局部变量区,显示的是当前函数中的变量,这些变量不用设置,自动出现在窗口中。为了观察其它变量,可以在Watch#1或Watch#2标签按F2输入变量名。在程序运行中,可以观察这些显示的变量的变化,也可以用鼠标点击修改它们的
18
值。
另外还有更简单的方法观察变量的值,在程序停止运行时,将光标放到要观察的变量上停大约1秒,就会出现对应变量的当前值,如operate=0x32。
35.在Keill C的调试状态下,如何观察和修改data区、idata区、xdata区的数据?如何观察code区的数据?
答:在调试状态下,点击View菜单下的Memory Window命令或对应的按钮,就会显示出或隐藏起存储器窗口。存储器窗口包含4个标签,即4个显示区,分别是Memory#1、?、Memory#4。
在4个显示区上边的“Address”栏输入不同类型的地址,可以观察不同的存储区域。
1)设置观察片内RAM直接寻址的data区,在Address栏输入D:xx(xx为十六进制的两位数,下同),便显示从xx地址开始的数据。高128字节显示的是特殊功能寄存器的内容。
2)设置观察片内RAM间接寻址的idata区,在Address栏输入I:xx,便显示从xx地址开始的数据。高128字节显示的也是数据区的内容,而不是特殊功能寄存器的内容。
3)设置观察片外RAM xdata区,在Address栏输入X:xxxx,便显示从xxxx地址开始的数据。 4)设置观察程序存储器ROM code区,在Address栏输入C:xxxx,便显示从xxxx地址开始的程序代码。
在显示区域中,默认的显示形式为十六进制的字节。
除了程序存储器中的数据不能修改之外,其它3个区域的数据均可修改。修改方法是,用鼠标对准欲修改的单元,点击鼠标右键,在弹出的菜单中对Modify Memory at 0x?命令点击鼠标左键,会弹出的文本输入栏输入数据,然后用鼠标左键点击“OK”即可。
36.在Keill C的调试状态下,如何观察各个片内外设的运行状态?如何修改它们的设置?
答:在调试状态下,点击Peripherals菜单下的不同外设选项命令,就会显示或隐藏对应外设的观察窗口。如显示定时器0窗口,点击Peripherals菜单下的Timer下面的Timer0选项,便会显示出定时器/计数器0状态窗口。
在程序运行时,各个片内外设的状态会不断地变化,为了随时观察它们的变化,可以启用View菜单下的Periodic Windows Update命令,让Keil C自动周期刷新各个调试窗口。另外,也可以在窗口中对设备直接进行设置,与程序中的命令设置一样,并且立即生效。
第5章 习题答案
1.什么是中断和中断系统?计算机采用中断系统带来了哪些优越性? 答:当CPU当CPU正在处理某事件的时候,外部或者内部发生的某一事件请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件后,再返回到原来被中止的地方继续原来的工作,这样的过程称为中断。
1.CPU与外设同步工作 2.实时处理
19
3.故障处理
2.MCS-51共有几个中断源?各中断标志是如何产生的,又如何清零的?CPU响应中断时,中断入口地址各是多少?
答:MCS-51共有5个中断源。各中断标志是通过中断请求产生的,通过指令或硬件清零的。CPU响应中断时,中断入口地址各是03H,0BH,13H,1BH,23H。
3.编写一段对中断系统那个初始化的程序,使之允许INT0、INT1、T1、串行口中断,且使串行口中断为高优先级。 EX0=1; EX1=1; ET1=1; ES=1; EA=1; PS=1;
4.什么是中断优先级?什么是中断嵌套?处理中断优先级的原则是?
答:中断响应的优先次序是中断优先级。当一个中断处理的过程中又响应了更高优先级的中断是中断嵌套。处理中断优先级的原则是先高级中断,后低级中断。同级的按自然优先级排序。
5.MCS-51在什么情况下可以响应中断?中断响应的过程是? 答:响应中断的条件 (1)中断源有中断请求; (2)中断总允许位EA=1;
(3)请求中断的中断源的中断允许位为1; 在满足以上条件的基础上,若有下列任何一种情况存在,中断响应都会受到阻断。 (1)CPU正在执行一个同级或高优先级的中断服务程序。 (2)正在执行的指令尚未执行完。
(3)正在执行中断返回指令 RETI或者对专用寄存器IE、IP进行读/写的指令。CPU在执行完上述指令之后,要再执行一条指令,才能响应中断请求。
中断请求被响应后,有内部长调用(LCALL)将程序转向对应的中断矢量地址,执行执行中断服务程序。
6.中断响应过程中,为什么通常要保护现场?如何保护和哪些信息要进行保护? 答:因为中断服务程序会用到寄存器和存储器的数据会被覆盖,而中断是要返回的,所以通常要保护现场。方法是把要保护的内容压入到堆栈。
7.MCS-51的ROM中,应如何安排程序区?
答:程序区从00H到32H的存储区依次存放主程序入口和各中断服务程序的入口。
8.外部中断触发方式有几种?它们的特点是什么?
答:外部中断触发方式有2种。它们的特点是低电平触发方式,边沿触发方式,上一个机器周期检测为高电平,接下来的下一个机器周期为低电平。
20