51单片机期末考试考点
单片机知识点
1,51单片机内部九大部件
1.8位CPU
2.片内振荡器及其时钟电路
3.4KB ROM程序存储器
4.128B片内RAM和SFR
5.两个12位的定时器/计数器
6.64KB的外部程序存储器和64KB的外部数据存储器
7.32个I/O口
8.一个可编程的全双工串行口
9.5个中断源和2个优先级嵌套中断结构
2,51单片机内部存储结构
3,51单片机中断服务子程序入口地址
外部中断0 | 0003H |
---|---|
外部中断1 | 0013H |
定时器T0中断 | 000BH |
定时器T1中断 | 001BH |
串行口中断 | 0023H |
4,C51关键字data,idata,bdata,pdata,xdata,code的用途是
1.data存储类型标识符声明的变量,位于片内RAM低128位的DATA区。该区可以进行直接寻址,寻址速度最快,把常用的变量定义为data类型。
2.bdata存储类型标识符声明的变量,位于片内RAM位寻址区(20H—2FH)BDATA区,允许字节和位混合访问。不允许在BDATA区中声明float和double类型的变量。
3.idata存储类标识符声明的变量位于IDATA区,位于片内256B RAM,只能间接寻址,速度比直接寻址慢。
4.pdata存储类型声明的变量位于PDATA区,PDATA区仅指定低256B的外部RAM。
5.xdata存储类型声明的变量位于XDATA区,可以访问片外RAM64KB的任何地址。
6.code存储类型声明的变量位于程序存储区CODE,该存储区的变量不可改变。
5,bit和sbit变量有何区别
bit是用来定义普通的位变量的,它的值只能是二进制0或1。
sbit是用来定义特殊功能寄存器的可寻址位,它的值可能是可位寻址特殊功能寄存器的某位。
6,简述80C51 4个并行I/O口的功能
P0:地址低8位/总线数据总线和一般I/O口。
P1:一般I/O口。
P2:地址总线高8位和一般I/O口。
P3:第二功能和一般I/O口。
4个口作为一般I/O口时,都为准双向口。
P3口的第二功能:
P3.0 | RXD串口接收 |
---|---|
P3.1 | TXD串口发送 |
P3.2 | INT0外部中断0 |
P3.3 | INT1外部中断1 |
P3.4 | T0定时器T0 |
P3.5 | T1定时器T1 |
P3.6 | R读 |
P3.7 | W写 |
7,简述80C51单片机响应中断的条件
1.中断允许总控制位开放,即EA=1;
2.当中断源有请求信号时,中断源对应的中断标志位为1;
3.该中断源对应的中断允许位置1。
4.无同级或更高级的中断正在服务。
5.当前指令周期已经结束,且当前的指令周期不是RETI或访问IE或IP的指令。
8,简述80C51单片机的中断响应过程
第一步:置为相应的优先级,激活触发器,以便封锁同级和低级的中断。
第二步:把程序计数器PC的内容压入堆栈,同时把被响应的中断服务程序入口地址装入PC中。
第三步:在硬件控制下,程序转向被响应的中断向量,执行中断请求需要的中断服务程序。
单片机代码
1.点亮一个LED灯
#include <reg52.h>
sbit led=P0^0;
void main()
{
led=0;
}
2.LED流水灯(按位取反)
#include <reg52.h>
#include <intrins.h>
void Delay(unsigned int x);
void main()
{
unsigned char n=0x01;
while(1)
{
P0=~n;
Delay(100);
n=n<<1;
Delay(100);
if(n==0)
{
n=0x01;
}
}
}
void Delay(unsigned int x) //@11.0592MHz
{
unsigned char i, j;
while(x--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
3.数码管动态显示1234
#include <reg52.h>
#include <intrins.h>
sbit input0=P3^7;
sbit input1=P3^6;
sbit input2=P3^5;
sbit input3=P3^4;
SegData[]={0xc0,0xf9,0xa4,0xb0,0x99};
void Delay(unsigned char x);
void main()
{
input0=0;
P0=SegData[1];
Delay(1);
input0=1;
P0=0xff;
input1=0;
P0=SegData[2];
Delay(1);
input1=1;
P0=0xff;
input2=0;
P0=SegData[3];
Delay(1);
input2=1;
P0=0xff;
input3=0;
P0=SegData[4];
Delay(1);
input3=1;
P0=0xff;
}
void Delay(unsigned char x)
{
unsigned char i,j;
while(x--)
{
_nop_();
j=199;
i=2;
do
{
while(--j);
}while(--i);
}
4.用定时器输出方波
#include <reg52.h>
sbit square=P0^0;
void Init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
TR0=1;
ET0=1;
}
void Timer0_Init() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
square=square^1;
}
void main()
{
square=1;
Init();
while(1);
}
5.串口初始化
void serial_Init()
{
SCON=0x50;//设置串口工作方式
TMOD=0x20;//设置T1工作方式(此时T1作为波特率发生器)
TH1=0xfd;//设置9600波特率
TL1=0xfd;
EA=1;//打开中断总开关
ES=1;//打开串口中断
TR1=1;
}