第二章单片机硬件结构测试
1、AT89S51单片机都集成了哪些功能部件?
答:AT89S51单片机的片内都集成了如下功能部件:
(1)1个8位微处理器(CPU);
(2)数据存储器(128B RAM)单元;
(3)4KB Flash程序存储器(ROM);
(4)4个8位可编程并行I/O口(P0口、P1口、P2口、P3口);
(5)1个全双工串行口;
(6)2个16位定时器/计数器;
(7)1个看门狗定时器;
(8)一个中断系统,5个中断源,5个中断向量、2个优先级;
(9)26个特殊功能寄存器(SFR)
2、AT89S51单片机存储器的结构特点?
答:80C51单片机采用将数据存储器和程序存储器分开,分别寻址的结构,称为Harvard结构。在物理上有四个存储器空间:片内程序存储器,片外程序存储器,片内数据存储器和片外数据存储器。
在逻辑上有三个存储器空间:片内外统一的64KB程序空间,128B片内数据空间,64KB片外数据空间。
访问格式:访问片内RAM采用MOV格式,访问片外RAM采用MOVX格式。
单片机内部程序存储器是(4KB 的Flash存储器),地址范围是(0000H)——(0FFFH);数据存储器是(128B的RAM),地址范围是(00H)——(7FH)。
3、程序存储器可外扩至(64K)B,地址范围是(0000H)——(FFFFH),通过引脚(EA非),区分访问的片内,片外存储器。如何区分?
如何区分:
当EA脚为高电平时,单片机读片内程序存储器(4K 字节Flash)中的内容,但在PC值超过0FFFH(即超出4K字节地址范围)时,将自动转向读外部程序存储器内(1000H-FFFFH)的程序;当EA脚为低电平时,单片机只对外部程序存储器的地址为0000H~FFFFH中的内容进行读操作,单片机不理会片内的4K 字节的Flash程序存储器
4、程序存储器中5个中断入口地址分别是多少?
中断源中断入口地址
外部中断0 0003H
定时器/计数器T0 000BH
外部中断1 0013H
定时器/计数器T1 001BH
串行口中断 0023H
5、数据存储器可外扩至(64K)B,地址范围是(0000H)——(FFFFH),访问片外数据存储器时,地址使用(DPTR)和(Ri)表示。
6、AT89S51的4个并行I/O口,分别是(P0)、(P1)、(P2)、(P3)。从电路特点,驱动能力,作用简单描述他们的特点。
作用:
P0口每位可驱动8个LSTTL输入,而P1、P2、P3口的每一位的驱动能力,只有P0口的一半,任何一个口想要获得较大的驱动能力,只能采用低电平输出。
7、单片机最小系统包括哪些基本电路?分别可以使用什么方法实现?
时钟电路:一种是内部时钟方式,通过晶振频率的高低控制
另一种是外部时钟方式,用现成的外部振荡器产生脉冲信号
复位电路:复位电路采用上电自动复位和按钮复位两种方式
8、时钟周期,机器周期和指令周期的关系
答:一个机器周期包括12个时钟周期。
指令周期是执行一条指令所需的时间。单字节指令需要一个机器周期,双字节位2个机器周期,复杂指令则需要多个机器周期。
第三章测试
1、把片外RAM 6000H单元数据送到片内 RAM 50H单元中
MOV DPTR,#6000H
MOVX A,@DPTR
MOV 50H,A
2、若有一表:
ORG 3000H
DB 00H,01H,04H,09H,10H,19H,24H,31H,40H,51H
请通过查找表指令将表中的第7个元素的值送值累加器R1
ORG 0000H
MAIN:
MOV DPTR,#DB
MOV A,#6
MOVC A,@A+DPTR
MOV R4,A
RET
DB 00H,01H,04H,09H,10H,19H,24H,31H,40H,51H
3、请使用两种方法将累加器A和寄存器R3中的内容互换
(1) XCH A,@R3
(2) MOV R0,A
MOV A,@R3
MOV @R3,R0
(3) PUSH Acc
PUSH @R3
POP Acc
POP @R3
4、请使用指令完成以下要求,未涉及位的内容不能改变:
(1)将ACC.2, ACC.6, ACC.7清0
ANL A,#10011101
(2)将ACC.4, ACC.5置1
ORL A,#18H
第5章-中断测试
1、AT89S51中断源有几个?入口地址分别是多少?
中断源中断入口地址
外部中断0 0003H
定时器/计数器T0 000BH
外部中断1 0013H
定时器/计数器T1 001BH
2、与AT89S51中断相关的寄存器有哪些?分别是什么作用?
定时器控制寄存器----TCON
用于选择外部中断0或1,并且选择外部中断的请求触发方式(跳沿触发或者电平触发)中断允许寄存器------IE 用于开中断或关中断
中断优先寄存器------IP 可控制和改变中断源的优先级
串行通信控制寄存器—SCON 低2位所存串行口的发送中断和接收中断请求标志TI和RI 3、各个中断的触发方式是什么?对应的撤销方式是什么?
IT1=0,电平触发方式,引脚上低电平有效,并把IE1置“1”。转向中断服务程序时,由硬件自动把IE1清“0”。
IT1=1,跳沿触发方式,加到引脚上的外部中断请求输入信号电平从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,由硬件自动把IE1清“0”
1.定时器/计数器中断请求的撤销
硬件会自动把中断请求标志位(TF0或TF1)清0,自动撤销。
2.外部中断请求的撤销
(1)跳沿方式外部中断请求的撤销
包括两项:中断标志位清0和外中断信号的撤销。
中断标志位清0是在中断响应后由硬件自动完成的。
外中断请求信号的撤销,由于跳沿信号过后也就消失了,自动撤销。
(2)电平方式外部中断请求的撤销
电平方式外中断请求的撤销,其中中断请求标志自动撤销,但中断请求信号的低电平可能继续存在,为此,除了标志位清“0”之外,还需在中断响应后把中断请求信号输入引脚从低
电平强制改变为高电平
(3)串行口中断请求的撤销
响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标志位,以判定是接收操作还是发送操作,然后才清除。
所以串行口中断请求的撤销只能使用软件的方法,在中断服务程序中进行,即用如下指令在中断服务程序中对串行口中断标志位进行清除:
CLR TI ;清TI标志位
CLR RI ;清RI标志位
4、设计中断程序时由主程序和中断服务子程序两部分构成,主程序的作用?中断服务子程序作用?请写出含有外部中断0和外部中断1主程序结构和中断服务子程序的结构。
主程序:设置中断源的入口地址、进行中断的初始化
子程序:完成中断需要执行的内容
INT:
CLR EA
执行内容
SETB EA
RETI
5、请写出由外部中断1控制的单个发光二极管闪烁5次(连在P1.5上)的程序
# include
sbit d1=P1^5;
void delay(x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}
void int1() interrupt 2
{ EA=0;
for(i=0;i<=10;i++)
{
d1=~d1;
delay(100);
}
EA=1;
}
main()
{
d1=1;
IT1=1;
EX1=1;
EA=1;
while(1);
}
第六章测试
1、定时器的启动方式有几种?分别由哪个引脚决定?
两种:1.只受定时器控制寄存器TCON中的运行控制位TRx的控制(即由单片机内部决定) 2.由内部和引脚INT0(P3.4)、INT1(P3.5)决定
是执行1还是2取决于GATE(门空位),当GATE=0执行1,GATE=1执行2
2、定时器的4种工作方式分别有什么特点?若系统时钟为12MHz,请问,4种工作方式最长定时分别是多少?(写出计算表达式)
方式0:为13位定时器/计数器
方式1:为16位定时器/计数器
方式2:8位的常数自动重新装载的定时器/计数器
方式3:仅适用于T0,此时T0分成两个8位计数器,T1停止计数
4种方式最长定时位:
初值=2^13-(t*12*10^6)/12
最长时间位(2^n-0)*10^(-6)
3、当T0(P3.4)引脚发生负跳变时,作为P1.0引脚产生方波的启动信号。开始从P1.0脚上输出一个周期为1ms的方波。
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar t=0;
sbit p1=P1^0;
void main()
{
TMOD=0x26;
TH0=0xFF;
TL0=0xFF;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
TR0=1;
ET0=1;
P1=0;
F0=0;
while(1)
{
if(F0==1)
{TR1=1;
ET1=1;}
}
}
void timer1() interrupt 3
{
p1=~p1;
}
void timer() interrupt 1
{
TR0=0;
F0=1;
}
4、时钟频率是12MHz,写出采用方式1,在P1.5引脚输出周期为2s的方波程序。#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar Timer=0;
sbit p1=P1^5;
uchar code table[]={0xC0,0xF9,0xA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; void main()
{
uchar i=9;
TMOD=0x10;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
p1=1;
while(1)
{
if(Timer==100)
{
Timer=0;
P2=~P2;
p1=~p1;
}
}
}
void timer1() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
Timer;
}
1、单片机AT89S51串行口传数据的帧格式是一个起始位(0),8个数据位,1位停止位组成,请画出发送字符B的帧格式。当串行口每分钟发送1800个字符时,波特率是多少?
1800*60=108000bit/s
2、若晶体振荡器为11.0952Hz,串口工作在方式1,波特率为4800bit/s,写出用T1作为波特率发生器的方式控制字和计数初值。选用T1的工作方式2,SMOD=0.
X=256-((fosc*(SMOD+1))/(384*波特率))=
3、使用串行口发送中断服务子程序完成以下功能:
(1)发送字符‘x’;(2)点亮发光二极管
#include
Sbit LED=P1^6;
Void INT() interrupt 4
{
if(TI)
{
TI=0;
SBUF=’X’;
LED=0;
}
}
4、使用串行口接收中断服务子程序完成以下功能:
(1)接收字符;(2)发光二极管(P1.6)闪烁一次
Void INT () interrupt 4
{
If(RI)
{
RI=0;
P0=SUBF;
LED=1;
DELAY();
LED=0;
DELAY();
LED=1;
}
}
1、D/A芯片的衡量指标?n位的转换芯片,其分辨率是多少?
指标:分辨率、建立时间、转换精度。
分辨率:输出电压满刻度/2^n
2、DAC0832的Vref=5V,输入数字量为0x80时,输出Vn是多少?
V0=|-B*(Vref/256) |=2.5V B=0x80
3、A/D转换芯片的衡量指标是什么?ADC0809是几位的转换芯片,其分辨率是多少?(1)转换时间和转换速率
(2)分辨率:输出电压满刻度/2^8 ADC0809是8位转换芯片
(3)转换精度
4、DAC0832的连接方式有几种?请写出单缓冲方式下的三角波、阶梯波、方波程序,设地址为0xFFFE。
有三种:单缓冲、双缓冲、直通方式。
三角波:
#include
#include
#define DAC0832 XBYTE[0XFFFE]
#define uchar unsigned char
#define uint unsigned int
void delay_ms(uint s)
{
uchar t;
while(s--)
for (t=0;t<120;t++);
}
void main()
{ uchar flag=0;
uchar i;
while(1){
if(flag==0)
{
i++;
DAC0832=i;
delay_ms(1);
if(i==0xff)
flag=1;
}
else
{
i--;
DAC0832=i;
delay_ms(1);
if(i==0)flag=0;
}
}
}
方波:
#include
#include
#define DAC0832 XBYTE[0XFFFE] #define uchar unsigned char #define uint unsigned int void delay_ms(uint s)
{
uchar t;
while(s--)
for (t=0;t<120;t++); }
void main()
{
while(1) {
DAC0832=0xff;
delay_ms(100);
DAC0832=2;
delay_ms(110);
}
}
阶梯波:
Void main()
{
Uchar f=0;i=0;
While(1)
{
DAC0832=f;
delayms();
i++;
if(i<10)
f=f+10;
else
{
f=0;i=0;
}
}
}
5、若DAC0809芯片对其IN3通道数据转换后送至内部RAM的30H单元。IN3通道地址为0X7FFB.
(1)采用查询的方式,EOC与单片机P1.5连接
(2)采用中断的方式。
双向来回的流水灯:
1、在keil中编写程序实现以下功能,将P2口接8只LED,实现来回流水灯效果。#include
#include
void delay(int a);
void main()
{ int i;
P2=0x01;
while(1)
{
// 向左循环点亮LED
for(i=0; i<7; i++)
{
P2=_crol_(P2,1); // 左移一位,点亮下一位LED
delay(100);
}
// 向右循环点亮LED
for(i=0; i<7; i++)
{
P2=_cror_(P2,1); // 右移一位,,点亮上一位LED
delay(100);
}
}
}
// 延时函数,延时a毫秒
void delay(int a)
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
题2:
ORG 1000H
TAB1 EQU 1234H
TAB2 EQU 3000H
DB “MAIN”
DW TAB1,TAB2,70H
请画出从1000H开始的存储单元的内容?
(3)将内部RAM中的45H单元的高4位清0,低4为置1。
实验:通过开关控制8个发光二极管的点亮,熄灭。(预习题)
2、按下开关K1, 8个发光二极管点亮与熄灭循环交替
3、按下开关K2,前4个发光二极管与后4个发光二极管交替点亮K1、K2分别由外部中断T0、T1引入。
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar flag=3;
void delay(uchar n)
{
uchar i,j;
i=n;
while(i--)
for(j=0;j<120;j++);
}
void main()
{
uchar a;
EA=1;
IT0=1;
EX0=1;
EX1=1;
IT1=1;
P2=0x01;
while(1)
{
if(flag==0)
{
delay(1000);
P2=_crol_(P2,1); // óòò?ò???£?£?μ?ááé?ò???LED
delay(1000);
}
if(flag==1)
{
P2=0XF0;
delay(1000);
P2=0x0f;
delay(1000);
}
}
}
void int0() interrupt 0
{
flag=0;
}
void int1() interrupt 2
{
flag=1;
}
实验内容:按键控制流水灯(8只LED)
1、初始状态:D1~D8轮流点亮
2、当按下按键SKEY1时(使用INT0),停止轮换,LED0~LED4与LED5~LED7交换点亮一次;
3、当按下按键SKEY2时(使用INT1),8只灯全亮全灭一次,再轮流点亮D1~D8。
#include
#include
#define uchar unsigned char
#define uint unsigned int
void delay(uchar n)
{
uchar j,i;
j=n;
while(j--)
for(i=0;i<120;i++);
}
void main()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
P2=0x01;
delay(1000);
while(1)
{
P2=_crol_(P2,1);
delay(1000);
}
}
void int0() interrupt 0
{
delay(1000);
P2=0x0f;
delay(1000);
P2=0xf0;
delay(1000);
P2=0X01;
delay(1000);
}
void int1() interrupt 2
{
P2=0XFF;
delay(1000);
P2=0X00;
delay(1000);
P2=0X01;
delay(1000);
}
实验内容:按键声光报警实验
利用外部硬件中断(使用INT0),按键skey1,按下一次产生一次外部中断,使得发光二极管和蜂鸣器的鸣响次数和计数器的数值一致。计数范围是1~10。
#include
#include
#define uchar unsigned char
#define uint usigned int
sbit speak=P1^1;
sbit display=P2;
uchar a=0;
uchar code table[]={0xC0,0xF9,0xA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void delay(uchar n)
{
uchar i,j;
i=n;
while(i--)
for(j=0;j<120;j++);
}
void main()
{
EA=1;
EX0=1;
IT0=1;
speak=1;
P2=table[0];
P0=0;
while(1);
}
void int_0() interrupt 0
{
uchar i;
a++;
if(a==9)
{
a=1;
P0=0;
}
P2=table[a];
P0=P0+pow(2,a-1);