欢迎光临散文网 会员登陆 & 注册

单片机复习题

2023-05-23 08:24 作者:生物yes  | 我要投稿

一、填空:

在keil C51编译器中,无符号整型变量占数据存储器空间 2 字节,其数值表达范围是  0~65535  。

将01111100 B转化为16进制数据为0x 7c      。在AT89S51的单片机标有“24PC”,S表示 该芯片含有可串行下载功能的Flash存储器 ,24代表 速度为24MHz       ,P表示 表示塑料直插双列DIP封装 ,C表示 商业用品 。若MCS-51单片机从片内程序存储器执行程序,引脚必须接 低电平 。

若MCS-51单片机从片外程序存储器开始执行程序,引脚必须接 高电平 。

引脚为  外部程序存储器选通信号使能脚(低电平有效) ,用于  实现外部ROM单元的读操作  。

、引脚的作用是 分别是读的时候用的引脚,写的时候用的引脚 。(WR和RD的时序是51单片机自动产生的,在执行一条指令movx A,@dptr(读时序)或movx @dptr,A(写时序)都是片外传值的,当然读写的时候都是产生低跳变。)

XTAL1与XTAL2引脚功能为 片内震荡电路输入端,片内震荡电路输出端 ,用示波器观察该引脚,在单片机正常工作时,其波形应为频率为  晶振写真频率方波   波形。(填写内容包括频率参数)

当89C51复位时,PC的内容是:   0000H  ,正常工作时RST引脚的电平是:低电平 ,当该引脚上出现持续2个以上的机器周期的  高  电平时,可实现复位操作。

若MCS-51单片机使用晶振频率为6MHz时,其复位持续时间应该超过   4us   。

ALE引脚为  地址所存允许信号使能脚 ,用于 地址锁存有效信号(使地址锁存) ,当不访问外部存储器时,该端口以时钟频率的  六分之一  输出固定的正脉冲信号。

P3.0和P3.1引脚还分别具有RXD和TXD的作用,在异步串行通信中,RXD引脚 串行输入口 ,TXD 串行输出口 。

引脚的作用:外部中断0/外部中断1中断源,引入中断请求信号。

在使用8051单片机计数器功能时,外部计数脉冲从  T0/T1即P3.4/P3.5 引脚引入单片机。

MCS-51系列单片机的有_4__组并行I/O端口,其中___P0__、___P2__和___P3___具有第二功能。P0口可以作为数据总线和     低八位地址总线   ,P2口作为 高八位地址           。

8051单片机P0口在作为普通IO口使用时,作为输出口需要  上拉电阻   。而所有IO口在作为输入口时,需要向IO寄存器    写1    。

将定时/计数器0用于定时方式,则计数脉冲来自于 内部时钟  ;若工作于计数方式,则计数脉冲必须来自于   外部脉冲 ,且计数频率不超过晶振频率的   24分之一   。

CPU响应中断后,不能自动清除中断请求“1”串行口中断 。

数据存储器在物理上和逻辑上都分为两个地址空间,一个是由128B的 RAM(内部数据存储器) 和21个 特殊功能寄存器       。另外一个是片外最大可扩充 64    KB的数据存储器。其中片内数据存储区地址为   0030H     ,划分为 工作寄存器区       、    位寻址区       以及  通用RAM区         3部分。

8051单片机可以最大寻址的外部存储器地址范围是  0000~FFFFH         。

8051单片机有四组工作寄存器,当前正在使用哪一组,由特殊功能寄存器 PSW 的RS0、RS1两位的状态决定。

C51编程语言中,不仅可以设定变量的数据类型,还可以设定存储器类型(将变量存储在哪里),data、bdata(位寻址区20H~2FH)、idata、pdata(64kRAM)、xdata、code分别将变量存储在什么区域。答:data idata xdata  code分别是存于片内低128字节,高128字节,片外RAM中,和程序存储器中。

C51编程语言中,SFR关键字的作用是 对51内部寄存器定义一个地址  ,SBIT的作用是  定义特殊功能寄存器位变量  ,

特殊功能寄存器IE用于实现中断系统的两级使能控制,若开启定时器1以及外部中断0,试写出IE寄存器所对应的16进制数值  0x89         。

若中断优先级控制寄存器IP的值设为0x12,请写出此时五个中断源的优先级顺序(由高到低)  T0    、  串行口      、  外部中断0     、 外部中断1      、 T1      。

