第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<reg51.h>
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”、
“B”、“C”、“D”,当输入数字“0”时,程序结束。
#include<reg51.h>
printf函数是如何实现的
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<reg51.h>
int sum(int b[ ] , int n)
{ int i ,s =0;
for (i=0 ; i<n ; i++)
s+=b[i];
return s;
}
void main( )
{ int a[10]={10,20,30,40,50,90,80,70,60 ,0} i ,total;
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<reg51.h>
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)在中断函数中不能使用参数。
2)在中断函数中不能存在返回值。
3)中断函数的执行是由中断源的中断请求后系统调用的。
4)中断函数的中断号在不同的单片机中其数量也不相同,具体情况察看具体的处理器手册。
9. 用C51编写流水灯控制程序,要求由8051的P1口控制8个发光二极管(采用
共阳极连接)依次轮流点亮,循环不止。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define led P1
void delay(uchar m); //声明延时函数
void main()
{
uchar s_data = 0xFE ;
while(1)
{
led = ~s_data;
s_data = _crol_(s_data , 1);
delay(200);
}
}
void delay(uchar m) //延时函数(形式参数m,调用时,m=200)
{
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<reg51.h>
sbit out P2^1;
void main(void)
{
IT0=1; /*设置中断触发方式为边沿出发,setb ie0*/
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;
}