单片机复习资料-挖空
选择(20)、简答(40)、程序填空(30)、设计(10)
整理人: 张鹏
一. 选择题
-
C语言中最简单的数据类型包括 ()
-
51单片机时序单位从 () 到() 是
2()—>1状态
6状态—>机器周期
1—4机器周期—> ( )
-
七段共阴极数码管显示字符‘A’,’H’,’L’,段码应为( )。
-
MCS-51单片机内部有 ( ) 个16位定时器/计数器。
-
单片机程序存储器的寻址范围是由程序计数器 ( ) 的位数决定的,MCS-51的PC为 ( ) 位,其寻址范围是 ( ) 。
-
控制串行口工作方式的寄存器是( )。
-
定时器工作方式的寄存器是( )。
-
在51单片机单片机中断 () 是
INT0 ()
T0 ()
INT1 ()
T1 ()
串口 ()
-
定时器/计数器工作 ( ) 是13位计数结构
( ) 是16位计数结构。
( )是8位计数器结构
( ) 是2个8位计数器结构( () )
- 在单片机中, ( ) 片内数据存储器
() 片外数据存储器
( ) 程序存储器
-
51单片机串行口有4种工作方式
-
MCS-51单片机复位操作的主要功能是把PC初始化为 ()
-
INTEL 8051 CPU是 () 位的单片机。
-
定时器 ( )的启动位是 TR0\TR1
-
在单片机中,( ) 是数据存储器。( )是程序存储器
-
MCS-51单片机有片内 ( ) ROM、( ) RAM
-
51单片机的对应的中断号
-
51单片机的对应的中断号优先级
INT0 -> T0 -> INT1 -> T1 -> 串口
MCS-51能够响应定时器T0中断、外部NT1中断,它的中断允许寄存器IE的内容应是
EA / / ES ET1 EX1 ET0 EX0 1 0 0 0 0 1 1 0
二、简答题
-
8051有哪几 () 个中断源?每个中断对应的 中断标志 是什么?写每个中断对应的中断类型号是多少?
-
MCS—51的存储器空间从逻辑上可以分为那 3几个空间?每个空间的空间有多大?MCS—51的存储器空间从物理上可以分 4为那几个空间?
-
51单片机的定时器工作模式有几种?
-
定时器的不同工作模式有什么特征?
-
如何设置定时器的工作模式?
-
51单片机有几个定时器/计数器?
-
如何计数的?
-
定时器和计数器什么区别?如何选择?
-
在单片机庄频6MHZ和12MHZ计数的时钟脉冲频率f和周期T?
-
在单片机主频6MHZ和12MHZ,定时10ms,定时计数值是多少?如何设置时间常数X? 如何知道定时时间到了?
-
串行通信中,单片机的fosc=12MHz,串口波特率为1400,串口工作在方式1。用C51写出初始化过程。(SCON格式如下)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
- 写出单片机串行口发送 接收数据的过程(中断法)?
- 如何确定时器的中断子程序?
- 在主程序中,使用定时器0工作在方式1采用中断,需要那些语句?
- 51单片机的异步串行口中,有几个串行数据缓冲器SBUF?
- 如何区分他们?
- 串口控制寄存器是什么?
- 串行口有4种工作方式?
三、程序填空
unsigned char code key_table[] =
{
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77
};
char getKey(void)
{
unsigned char i,tmpcode;
P3 = 0xf0; // 发送全0行扫描码
if( ( P3&0xf0 ) != 0xf0){ //若有按键按下
dealay(10); //延时去抖动
if( ( P3&0xf0 ) != 0xf0){ //延时后再判断一次,去除抖动
for(int i=0;i<4;i++){
P3 = scancode[i]; //输出行扫描码
if( ( p3&0xf0 ) != 0xf0){ //本行有键按下
tmpcode = P3; // 返回特征字节码
while(( P3&0xf0 ) != 0xf0);
return (tmpcode)
}
}
}
}
return (0); //无键按下,返回值为0
}
time0() interrupt 1
{
count++;
if(count==1000){
count = 0;
state++;
if(state==8){
state=0;
LED=0xfe;
}else{
LED=(LED<<1)|0x01;
}
P1=LED;
}
TH0=(65536-1000)/256;
TH0=(65536-1000)%256;
}
a) 计数显示器,对按键动作进行统计,并将动作次数通过数码管显示出来(参考如下电路图)。