特殊功能寄存器TCON中的TR0和TR1分别是T/C0和T/C1的  启动/停止控制位        。

TMOD寄存器中的GATE位用来   指定外部中断请求是否参与对定时器/计数器的控制  ,若GATE位为1,则除了需要对应的TRi为1之外,还需要      引脚同时为高电平才可能启动相应的定时器。

当SCON寄存器的“REN”位设置为逻辑1时,表明   串行口允许控制接收 。

将波特率设定成加倍,需要将特殊功能寄存器 PCON 的最高位设置成1。

IT0用于设定外部中断0的触发方式,当其为逻辑0时,表明 低电平触发 ,当其为逻辑1时,表明 下降沿触发   。

DAC0832内部有输入锁存器和DAC寄存器两个缓冲器,由这两个缓冲器的状态可使DAC0832工作在 单缓冲模式    、 双缓冲模式   和  直通模式   三种方式。

ADC0809将模拟量转化成数字量之后,EOC引脚为 高 电平。

DAC和ADC的分辨能力都和自身位数有关,位数越大,分辨能力越 强  。

74LS273通常用来做简单 输出 接口扩展;而74LS244则常用来做简单 输入 接口扩展

在片外扩展一片2764程序存储器芯片要 13 根地址线。





二、简答题:

1  单片机最小系统:含义及画图。

单片机正常运行的最低配置:它有一系列模块组成

1)复位系统:当引脚9出现2个机器周期以上高电平时,单片机复位,程序从头开始运行.

2) 时钟系统:有振荡器电路产生频率等于晶振频率,这时用的是外界晶振。

            也可以又外部单独输入,此时XTAL2脚接地,时钟信号由XTAL1输入.

3) 电源系统:VCC,和 GND引脚,供电电压4--5.5V.

2  扫描法识别矩阵式键盘的程序步骤。

3  8051单片机串行通信中主从式多机通信原理。

4  8051单片机有几个中断源,有几级中断优先等级?如果所有中断源处于同一优先等级,且同时产生中断请求,CPU将按照何种顺序响应中断?

8051单片机有五个中断源,两个中断优先等级;

CPU将按照自然优先级(高到低):外部中断0,定时器/计数器中断0,外部中断1,定时器/计数器中断1,串行口。

5  8051单片机各中断源的中断标志是什么?如何产生?如何清除的?串口中断,外部中断标志是IF0,IF1 ;定时器中断标志是TF0,TF1;串口中断标志是RI,TI ;外部中断和定时器中断硬件置位,硬件清零,软件不用管,串口中断必须使用软件清零(向TI和RI写0)



TF1和TF0:分别为两个定时/计数器中断标志,当定时/计数器计数值满产生溢出时,由硬件自动置1,并向CPU申请中断。该

标志位一直保持到CPU响应中断后,由硬件自动清0;

IE1和IE0:为外部中断1和外部中断0的中断请求标志位,当外部中断源发出中断请求时,由硬件自动置1,并向CPU申请中断。该标志位一直保持到CPU响应中断后,由硬件自动清0;

RI和TI:分别是串口发送/接受标志。在方式0下,发送/接受完第八位数据位时,由硬件置位;在其它方式下,当开始发送停止位时,由硬件将T1置位,即向CPU申请中断;当接受到停止位时,R1置位,必须由软件清0;

6  8051单片机串行通信中,奇偶校验原理。

设置串口工作模式为2或3,可以用第9位数据位作奇偶检验位,例如发送一字节若这字节为奇检验位则将第9位数据位置1,此时必须通过改变奇偶校验位TB8这样在另一单片机接收时判断第9位数据位为一时才接收就能完成奇检验。(仅供参考)

7  什么是数码管的动态显示?

答:所谓动态显示就是一位一位轮流点亮每位显示器,在同一时刻只有一位显示器在工作,但由于人眼的视觉残留效应和发光二极管熄灭时的余晖,将出现多个字符“同时”点亮的现象。

8  8051单片机定时器有几种工作方式?各方式中的计数寄存器是几位的?

定时器0有方式0,1,2,3共四种工作方式,而定时器0有方式0,1,2共三种工作方式;

(只要定时器0工作在方式3,定时器1,停止工作);

方式0,高八位,低五位共13位;

方式1,高八位,低八位共16位;

方式2,只有八位;

方式3,两个八位;

9  简述8051单片机串行口有几种工作方式,各自特点是什么?

方式1,

方式2.

方式3,

