2024年6月5日发(作者:)

第4章

1. C51扩展了哪些数据类型?

sbit sfr sfr16 bit

2. 简述C51存储器类型关键字与8051存储空间的对应关系。

程序存储器(code)

内部数据存储器:

data 内部RAM直接寻址128B(0x00~0x7F)

idata 内部RAM间接寻址256B(0x00~0xFF)

bdata 内部RAM 16B(0x20~0x2F)的128位进行位寻址

外部数据存储器:

xdata 外部存储器64KB的任何单元

pdata 访问外部存储器(一页)低256B

3. 在定义int a=1,b=1后,分别指出表达式b=a、b=a++和b=++a执行后变量a和b的值。

b=a;

b=a++; a=2 b=1

b=++a; a=2 b=2

4. 用C51编程实现当P1.0输入为高电平时,P1.2输出控制信号灯点亮。

#include

sbit key1=P1^0;

sbit led=P1^2;

void main()

{ bit a;

for( ; ; )

{key1=1;

a=key1;

if(a) led=1;

else led=0;

}

while(1);

}

5. 使用选择结构编写程序,当输入的数字为“1”、“2”、“3”、“4”时,输出显示“A”、

65

“B”、“C”、“D”,当输入数字“0”时,程序结束。

#include

void main( )

{ char ch;

SCON=0x52; /*对串口实现初始化,以便调试时调用scanf()和printf()*/

TMOD=0x20; /*在keil c串行窗口#0中输入或显示数据*/

TH1=0Xf3; /*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/

TR1=1;

printf("请输入:") ;

while(1)

{ scanf("%c" , &ch) ;

switch(ch)

{

case ‘1’ : printf("A"); break ;

case ‘2’ : printf("B"); break ;

case ‘3’ : printf("C"); break ;

case ‘4’ : printf("D"); break ;

case ‘0’ : break ;

default : printf("输入错误n") ;

}

if(ch==’0’) break;

}

while();

}

6. 编一个函数sum,求数组a中各元素的数据和。

要求在main函数中输入数组元素的数据,通过调用sum函数并输出返回的数据和。

#include

int sum(int b[ ] , int n)

{ int i ,s =0;

for (i=0 ; i

s+=b[i];

return s;

}

void main( )

{ int a[10]={10,20,30,40,50,90,80,70,60 ,0} i ,total;

66

SCON=0x52; /*对串口实现初始化,以便调试时调用scanf()和printf()*/

TMOD=0x20; /*在keil c串行窗口#0中可以输入或显示数据*/

TH1=0Xf3; /*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/

TR1=1;

total= sum(a , 10) ;

printf("%d " ,total) ;

while(1);

}

7. 编一个函数len,求一个字符串s的长度。

要求在main函数中输入字符串,通过调用len函数并输出返回的字符串长度。

#include “string.h”

#include

int len(char *s)

{int n ;

n=strlen(s) ;

return n;

}

void main( )

{ char *ch=”china”;

int a;

a= len(ch ) ;

while(1);

}

8. C51中断函数如何定义,在使用时应注意哪些问题?

C51中,中断服务程序是以中断函数的形式出现的。

单片机中断源以对应中断号的形式出现在C51中断函数定义中

中断函数定义语法格式如下:

void 函数名(void) interrupt n [using n]

{

函数体

}

关键字interrupt定义该函数为中断服务函数,n为中断号。

使用时应注意:

1)在中断函数中不能使用参数。

67

2)在中断函数中不能存在返回值。

3)中断函数的执行是由中断源的中断请求后系统调用的。

4)中断函数的中断号在不同的单片机中其数量也不相同,具体情况察看具体的处理器

手册。

9. 用C51编写流水灯控制程序,要求由8051的P1口控制8个发光二极管(采用

共阳极连接)依次轮流点亮,循环不止。

#include

#include

//声明延时函数

#define uchar unsigned char

void delay(uchar m);

void main()

{

uchar s_data = 0xFE ;

while(1)

{

led = ~s_data;

}

}

void delay(uchar m)

{

unsigned char a,b,c;

for(c=m;c>0;c--)

for(b=142;b>0;b--)

for(a=20;a>0;a--);

}

10.用c51编写外部中断“0”的中断函数,该中断函数的功能实现从P1口读入8

位数据存放在一数组中,如果数据全为0,则置P2.1输出1,否则P2.1输出0。

#include

sbit out P2^1;

void main(void)

{

IT0=1;

#define led P1

s_data = _crol_(s_data , 1);

delay(200);

//延时函数(形式参数m,调用时,m=200)

/*设置中断触发方式为边沿出发,setb ie0*/

68

EA=1; /* 打开全局中断,setb ea*/

EX0=1; /* 打开外部中断0, setb ex0*/

while(1); /*等待中断*/

}

void external0(void) interrupt 0 /*定义外部中断0中断函数处理程序*/

{ int a;

EX0=0; /*关闭外部中断0, clr ex0*/

P1=0xff;

a=P1;

if(a) out=1;

else out=0;

EX0=1;

}

69