单片机学习笔记

一、单片机帝国的诞生与发展

1.1 单片机的基本概念

单片机是一种集成电路芯片,采用超大规模的集成电路把具有数据处理功能的中央处理器存储器、输入输出端口、外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统。

 一般而言,单片机也称为MCU(微控制器),不是完成某一功能的芯片,是把一个计算机系统集成到一个芯片上。单片机就相当于小型计算机。和计算机相比,单片机缺少I/O 设备。

简单概括:一个芯片就成了一台计算机,它体积小,质量轻,价格便宜,学习成本低。

单片机,按用途去分,大体分为两种:通用型、专用型


通用型:用户可以根据自己的需求去选择单片机的外设,如以单片机芯片为核心,搭外围电路和相关外设,实现对应的功能。


专用型:主要就是针对某些特定的产品的功能去设计单片机,单片机芯片的开发商和厂家去进行定制。

1.2  单片机的发展历史

1975 年,美国德州仪器公司(TI公司)推出了一款4位单片机:TMS-1000,可以理解为单片机的诞生。
1976 年,美国 Intel研制出 MCS-48 系列的8位单片机,单片机进入新的阶段。MCS-48 系列单片内部集成8位 CPU,多个并行 I/0 口,8位定时器/计数器,小容量的 RAM 和ROM 等,但是没有串行通信接口,操作简单。
1980年,美国 INETL 公司在 MCS-48 系列的单片机基础上,推出 MCS-51系列单片机。相对于 MCS-48 系列,MCS-51 系列单片机内部增加了串行通信接口,定时器/计数器由8 位变为 16 位,扩大了 ROM 和 RAM 的容量。因为 MC5-51 单片机简单易用,性价比高,被称为“最经典的单片机"

二、单片机派系之间的明争暗斗

2.1 8位单片机的体系

1.MCS-51 系列单片机
MCS-51 系列单片机是美国 Intel 设计的单片机系列的总称,这一个系列包含很多品种,如基酬型(8031、8051、8751),增强型(8032、8052、8752),8051是最经典的产品,其他的型号都是在 8051 的基础上进行功能的增加与制除与修改得到的。一般而言,用 8051 去称呼MCS-51 系列单片机。

  • 8031 单片机
  • 8051单片机  (8位CPU,片内振荡器,4kb字节ROM 128字节RAM  21个特殊功能寄存器 32个IO口、2个16位的定时器/计数器  5个中断源  2个优先级)
  • 8751 单片机

推出基础型单片机之后,Intel又推出增强型(8032、8052、8752),也就是52系列

  • 8032 单片机(8位CPU,片内振荡器,256字节RAM  21个特殊功能寄存器 32个IO口、3个16位的定时器/计数器  6个中断源  2个优先级)
  • 8052 单片机  (8位CPU,片内振荡器,8kb字节ROM  256字节RAM  21个特殊功能寄存器 32个IO口、3个16位的定时器/计数器  6个中断源  2个优先级)
  • 8752 单片机(8位CPU,片内振荡器,8kb字节EPROM  256字节RAM  21个特殊功能寄存器 32个IO口、3个16位的定时器/计数器  6个中断源  2个优先级)

2.AT89 系列单片机
20 世纪 80 年代中期,美国 Intel 公司开始研发高端 CPU,把 MCS-51 单片机的核心技术以专利转让或者技术交换,其中就包含美国的ATMEL公司。
ATMEL 把 Flash 和 8051 内核进行结合,推出帶有 FLASH 存储器的 AT89C5x/AT89S5x,AT89 系列单片机和 MCS-51系列的引脚、功能、指令系统都是完全兼容的。

  • AT89C5x 系列(AT89C51(基础型    )AT89C52(增强型)   不再生产   C 表示COMS)
  • AT89S5x系列

3.STC 系列单片机
 STC系列单片机是国内宏晶科技(STC公司)自主研发的,如STC89C5x、STC8955x,并且支持I5P 下载,使用简单方便。


4.AVR 系列单片机
AVR 单片机也是美国 ATMEL 公司研发出的增强型内置 Flash 的 RISC(精简指令集)高速8位单片机。AVR的单片机的可以广泛的应用在计算机外部设备,工业控制,仪表仪器,通讯设备,家用电器等相关领域。

2.2 C51 和 STM32 的关系


C51 是 20 世纪 70 年代的产物,结构简单,被广泛用于教学,因为其资源有限,引脚数目少,所以不能满足市场需求,就需要一款新的单片机。
基于这样的市场需求,ARM 公司就推出了一款基于 ARMv7 架构的 32 位的 Cortex M3/M4 内校,ST公司(意法半导体)就基于这个内校推出一款32位的 MCU,也就是STM32。STM32由于开发简单(多种开发方式 寄存器开发、同件库开发),性价比高、资源丰富,所以目前而言是主流的 32 位的 MCU。

