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


发布评论