关于嵌入式学习——嵌入式硬件2

一基本概念:

GPlO :Genral Purpose Input/Output,GPIO是51单片机和外界交互最基本的方式

工作模式:

输出模式: 单片机给定引脚一个电平(高电平(5V)低电平(0V)),控制引脚实现高低电平

输入模式 :检测引脚电平变化

类比GPIO为 水龙头:

输出模式:控制水龙头(水流)

输入模式:观察水龙头是否有水流**(按键)**

二 按键:

按键K1,两个引脚被接到GND和P14引脚,当K1按被技下时,P14引|脚会和GND短路到一起,P14引脚即会呈现低电平

判断按键是否被按下:只需要检测对应的引即是否为低电平

P14 引脚是否为低电平?P1 初始化全为1, (P1 & 0001 0000) == 0 说明P14 引脚是为低电平,按键1被按下。

cpp 复制代码
#include <reg51.h>

//初始化是P1高四位和P35置1
void Key_Init(void)
{
	P1 |= (0xF0 << 0);
	P3 |= (1 << 5);

	return ;
}

//检测是否有按键按下
int Key_Press(void)
{
	//初始化P1全为1 若有按键按下,则说明按位与不为0 
	int ret = 0;
	//把1放在第 4bit 位置  通过这种方式定位到具体按键
	if ((P1 & (1 << 4)) == 0)//注意加括号 关系运算符优先级高于位运算符
	{	
	 	ret = 1;
	}
	else if ((P1 & (1 << 5)) == 0)
	{
		ret = 2;
	
	}
	else if ((P1 & (1 << 6)) == 0)
	{
		ret = 3;
	
	}
	else if ((P1 & (1 << 7)) == 0)
	{
		ret = 4;
	
	}
	else if ((P3 & (1 << 5)) == 0)
	{
		ret = 5;
	
	}

	return ret;
}

三、中断:

1.中断概念:CPU在执行一个任务时,被外界更为紧急的事件打断,转而去执行更为紧急的任务,执行完后再回到刚才的地方继续向下执行,这一过程叫做中断

2.中断源:打断CPU执行当前任务的事件/源头叫做中断源(51单片机只有5个中断源)

3中断源分类:外部中断0,外部中断1,定时器0,定时器1,串口

4外部中断:单片机上的引脚电平变化所引起的中断(INT0(P3-2)、INT1(P3-3))

5.中断优先级:CPU再去处理中断任务时候,会去比较多个中断的优先级,优先去处理优先级高的中断

6.中断嵌套:处理一个中断时,再套另外的中断:51单片机只允许嵌套2层
7.中断处理流程:

  • (1) 中断源发出中断请求
  • (2)检查CPU是否响应中断及该中断源是否被屏蔽
  • (3)比较中断优先级
  • (4) 保护现场
  • (5)执行中断服务函数 (回调函数)
  • (6)恢复现场

四、中断相关寄存器配置:

1 IE寄存器(中断允许寄存器)


(1)将IE寄存器中的bit7,EA置1,代表CPU能够响应所有中断
(2)将IE寄存器中的bit0,EX0置1,代表允许外部中断0产生中断
2.TCON寄存器(定时器寄存器)

(1)将TCON寄存器的bit1,IE0置1,代表向CPU发起中断请求,CPU响应完中断请求后,硬件清"0"
(2)将TCON寄存器的bit0,IT0置1,代表外部中断0下降沿触发中断

五、定时器

  1. **定时器:**能够产生一个精准的定时,不同外设对时序的要求高(高电平和低电平时间是精准的)
  2. 51单片机内部有两个定时器,分别为timer0、timer1 ,所使用自增型定时器(计数器16位:0-65535)
  3. Clock,时钟,CPU运行节拍,频率(Intel2.1GHZ)
    1. 频率单位:HZ
    2. 时间单位:S
    3. 频率和时间关系:1/2.1GHZ ns(hz-s khz -ms Mhz-us Ghz-ns)

