51单片机编程学习笔记——管脚输出

大纲

《51单片机编程学习笔记------编译代码点亮LED》一文中,我们看到了如何通过编码控制LED的亮点。其核心代码是

c 复制代码
sbit LED1=P2^0;	//将P2.0管脚定义为LED1
sbit LED2=P2^1;	//将P2.1管脚定义为LED2

LED1=0;	//LED1端口设置为低电平
LED2=0;	//LED2端口设置为低电平

在这段代码中,我们通过设置管脚为低电平来让LED两端产生电压差,从而点亮LED。此时我们就是将管脚作为输出端口。

为什么P2^0可以代表P2.0管脚呢?

回顾我们在《51单片机编程学习笔记------LED原理图》中的介绍,LED的电路原理图如下。

VCC作为正极在LED的P端,N端则连着单片机的P20管脚。

我们再在原理图中查看单片机核心的原理图,可以找到P20管脚。

同时我们还发现P系列管脚每8个为一组:

  • P00~P07
  • P10~P17
  • P20~P27
  • P30~P37

这4组共28个管脚构成了51单片机核心控制外部器件的端口。

那代码是怎么控制这些端口的呢?我们回到代码上

c 复制代码
#include <REG52.H>
sbit LED1=P2^1;

上面代码的第二行中的P2是在REG52.H中定义的

c 复制代码
#ifndef __REG52_H__
#define __REG52_H__

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;

sfr 关键字是用于定义特殊功能寄存器(Special Function Register,SFR)的关键字。使用 sfr 关键字后,紧跟着是要定义的特殊功能寄存器的名称,然后是等号和该寄存器的地址值。

这就意味着代码中P2表示的特殊功能寄存器,它的地址是0xA0。

P3和P2之间有16bit空间,其中前8bit对应于P20到P27管脚。

c 复制代码
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;

sbit是用于定义可位寻址对象的关键字,主要用于访问可位寻址的特殊功能寄存器中的某位或可位寻址的内部 RAM 单元,方便对这些特定位进行单独操作。简单来说,sbit定义的是"位变量"。这就意味着给它赋值(不是定义),实际修改的是该位空间中的值,而不是该位的地址。

c 复制代码
sbit LED1=P2^0;	// LED1是位变量,其地址是P2^0

LED1=0;	//给变量赋值,而不是修改变量的地址

当理解这个概念后,我们就可以很清晰了解控制管脚输出的代码设计。

比如下面代码,我们设计了一个跑马灯功能。

c 复制代码
#include <REG52.H>
#include <intrins.h>

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

void Delay(unsigned int millisecond) {
	unsigned int i = 0;
 	for (i = 0; i < millisecond; i++) {
		Delay1ms();	
	}
}


void marquee() {
	unsigned char i;
	for(i=0;i<8;i++) {
		P2=~(0x01<<i);
		Delay(200);
	}
}

void main() {	
	while(1) {
		marquee(); 	
	}		
}

0x01<<i是按位位移1,这样可以构成0x00100000这样的值。然后我们按位取反,就会得到0x11011111。然后将该值赋给P2寄存器空间,这样就让8个LED灯中的某个点亮。

相关推荐
春风解人意7 小时前
从零开始学习嵌入式P32----网络基础之TCP
c语言·网络·学习·tcp/ip
李帅朋7 小时前
微分基本定义笔记
人工智能·笔记·深度学习·神经网络
传奇开心果编程8 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
水巷石子8 小时前
备考系统架构设计师第一天
学习·架构·软考·设计·考试
是隼人9 小时前
buuctf-pwn inndy_echo(32位fmt)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
xian_wwq10 小时前
【学习笔记】深度认知系列-第16讲-提示词工程
人工智能·笔记·学习
洛阳纸贵10 小时前
MATLAB-matlab基础知识
学习·算法·matlab
Vcaker10 小时前
Linux学习25-harbor私有仓库部署
linux·运维·学习
留白_11 小时前
【tableau入门学习】5、筛选器、参考线和集
学习·tableau
youm200311 小时前
认识Redis
redis·笔记·学习