三、单片机帝国那些不得不说的秘密

3.1 嵌入式与单片机的区别

  • 什么是单片机

单片机是一种集成电路芯片,采用超大规模的集成电路把具有数据处理功能的中央处理器(CPU)、随机存储器 RAM、只读存储器 ROM、输入输出端口以及外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统,广泛应用在工业控制领域。

  • 什么是嵌入式

国外定义:嵌入式都是指嵌入式系统,指的是“用于控制、监视或者辅助操作机器和设备的装置”。
国内定义:以应用为中心,以计算机技术为基础,适用于对体积、功耗、性能等方面有严格要求的计算机系统。

嵌入式特点
     硬件特点:
                    体积小,集成效率高
                    功耗低,抗干扰能力强
软件特点:
             一般软件都是采用C语言去开发(接近底层)

              一般软件是固化在ROM或者FLASH(掉电不丢失)

  • 两者之间的区别

总的来说,就是单片机是比较简单的系统,而嵌入式则侧重于比较复杂的系统

四、探寻单片机脑子里那点事

4.1、主流的ARM内核架构

(1)ARM的基本概念

ARM--是一家英国的一家公司,设计芯片的IP内核,授权其他的半导体公司,三星,TI 索尼 飞利浦 微软

ARM--- 功耗低、性能高的处理器

(2)ARM的内核架构

  • ARM以前的内核:ARM7  ARM9  ARM11(最经典)
  • ARM现在的内核:Cortex A  Cortex R  Cortex M

Cortex A 系列:面向高端智能产品  (手机 平板  搭载操作系统)

Cortex R系列:面向实时性要求高的产品(航空航天、汽车制动系统、硬盘)

Cortex M系列:面向成本敏感型产品(智能穿戴产品、平衡车、四轴飞行器)

五、浅谈单片机帝国的辉煌战绩


5.1 单片机的应用领域


单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器、存储器、输入输出端口和中断系统、定时器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的 300M 的高速单片机。


随着科学技术的快速发展,单片机也被广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。

  • 工业控制

   例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统等。

  • 家用电器

    例如电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材等。

  • 医疗设备

    例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等。

  • 消费电子

    单片机也经常用在消费类电子产品上,比如智能手环、平衡车、扫地机器人等。

六、单片机集成开发环境的安装


6.1 集成开发环境的搭建


KEIL5 集成开发环境的安装
1.什么是 KEIL
KEIL 软件是德国的 keil 公司(被 ARM 公司收购),kei软件提供C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完成开发方案。通过集成开发环境(uVision)将这些部分组合在一起。KEIL 集编辑、编译、仿真等功能于一体。并且还包含软件的调试功能。
需要注意:keil 是收费软件,用于商业用途支持买正版!!!
注意事项:
1)安装 KEIL5 的路径不能存在中文,建议在某个盘新建一个文件夹 如 KEIL51)电脑用户名最好不要是中文,会导致程序编译过程中出现某些未知问题,如果电脑用户21名是中文,按照文档进行操作

七、浅谈单片机开发方式的种类与利弊


7.1 STM32 的开发方式


STM32 的开发方式大体分为两种:函数库开发+寄存器开发

  • 函数库开发

就是利用 ST 公司提供的 STM32 标准函数库,是 ST 公司针对 STM32 开发的一系列 API 接口,可以调用这些函数来配置 STM32的寄存器,开发人员不需要特别关注底层寄存器的操作,有利于快速开发和维护。
库是架设在寄存器和用户代码之间的代码,向下与寄存器相关,向上提供给用户相关接口
优点: 代码可读性好、代码容易维护、方便快速开发
缺点:代码运行效率相对于寄存器来说,大概低10%左右

  • 寄存器开发

STM32 的外设资源十分丰富,所以寄存器的数量增多和复杂度增大,并且要求开发人员需要掌握底层开发的相关知识。
优点:代码运行效率变高 代码量减少 程序运行占用的内存资源减少
缺点:程序开发效率降低  代码的可读性不好 代码不容易维护

八、如何优雅的创建一个固件库工程

8.1 创建工程


固件库利用 ST 公司提供的 STM32 标准函数库,是 ST 公司针对 STM32 开发的一系列 API 接口,可以调用这些函数来配置 STM32的寄存器,开发人员不需要特别关注底层寄存器的操作,有利于快速开发和维护。

九、浅谈单片机最小系统的组成

9.1 单片机的最小系统


1.单片机最小系统的组成
单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器、存储器、输入输出端口和中断系统、定时器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。


单片机最小系统,指的是用最少的元件组成的单片机可以正常工作的系统。对于单片机最小系统而言,需要复位电路、晶振电路、电源电路

2.单片机引脚的基本分类

电源引脚

晶振引脚

复位引脚

控制引脚

输入输出引脚