51单片机:

  • 晶振,晶体振荡器(12MHZ or 11.059MHZ)
  • 51单片机达不到12MHZ,将12MHZ进行12分频,12MHZ/12 = 1MHZ(机器实际使用)
  • 51单片机完成一条指令运算:1/1MHZ=1uS
  • ex:通过定时器0实现1ms定时:
    • 1ms = 1000us,定时器溢出是计数器16位占满总共是65535次运算, 一条指令运算需要1us,花费时间1000us刚好溢出,即进行1000次运算,定时器初值:64535。

六、定时器相关寄存器配置:

8位自动重装载定时器:分为TLO和THO两部分,1byte,实际参与计数的只有TLO,当TLO中的值加到255溢出后,再将THO中的值重新装入到TLO中
TCON寄存器:
(1)bit4置1,TMOD寄存器中的Gate位清0,代表允许定时器开始计数


TMOD寄存器:
(1)定时器0>低四位清0
(2)将TMOD寄存器中的M0,bit0置1,代表定时器0工作在16位定时器/计数器模式

工作模式寄存器

IE寄存器:

(1)将IE寄存器中的bit7置1,代表CPU能够响应所有中断

(2)将IE寄存器中的bit1置1,代表允许定时器0产生中断

cpp 复制代码
#include <reg51.h>
#include "led.h"

unsigned int g_i = 0;

//定时器中断服务函数
void Timer0_Handler(void) interrupt 1
{
	TH0 = 64535 >> 8;
	TL0 = 64535;	//溢出之后,下一次进入这个函数 定时器得重新赋初始值
	g_i++;
	if(g_i >= 1000)//1000ms执行一次中断处理函数 执行1000次才执行led反转 即1s
	  {
	  	 LED_NOR();
		 g_i = 0;
	  }

	return;
}

//定时器0初始化函数
void Timer0_Init(void)
{
	//配置定时器0工作模式寄存器
	TMOD &= ~(0x0F << 0);//TMOD寄存器低四位清零
	TMOD |= (1 << 0);//TMOD bit0 M0置1 工作在16位定时器模式
	//补充一点:TMOD bit2 C/T 置0是定时器 置1为计数器 这里初始化低四位清零正好赋值0

	//配置16位定时器的高八位和低八位  
	TH0 = 64535 >> 8;//64535是16位数据,右移八位正好把高八位赋值给TH0;
	TL0 = 64535;// 64535是16位数据,多位数据赋值给少位数据,优先赋值低位
	 //定时1000ms:执行一次指令需要1ms 起点64535 执行1000次 65535计数溢出 触发中断函数

	//配置定时器0中断控制寄存器	
	TCON |= (1 << 4);//配合TMOD bit3 GATE置0,TCON bit4 TR0置1 表示允许定时器T0开始计数

	//配置定时器0中断允许寄存器
	IE |= (1 << 7)|(1 << 1);	//运行CPU响应中断(总开关)以及定时器0产生中断(子开关)
	
	
}

流程:

  1. 先配置TMOD模式选择寄存器,将低四位清0,再将bit0置1代表工作在16位定时器

  2. 向TH0和TL0中装入定时器的初值(1ms -> 64535)

  3. 将TCON寄存器中的bit6置1,代表允许定时器开始计数

  4. 将IE寄存器中的bit7和bit1置1,开启中断总开关和定时器0的子开关

  5. 编写定时器0的中断服务函数

七、蜂鸣器、PWM:

PWM:

  • 脉冲宽度调制,能够让引脚产生一个方波,周期性的让引脚的电平发生翻转
  • PWM周期:一个方波所经历的周期(从上升沿到上升沿所经历的时间/从下降沿到下降沿所经历的时间)
  • PWM占空比:在一个周期内高电平所占的比例

蜂鸣器:

  • 震荡源 -> 声音(波)-> 音调不同 -> 波的频率发生变化 -> 高音 高频 低音 低频
  • 音量不同 -> 波的振幅 -> 能量
  • 有源蜂鸣器:存在震荡源,通电后蜂鸣器会发出持续频率的声音
  • **无源蜂鸣器:**不存在震荡源,通电后蜂鸣器不会发出声音,需要给蜂鸣器一个震荡

原理:P11高电平,NPN基极高电平,发射极接地,NPN导通,集电极电电压接近0,BZ1一端VCC高电平,一端低电平,导通,蜂鸣器响;同理P11低电平,NPN基极低电平,发射极接地,NPN不导通,集电极高阻态电压很高,BZ1一端VCC高电平,一端高电平,没有电压差不导通,蜂鸣器不响。(无源蜂鸣器:需要给蜂鸣器一个震荡,PWM方波)

