单片机技术课程总结

(1)单片机相关基本概念

1.1 概述

1.1.1 发展概况

定义:

将单片机主机集成在一小块硅片上的微型机,被称做MCU(Micro Controller Unit)具有集成、可靠、性价比高的特点

历史:

阶段一:单片机探索阶段

低档型8位机主流,如Intel公司MCS-48、Motorola公司6801

阶段二:单片机完善阶段

高档型8位机主流,如Intel公司MCS-51、Motorola公司68HC05,其中MCS-51奠定了单片机领域的经典地位,形成了事实上8位单片机标准结构

阶段三:8位机与16位机争艳阶段

由于8位机的性能价格比16位机高,进一步巩固和加强了8位单片机的主流低位

阶段四:微控制器全面发展阶段

出现了32位、64位微处理器,如ARM系列微处理器

1.1.2 80C51系列单片机

(一)、MCS-51系列单片机
(二)、AT89系列单片机
(三)、STC系列单片机【性价比最高的51单片机】

(2)26个特殊功能寄存器用处 & 40个引脚名字和作用

2.1 片内结构

2.1.1 80C51单片机功能结构框图

在这里插入图片描述
功能部件:

(1)、一个8位CPU
(2)、一个片内振荡器和时钟电路
(3)、4KB ROM
(4)、256B 片内RAM
(5)、可寻址64KB片外ROM和片外RAM的控制电路
(6)、2个16位定时/计数器
(7)、21个特殊功能寄存器
(8)、4个8位并行I/O口,共32条可编程I/O端线
(9)、一个可编程全双工串行口
(10)、可设置成2个优先级的5个中断源

2.2 引脚功能

2.2.1 80C51单片机引脚图

在这里插入图片描述

2.2.2 时钟

XTAL1、XTAL2:晶体振荡电路反相输入端和输出端

2.2.3 控制线(个人认为不是重点)

1个单线:

  1. P S E N ‾ \overline{PSEN} PSEN—— 外ROM读选通信号

3个复用线:

  1. 、ALE/ P R O G ‾ \overline{PROG} PROG——地址锁存允许/片内EPROM编程脉冲
  2. 、RST/ V P D V_{PD} VPD——复位/备用电源
  3. E A ‾ \overline{EA} EA/ V p p V_{pp} Vpp——内外ROM选择/片内EPROM编程电源

2.2.4 I/O线

4个8位并行I/O端口

P0 :分时传送低8位地址信号和8位数据信号
P1 :自定义I/O口
P2 :传送高8位地址信号
P3 :常用作第二功能,如串口、外部中断、定时/计数器、外部RAM请添加图片描述

2.2.5 电源

Vcc:芯片电源,接+5V
Vss:接地端

2.3 存储器与寄存器

2.3.1 存储器(盲猜很重要,可以好好看下)

(一)、64KB 程序存储器【片内ROM和片内ROM】
(二)、64KB 外部数据存储器【外RAM】
(三)、256B 内部数据存储器【内RAM】
请添加图片描述

2.3.2 寄存器(部分)

(1)、累加器ACC
(2)、寄存器B
(3)、程序状态字寄存器PSW

1、Cy 进位标志
2、AC 辅助进位标志
3、RS1、RS0 工作寄存器区选择控制位
4、OV 溢出标志
5、P 奇偶标志
6、F0 用户标识

(4)、数据指针DPTR
(5)、堆栈指针SP
(6)、程序计数器PC

2.4 时钟和时序

2.4.1 电路

在这里插入图片描述

2.4.2 周期

1、时钟周期:时钟脉冲频率的倒数
2、状态周期:将时钟脉冲二分频后的脉冲信号,为时钟周期的两倍
3、机器周期:基本定时单位,12个时钟周期 = 1个机器周期
4、指令周期 :CPU执行一条指令的时间(不确定)

(3)IO 口的使用

3.1 LED ( 任务1:数码管流水灯) 【蜂鸣器可依此类推】

代码

#include <reg51.h>
#include <intrins.h>			/*包含移位函数的头文件*/
#define uchar unsigned char		  			
#define uint unsigned int		  			
void  delay(uint i)				 /*延时函数*/
{	uchar t;
	while (i--);
	{	
		for(t = 0; t < 120; t++);	
	}
}
void  main(  )					/*主程序*/
{	
	P1=0xfe;	
	while (1)
	{
		P1=_crol_( 0,1) ; /*C51函数库中的左移函数,P1中的数据循环左移1位*/
		delay( 500 ); /*500为延时参数,可根据实际需要调整*/
	}
}

3.2 按键 ( 任务2:按键检测)

代码(按键代码现在一般不会像这样写,一般还会加上消抖处理)

#include <reg51.h>
void  main(  )                     /*主函数*/
{	
	while (1)
	{	
		unsigned char temp;        /*定义临时变量temp*/
		P1=0xff;			              /* P1口低4位置1,作为输入;高4位置1,发光二极管熄灭*/
		temp= P1&0xf0;	          	               /*读P1口并屏蔽低4位,送临时变量temp */
		temp = temp >>4;
                          /* temp的内容右移4位,P1口高4位状态移至低4位*/
      	P1= temp;			                 /* 临时变量值写入P1口输出*/
	}
}

3.3 数码管(任务3:数码管显示)