十、设置单片机的“”心脏“”之晶振电路

10.1 电源电路设计

电源电路可以利用电池供电,一般使用4节5号电池(5号电池每节1.2V),或者利用充电宝或者电脑的 USB 口进行供电,一般可以加上一个电源开关。
注意:AT89C52的供电电压范围:4.5V~5.5V

10.2 晶振电路设计

(1) 什么是晶振
晶振全称叫做品体振荡器,作用就是产生高度稳定的振荡频率,目的是给单片机提供时钟。晶振是一种机电器件,一般使用电损耗很小的石英品体,经过精密的切割打磨,并在石英晶体中镀上电极和引线。
这种元件具有机电效应,如果给晶体通电,就会产生机械力,反过来说,给晶体一个机械力,晶体会产生电。
(2) 晶振的频率
对于 51 单片机,常用的晶振频率是 11.0592MHZ或者 12MHZ
11.0592MHZ(一般用于串口通信,可以得到准确的波特率,如9600)12MHZ(可以得到精准的时时间,一般用到定时器或者延时STC系列常用)
对于 AT89C52 而言,时钟频率 0MHZ~24MHZ,晶振的频率决定单片机的运行速度,晶振频率越高,运行速度越快,稳定性降低,反之同理。
(3) 晶振电路组成
晶振电路一般由晶体振荡器(CRY)和电容(CAP)组成。和人类的心脏类似,单片机离开晶振电路无法正常工作,对于电容而言,一般选择15PF~33PF,常用 22PF、30PF 等。
注意:晶振电路在设计时要尽可能的靠近MCU,防止晶振起振失败或者品振收到干扰。

十一、让单片机得到“重生”之复位电路

11.1 复位电路设计


对于复位电路而言,是51单片机中非常重要的电路,目的就是让程序跑飞(程序运行时出现问题),让单片机进行复位,重新运行程序。
对于 51 单片机而言,想要复位,只要给 RST复位引脚持续 2us 以上的高电平即可
单片机在上电的时候进行复位,也可以设计一个复位按键,当按键按下的时候可以复位。

  • 开机复位

单片机电压小于1.5v,会被作为低电平信号(0v),大于1.5v会被作为高电平信号(5v)

  •     按键复位

十二、设计单片机的“躯干”之外围电路

12.1 外围电路设计

发光二极管是一种常用的发光器件,通过电子与空穴复合释放能量发光,它在照明领域应用广泛。 发光二极管可高效地将电能转化为光能,在现代社会具有广泛的用途,如照明、平板显示、医疗器件等。

十三、轻松实现KEIL与PROTEUS的联调

1.1 keil 和 proteus 仿真如何进行联调
在真正的电路设计,一般设计完电路之后不会直接进行硬件的制作,而是先采用仿真的形式去进行验证。

1、设计单片机的仿真电路

2、编写代码

#include "REG51.h"

// sbit LED = P1^0;

//ÑÓʱº¯Êý
 void delay(unsigned int t){
	unsigned  char i;
	for(;t>0;t--){
	   for(i=100;i>0;i--){
		 }
	}



}
void main(void){ 
  /*unsigned  char i;
	P1=0x55;*/
	//P1 = P1 & 0xFE;
	 //P1 &=0xFE;
	//LED = 0;
	
	//  µÚ¶þ¸ö°¸Àý
	 // unsigned  char i;
	 // P0 = 0x55;
	
  while(1){
			//i=P3;
	   // P0=i;
		¡f//for (i=0;i<8;i++){
			//P2 = ~(0x01<<i);
	   //  delay(900);
		//}
		//LED = 0;
		//delay(2000);
	 // LED = 1;
		
	P2 = 0xFE;
	P2 = ~(0x01<<0);
	delay(300);
	P2 = 0xFD;
	P2 = ~(0x01<<1);
	delay(300);
	P2 = ~(0x01<<2);
	delay(300);
	P2 = ~(0x01<<3);
	delay(300);
	P2 = ~(0x01<<4);
	delay(300);
	P2 = ~(0x01<<5);
	delay(300);
	P2 = ~(0x01<<6);
	delay(300);
	P2 = ~(0x01<<7);
	delay(300);
	}
}

十四、单片机项目教程案例

14.1 LED跑马灯设计

一、实验内容

  1. 硬件部分:打开proteus完成原理图绘制,如下。注意,本图中省略了复位电路和晶振电路,在仿真的时候是可以的,实际设计不能省略,请大家根据所学知识,把这两部分加到图1中。

图 1 电路原理图

在Proteus中该实验需要的元件清单如下:

元器件

单片机

发光二极管管

电源

晶振

名称或型号

AT89C51