#include <reg51.h>
// led_mode存放的是LED显示码
unsigned char code led_mode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code led_p[]={0xfe,0xfd,0xfb,0xf7}; //LED位选
unsigned char data d[4]={0,0,0,0},count=0;
unsigned char j=0;
TIMER0() interrupt 1 //此语句中的1定时0
{
P0=0;
P0=led_mode[d[j]];
P2= led_p[j];
j=(j+1)%4;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
INT_0() interrupt 0 sing 2
{
count++;
if(count==100) count=0 ;
d[2]= count/10;
d[3]=count%10;
}
main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
EX0=1;
IT0=1;
TR0=1;
while(1);
}
b) 采用定时器中断方式使P1口上的8个LED灯每间隔10ms轮流点亮(如下图所示)

#include <reg51.h>
unsigned char n=0,i=0;
unsigned char code ledcod[]={0x7f, 0xbf,0x0df,0x0ef,0x0f7,0x0fb,0x0fd,0x0fe,0x0ff};
void TIMER(void) interrupt 1 using 2
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
n++;
if(n>10){
n=0 ;
i=(i+1)%8;
}
P1=ledcod[i]
}
main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
计数显示器,对按键动作进行统计,并将动作次数通过数码管显示出来(参考如下电路图)
#include <reg51.h>
unsigned char code led_mod[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d, 0x07,0x7f,0x6f,0x00};//0X00标红
unsigned char code led_sca[]={0xfe,0xfd,0xfb,0xf7};
unsigned char led_data[]={10,10,10,10};//此语句中的10 去LED显示码得到00,数码管不亮 //10,10,10,10标红
unsigned char count;
void delay(unsigned int time)
{
unsiged int i;
for(i=0;i<time;i++);
}
void led_disp()
{
unsigned char i,j;
for(i=0;i<4;i++){
P0=0x00;
j=led_data[i];
P0=led_mod[j];
P2=led_sca[i];
delay(1000);
}
}
int1() interrupt 2 //此语句中的2代表 对应中断INT1
{
count=(count+1)%100;
led_data[2]=count/10;
led_datal3l=count%10 ;
}
main()
{
led_data[2]=count/10;
led_data[3]=count*10;
IT0=1; //此语句作用是设置边沿触发
EX0=1; //此语句作用是允许INT0中断
EA=1; //此语句作用是CPU开中断
while(1) led_disp();
}
2)利用定时器1ms中断一次,动态显示LED的原理,将8756显示在4位数码管上(参考如下电路图)

#include <reg51.h>
//led_mode[]中存放的是数码管的显示码
unsigned char code led_mode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code led_p[]={0xfe,0xfd,0xfb,0xf7};
unsigned char data d[4]={8,7,5,6}; //8,7,5,6 标红
unsigned char j=0;
TIMER0() interrupt 1 using 2
{
P0=0;
P0=led_mode[d[j]];
P2=led_p[j];
j=(j+1)%4;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
}
main()
{ TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
#include <reg51.h>
unsigned char count=0;
sbit start=P2^7;
bit flag=0;
void TIME0() interrupt 1
{
TH0=(65556-10000)/256;
TL0=(65556-10000)%256;
count++;
if(count==20){
count=0;
flag=1;
}
}
main()
{
unsigned char n,LED;
TMOD=0x01;
TH0=(65556-10000)/256;
TL0=(65556-10000)%256;
TR0=1;
ET0=1;
EA=1;
SCON=0;
n=0;
LED=0x7f;
start=1;
while(1){
if(flag==1){
flag=0;
SBUF=LED;
while(!TI); //等待发送结束
TI=0;
n++;
if(n==8){
n=0;
LED=0x7f;
}else{
LED=(LED>>1)|0x80;
}
}
}
}