10 串口初始化编程,如:已知fosc=11.0592MHz,定时器1工作在方式2下,波特率欲设定为9600bps,请写出串口初始化程序。

     MOV TMOD,#20H

     MOV TL1,#0FDH

  MOV TH1,#0FDH

  SETB TR1

  MOV SCON,#50H

  MOV R0,#55H

  SETB EA

  SETB ES

11 8051单片机的三总线结构是什么?

数据总线,地址总线,控制总线。称为三总线

数据总线,地址总线,控制总线。称为三总线


12 8051单片机的主要特性是什么?

8051是MCS-51系列单片机中的代表产品,它内部集成

了功能强大的中央处理器,包含了硬件乘除法器、21个

专用控制寄存器、4kB的程序存储器、128字节的数据存

储器、4组8位的并行口、两个16位的可编程

定时/计数器、一个全双工的串行口以及布尔处理器。

8051中集成了完善的各种中断源,用户可十分方便地

控制和使用其功能,使得它的应用范围加大,可以说

它可以满足绝大部分的应用场合。


三、程序设计类题目:

1要求:编写基于定时器的LED流水灯闪烁程序,每1S灯的状态变化一次。

1c语言

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

uint t=0,n=0;

uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void main(void)

{

    TH0=0X3C; 

    TL0=0XB0;

    EA=1;  

    ET0=1;

    TR0=1;

    TMOD=0X01; 

    P1=0xff;

while(1)

{

if(n==10)

{

n=0;

P1=table[t];

t++;

if(t==8) t=0;

}

}

}

void timer0()interrupt 1

{

n++;

TH0=0X3C;

TL0=0XB0;

}



2要求:根据按键的不同、要求编写LED灯的变化程序。例如:当第一个按键按下时、实现8个LED灯依次闪灭(流水灯),每个灯的闪灭间隔为0.5秒。第二个按键按下时,实现从左面开始奇数号灯亮灭,闪烁频率为1Hz。当第三个按键按下时,实现从左面开始偶数个灯亮灭,闪烁频率为2Hz,当所有按键全部按下时,实现LED灯逐个点亮,然后再依次点灭。循环往复。

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit key1=P3^0;

sbit key2=P3^1;

sbit key3=P3^2;

uint m;

uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar code b[]={0x55,0xff};

uchar code c[]={0xaa,0xff};

uchar code d[]={1,3,7,15,31,63,127,255};

void DelayMS(uint x)

{

  uchar i;

 while(x--)

 {

   for(i=60;i>0;i--);

 }

}

void main()

{

P3=0xff;

while(1)

{

P1=0x00;

while(key1==0&&key2==0&&key3==0)

{

for(m=0;m<8;m++)

    {

P1=(d[m])%256;

DelayMS(50);

  }

for(m=0;m<8;m++)

    {

P1=(d[m])%256;

P1=~P1;

DelayMS(50);

  }

}

    while(key1==0)

 {

if((key1==0)&&(key2==0)&&(key3==0)==1)

   {break;}

for(m=0;m<8;m++)

{

P1 = a[m];

P1 = ~P1;

DelayMS(50);

   }

 }

    while(key2==0)

{

if((key1==0)&&(key2==0)&&(key3==0)==1)

      {break;}

for(m=0;m<2;m++)

{

P1 = b[m];

DelayMS(500);

   }

}

while(key3==0)

{

if((key1==0)&&(key2==0)&&(key3==0)==1)

      {break;}

for(m=0;m<2;m++)

{

P1 = c[m];

DelayMS(1000);

   }

}

}

}



3要求:编写基于外部中断显示控制程序,要求初始显示“001000”,完成基于外部中断的数字显示与调整程序。要求按下int0所对应的按钮,数字加1;按下int1对应按钮,数字减1。(数码管显示电路不一定这么复杂)

3c语言

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

sbit a1=P2^0;

sbit a2=P2^1;

sbit a3=P2^2;

sbit a4=P2^3;

sbit a5=P2^4;

sbit a6=P2^5;

uchar tt=0,count=160;

uint m=1000;

uchar code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};

void init()

{

EA=1;

EX1=1;

EX0=1;

IP=0x08;

P2=0xff;

}

 

void delay(uint ms)

{

    uint x,y;

    for(x=ms;x>0;x--)

        for(y=110;y>0;y--);

}

 

void display(uint num)

