分享

《微型计算机原理与接口技术》试题

 夜猫速读 2022-05-05 发布于湖北

20174月高等教育自学考试《微型计算机原理与接口技术》试题

课程代码:02205

一、单项选择题

1、通常,不包含在CPU中的是(C

    A、运算器    B、控制器    C、存储器    D、运算器和控制器

28位二进制补码能够表示的最小值是(B

    A-127    B128    C0    D-255

3、下列不属于C语言合法类型的是(B

    Achar    Bclass    Cdouble    Dint

4、下列选项中,不是C语言合法的整型常量的是(C

    A0123    B278    C0288    D0xff2

5、循环语句“for(k=0;k=5;++k);”的循环次数是(D

    A5    B6    C0    D、无限次

6、与语句“for(k=0;k<=10;++k)sum+=k;”不等价的语句是(C

    Ak=0;while(1){sum+=k;if(++k>10)break}

    Bk=0;while(k<=10){sum+=k++;if(k>10)break}

    Ck=0;do{sum+=k}while(k++<=10)

    Dk=0;while(k<=10)SUm+=k++

7、下列关于LPC2138微控制器的描述,不正确的是(B

    A、采用RISC体系结构    B、采用CISC体系结构

    C、支持在线硬件调试    D、支持片上调试

832ARM指令集中的ARM指令长度为(C

    A16    B8    C32    D64

9、计算机执行如下运算操作:0xf0-0xff,则条件标志位ZC分别为(B

    A00    B01    C10    D11

10LPC2138微控制器中,属于AHB外设的是(D

    AGPIO    BADC    CTIMER0    DEMC

11LPC2138微控制器的大部分引脚都是功能复用的,其中配置引脚输入偷出方向的寄存器是(C

    AIOxCLR    BIOxSET    CIOxDIR    DPINSELx

12、在AD转换中,根据采样定理,若输入模拟信号的最高频率分量为10kHz,则最低采样频率为(C

    A2kHz    Bl0kHz    C20kHz    D40kHz

13LPC2138芯片中,VIC控制器的作用是(C

    A、虚拟中断控制    B、虚拟输入通道    c、向量中断控制    D、向量输入通道

14LPC2138芯片的CPSR寄存器中,条件位C代表(B

    A、溢出    B、进位    C、零标志    D、负标志

15、如果数据访问指令的目标地址不存在,则会产生的ARM异常类型是(C

    A、未定义指令    B、软件中断    c、数据访问终止    D、指令预取终止

16、当LPC2138处理器正在中断服务时,若有更高级的中断请求到达,处理器会(B

    A、嵌套处理

    B、处理完当前中断服务再处理更高级的中断请求

    C、提高当前中断的优先级

    D、产生新的异常

二、填空题

17、计算n!的函数fun的原型是  int fun(int n)long intfun(int n) 

18、在C语言中,若定义int x=5y=x++;则变量xy的值分别为  x=6, y=5  

19、若变量x是奇数时,y=2x,否则y=x/2。完成此任务的条件表达式是  y=(x%2)? 2*x: x/2 

20、下列函数是用递归方法计算。到100之内的偶数之和,请补充完整。

    #include <stdio.h>

    int sum(int n);

    iht main()

    { printf("%d\n", sum(100));

         return 0;

}

int sum(int n)

{   if (n == 0) remm 0;

     return  n +sum(n-2)  ;

}

21、下列函数是计算数组a中的元素之和,请补充完整。

int f(int a[], ihtsize)

{   int sum = 0, *p;

     for (p = a; p < a+ size; ++p)

          sum +: *p ;

     return sum;

}

22、下列程序输出110的二进制表示,请补充完整。

#include<stdio.h>

int main()

{ union {

        unsigned char d1;

        struct {

           unsigned char d22:1;

           unsigned char d23:1;

           unsigned char d24:1;

           unsigned char d25:1;

           unsigned char d26:4;

        }d2;

} data;

for (data. d1 = 1;data.d1 <= 10; ++data.d1)

          printf("%d%d%d%d\n",   data.d2.d25, data.d2.d24, data.d2.d23,data.d2.d22   );

     remm 0;

}

23、数值信号不经过调制时,比特率  等于  波特率(等于/大于/小于)

24LPC2138的内核只接收  IRQ (或普通中断)     FIQ (或快速中断两个中断请求输入信号。

25RS232C协议中,电压为3~15V对应的逻辑值是  0  (或假false) 

26、假定异步串行传输字符'18位二进制值,即ASCII0x31。其中,通信编码采用奇校验、2个停止位(11)1个起始位(0),则传输的二进制位(传输顺序自左向右)  010001100011 。如果比特率为1200bit/s,则传输100个字符所用的时间为    1   S

27、根据传输性能的要求不同,ARM结构中连接系统部件或外围设备的总线包括有AHB  APB    两种总线。

28LPC2138微控制器的VDDVSS应分别与   3.3V (或电源)      ( 0V)   相连。

29、在ARM7TDMI中,T表示该芯片支持  16 Thumb 指令   D表示该芯片支持  片上调试 

三、改错题

每小题只有一处错误或不妥,请指出错误原因,并将其改正。

30、程序中有定义  int a[4]={1,2,3,4};,欲输出数组的第一个元素值,程序中采用语句printf("d",a[1]);

答:错误:C语言的数组下标从0开始。

    改正:printf("d",a[0]

31、某程序员用了表达式sizeof(a)获取整型数组a的元素个数。

答:错误:sizeof(a)是获取数组占用的存储空间的字节数而非数组元素个数

    改正:sizeof(a)/sizeof(int)    sizeof(a)/sizeof(a[0]

32、下列程序段计算1100之间既不是2的倍数也不是3的倍数的所有数之和。

for(k=1,  sum=0;k<=100;k+=2){

    if (k % 3 == 0) break;

    sum += k;

}

答:错误:k3的倍数时,跳过当前循环周期而非跳出循环

    改正:将break改为continue

33、下列函数是在一个非空单链表(链首指针为head)末尾插入一个值为x的结点。

typedef struct node_t{

     int data;

     struct node t *next;

} Node;

void insert(Node*head, int  x)

{   Node *p = head,  *q=malloc(sizeof(Node)); q->data=x;

     while (p->next)   p = p->next;

     p->next = q;

}

答:错误:单链表最后一个结点的后继指针没有置成空指针

    改正:在p指针定义语句后的任何位置添加语句

      q->next=NULL  q->next=0

四、程序阅读题

请阅读下列程序,写出程序运行结果。

34#include<stdio.h>

     int main()

     {  char ch;

          for (ch = 'a' ;ch <= 'd'; ++ch)

             switch(ch) {

                case 'a':printf("a");

                case'b':printf("b\n"); break;

                case 'c':printf("c");

                case 'd':printf("d\n");

        }

            return 0;

答:ab

b

     cd

     d

35#include<stdio.h>

     iht x = 10;

     iht f(int n);

     int main()

     {  int y, z=5;

        y=f(z);

          printf("%d\t%d\t",x,y);

          return 0;

    }

     int f(int n)

     { iht y;

          y=n+x;

          printf("%d\t%d\t",x,y);

          return x++;

    }

答:10    15   11   10

36#include<stdio.h>

     void f(char *s);

     int main()

     {  char a[10] ="abcde";

          f(a);

          return 0;

    }

     void f(char *s)

     {  int sum = 0;

          char *p;

          for (p=s; *p !='\0'; ++p){

               printf("%c", *p);

                  ++sum;

        }

          printf("\t%d\t", sum);

          for (--p; p >= s; --p){

               printf("%c",*p);

                  --sum;

        }

          printf("\t%d\t",sum);

答:abcde    5  edcba   0

37#include<stdio.h>

     struct {

          int a;

          int b;

     } test[4]= {{1,2},{2,3},{3,4},{4,5}}, *p;

     iht main()

     { int d1, d2,i,j;

          for (i=0; i <=1;++i) {

               d1=d2=O;

               for ( p=test+i;p<test+4;p+=2) {

                     dl += p->a;

                     d2 += p->b;

            }

              printf("%d\t%d\n",d1,d2);

        }

          return 0;

}

答:4   6

    6  8

五、程序设计题

根据题意编写成完整的程序。

38、编写一个函数convert,将一个字符串转换成double型的数据。例如xdouble型的变量,执行x=convert("123.456")后,x的值为123.456(注:只考虑正数,不需要考虑负数)

调用的主函数如下:

#include<stdio.h>

double convert(char*s);

iht main()

{  prmtf("%f\n,convert("123.456"));

    return 0;

}

答:double convert(char*s)

  {

     double sum = 0;

     int digit = 0, flag = 0;

     for (; *s; ++s) {

           if (*s == '.') { flag = 1; continue;}

           if (flag) ++digit;

           sum = sum * 10 + *s -'0';

    }

     for (; digit > 0; -- digit)

           sum/= 10;

     return sum;

}

六、分析题

39、题39图所示为LPC2138的部分引脚图,现利用其中的D/A模块编程输出峰值为3.3V三角波信号。要求:

(1)引脚VSSAVDDAVREF应分别与什么相连?D/A模块的输出引脚名称是什么?

(2)请将下列程序中空缺的内容填写在“答题卡”上。

/* main.c */

#include<LPC213X.H>

typedef unsigned intuint32;

typedef unsigned charuintS;

typedef union

{   uint32 data;

     struct

     {  uint32        :6;

           uint32  value       ;

           uint32  bias :1;

      } field;

} reg_da_cr;

#define rDACR (*((volatile reg_da_cr *) 0xE006C000))      //D/A 控制寄存器

int main()

{  uint32 DAOut,i;

            = OxOOO80000; //设置引脚PO.25DA模块输出

      DAOut = 0;

      while(1) {

           rDACR.field.      = DAOut++;

            if(DAOut >=      ) DAOut = 0;

            for(i-0; i<0x100; i++);

     }

 }

答:(1) 引脚VSSAVDDAVREF应分别与0V(: ), 3.3V (: 电源), 3.3V (:

     参考电压) 相连。DA模块的输出引脚名称是AOUT

(2)    10   ;       PINSEL1   ;        value        1023    

40、由LPC2138微控制器构成的键控数码管电路如题40图所示。试分析该电路,并回答:

    (1)两个数码管DS1DS2分别为哪种类型(共阴极/共阳极)的结构?

    (2)LPC2138的哪些引脚用作输入引脚?

    (3)LPC2138的哪些引脚用作输出引脚?

    (4)当按键K1按下或释放时,电路的哪些引脚产生了什么样的变化?

答:(1)共阳极结构

(2) P0.16  

(3) P0.19P0.20P1.16~P1.23

(4) K1按下:P0.16的引脚为逻辑0电平; K1释放: P0.16的引脚为逻辑1电平

七、应用题

41、对题40图所示电路,程序完成如下功能:每按一次按键K1,数码管显示的计数值增加1。数码管DS1显示计数值的十位,DS2显示个位。请将程序中空缺的内容填写在“答题卡”上。

//主程序: main.c

//include"LPC213xReg.h"

#define one_pin       //控制个位数码管的共阳脚

//define ten_pin       //控制十位数码管的共阳脚

//define gpio_bit(reg,g, i) rIO##g##reg.field.d##i

//define gpio_byt(reg,g, i) rlO##g##reg.bytes.b##i

#define set_seg(code)gpio_byt(PIN, 1, 2) = code;//设置数码管的段,亦即送显示码

//define lighten(bit)gpio_bit(CLR, 0, bit) = 1;//点亮bit位数码管,bit=one_pin/ten_pin

#define darken(bit)gpio_bit(SET, 0, bit) = 1;//熄灭bit位数码管,bit=one_pin/ten_pin

/*函数声明*/

void DelayMs(unsignedint t);

intIsKeyPressed(volatile int key_state);

void InitRegs(void);

void DisplayNum(intn);

int main(void)

{   intn=0;  //计数初值为零

     InitRegs0;

           (one pin);  //熄灭个位数码管

           (tenpin);  //熄灭十位数码管

     while(1)

     {   if(IsKeyPressed(gpio_bit(PIN,0,16))) //检查按键

           {  n++;

                n %= 100;

          DisplayNum(n);//显示计数值

}

void InitRegs(void)//寄存器初始化

{  rPINSEL1.field.p0_16 = 0;//设置P0.16引脚为GPIO

     rPINSEL1.field.p0_20 = 0;//设置P0.20引脚为GPIO

     rPINSEL1.field.p0_19 = 0;//设置P0.19引脚为GPIO

     rPINSEL2.field.p1_16_25 = 0;//设置P1.16~P1.25引脚为GPIO

     rIOODIR.field.d16=         // 设置引脚的方向 (0=输入, 1=输出 )

     rIOODIR.field.d20 =       

     rIOODIR.field.d 19 =      

     rIO1DIR.bytes.b2 =           // 设置引脚P1.16~P1.25

}

void DisplayNum(intn)//显示计数器的个位和十位

{    uint8_t disp_code[] = { 0xc0, 0xf9, 0xa4,0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

     lighten(one_pin);

     set_seg(disp code[n%10]);  //显示个位

     DelayMs(80);

     darken(      );

     lighten(ten_pin);

     sekseg(disp code[n/10]);  //显示十位

    DelayMs(80);

     darken(ten_pin);

void DelayMs(unsignedint t)   /*t为延时的ms*/

{   const unsigned int cclk = 12000000;   /*芯片主频为12MHz*/

     const unsigned int loop_clks = 10;

     volatile unsigned iht n;

     n = (cclk/1000/loop_clks)*t;

     while(n--);

     return;

}

intIsKeyPressed(volatile int key_state)

{   static int key_st = - 1;    //按键状态

     if(key_state -- 0)      //K1 按下

     {  DelayMs(5);

          if(key state --= 0)  //K1 依然按下

               keyst <<= 1; //使最低有效位为0,表示已经闭合

    }

     else//K1 释放

     {  DelayMs(5);

          if(key_state != 0) //K1 依然释放

          {  key_st <<= 1;

               key_st [= 1;  //使最低有效为1, 表示K1已经释放

        }

    }

    return ((key_st & 0x3) ==       );

答:①   19    ;   20    ;     darken     darken ;   0  

   1     ;     1    ;      Oxff   ;   one pin    ;   1     

201710月高等教育自学考试《微型计算机原理与接口技术》试题

课程代码:02205

一、单项选择题

1-18位原码表示是

    A00000001B    B1000000lB

    C1llllll0B    D1lllllllB

28位二进制数1101101的和是

    I.十进制数18    II.二进制数10010   III.八进制数22    iV.十六进制数12

    A.仅I正确    B.仅I和Ⅱ正确

    C.仅IIIIII正确    D.四个都正确

3.如果x是整型变量,则不合法的C语言输出语句是

    Aprintf("d",x)    Bprintf("s"x)

    Cprintf("u",x)    Dprintf("O"x)

4.下列选项中,都是C语言合法变量名的是

    Aabc    B_bc    Cfun    Dlong

    N1        auto       _123      xy

       enum      num       n_m_l     xl

5.循环次数不为5C语言语句是

    A x=0while(++x<5)    Bx=0;while(x++<5)

    C for(x=0x<5++x)    Dx=0do{x++;}while(x<5)

6.执行下列C语言语句段后x的值是

x=0;

switch (x) {

     case 0:

     case 1: ++x;

     case 2:++x; break;

     default: ++x;

}

A. 0                B. 1            C. 2            D. 3

7.异步传输数据帧由预先确定的若干位组成,其中可选的是

    A.空闲位和起始位  B.数据位    C.奇偶检验位  D.停止位

8ARM处理器的CPSR寄存器用于存放

    A.堆栈地址    B.堆栈数据    C.程序指针    D.控制和状态位

9LPC2138D/A模块的分辨率为

    A9    B10    C11    D12

108A/D转换器的满量程为5V,其分辨率为

    A1mV    B8mV    C19.5mV    D10mV

11LPC2138芯片的VIC模块可处理几个中断输入信号?

    A2    B16    C32    D64

12.在LPC2138微控制器的CSPR寄存器中,Z表示

    A.溢出    B.进位    C,零标志    D.标志

13.按照小端字节顺序将数据OxOaObOcOd存储在地址0x10000000中,则地址0x10000003中的内容为

    AOxOa    B0xob    COxOc    DOxOd

14.一个4D/A转换器的最大误差为±1/2LSB,则其相对精度为

    A6.25    B3.125    C0.625    D0.3125

15.在异步传输中,不允许的停止位的位数是

    A1    B15    C2    D25

16.在LPC2138微控制器中寄存器R14又记为

    ASP    BLR    CPC    DSPSR

二、填空题

17.在C语言中如果函数f不需要参数,返回值为整型,则函数原型为      

18.在C语言中如有定义:intx=5y=2;则表达式x/y的值为      

19.在C语言中设有定义unsignedcharxl=0x33x2=0xlfx3;执行x3=x1&x2后,x3的值用十六进制表示是      

20.下列C函数功能是用递归方式计算xn,请填空。

double exp(double x,int n)

{    if (n == 0) return 1;

                     ;

}

21.下列C程序的执行结果是:  1 2  4  7,请填空。

//include <stdio.h>

void fun(                  )

{   *m += n;

}

int main()

{  int k1,k2 = 1;

     for (kl = 0; k1 < 4; ++k1) {

           fun( kl,          );

           printf("%d\t",k2);

    }

     return 0;

}

22.设有C语言定义

struct  {

    int x, y;

} a[3]= {{1, 2}, {10, 12},{5,4}}, *p = a+1;

则表达式(p-1)->x+p->y的值是              

23.在串行通讯中,每秒钟内传输二进制位的数量称为        。在串行通讯中,每秒钟内硬件所产生的信号单元变化的次数称为       

24.已知PINSEL1=0xf0,如执行语句PINSELl&=~(1<<4),则PINSEL1=0x        ;如执行语句PINSEL1^=(3<<4),则PINSEL1=0x       

25LPC2138芯片引脚配置为输出模式时,可以通过        寄存器控制引脚输出高电平,也可以通过        寄存器控制引脚输出低电平。

26.所有ARM内核均采用RISC体系结构,而不是CISC体系结构。这里,RISC的中文含义是指        CISC的中文含义是指       

27.微控制器处理中断的过程包括中断响应、                三个阶段。

28LPC2138微控制器的每个定时器可产生2种类型8路中断,其中4路是        类型中断和4路是        类型中断。

29LPC2138微控制器的CPU时钟由晶振时钟或外部时钟经PLL进行        得到,CPU时钟经过VPB模块        后供外设模块使用。

三、改错题

每小题中有一处错误或不妥,请指出,并将其改正。

30.下列C程序段的功能为计算2+4+6+……+98+100,请指出问题并改正之。

sum = 0;

for (k=2; k<100;k=k+2)sum=sum+k;

31.某程序员用如下表达式计算函数的值,请指出错误并改正。

y=(x=5)?5:x+10

32.下面C程序段是实现符号函数请指出错误并改正。

y=0;

if(x>=0)

     if(x>0) y=1;

else y=-1;

33.下列函数是找出单链表中最大元素值的函数,请指出其中的错误并改正。单链表的元素为int型,head为链首指针。

int insert(Node *head)

{

    Node *p= head, *max;

    while (p) {

         if(max->data <p->data) max=p;

         p=p->next;

    }

     return max->data;

}

四、程序阅读题

34.   #include <stdio.h>

        int main()

        {int a[]={-8,9,8,-7};

          int k1, k2, k3;

k1=0;

k2=3;

do { if(a[k2]>0)-k2;

     if(a[k1]<0)++k1;

    if (k2> k1) (

           k3=a[k1];

           a[kl]=a[k2];

           a[k2]=k3;

    }

} while (k2>k1);

for (k1=0; k1<4;++k1)

     printf("%d\t",a[k1]);

printf("\n");

return 0;

}

程序运行结果为:

35. //include<stdio.h>

     int fun(int n);

     iht main()

            int kl;

          for (kl =0; kl < 4;++k1)

               printf("%d\t",fun(k1));

          return 0;

    }

     int fun(int n)

     { int k1=10;

           static int k2=1;

           return++k2+n*k1;

    }

程序运行结果为:

36. #include<stdio.h>

     void f(char *s);

     int main()

     { f("abdeg");

         return 0;

  }

   void f(char*s)

   {  while (*(++s))

              printf("%d\t",*s-*(s-1));

}

程序运行结果为:

37. #include<stdio.h>

     iht main()

     { union {

                int d1;

                char d2[4];

           } a[4];

          int i;

          for (i=0;i<4;++i) a[i].d1=i*256+i;

          for (i=0;i<4; ++i)

               printf("%d\t",a[i].d2[0]);

           return 0;

}

如果计算机以小端模式工作且int型占4字节,则程序运行结果为:

五、程序设计题

38.直接选择排序法:欲排序整型数组a,先用顺序查找法找到整个数组中的最小的元素,把它与a[0]交换;然后在剩下的元素中找最小的元素并把它与a[1]交换;对整个数组继续这个过程,最终将得到按从小到大顺序排列的数组。编写一个函数son用直接选择排序法排序一组整数。

六、分析题

39.由LPC2138微控制器构成的电路如题39图所示。编写程序完成如下功能:发光二极管D1D2交替闪烁,周期为2s。试将程序中标有编号的横线上空缺的内容补充完整。

/* main.c */

#include<LPC213X.H>

#define LED I_ON(((unsigned long) 0x01) <<2)

#define LED2_ON(((unsigned long) 0x01) <<8)

void  irq Timer0_ISR(void)/* 中断服务程序 */

{

     if((IOOPIN & LED1_ON)==0) /* 熄灭D1,点亮D2*/

    {

                  = LED1_ON;

                  = LED2_ON;

    }

     else

    {

                   = LED1_ON;

                   = LED2_ON;

}

     m0IR=0x01; /* 清中断标志*/

     VICVectAddr = 0x00;/* 通知VIC中断结束*/

voidTimer0Init(void)/* 定时器0初始化*/

{

/* 采用系统默认的时钟频率设置。

    晶振:fosc=12MHz;系统时钟:fcclk=60MHz;VPB时钟:fpclk=15MHz*/

TOPR = 99;/* PCLK进行100分频 */

TOMCR = 0x03;/* TCMC匹配时产生中断,TC复位*/

TOMR0 =       ;/* TC匹配值*/

TOTCR = 0x03;/* 启动并复位定时器0 */

TOTCR = 0x01;/* 启动定时器0 */

      VICIntSelect = 0x00;

      VICVectCntl0 = (0x20 1 4);

      VICVectAddr0 = (unsigned long)       

      VICIntEnable = (1<<4);

}

 int main()

{

              = LEDI_ON I LED2_ON;

             

      while(1);

}

七、应用题

40.由LPC2138微控制器构成的电路如题40图所示。试分析该电路并回答下述问题:

    (1)两个数码管DS1DS2分别为哪种类型(共阴极/共阳极)的结构?

    (2)LPC2138的管脚编号为131921的引脚在此电路中作什么用途?

    (3)LPC2138的管脚编号为5963的引脚应分别连接什么?

    (4)如果要求三极管Q1导通,则应控制LPC2138产生什么动作?

41.对如题40图所示电路,编程实现如下功能:利用软件启动方式,循环对ADO.1引脚(引脚13)电压进行A/D转换,并利用LPC2138UART0模块将转换结果输出。将程序中标有编号的横线上空缺的内容补充完整。

/* ADC.h*/

#ifndef ADC H

#define ADC H

typedef unsigned intuint32;

typedef unsigned shortuint 16;

typedef unsigned charuint8;

typedef union//AD控制寄存器

{

     uint32 data;

     struct

     {

           uint32 sel    :8;

           uint32 clkdiv :8;

           uint32 burst  :1;

           uint32 clks   :3;

           uint32       : 1;

           uint32 pdn   : 1;

           uint32       :2;

           uint32 start   :3;

           uint32 edge  : 1;

           uint32      :4;

      } field;

 } reg_ad_cr;

 #define Channel(n) (1 << n)

 typedef union//AD数据寄存器

 {

      uint32 data;

      struct

     {

            uint32           :6;

            uint32 result      :      

            uint32          :8;

            uint32 chn      :         //2A/D,每个A/D8个通道,

16路通道

            uint32           :3;

            uint32 overrun    :       ;

            uint32 done      :      ;

       } field;

 } reg, ad_gdr;

 typedef union//AD启动寄存器

 {

       uint32 data;

       struct

     {

          uint32         : 16;

          uint32 burst      :1;

          uint32         :7;

          uint32 start      :3;

          uint32 edge      :1;

          uint32           :4;

     } field;

} reg_ad_gsr;

#define rADOCR(*((volatile reg_ad_cr *) 0xE0034000))

#define rADOGDR(*((volatile reg_ad_gdr *) 0xE0034004))

#define rAD1CR(*((volatile reg_adcr *) 0xE0060000))

#define rAD1GDR(*((volatile reg_ad gdr *) 0xE0060004))

#define rADGSR(*((volatile reg_ad_gsr *) 0xE0034008))

#endif

/* UART0.h */

#ifndef UART0 H

#define UART0 H

void UARTOInit(void);

voidUARTOSendString(char *);

#endif

/* UART0.c */

#include<LPC213X.h>

/* 初始化UART0:波特率96008个数据位,1个停止位,无奇偶校验

  *fosc=11.059MHz,PLL倍频数M=4VPB分频数P=4

  *与波特率对应的分频数:11059000/(16*9600)=72  */

void UARTOInit0

 {

      UOLCR = 0x80;//设置除数锁存器,DLAB=1

      UODLM =     ;//分频数为72

      UODLL =      ;

      UOLCR=0x03;//DLAB=0, 8个数据位,1个停止位,无奇偶校验

}

 /* 通过UARTO发送字符串,参数:char*str--待发送字符串指针 */

 void UARTOSendString(char *str)

 {

      while(*str !=        )

     {

            UOTHR = *str++;

            while((UOLSR & 0x40)--0);//等待发送完成

     }

 }

/* main.c */

//include<LPC213X.h>

#include<stdio.h>

#include"UART0.h"

#include"ADC.h"

const uint32 Fpclk =11059000;

/* 延时函数: uint32dly--毫秒数*/

void Delay(uint32 dly)

{

     uint32 i;

     for(; dly > 0; dly--)

           for(i = 0; i < 50000; i++);

}

 int main(void)

{

      uint32 adc_data;

      char message[20] = {0};

      reg_ad cr cr;

      uint8 chn;

      PINSEL0 = 0x00000005;//PO.O: TxD0; PO.1:RxD0

           ;

      PINSEL1 = 0xl0000000;//P0.30:AD1

      cr. field.sel =         ;

      cr. field.clkdiv = Fpclk/1000000 - 1;

      cr. field.burst = 0;

      cr. field.clks = 0;

      cr. field.pdn = 1;

      cr. field, start = 1;

                  = cr;

      while(l)

     {

            while(rADOGDR.field.done -- 0);

            adc data = rADOGDR.field.result;

            chn= rADOGDR.field.chn;

            adc data = adc data * 3300;

            adc data = adc data/1024;

            sprintf(message,ADO.%d:%5dmV\r\n",chn,adc_data);

            UARTOSendString (message);

            Delay(10);

            rADOCR.field.start = 1;

     }

}

20184月高等教育自学考试《微型计算机原理与接口技术》试题

课程代码:02205

一、单项选择题

1.下列不能由ALU完成的动作是(

    A.加减运算    B.取指操作    C.移位操作    D.逻辑非运算

2. 十进制数·1288位二进制补码是(  C

    A1lllllllB    B00000000B    C10000000B    D0000000lB

3. C语言中常量'\010'占用的字节数为(  A

A1个字节    B2个字节    C3个字节    D.非法常数

4.下列C语言表达式不正确的是(

A. x=y=l;    B.x=(y-l)=l;    C. x=(y=l)+l;    D. x=y+l;

5.若有定义int n=2;,则语句while(n=0)n--;执行的循环次数是(

    A3         B2         C1         D0

6.设有定义:int a[10)*p;,则合法的赋值语句是(  C

A.  p=(a++) + 5;                   B.  p=a[5];

C.  p=a+5;                       D.  p=*(a+5);

7ARM处理器结构中,包含AHBAPB两种总线。其中APB总线的含义是(

    A.高级外设总线          B.高级高性能总线

    C.中断优先级仲裁总线    D.总线仲裁器控制总线

8.在LPC2318处理器中,为了增加用户代码的可移植性,可通过    机制将片内厂家固化的引导代码的地址映射到存储空间的最高处。(  C

    A.中断矢量表    BI/O地址空间    C.重映射    DAD转换

9.在AD转换中,已知输入模拟信号的最高频率分量为200kHz,则最低采样频率应为( D

    A20kHz    B100kHz    C2001d-Iz    D400kHz

10.异步传输数据帧中不包含的信息位为(  A

    A.空闲位    B  起始位    C,停止位    D.数据位

11LPC2138微控制器中的DA模块一共包括几路模拟输出? A

    A1   B2    C4    D16

12LPC2138微控制器中片内的512KBFlash主要用来存放(

    A.数据    B.代码

    C.外设映射地址    D.系统参数

13RS232C协议中逻辑1对应的电压为(  B

A. 0~+3.3V       B.-15~-3V        C. +3.3~+5V   D. +3~+15V

14.在ARM中寄存器R15又记为(

    APC    BSP    CLR    D  CPSR

15.下列有关LPC2138GPIO引脚的说法,正确的是(  C

    A.每个引脚的功能不能配置             B.每个引脚的方向不能配置

    C.任何时刻一个引脚只能有一个功能     D.任何时刻一个引脚能有多种功能

16.当发生FIQ中断时,ARM处理器完成的操作是(

    APC0x0地址取指并执行    B.将CPSR中的条件标志清零

    C.将CPSRI位置1          D.将CPSRF位置1

二、填空题

17.执行C语句printf(''%s\' s age=%od\n'', "Tom", ~(~3<<2));后的输出是   Tom' s  age=l 5   

   18.计算结果为8位无符号二进制整数x的第0~3位的值的C语言表达式是   x & 0x0f     

19C语言中若有定义int al5]={ 1,2,3,4};a[a[1]]的值是  3  a[a[a[2]]]的值是    0

20.补充完整下列用递归函数求C函数。

long int Sum(,

{   if (n == 1) return 1;

     if (n > 1) return(       int n   n+ Sum(n- 1 )      );

{

   21.在C语言中若有int a[l0];,如果将数组名a作为实参进行函数调用,实质上传递给形参的是数组的    首地址(或地址)     ,其参数类型为   int型指针或int*    

   22.设有定义union {char s[2]; char cl; char c2; } m;,依次执行m.cl = 'A';,   m.c2= 'B';, m.s[0]=m.cl+l; ,m.s[l]=m.c2-1;,  printf("%c,%c\n", m.s[0], m.s[1]);,后的输出结果是    C,B    

   23,在ARM正常的程序执行过程中,处理器处于     用户    模式。只要正常的程序执行过程被中断,处理器就进入    异常     模式,

   24。由于LPC2138微控制器采用了   3     级流水线机制,PC寄存器总是指向当前正在取指的指令,因此正在执行的指令的地址为    PC-8    

   25LPC2138微控制器的第30号引脚名称为P0.6/MOSI0/CAP0.2/AD 1.0,  其中"P0.6"    表明该引脚可用作     IO引脚(或者:双向IO引脚)    ;“ADl.0”表明该引脚可用作        

A/D转换器1输入0

   26,若采用8位数据位、1个停止位、带奇校验的异步串行通信方式传输数据oxfo,则数据帧的二进制位传输顺序(最右边的先传输)   11111100000     

   27.若采用8位数据位、1个停止位、带奇校验的异步串行通信方式,如果波特率为1200bit/s,传输1200个数据的时间为    11    S,传输效率为   72.7   %。

   28.将字符串常数"4321",按照大端字节顺序存入存储器,则内存地址从高到低的存储单元中存放的数据分别是:     '1'          '2'         '3'         '4'    

   29.将整型数据0x01020304按照小端字节顺序存入存储器,则内存地址从高到低的存

储单元中存放的数据分别是:    0x01         0x02         0x03         0x04 

三、改错题

    每小题只有一处错误或不妥,请指出,并将其改正。

   30Intmain(void)

   {    int N=10

         int k = 0, s[N], *p = s + N - 1;

         for(; p >= s; p-- )  *p = k++;

错误:变量不能用来定义数组元素个数

    改正:将s[N)改为s[10]

31. int main(void)

    {   double x = 3.0 / 2;

          switch (x) {

               case 1: printf("rounddown\n");

               default: printf('roundup\n");

       }

}

错误:switch(x)括号内表达式不能为实型

    改正:switch((int)x)

32. #define tuning(x)  (x) < 60 ? (x)++: (x)

    int main(void)

    {   int a = 5, b =10;

          tuning(a+b);

          printf("result = %d!\n", a+b);

}

错误:宏替换错误,导致出现(a+b)++

    改正:将tuning(a+b):改为intc=a+btuning(c):或turlng(a)turlng(b)

33. typedefstruct {

          char name[20];

           int score[3];

     } student;

     int main()

     {   student st ={"Ming", {88, 77, 99}};

          student *sp = &st;

          sp->name[1 ]='u'; *sp->score[ 1 ]++;

          printf("The scores are %s, %d \n", st.name, st.score[1 ]);

}

错误:*sp->score[1]++;结构成员访问错误

    改正:sp->score[1]++

四、程序阅读题

程序运行结果为:

34. 已知'A'ASCII 码值为 650

    tnt main(void)

     {   tnt a = 0xl0, b= 10;

          b += (a++) + 1;

          printfC%d, %d, %c, %x\n", a, b, a+50; b-a);

}

答:17.  27.  C.  Aa

35. tnt func(int x)

     {   iht a = 1;

          static tnt b = 2;

          a++; b++; x++;

          return a+b+x;

    }

     iht main()

     {   tnt a;

a = f(3);

printf("%d, %d ", a, ifa));

 程序运行结果为:9, 16

36. int main(void)

    {   char s[]="cYaabacd\Oec', *p= s;

          while (*p != '\09 {

                if (*p >='a' && *p<= 'd') printf("%c ", *p);

                p+=2;

       }

         printf(\n);

    }

程序运行结果为:cabc

37. typedefstruct list {

         int data;

         struct list *next;

     }st_list;

    iht main(void)

    {   st_ list a[4], *p = a;

         p->data = 3; p->next = ++p;

         p->data = 5; p->next = (++p) + I;

         p->data = 7; p->next = O; ~ I p;

         p->data = 9; p->next = p-l;

         for (p = a; p != O; p = p->next)

               printf('%d, ", p->data);

   }

程序运行结果为:3,  5, 9,  7

五、程序设计题

38.编写一个函数,统计传入的整型数组中各位数字的和能被3整除的三位数个数。该函数的调用形式由如下的主程序给出。

#include <stdio.h>

#define N   8

int byThree Ont [], int);

int main(void)

{  int num, s[N] = {123, 39, 369,4567, 564, 656, 7887, 909};

    hum = byThree (s, N);

    printf ("There are %d numbers\n", num);

}

/* 以下为int byThree (int [], int) 函数的定义部分 */

答:

int byThree (int s[], int n)

{  int a, b, c, i, t  0;

   for(i  0;i<n;i++){

         if (s[i] > 999 II s[i] < 1OO) continue;

         a  s[i]/t00;b  (s[i]/t0)%t0;c  s[i]%t0;

         if ((a+b+c) % 3   0 ) t++;

    }

   return t;

}

六、分析题

   39.题39图所示为LPC2138微控制器的定时器工作原理图。现用引脚P0.7控制蜂鸣器的导通与否,当P0.7输出为低电平时,控制蜂鸣器发出声音;当P0.7输出为高电平时,  控制蜂鸣器不发声。已知晶振时钟频率(fosc)24MHz,系统时钟频率(fPCLK)15MHz;每01秒中断处理程序IRQ_ Timer0被调用一次。试完善下面的程序段,将程序中带有标号的空缺内容补充完整。

#include "config.h"

#define BEEP    (1 <<7)     //P0.7:0 = beeping, 1 = silent

#define FOSC   24000000    //Freq. of OSC

#define FPCLK  15000000    //Freq. of Pre-Scalar

void irq IRQ_Timer0(void)

{

    if((IOOSET & BEEP)--=0)

               = BEEP;  //关闭蜂鸣器

    else

                = BEEP;    //打开蜂鸣器

    TOIR = 0x01; /清除中断标志, IR=Interruption Reg.(CR3-0, MR3-0)

    VICVectAddr = 0;//通知VIC: "中断处理结束"

iht main(void)

{

           = 0x00000000; // 设置引脚P0.0~0.15GPIO模式

           = BEEP;        //P0.7 为输出模式

IRQEnable0;    //IRQ 初始化(代码省略)

TOTC=       ;       // 计数器清零

TOPR =         ;   // 设置预分频值, PR=Pre-Scalar Reg.

TOMCR = 3;     //MCR[O]= enable INT; MCR[1]=TC Reset

TOMR0 = FPCLK/20;//MR0= 匹配值 (TC=MR0 之时产生中断)

TOTCR = 0x01;       // 启动计时, TCR=Timer Ctrl Reg.

while(l) {

VICIntSelect = 0x00;  // 所有中断源通道为IRQ(而不是FIQ)

VICVectCntl0 = 0x20]0x04;// 设置Timer0 中断通道(4) 0号向量

VICVectAddr0 = (uint32)    ;// 设置中断处理程序入口地址

VIClntEnable = 1 << 0x04; // 允许Timer0 中断源(4)输入

while(    );        // 等待中断

return 0;

答:①IO0SET; IO0CLR; PINSEL0; IO0DIR ; 0; 1; IRQ Timer0; 1

七、应用题

   40.由LPC2138微控制器构成的电路如题40图所示。编写程序完成如下功能:发光二

极管以跑马灯的形式交替闪烁,周期为0.1s,即D1且仅D1点亮0.1s,然后D2且仅D2点亮0.1s,依次类推。试完善下述程序,将程序中带有标号的空缺内容补充完整。

/* main.c */

    #include <LPC213X.H>

volatile unsigned long LED_ON = 0xl;

volatile unsigned char LED_ON_Num = 1;

void_, irq Timer0_ISR(void)/* 中断服务程序 */

     = ~LED_ON;

    = LED_ON;     

    LED_ON <<=     ;

     if (LED_ON_Num++ ---      )

    {  LED_ON = 0xl;

         LED_ON_Nm = I;

    TOIR = 0x01;  /* 清中断标志

    VICVectAddr = 0x00;/* ~ VIC 中断结束 */

}

void Timer0Init(void)/* 定时器0初始化 */

{/* 采用系统默认的时钟频率设置。晶振:fosc=12MHz;系统时钟:fcclk=60MHz;VPB

: fpclk=l5MHz */

    TOPR = 99;/* PCLK 进行100分频 */

    TOMCR= 0x03;/* TC MC 匹配时产生中灿,TC复位 */

    TOMR0 =      ;/* TC 匹配值 */

    TOTCR = 0x03;/* )=启动并复位定时器0 */

    TOTCR = 0x01;/* 启动定时器 0 */

    VICIntSelect = 0x00;

    VICVectCntl0 = (0x20 [4);

    VICVectAddr0 = (unsigned long)      

    VICIntEnable = (1 << 4);

}

int main()

{     IOODIR = OxO000000           

       ~

    while(1);

答:①IOOSET; IOOCLR; 1; 4; 150000; Timer0 ISR; f; Timer0Init()

41.41图所示为LPC2138的部分引脚图,现利用其中的DA模块编程输出峰值为3.3V的矩形波信号。请回答问题,并完善程序。

(1)引脚VDDVSSVSSAVDDAVREF应分别与                              相连。DA模块的输出引脚编号为     

(2)将程序中带有标号的空缺内容补充完整。/* main.c */

/* main.c */

//include <LPC213X.H>

typedef unsigned int uint32;

typedef unsigned char uint8;

typedef union

{  uint32 data;

    struct

    {   uint32        :6;

         uint32  value :10;

          uint32  bias  :1;

    } field;

} reg_da_cr;

#define rDACR (* ((volatile        *) 0xE006C000))

iht main()

{  uint32 DAOut, i;

    PINSELI = 0x00080000;//设置DA 模块输出引脚

     DAOut= 0;

while( 1 )

{    if (DAOut == 0)

         DAOut = 1;

    else

         DAOut = 0;

                          = DAOut     1023;

    for(i = O; i < OxlO00;     );

答:(1)3. 3v(或电源),地,地,3. 3v(或电源)3. 3v(或参考电压)9

(2) reg  da  cr ; rDACR.field.value; *; i++;

201810月高等教育自学考试《微型计算机原理与接口技术》试题

课程代码:02205

一、单项选择题

1.在冯·诺依曼结构的计算机中,控制器的作用之一是

    A.指令存储    B.指令译码    C.执行逻辑运算    D.执行算术运算

2.与无符号二进制数101101B不等值的是

    A45    B45D    C10111B+10110B  D55H

3.在一个C语言源程序中只能出现一次的基本单元是

    Amain函数    B.库函数    C.函数    D.子程序

4.设x为整型变量,合法的C语言表达式是

    Ax*103    Bx+'\\n'    Cx>'X'    Dx-32H

5C语言程序段intk=100;while(k=0)k--;循环体执行的次数是

    A0    B99    C100    D.无穷次

6.在C程序中关于形参的说法正确的是

    A.形参的初值默认为0

    B.形参在调用函数和被调用函数中都有效

    C.形参与实参的作用域范围相同

    D.形参属于函数内部变量

7LPC2138微控制器复位后,ARM处理器的运行模式是

    A.用户模式    B.系统模式    C.管理模式    D.中断模式

8ARM体系中使用单一地址空间对存储器进行编址,每个字节单位都有一个几位的地址?

    A8    B16    C32    D64

9ARM处理器的异常运行模式共有

    A5    B6    C7    D8

10.在ARM系统中,下列优先级最低的异常中断类型是

    A.外部中断请求    B.数据预取中止

    C.指令预取中止    D.复位   

11.对LPC2138芯片的GPIO输出清零寄存器IOCLR,设置正确的是

    A.写入1使对应引脚输出高电平    B.写入0使对应引脚输出高电平

    C.写入1使对应引脚输出低电平    D.写入0使对应引脚输出低电平

12LPC2138微控制器的大部分引脚都是功能复用的,需要通过哪个寄存器将引脚设置为GPIO功能?

    AIOxCLR   BIOxDIR    CIOxSET   DPINSELx

13LPC2138是面向工业控制领域的微控制器,其ARM内核能够处理多达多少个中断输入请求信号?

    A16    B32    C64    D128

14.对逐次逼近型AD转换器,其特点不包括

    A.结构简单    B.转换时间长  C.精度高    D.功耗较低

15.在AD转换中,如果输入模拟信号的最高频率分量为20kHz,则最低采样频率应为

    A5kHz    B10kHz    C40kHz    D  80kHz

二、填空题

16C语言的定义语句:chardevice[]="Computer";表明数组device      个元素,最后一个元素的值为     

17.若整型变量y能被7整除,但不能被11整除,则表达式的值为1,否则为0。使用条件运算符写出满足以上条件的条件表达式:     

18.设有定义intx=5;表达式x+=x*=<<=1的值是      ,该表达式包含的赋值操作次数为     

19.函数声明语句int*fname(void);表明函数fname      个形参,函数返回值的类型是     

20.若有定义:inta[2][3]={{1},{3,5,7}};int *p[2]={a[0],a[1]};则表达式a[0][1]的值为      ,表达式*(p[1]+2)的值为     

21.设有定义union{unsignedchar t[2]

    struct{unsignedshort h:4,m:6,s:5}timer

    }runner

在小端序系统中,若short型占2字节,char型占1字节,则变量runner      个字节。执行语句runner.t[1]=0x21;后,runner.timer.s的值是     

22LPC2138微控制器支持两个低功耗模式,分别为            模式。

23ARM指令的寻址方式是指令从内存中找到            的方式。

24LPC2138芯片的GPIO输出清零寄存器IOCLR的正确访问方式是     

25LPC2138芯片有      32位的通用IO端口。

26LPC2138芯片的异步串行口在启动接收数据时,串行数据通过RxD引脚进入接收位移寄存器,数据的      位最先收到。

27.一个12位的AD转换器,满量程电压为5V,其分辨率为       mV

28.当LPC2138芯片的引脚用作GPIO功能时,可通过      寄存器对该引脚清零。

29LPC2138芯片的定时器可以产生4路匹配中断和            中断。

三、改错题

每小题只有一处错误或不妥,请指出,并将其改正

30. #include <stdio.h>

     int main(void)

     {   float x = 22.22;

         printf("Circumference is %f\n", 3x+6)

    }

31. int spilt_add(float a)

     {  int s = 0;

         if(a/10>0)  s+=a/10;

          s+=a%10;

          return s;

}

}

33.以下insert_book函数的功能是将新书按页数从少到多的顺序插入到链表:

typedef struct book_list {

          charname[10];

          intpages;

          structbook list *next;

} *book_list_ptr;

void insert_book(book_list_ptr head, book_list_ptr new)

{   book_list_ptrp, pp;

           if(head->pages > new->pages) {

          new->next = head; head = new; return;

           for (pp= p = head; p->pages <- new->pages; pp = p, p++);

          new->next = p; pp->next = new;

     return;

}

四、程序阅读题

34.  #include<stdio.h>

      #defineodd(x) 2*x+1

      intmain(void)

     {  int a[4] = {1,2,3};

          int s, k;

          for (k=0;k<4; k++) {

                    if (k % 2 !=0) s=a[k];

               else s = odd(a[k]) * 10;

   printf("%d\t", s);

   }

}

程序运行结果:

35. #include <stdio.h>

          intmain(void)

          {  int a=18, b=12, t;

               while(b) {

                    t=a%b;a=b;b=t;

                          prinff("%d, %d, ", a, b);

     }

}

程序运行结果:

36. #include <stdio.h>

     voidmerge(char *x, char *y, char *z);

     im main(void)

     {   char a[] = "hot", bi] ="do", c[20];

          merge(a,b, c);

         printf("%s, ", c);

         merge(&a[2], &b[1], c);

          printf("%s\n", c);

    }

     void merge(char*x, char *y, char *z)

     {   static int k=0;

               while (*x &&*y) {

                     if(*x < *y)  z[k++] = *x++;

                    else if(*x > *y)  z[k++]=*y++;

                     else { x++; y++;}

            }

            z[k] ='\0';

               printf("%d, ", k);

}

程序运行结果:

37. #include <stdio.h>

    typedef structresult {

          int id;

          intscore;

     } r_list;

    int main(void)

     {  r_ list s[4] = {{1,10}, {2,20}, {3,30},{4,40}};

          r list *head= s;

          printf("%d, ", (head++)->score);

          head =head + 2;

          printf("%d, ", head->score);

         printf("%d, ", (--head)->score);

          printf("%d\n", (head-1 )->score);

     }

程序运行结果:

五、程序设计题

38. 编写一个函数,判断作为形参的整型数组是否满足f[i]=f[i-1]+f[i-2]的规律,满足    则返回该数组中首尾两个元素的和值,否则返回0

六、分析题

39.题39图所示为由LPC2138微控制器构成的按键与LED指示灯电路。试阅读程序,填空回答问题。

/* Main.c file generated by New Project wizard

 * Processor:LPC2138  * Compiler:  Keil forARM*/

#include <LPC2138.h>

typedef unsigned int  uint32;

typedefunsigned char uint8;

#define keycon 0x00ff00

#define KEY 1 (1 <<8)      //定义按键

#define KEY2 (1 <<9)

#define KEY3 (1 <<10)

#define KEY4 ( 1 << 11)

#define KEY5 (1<<12)

#define KEY6 (1 << 13)

#define KEY7 (1 << 14)

#define KEY8 (1 <<15)

#define LED1 (1<<0)   //定义LED引脚

#define LED2 (1 << I)

#define LED3 (1 <<2)

#define LED4 (I <<3)

#define LED5 (1 <<4)

#define LED6 (1 <<5)

#define LED7 (1 <<6)

#define LED8 (1 <<7)

/**************************************************************************

*

**函数名称:keyscan()

***************************************************************************

*/

void keyscan(void)

{ uint32 i, j, k;

  k-IOOPIN;

  if((k&keycon)!=keycon)

  {

     for(j=0;j<50000; j ++);//延时去抖

     k=IO0PIN;

    if((k&keycon) !=keycon)

     {i=(k&keycon)|(-keycon);

           i=-i;

        switch(i)

      {

           case KEY1 :if((IO0PIN&LED1)!=LED1) IOOSET=LED1;

                          else IO0CLR=LED 1;

                               break;

case KEY2:if((IO0PIN&LED2)!=LED2) IOOSET=LED2;

                         else IO0CLR=LED2;

                               break;

case KEY3:if((IO0PIN&LED3)!=LED3) IOOSET=LED3;

                        else 1O0CLR=LED3;

                              break;

case KEY4:if((IO0PIN&LED4)!=LED4) IOOSET=LED4;

                       else IO0CLR=LED4;

                             break;

case KEY5:if((IO0PIN&LED5)!=LED5) IOOSET=LED5;

                       else IO0CLR=LEDS;

                            break;

case KEY6:if((IO0PIN&LED6)!=LED6) IOOSET=LED6;

                       else [O0CLR=LED6;

                            break;

case KEY7:if((IO0PIN&LED7)!=LED7) IOOSET=LED7;

                       else IO0CLR=LED7;

                            break;

case KEY8:if((1O0PIN&LED8)!=LED8) IOOSET=LED8;

                       else IO0CLR=LED8;

                            break;

}

}

while((k&keycon)!=keycon) k=IO0PIN;

}

}

/**************************************************************************

*

*函数名称:main()

***************************************************************************

*/

int  main(void)

{

PINSEL0 = 0x00000000;

P1NSELI = 0x00000000;

IO0DIR = 0x000000ff;

IO0SET = 0xffiTffff;

while( 1 )

{

  keyscan();

  }

}

(1)程序中,“uint32”指无符号    位整型变量;“uint8"指无符号    位整型变量。

(2)程序中,KEYl=0x    (填写四位十六进制)LED2=0x    (填写四位十六进制)

(3)程序运行后,所有的LED灯为点亮状态。如果要求程序运行后,所有的LED灯为熄灭状态,则应将语句    修改为    =0xff;

(4)语句"PINSEL1=0x00000000"的作用是将引脚    (填写引脚符号)设置为    功能。

(5)语句"IO0DIR=Ox000000ff;”的作用是将引脚P0.0~P0.7设置为  功能,将引脚P0.8~P0.15设置为    功能。

(6)语句"k=IO0PIN;"的作用是将引脚  ⑪   (填写引脚符号)的电平状态赋值给变量k,其目的在于读取  ⑫  (按键、LED、按键和LED)的状态。

(7)假设程序开始运行前,按键KEY6~KEY8闭合、其他按键断开(如图所示),则程序运行后,断开按键KEY8,则各LED灯的状态  ⑬  (有/无)变化。再合上按键KEY8,则各LED灯的状态  ⑭  (有/无)变化。

(8)假设程序开始运行前,只有按键KEY1KEY2闭合,其他按键断开,则程序运行后,

断开按键KEY1,则各LED灯的状态  ⑮  (有/无)变化。再合上按键KEY1,则各LED)灯的状态  ⑯   (有/无)变化。

(9)假设程序开始运行前,只有按键KEYl闭合,其他按键断开,则程序运行后,断开按键KEY1,则各LED灯的状态    (有/无)变化。再闭合按键KEY1,则各LED灯的状态(有/无)变化。

(10)假设程序开始运行前,所有按键断开,则程序运行后,点按按键KEY1(KEY1先合上再断开),则LED1灯的状态为  ⑲  (点亮/熄灭)。再次点按按键KEY1(KEY1先合上再断开),则LED1灯的状态为  ⑳  (点亮/熄灭)

七、应用题

40. 对题40图所示电路,下述程序完成如下功能:定时器0每隔0.5s产生一次匹配输出,控制P0.3P0.5连接的数码管灯同时闪烁。试填写程序中的空格以完善程序。假设系统晶振为12MHz,系统时钟为60MHzVPB时钟为12MH2

/* Main.c file generated by New Project wizard

 * Processor:LPC2138

 * Compiler:  Keil for ARM */

#include <LPC2138.h>

typedef unsigned int  uint32;

#define    LED2 (1<<7)

/***********************************************************************

**

**函数名称:Time0Init()

**函数功能:定时器0初始化。

*************************************************************************

***

void Time0lnit(void)

{

    TOTC = 0;           // 定时器T0初始化

    TOPR =            // 设置定时器0分频为100分频

    TOMCR =0xl2;       // 匹配通道MR0MR1匹配时复位TC

    TOMR0=        //MR0 比较值 (0.5 秒定时值)

    TOMR1 =        //MR1 比较值 (0.5 秒定时值)

    TOEMR=0xf0;       // 设置定时器0MR0MR1匹配输出,输出方式为翻转

    TOTCR = 0x03;        // 启动并复位T0TC

    TOTCR=0x01;       // 使能定时器0

    TOIR = 0x02;

}

/***************************************************************************

*

*名称:main()

*功能:控制LED2闪烁

***************************************************************************

*/

int  main(void)

{

    PINSEL0-0x000008   0;// 设置管脚P0.3,P0.5为定时器0匹配输出

    TimeOInitO;              // 定时器0初始化

     IO0CLR =LED2;         // 等待中断

     while(I);

}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多