STC51单片机IO口模式快速设置
学习笔记之-51单片机IO口详解

学习笔记之-51单片机IO口详解前言 对单片机的控制,其实就是对I/O口的控制,无论单片机对外界进行何种控制,或接受外部的何种控制,都是通过I/O口进行的。
51单片机每个IO端口结构都有差异,都各有各的特点。
在平时的应用中,特别是设计外围硬件的时候,如果不了解其内部结构的话设计起来也许会有问题(特别是用到P0口),所以好好了解每个端口的结构是非常有必要的。
再有一点是51单片机的引脚不像STM32那样可以支持重映射,所以硬件布局的时候也要注意这一点。
下面就是在网上找的一点资料,整理如下:51单片机I/O口内部结构1.1P0端口的结构及工作原理 P0端口8位中的一位结构图 由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。
图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。
下面,我们先介绍一下组成P0口的每个单元部份:- 输入缓冲器:在P0口中,有两个三态的缓冲器,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态)。
要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。
下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。
- D锁存器:构成一个锁存器,通常要用一个时序电路,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。
上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。
对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。
51单片机串口设置及应用

51单片机串口设置及应用单片机的串口设置及应用是指通过单片机的串口功能来进行通信的一种方式。
串口通信是一种全双工通信方式,可以实现双向数据传输。
单片机通过串口可以与其他设备进行通信,如计算机、传感器、LCD显示屏等。
1. 串口设置:单片机的串口通信一般需要进行以下设置:(1)串口模式选择:要根据实际情况选择串口工作模式,一般有异步串口和同步串口两种。
(2)波特率设置:串口通信需要设置一个波特率,即数据传输速率。
常见的波特率有9600、19200、115200等,需要与通信的设备保持一致。
(3)数据位设置:设置传输的数据位数,常见的有8位、9位等。
(4)停止位设置:设置停止位的个数,常见的有1位、2位等。
(5)校验位设置:可以选择是否启用校验位,校验位主要用于检测数据传输的正确性。
2. 串口应用:串口通信在很多领域都得到广泛应用,下面列举几个常见的应用场景:(1)串口与计算机通信:通过串口可以实现单片机与计算机的通信,可以进行数据的读写、控制等操作。
例如,可以通过串口将传感器采集到的数据发送给计算机,由计算机进行进一步处理分析。
(2)串口与传感器通信:串口可以与各种传感器进行通信,可以读取传感器采集到的数据,并进行处理和控制。
例如,可以通过串口连接温度传感器,读取实时的温度数据,然后进行温度控制。
(3)串口与LCD显示屏通信:通过串口可以实现单片机与LCD显示屏的通信,可以将需要显示的数据发送给LCD显示屏进行显示。
例如,可以通过串口将单片机采集到的数据以数字或字符的形式显示在LCD上。
(4)串口与外部存储器通信:通过串口可以与外部存储器进行通信,可以读写存储器中的数据。
例如,可以通过串口读取SD卡中存储的图像数据,然后进行图像处理或显示。
(5)串口与其他设备通信:通过串口可以和各种其他设备进行通信,实现数据的传输和控制。
例如,可以通过串口与打印机通信,将需要打印的数据发送给打印机进行打印。
总结:单片机的串口设置及应用是一种实现通信的重要方式。
单片机io口的某位高低电平设置方法

单片机io口的某位高低电平设置方法下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!单片机IO口的某位高低电平设置方法在嵌入式系统中,单片机的IO口控制是非常基础且常见的操作。
STC51单片机IO口模式快速设置