LED-BLUE(或LED-RED等都可以

POWER

CRYSTAL

元器件

电容

电阻

名称或型号

GROUND

CAP

RES

2、软件部分:请参照《Keil编写源程序步骤》文档,编写源程序文件。

3、实验内容:使用C语言实现P3口的8个发光管循环点亮。将程序下载到单片机,运行查看结果。

4、最好能使用两种不同的方法实现这一功能。(移位法、查表法等)。

二、注意事项

1、使用C51编写程序,程序扩展名为  *.c,注意左移运算符<<和_crol_()函数的区别。

三、实验报告

  1. 画出原理图、写出程序代码(适当加注释)。

方法一:移位法

方法二:查表法

  1. 图中的限流电阻,阻值如何确定?请写出计算公式及原理

限流电阻的阻值可以通过欧姆定律进行计算,公式为:

‌,其中R为限流电阻的阻值,V为电源电压,VF为电路中二极管等元件的正向电压降,I为要控制的电流。这个公式的原理是基于欧姆定律,即电压等于电流乘以电阻。通过这个公式,可以根据给定的电源电压和元件的正向电压降,以及期望控制的电流,来计算出限流电阻的阻值,以确保电路中的电流不超过元件所能承受的安全范围,避免损坏元件‌。

  1. 原理图中的限流电阻阻值为10KΩ是否可以?          

阻值为200Ω是否可以?    是       

4、请分析_crol_(  ) 函数和<<运算符有什么不同? 

<<运算符和_crol_()函数的主要区别在于它们处理移位的方式不同。‌

‌<<运算符‌执行的是标准的左移操作,当数据向左移动时,空出的位会补0。这意味着,如果最高位移出移位寄存器的范围,新的0会被添加到最低位。这种操作是线性的,移出的位被视为丢失,不再参与后续的计算或处理。

‌crol()函数‌执行的是循环左移操作。在这种操作中,移出移位寄存器的位并不会丢失,而是会循环回到移位寄存器的另一端,即最低位。这意味着,当最高位移出时,它不会像<<运算符那样被简单地补0,而是会循环到最低位的位置。这种操作是循环的,因此被称为循环左移。

简而言之,‌<<运算符‌在执行左移操作时,移出的位被视为丢失,并在移位寄存器的另一端补0;而‌crol()函数‌则实现了真正的循环左移,其中移出的位不会丢失,而是会循环回到移位寄存器的另一端,从而实现了一种周期性的数据移动方式‌

14.2 LED数码管静态显示

1、LED显示器类型

2、LED数码管内部

3、数码管数字表示

4、数码管应用1

实现循环显示00~99的数字

原理图:

​​​​​​​

代码实现:

#include<reg51.h>
unsigned char table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char table1[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时函数
void delay(unsigned int del){
	unsigned int i;
	while(del--){
		for(i=0;i<del;i--){
			;
		}
	}
	
}


void main (void){
	unsigned char num =0;
	while (1){
		//求出十位数字
		P0 = table1[num/10];
		//求出个位数字
		P2 = table1[num%10];
		// 保持num在00~99之间
		num = (num+1)%100 ;
			delay(5000);
	}
}

14.3 LED数码管动态显示

14.4 独立按键的设计

1、按键的外观及特点

机械式弹性开关,在闭合及断开的瞬间均伴随有一连串的抖动,抖动造成电压的波动。

2、按键消抖原理
3、独立按键的应用1

思路: (1)读取键值引导程序进行分支控制 (2)灯控制

原理图

代码:

#include <reg51.h>
//定义自上而下显示的数组
unsigned char led_up[4] = {0xfe,0xfd,0xfb,0xf7};
//定义自下而上显示的数组
unsigned char led_down[4] = {0xf7,0xfb,0xfd,0xfe};

//定义延时函数
void delayms(unsigned int x)
{
	unsigned char i;
	while(x--)
	{
		for(i=0;i<120;i++)
		{;}
	}
}


main(){
  // 定义temp临时接收按键传递值
	unsigned char temp;
	unsigned char i;
	//定义key存储按键的状态
	unsigned key=0;
	while(1)
	{ 
		//进行与运算
		temp = P0&0xf;
		switch(temp)
		{
			case 0x0e:key=1;
		          break;
		  case 0x0d:key=2;
		          break; 
		  case 0x0b:key=3;
		          break;  
		   case 0x07:key=4;
		          break; 

		}
	//根据key的值给P2组引脚赋值
	    if(key!=0){
	    switch(key){
			case 1:P2=0xff;
			       break;
			case 2:P2=0;
			       break;
			case 3:for(i=0;i<4;i++){
			         P2=led_up[i];
					     delayms(500);
					      }
			       break;
			case 4:for(i=0;i<4;i++){
			         P2=led_down[i];
					     delayms(500);
					       }
			       break;
		     }
	       }
	
	}

}
4、独立按键的应用2

实现功能按下上面按钮数字加1按下下面按钮数字减1,使用延时消除按键抖动

原理图:

实现代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值