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单片机中断服务子程序入口地址

外部中断00003H
外部中断10013H
定时器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.0RXD串口接收
P3.1TXD串口发送
P3.2INT0外部中断0
P3.3INT1外部中断1
P3.4T0定时器T0
P3.5T1定时器T1
P3.6R读
P3.7W写

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;
}
  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值