用方法参考absacc.h头文件。其中:
CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址; DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址; XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址; PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址; 如:
#include
#define PORTA XBYTE[0xFFC0]/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/
#define NRAM DBYTE[0x40] /*将NRAM定义为片内RAM,地址为40H,长度为8位*/
(2)_at_关键字
可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下: [存储器类型] 数据类型说明符 变量名 _at_地址常数;
其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
10.按照给定的数据类型和存储类型,写出下列变量的说明形式
答:
(1)在data区定义字符变量val1
char data vall;
(2)在idata区定义整型变量val2
int idata val2;
(3)在xdata区定义无符号字符型数组val3[4]。 unsigned xdata val3[4];
(4)在xdata区定义一个指向char类型的指针px。 char xdata *px;
(5)定义可位寻址变量flag。
bit flag;
11
(6)定义特殊功能寄存器变量P3。
Sfr P3=0xB0;
11.break和continue语句的区别是什么?
答:break语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环。 Continue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执
行,直到判断条件不满足为止。
和break的区别是该语句不是退出整个循环。
12.C51选择语句、循环语句包含那些?
答:参看课本P68~P77。
13.什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方?
答: 多个函数可以同时使用的函数,称为重入函数。
通常情况下,C51函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。 重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。
14.如何消除键盘的抖动?
答:由于按键是机械开关结构,所以当用手按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但通常不会大于10ms。 若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约10ms后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟10ms后再扫描处理并不迟。
15.在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?
答: (1)确定T/C的工作方式——编程TMOD寄存器; (2)计算T/C中的计数初值,并装载到TH和TL;
(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器; (4)启动定时器/计数器——编程TCON中TR1或TR0位。
16.外部中断源初始化步骤是什么?
外部中断源初始化 2个外部中断源:
/INT0中断,外部中断0请求,占用P3.2引脚,其中断请求号为0。 /INT1中断,外部中断1请求,占用P3.3引脚,其中断请求号为2。 (1)TCO寄存器中的IT0、IT1位
12
(2)IP寄存器中的PX0、PX1位
(3)IE寄存器中的EA、EX0、EX1位
五、读程序、编程序
1.第四章 中断:例4-1 P104 例4-9 P116 例4-10 P117 定时:例4-16 P123 例4-17 P124 例4-18 P126 2.第五章 例5-9 P154 例5-10 P155 例5-11 P157 3.第六章 静态: 例6-1 P169 动态: 例6-3 P171 独立式键盘:例6-6 P178 矩阵式键盘:例6-7 P181 LED阵列:例6-10 P187 LCD1602:例6-12 P194 4.第七章 D/A:例7-4 P208 A/D:例7-6 P213
第四章
例4-1 P104
假设外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向。
中断类
13
#include
void IS0(void) interrupt 0 { P0=~P0;} //P0端口反向 void IS1(void) interrupt 2 { P1=~P1;} //P1端口反向 void main( )
{ P0=0x00; P1=0xFF; IT0=1; IT1=1; EX0=1; EX1=1; EA=1; while(1); }
【例4-9】外部中断示例
在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。
14
#include
void interrupt0( ) interrupt 0 using 2 //外部中断0 { P1_7=!P1_7;} void main( )
{ EA=1; //开中断
IT0=1; //外部中断0脉冲触发 EX0=1; //外部中断0
P1_7=0; do{ }while(1); }
如果有3个脉冲,则灯亮、暗交替一次,可如下面编程: #include
15