{

    uchar ge,shi,bai,qian,wan,shiwan;

    ge=num%10+0;

    shi=(num/10)%10+0;

  bai=(num/100)%10+0;

  qian=(num/1000)%10+0;

  wan=(num/10000)%10+0;

  shiwan=(num/100000)%10+0;

    a1=1;

    P0=table[shiwan];

    delay(1);

    a1=0;

    a2=1;

    P0=table[wan];

    delay(1);

    a2=0;

  a3=1;

    P0=table[qian];

    delay(1);

    a3=0;

  a4=1;

    P0=table[bai];

    delay(1);

    a4=0;

a5=1;

    P0=table[shi];

    delay(1);

    a5=0;

a6=1;

    P0=table[ge];

    delay(1);

    a6=0;

}

  

main()

{

init();

while(1)

{

  display(m);

}

}

void timer0() interrupt 0

{

  m=m++;

display(m);

}

void timer1() interrupt 2

{

m=m--;

display(m);

}

4要求:外部中断改变流水灯的流动方向和状态转换的延迟时间。

#include<reg52.h>

#include<stdio.h>

#define uint unsigned int

#define uchar unsigned char


void Delay(uint z)

{

  uint x,y;

  for(x=z;x>0;x--){

   for(y=110;y>0;y--){

}}}

 

void main()

{

  EX0=1;

  IT0=1;

  EX1=1;

  IT1=1;

  EA=1;

while(1)

{

P1=0xff;

}

}

void  into() interrupt 0

{

  uint i;

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

  {

    P1=0x00;

    Delay(100);

    P1=0xff;

Delay(100);

  }

}

 

void  intr() interrupt 1

  uint i;

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

  {

P1=0xfe;

Delay(50);

P1=0xfd;

Delay(50);

P1=0xfb;

Delay(50);

P1=0xf7;

Delay(50);

P1=0xef;

Delay(50);

P1=0xdf;

Delay(50);

P1=0xbf;

Delay(50);

P1=0x7f;

Delay(50);

  }

}



5要求:数码管动态显示默认数字(如654321)。

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

sbit a1=P2^0;

sbit a2=P2^1;

sbit a3=P2^2;

sbit a4=P2^3;

sbit a5=P2^4;

sbit a6=P2^5;

unsigned long m=654321;

uchar code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};

void init()

{

EA=1;

EX1=1;

EX0=1;

IT0=1;

IT1=1;

IP=0x08;

P2=0xff;

}

 

void delay(uint ms)

{

    uint x,y;

    for(x=ms;x>0;x--)

        for(y=110;y>0;y--);

}

 

void display(unsigned long num)

{

    uchar ge,shi,bai,qian,wan,shiwan;

    ge=num%10+0;

    shi=(num/10)%10+0;

  bai=(num/100)%10+0;

  qian=(num/1000)%10+0;

  wan=(num/10000)%10+0;

  shiwan=(num/100000)%10+0;

    a1=1;

    P0=table[shiwan];

    delay(1);

    a1=0;

    a2=1;

    P0=table[wan];

    delay(1);

    a2=0;

  a3=1;

    P0=table[qian];

    delay(1);

    a3=0;

  a4=1;

    P0=table[bai];

    delay(1);

    a4=0;

a5=1;

    P0=table[shi];

    delay(1);

    a5=0;

a6=1;

    P0=table[ge];

    delay(1);

    a6=0;

}

  

main()

{

init();

while(1)

{

  display(m);

}}

void timer0() interrupt 0

{m=m++;

display(m);}

void timer1() interrupt 2

{m=m--;display(m);}


6要求:编写基于定时器的LED指示灯闪烁程序。LED亮1秒,熄灭N(大于等于1的整数)秒。

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit P10=P1^0;

uint t=0,i=0;

uint N=4;

void main(void)

{

    TH0=0X3C;

    TL0=0XB0;

    EA=1;  

    ET0=1;

    TR0=1;

    TMOD=0X01;

while(1)

{ P10=0;

while(1)

{

if(t==10)

{

i=0;

P10=1;

}

if(i==10*N)

{

i=0;

t=0;

P10=0;

}

}

  }

}

void timer0()interrupt 1

{

t++;

i++;

TH0=0X3C;

TL0=0XB0;

}
7要求:利用定时器T1的中断来使P1.7控制蜂鸣器发出1kHz的音频信号,假设系统时钟频率为12MHz。编写定时器的方波发生器,要求采用定时器工作方式0。(具体方式可能变化)

#include <reg52.h>

sbit P17=P1^7;

main()

