单片机复习题
一、填空:
在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亮灭。
