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灯中的某个点亮。

相关推荐
keyipatience8 小时前
Git学习(4)Git分布式优势与实战配置全解析
git·学习
览讯冷却8 小时前
冷却塔噪声的健康危害与法规要求的技术梳理
经验分享·笔记·科技·其他·百度·制造·业界资讯
Dory_Youth8 小时前
电脑的搜索功能不能用,一搜就黑屏闪退
运维·笔记
bessyon9 小时前
信息熵减与医疗交付:以3D检测与设备溯源为例
笔记
comyccccc11 小时前
STM32F407VET6核心板的部分电路绘制学习笔记
笔记·stm32·学习
叼烟扛炮11 小时前
Linux 学习笔记(三十六):并发进阶——读写锁 vs 自旋锁,到底怎么选?
linux·运维·服务器·笔记·学习
是隼人11 小时前
buuctf-pwn [极客大挑战 2019]Not Bad(orw+jmp)题解(学习过程持续更新)
学习·安全·pwn入门·ctf入门
摇滚侠11 小时前
《On Java 中文版 基础卷》阅读笔记 复用 13
java·笔记·python
摇滚侠11 小时前
《大模型是怎样跑起来的(轻科技)》软件篇 阅读笔记
笔记·科技
hss1234567812 小时前
天津整装公司横向测评:红杉树大宅整装与业某峰、东某日盛在工期、ENF板材、防水厚度和监理模式上的数据差异
笔记