如何计算:

200hz (周期的倒数,周期代表从高电平到下一高电平的时间)

50%的占空比(高电平占一周期的比例)

蜂鸣器200hz--->周期为0.005s---->高电平周期---->0.0025s------>定时器定时0.0025s

晶振12GHZ------>12分频供给使用 ---->机器周期频率1GHZ---->1000000HZ----->执行一次指令需要1us----->定时器定时0.0025s需要执行------>2500次------>65535计数器溢出----->因此初始值为63035

cpp 复制代码
#include <reg51.h>
#include "led.h"

unsigned int g_i = 0;

//定时器中断服务函数
void Timer0_Handler(void) interrupt 1
{
	TH0 = g_i >> 8;
	TL0 = g_i;	//溢出之后,下一次进入这个函数 定时器得重新赋初始值
	g_i++;
	P2 ^= (1 << 1);//P21引脚置1置0 来回翻转
	return;
}

//定时器0初始化函数
void Timer0_Init(void)
{
	//配置定时器0工作模式寄存器
	TMOD &= ~(0x0F << 0);//TMOD寄存器低四位清零
	TMOD |= (1 << 0);//TMOD bit0 M0置1 工作在16位定时器模式
	//补充一点:TMOD bit2 C/T 置0是定时器 置1为计数器 这里初始化低四位清零正好赋值0

	//配置16位定时器的高八位和低八位  
	TH0 = g_i >> 8;//64535是16位数据,右移八位正好把高八位赋值给TH0;
	TL0 = g_i;// 64535是16位数据,多位数据赋值给少位数据,优先赋值低位
	 //定时1000ms:执行一次指令需要1ms 起点64535 执行1000次 65535计数溢出 触发中断函数

	//配置定时器0中断控制寄存器	
	TCON |= (1 << 4);//配合TMOD bit3 GATE置0,TCON bit4 TR0置1 表示允许定时器T0开始计数

	//配置定时器0中断允许寄存器
	IE |= (1 << 7)|(1 << 1);	//运行CPU响应中断(总开关)以及定时器0产生中断(子开关)
	
	
}

重点:

1GPIO输入模式、输出模式

  1. 按键工作原理(GPIO输入)

  2. 中断概念

  3. 中断源概念、中断源个数、哪几个中断源

  4. 外部中断、定时器中断概念

  5. 中断处理流程

  6. 51单片机中定时器的个数?类型

  7. 16位定时器和8位自动重装载定时器的区别

  8. PWM的概念、PWM周期、PWM占空比

10、有源蜂鸣器和无源蜂鸣器的区别

11、51单片机蜂鸣器实现原理

相关推荐
KaifuZeng12 分钟前
通信与接口协议面试十七、SFP光模块
单片机·嵌入式硬件·面试·通信与接口协议
jsons117 分钟前
rocky8内网离线批量补丁(你之前搭建的架构,多台服务器首选,无订阅)
linux·运维·服务器
进击的小头22 分钟前
第16篇:Buck-Boost 升降压电路:核心原理、参数计算与典型应用场景全讲解
经验分享·学习·数学建模
深圳尚鼎24 分钟前
尚鼎防潮柜分析:三核EtherCAT实时控制MCU/DSP发展趋势
单片机·嵌入式硬件
霸道流氓气质36 分钟前
Java 工程师 AI 智能体学习路线 · 阶段 1:AI / LLM 基础认知 详解
java·人工智能·学习
阿拉斯攀登44 分钟前
SPI 设备驱动开发
linux·驱动开发·嵌入式硬件·linux内核·嵌入式·linux驱动·spi
Dlrb12111 小时前
51单片机基础知识
单片机·嵌入式硬件·51单片机
zhou135284822671 小时前
Windows 配置 WSL (Ubuntu) 环境完整指南
linux·windows·ubuntu
hunter1990101 小时前
Higress学习
学习
FREEDOM_X1 小时前
Linux 进程间通讯(IPC)——总结
linux·c语言·前端·嵌入式硬件·struts