STC51单片机IO口模式的快速设置新型51单片机STC系列,较传统51单片机在性能和速度上有根本性的提高。
速度提高8—12倍;片上RAM大量增加;片上外围模块大量增加,等等。
其中IO口的模式增加为4种(传统51只有1中),以P0口为例:这里,每个端口新增两个寄存器PxM0, PxM1(x=0,1,2,3)。
在设置每一个IO端的模式时都需要对这两个寄存器进行操作。
比如:要将P0.7设为推挽输出,P0.6设为准双向口,P0.5设为高阻输入;P0.4设为开路模式,P0.3---P0.0都设为准双向口,那么需要如下的代码:IO_Init(){P0M0=0x30;//0011 0000P0M1=0x90;//1001 0000}这样的设置不便于记忆,很容易写错,且写好的代码可读性差,为此,我们可以通过一个宏定义来解决,具体如下:#define PORT0 0#define PORT1 1#define PORT2 2#define PORT3 3#define BIT0 0#define BIT1 1#define BIT2 2#define BIT3 3#define BIT4 4#define BIT5 5#define BIT6 6#define BIT7 7#define STANDARD 0#define PP_OUT 1#define Z_IN 2#define OD 3#define IOMODE(Port,bit_n,mode) { \switch(Port)\{\case 0:\switch(mode) { \case STANDARD: P0M0&=~(1<<bit_n); P0M1&=~(1<<bit_n); break; \case PP_OUT: P0M0&=~(1<<bit_n); P0M1|= (1<<bit_n); break; \case Z_IN: P0M0|=(1<<bit_n); P0M1&=~(1<<bit_n); break; \case OD: P0M0|=(1<<bit_n); P0M1|=(1<<bit_n); break; \} \break;\case 1:\switch(mode) { \case STANDARD: P1M0&=~(1<<bit_n); P1M1&=~(1<<bit_n); break; \case PP_OUT: P1M0&=~(1<<bit_n); P1M1|= (1<<bit_n); break; \case Z_IN: P1M0|=(1<<bit_n); P1M1&=~(1<<bit_n); break; \case OD: P1M0|=(1<<bit_n); P1M1|=(1<<bit_n); break; \} \break;\case 2:\switch(mode) { \case STANDARD: P2M0&=~(1<<bit_n); P2M1&=~(1<<bit_n); break; \case PP_OUT: P2M0&=~(1<<bit_n); P2M1|= (1<<bit_n); break; \case Z_IN: P2M0|=(1<<bit_n); P2M1&=~(1<<bit_n); break; \case OD: P2M0|=(1<<bit_n); P2M1|=(1<<bit_n); break; \} \break;\case 3:\switch(mode) { \case STANDARD: P3M0&=~(1<<bit_n); P3M1&=~(1<<bit_n); break; \case PP_OUT: P3M0&=~(1<<bit_n); P3M1|= (1<<bit_n); break; \case Z_IN: P3M0|=(1<<bit_n); P3M1&=~(1<<bit_n); break; \case OD: P3M0|=(1<<bit_n); P3M1|=(1<<bit_n); break; \} \break;\}\}有了上面的宏定义,在初始化程序中可以直接这样写IO_Init(){IOMODE(PORT0,BIT7,PP_OUT)IOMODE(PORT0,BIT6, STANDARD)IOMODE(PORT0,BIT5, Z_IN)IOMODE(PORT0,BIT4, OD)IOMODE(PORT0,BIT3, STANDARD)IOMODE(PORT0,BIT2, STANDARD)IOMODE(PORT0,BIT1, STANDARD)IOMODE(PORT0,BIT0, STANDARD)}。
STC51单片机的IO配置问题解决方案

STC51单片机的IO配置问题解决方案STC51单片机的IO配置问题解决方案我们人类可以通过连接手脚上神经网络,肌腱,控制着我们的肌肉做出各种动作,完成各种造型。
那单片机里的肌腱和神经就是今天我们要讲的主角----单片机的IO 口。
我们学习单片机,到底学什么呢?最终落脚点,就是落在单片机的IO口上,其实最终就是操作单片机的IO口,什么串口通讯,IIC通信协议,中断,定时器,最终在单片机上体现出来的还是我们对单片机IO口的操作。
既然那么重要,今天我们就来好好的说一说单片机的IO口。
说起单片机的IO口,大家肯定会笑话小编,这么简单的东西,还要你说。
对,它是简单,看遍你是个人写的单片机教程,最开始讲编程就是从操作单片机IO口开始,都是从点亮一个LED灯开始,是的点亮一个LED灯,就是对单片机IO的最简单的操作,要么给高电平,要么给低电平,这也是操作IO的唯一的两个方法。
怎么说?举个例子:要在某个IO上输出PWM信号,其实就是有规律的在这个IO上交替的给高低电平,给的速度快慢决定了PWM信号的频率,给的高电平的时间所占一个高低电平周期的多少,决定了这个PWM信号的占空比。
这么一说,高大上的PWM信号是不是就简单多了。
说了这么多,下面我们具体来说STC51单的IO的配置和各个模式的区别。
·正·文·来·啦·STC的51单片机为了更多更能的使用和运用于不同场合,STC51单片机设计了4中IO口模式,分别是:准双向IO口模式、推挽输出模式、高阻输入模式和开漏输出模式。
每个IO口的模式配置,需要两个寄存器结合起来进行设置。
这两个寄存器分别是PnM1和PnM0,(在STC8系列芯片中n=0,1,2,3,4,5,6,7),以P0口为例,配置P0口需要P0M1和P0M0两个寄存器进行配置,具体如下图:即P0M1寄存器的第0位和P0M0寄存器的第0位组合起来配置P0.0位的模式,P0M1寄存器的第1位和P0M0寄存器的第1位组合起来配置P0.1位的模式,P0口的其他位以此。
2.1.1 51单片机IO操作.

④ P3口(10~17脚)
8位准双向口,操作方式等和P1类似。在8051中,P3口还 可按位复用为其它功能,具体见下表:
口线 P30 P31 P32 P33 P34 P35 P36 P37
引脚 10 11 12 13 14 15 16 17
第二功能 RxD(串行口输入) TxD(串行口输出) INT0(外部中断0) INT1(外部中断1) T0(定时器0外部输入) T1(定时器1外部输入) WR(外部存储器写脉冲) RD(外部存储器读脉冲)
CPU可对其按字节方式或位方式进行操作。 P0口的内部电路如下图所示:
P0口内部电路构成
0
地址/数据 控制
VCC
读锁存器
内部总线 写锁存器
S SET Q
P0.X 锁存器
R CLR Q
0
二选一 复用器
读引脚
P0.X引脚
② P1口(1~8脚) 8位准双向I/O口。没有高阻状态,输入也不能锁存,必
须先输出1才能正确读出端口电平,故称为准双向口。 CPU既可以对P1进行字节操作,也可以通过位操作方式
当EA接地时,单片机只运行外部程序存储器中的程序。 对于有内部ROM/FLASH的单片机,此引脚还用来在编程 时输入编程电源。
(4) 并行I/O口P0~P3的结构和功能
① P0口 (39~32脚) 双向8位三态I/O口,在外接存储器时,作为数据总线
和地址总线的低8位(复用,通过ALE信号区分); P0口的每一位能以吸收电流的方式驱动8个TTL负载。
对于片内有ROM/FLASH的单片机,此引脚在编程期间 输入编程脉冲。
④ EA/VPP (31脚) 当EA外接高电平时,单片机运行内部ROM/FLASH中的程
51单片机 速度调节+定时控制

#define MENU_HOUR2
#define MENU_MINUTE3
uchar bFlag_5ms;// 5ms标志
uchar cTickCnt_5ms;// 5ms计数值
uchar cFanSpeed;//风速
uchar cFanPwmCnt;//风扇PWM计数
uchar cLedBuf[4];// LED缓存
uchar Timer;//定时标志
uchar Set_Hour;//定时小时
uchar Set_Minute;//定时分钟
uchar cLed_off;//数码管关
uint led;
uint cSecCnt;//秒计数
uchar code tablename[] = {~0x92,~0xbf,~0x87};//s -t
void InitTimer0(void)//1毫秒
{
TMOD |= 0x01;
TH0 = 0xfc;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xfc;
TL0 = 0x18;
if(++cTickCnt_5ms == 5)
case KEY_DOWN: //减键
{
if(cMenu == MENU_NULL) //风速调整
{
if(--cFanSpeed == -1)
cFanSpeed = 10;
}
else if(cMenu == MENU_TIMER) //定时调整
51单片机IO说明

一、P0端口的结构及工作原理P0端口8位中的一位结构图见下图:由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。
再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。
下面,我们先就组成P0口的每个单元部份跟大家介绍一下:先看输入缓冲器:在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),大家看上图,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。
下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。
D锁存器:构成一个锁存器,通常要用一个时序电路,时序的单元电路在学数字电路时我们已知道,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。
大家看上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,Q非是反向输出端。
对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及反向输出端Q非的。
如果时序控制端CP的时序脉冲一旦到了,这时D端输入的数据就会传输到Q及Q非端。
数据传送过来后,当CP时序控制端的时序信号消失了,这时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。
如果下一个时序控制脉冲信号来了,这时D端的数据才再次传送到Q端,从而改变Q端的状态。
多路开关:在51单片机中,当内部的存储器够用(也就是不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器)时,P0口可以作为通用的输入输出端口(即I/O)使用,对于8031(内部没有ROM)的单片机或者编写的程序超过了单片机内部的存储器容量,需要外扩存储器时,P0口就作为‘地址/数据’总线使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STC51单片机IO口模式的快速设置新型51单片机STC系列,较传统51单片机在性能和速度上有根本性的提高。
速度提高8—12倍;片上RAM大量增加;片上外围模块大量增加,等等。
其中IO口的模式增加为4种(传统51只有1中),以P0口为例:这里,每个端口新增两个寄存器PxM0, PxM1(x=0,1,2,3)。
在设置每一个IO端的模式时都需要对这两个寄存器进行操作。
比如:要将设为推挽输出,
设为准双向口,
设为高阻输入;
设为开路模式,
都设为准双向口,
那么需要如下的代码:
IO_Init()
{
P0M0=0x30;//0011 0000
P0M1=0x90;//1001 0000
}
这样的设置不便于记忆,很容易写错,且写好的代码可读性差,为此,我们可以通过一个宏定义来解决,具体如下:
#define PORT0 0
#define PORT1 1
#define PORT2 2
#define PORT3 3
#define BIT0 0
#define BIT1 1
#define BIT2 2
#define BIT3 3
#define BIT4 4
#define BIT5 5
#define BIT6 6
#define BIT7 7
#define STANDARD 0
#define PP_OUT 1
#define Z_IN 2
#define OD 3
#define IOMODE(Port,bit_n,mode) { \
switch(Port)\
{\
case 0:\
switch(mode) { \
case STANDARD: P0M0&=~(1<<bit_n); P0M1&=~(1<<bit_n); break; \
case PP_OUT: P0M0&=~(1<<bit_n); P0M1|= (1<<bit_n); break; \
case Z_IN: P0M0|=(1<<bit_n); P0M1&=~(1<<bit_n); break; \
case OD: P0M0|=(1<<bit_n); P0M1|=(1<<bit_n); break; \
} \
break;\
case 1:\
switch(mode) { \
case STANDARD: P1M0&=~(1<<bit_n); P1M1&=~(1<<bit_n); break; \
case PP_OUT: P1M0&=~(1<<bit_n); P1M1|= (1<<bit_n); break; \
case Z_IN: P1M0|=(1<<bit_n); P1M1&=~(1<<bit_n); break; \
case OD: P1M0|=(1<<bit_n); P1M1|=(1<<bit_n); break; \
} \
break;\
case 2:\
switch(mode) { \
case STANDARD: P2M0&=~(1<<bit_n); P2M1&=~(1<<bit_n); break; \
case PP_OUT: P2M0&=~(1<<bit_n); P2M1|= (1<<bit_n); break; \
case Z_IN: P2M0|=(1<<bit_n); P2M1&=~(1<<bit_n); break; \
case OD: P2M0|=(1<<bit_n); P2M1|=(1<<bit_n); break; \
} \
break;\
case 3:\
switch(mode) { \
case STANDARD: P3M0&=~(1<<bit_n); P3M1&=~(1<<bit_n); break; \
case PP_OUT: P3M0&=~(1<<bit_n); P3M1|= (1<<bit_n); break; \
case Z_IN: P3M0|=(1<<bit_n); P3M1&=~(1<<bit_n); break; \
case OD: P3M0|=(1<<bit_n); P3M1|=(1<<bit_n); break; \
} \
break;\
}\
}
有了上面的宏定义,在初始化程序中可以直接这样写
IO_Init()
{
IOMODE(PORT0,BIT7,PP_OUT)
IOMODE(PORT0,BIT6, STANDARD)
IOMODE(PORT0,BIT5, Z_IN)
IOMODE(PORT0,BIT4, OD)
IOMODE(PORT0,BIT3, STANDARD)
IOMODE(PORT0,BIT2, STANDARD)
IOMODE(PORT0,BIT1, STANDARD)
IOMODE(PORT0,BIT0, STANDARD)
}。