{

    TH0=(8192-500)/32;

    TL0=(8192-500)%32;

    EA=1;  

    ET0=1;

    TR0=1;

    TMOD=0X00;

    P17=0;

while(1);

}

void timer0()interrupt 1

{

  P17=!P17;

    TH0=(8192-5000)/32;

    TL0=(8192-5000)%32;

}

 

8要求:编写基于定时器方式1的LED单个数码管显示程序,要求以每隔1s数字加1,当数字大于9时,清0。

 

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};

uint t=0,num=0;

void main(void)

{

    TH0=0x3c;

    TL0=0xb0;

    EA=1;  

    ET0=1;

    TR0=1;

    TMOD=0X01;

  while(1)

{

if(t==10)

{

if(num>9)num=0;

t=0;

P0=~table[num];

num++;

}

}

}

void timer0()interrupt 1

{

  t++;

    TH0=0x3c;

    TL0=0xb0;

}

9要求:编写基于定时器方式1的LED两个数码管显示程序,要求初始显示“00”,每按下一次按键数字加1,当数字大于99时,清0;小于0时,保持不变。

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit key1=P3^7;

sbit key2=P3^6;

uchar code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};

int num=20;

void delay(uint ms)

{

    uint x,y;

    for(x=ms;x>0;x--)

    for(y=110;y>0;y--);

}

void main(void)

{

  key1=1;

  key2=1;

  while(1)

{

  P0=table[(num/10)%10];

P2=table[num%10];

if(key1==0)

{

delay(100);

if(num>99)num=0;

P0=table[(num/10)%10];

P2=table[num%10];

num++;

}

if(key2==0)

{

num--;

delay(100);

if(num<0)num=0;

P0=table[(num/10)%10];

P2=table[num%10];

}

}

}


10要求:利用定时器功能编写时、分、秒显示程序。

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit a1=P2^0;

sbit a2=P2^1;

sbit a3=P2^2;

sbit a4=P2^3;

sbit a5=P2^4;

sbit a6=P2^5;

uint tt=0;

unsigned long m=32,f=23,s=13;

uchar code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};

void init()

{

    TH0=0X3C;

    TL0=0XB0;

    EA=1;  

    ET0=1;       

    TMOD=0X01;        

    TR0=1;     

    P1=0x00;

}

void delay(uint ms)

{

    uint x,y;

    for(x=ms;x>0;x--)

    for(y=110;y>0;y--);

}

void display(unsigned long num)

{

    unsigned long ge,shi,bai,qian,wan,shiwan;

    ge=num%10+0;

    shi=(num/10)%10+0;

  bai=(num/100)%10+0;

  qian=(num/1000)%10+0;

  wan=(num/10000)%10+0;

  shiwan=(num/100000)%10+0;

    a1=1;

    P0=table[shiwan];

  delay(2);

    a1=0;

    a2=1;

    P0=(table[wan])+0x80;

    delay(2);

    a2=0;

  a3=1;

    P0=table[qian];

    delay(2);

    a3=0;

  a4=1;

    P0=(table[bai])+0x80;

    delay(2);

    a4=0;

a5=1;

    P0=table[shi];

    delay(2);

    a5=0;

a6=1;

    P0=table[ge];

    delay(2);

    a6=0;

}

 

main()

{

init();

while(1)

{if(tt>=10)

{tt=0;m++;

if(m>=60){m=0;f++;}

if(f>=60){f=0;s++;}

if(s>=24){s=0;}

  }

  display(m+100*f+ 10000*s);

}

}

void timer0() interrupt 1

{

TH0=0X3C;

TL0=0XB0;

tt++;

}

11要求:利用74LS165和串行口工作方式0,实现开关控制对应LED的亮灭。

12要求:利用74LS164和串行口工作方式0扩展单片机IO口,使多个数码管显示。

13要求:编写基于串口方式1的双机通信程序,要求左侧单片机不断发出0x55;右侧单片机接收到数据后判断是否是0x55,如果是,向左侧机回0xaa。两种编程方式的考察:查询方式和中断方式。

14要求:编写AD0809的模拟量采集源程序,实现将所选通道的0~5V电压以LED灯的形式显示。延迟方式、中断方式或查询方式。

15要求:基于DAC0832输出三角波,正弦波波形

16要求:利用74LS273、74LS244扩展IO口,实现每个开关控制对应的LED亮灭。


单片机复习题的评论 (共 条)

分享到微博请遵守国家法律