代码

 #include <regx52.h>
 #include <INTRINS.H>
 void Delay1000us()	  /*延时函数*/
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
 void main()				  /*主函数*/
 {
	 while(1)
	 {
	   P2_4=1;
	   P2_3=0;
	   P2_2=1;
	   P0=0x5B;//1
	   Delay1000us();
	   P2_4=0;
	   P2_3=1;
	   P2_2=1;
	   P0=0x06;//2
	   Delay1000us();
	   P2_4=1;
	   P2_3=1;
	   P2_2=1;
	   P0=0x4F;
	   Delay1000us();
	 }
 }

(4)中断的使用和配置

在这里插入图片描述

4.1 中断源

外部中断0
外部中断1
定时/计数0溢出中断
定时/计数1溢出中断
串行中断

4.2 寄存器

4.2.1 中断请求控制寄存器

TCON 中断请求标志

TF1 定时/计数器1中断请求标志
TF0 定时/计数器0中断请求标志
IE1 外部中断1中断请求标志
IT1 外部中断触发方式1控制位
IE0 外部中断0中断请求标志
IT0 外部中断触发方式0控制位

SCON 串口请求标志

TI 串行发送中断请求标志
RI 串行接收中断请求标志

在这里插入图片描述

4.2.2 中断允许控制寄存器IE

EA CPU中断允许控制位(总开关)
ES 串行口中断允许控制位
ET1 定时/计数器1中断允许控制位
EX1 外部中断1允许控制位
ET0 定时/计数器0中断允许控制位
EX0 外部中断0允许控制位

4.2.3 中断优先级控制寄存器IP(不是很重要)

PS 串口优先级控制位
PT1 定时/计数器1优先级控制位
PX1 外部中断1优先级控制位
PT0 定时/计数器0优先级控制位
PX0 外部中断0 优先级控制位

在这里插入图片描述

4.3 代码(外部中断实现按键检测)

#include <reg51.h>

sbit LED = P1^0;// 定义LED就是P1^0

void delayms(unsigned int t) //延时函数
{
	unsigned int a,b;
	for(a=0; a<t; a++)
	  for(b=0; b<120; b++);
}
void main(void)
{
	//设置INT0  (设置位寄存器)
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。	
	EA=1;//打开总中断	
	while(1)
	{
	    LED = 0;	//注意,主函数是让led灭掉	
	}
}

/*外部中断0函数,只有INIT0引脚有下降沿才会触发,并且只会执行一次*/
/*外部中断0*/

void Int0()	interrupt 0		//外部中断0的中断函数
{
		LED = 1;
		delayms(1000);
}

(5)定时器的原理和配置

5.1 定时/计数器原理

在这里插入图片描述

5.2 定时/计数器工作方式寄存器TMOD

1、GATE 启动方式
2、C/T 模式选择
3、M1M0 工作方式

在这里插入图片描述

5.2 代码(定时器0定时代码)

#include <reg51.h>

void main(void)
{
//相关控制字
	TMOD = 0x01;	//定时方式,计数器的工作脉冲来自内部时钟信号
	TR0= 1;   //定时计数器启动
	ET0 = 1;		   //打开定时器0中断
	EA = 1;			   //打开总中断
 	TH0 = (65535-5000)/256;	   //设置定时器时间为50ms
	TL0 = (65535-5000)%256;
	while(1);
}

timer0(void) interrupt 1
{
	static char n = 0;	  //记录中断响应次数n
	n++;
	TH0 = (65535-50000)/256;   //响应中断后会清零,要从新赋值
	TL0	= (65535-50000)%256;
	if(n == 20)			  //记录到响应了20次 也就是1秒,执行下程序
	{
		n = 0;	//录记响应次数清零
		P1 = ~P1;	
	}
} 

(6)串口

6.1 串口特殊功能寄存器

6.1.1 数据缓存器SBUF

逻辑上只有一个
物理上具备两个

6.1.2 串行控制寄存器SCON

在这里插入图片描述

6.1.3 电源控制寄存器PCON

此部分主要控制波特率的倍数,SMOD,但不能位寻址

6.2 波特率计算

一般采用定时/计数器1模式3当作波特率发生器来实现波特率可变
其公式为:

2 S M O D ∗ ( T 1 溢出率 ) / 32 2^{SMOD} * (T1溢出率)/32 2SMOD(T1溢出率)/32

补充:其中T1溢出率 = f O S C 12 ( 256 − T 1 初值 ) \frac{f_{OSC}}{12(256-T1_{初值})} 12(256T1初值)fOSC

6.3 代码

#include <REGX52.H>
void UartInit()		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;			//设定定时初值
	TH1 = 0xFD;			//设定定时器重装值		
	TR1 = 1;			//启动定时器1
	ET1 = 0;        	//禁止定时器1中断
	EA=1;				//开放总中断 
	ES=1;				//开放串口中断
}
void Uartsend(unsigned char byte)//发送
{
	SBUF=byte;//把数据写入发送缓冲区SBUF
	//数据发送完成的标志是TI=1;所以等待数据传送完
	while(TI==0);
	TI=0;//软件清零
}
void UART_ISR() interrupt 4//串口中断函数
{
	if(RI==1)//接收中断
	{
		Uartsend(SBUF);//把接收的数据发送到计算机
		RI=0;//软件清零
	}
}
int main()
{
	UartInit();
	while(1)
	{
		
	}
}

总结了一些关于单片机技术我认为比较重要的知识,给大家提供参考,预祝大家考试顺利!!!

  • 29
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值