n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制N76E003 最多支持 26 个可位寻址的通用 I O 引脚 分成 4 组 P0 到 P3 每一个端口有它的端口控制寄存器 Px 端口控制寄存器的写和读有不同的意思 写端口控制寄存器设置输出锁存逻辑值 读端口引脚的逻辑状态 所有 I O 引脚 除 P2 0 可以被软件独立配置成四种 I O 模式中的一种 这四种模式是准双向模式 标准 8051 端口结构 推挽输出 输入和开漏模式 每一个端口通过两个特殊功能寄存器 PxM

N76E003最多支持26个可位寻址的通用I/O引脚,分成4组 P0 到 P3 。每一个端口有它的端口控制寄存器(Px)。端口控制寄存器的写和读有不同的意思。写端口控制寄存器设置输出锁存逻辑值,读端口引脚的逻辑状态。所有I/O引脚(除P2.0)可以被软件独立配置成四种I/O模式中的一种。这四种模式是准双向模式(标准8051端口结构)、推挽输出、输入和开漏模式。每一个端口通过两个特殊功能寄存器PxM1 和 PxM2来选择端口Px的I/O模式。下表指示如何选择Px.n的I/O模式。注意任何复位之后,默认的配置是高阻输入模式。

n76e003浮点_N76E003之IO控制

所有I/O引脚可以通过PxS寄存器里对应的位选择为TTL电平输入或施密特触发输入 。施密特触发输入有更好的抗干扰能力。所有的I/O引脚可通过软件选择位控制,斜率输出能力。输出斜率控制寄存器是PxSR。默认是慢斜率。.如果用户想要增加I/O引脚输出速率,设置PxSR的相应位,将斜率设置成高速输出。

当配置RPD (CONFIG0.2) 为0,P2.0被配置为输入引脚。同时P2.0将永远在输入模式和施密特触发模式,通过P20UP(P2S.7)使能内部上拉电阻。如果RPD未编程,P2.0作为外部复位引脚,P2.0作为管脚功能无效,由于作为复位脚,内部上拉电阻始终有效,此种状态下读取P2.0的值始终为0.

准双向模式

准双向模式作为标准8051的I/O结构,可以同时用作输入和输出。当端口输出逻辑高时,驱动能力较弱,同时允许外部器件将电平拉低。当引脚被拉低时有强驱动能力,会吸收大电流。在准双向I/O 结构中,有三个上拉MOS管,适应不同的应用。其中一个上拉叫做特弱上拉,当端口锁定在逻辑1时,打开特弱上拉,特弱上拉有很小电流将引脚拉高。

第二种上拉为“弱上拉”,当外部端口引脚自身处于逻辑1时打开。这种上拉提供源电流以使准双向引脚输出1。如果引脚为逻辑1,被外部器件拉低, “弱上拉”关闭, 仅有“特弱上拉”打开。 此时要将引脚拉低,外部器件要有足够的灌电流 (大于ITL)以克服“弱上拉”,并使端口的电压低于输入门限电压 (低于VIL)。

第三种上拉为“强上拉”。这种上拉用于在准双向口引脚上,加速端口电平由逻辑0转为逻辑1的转换速度。 当这种

情况发生时,打开强上拉用两个CPU时钟的时间快速地将端口引脚拉高。 然后就关闭,弱上拉和特弱上拉继续

保持该端口引脚为高。 准双向端口结构如下所示。

推挽模式

推挽输出模式与准双向输出模式有相同的下拉结构。当端口锁定为1时,提供持续的强上拉。推挽输出模式用于需要从端口输出大电流时的应用。

输入高阻模式n76e003浮点_N76E003之IO控制

输入模式提供真实的高阻输入路径。虽然准双向模式也可以作为输入引脚,但是它需要相对强的输入源。输入模式的好处是减少在逻辑0时电流的消耗,如果是准双向模式,逻辑0时总是消耗来自VDD 的电流。用户需要注意的是,输入模式应该由外部设备或电阻提供一个确定的电平。悬浮的引脚在掉电状态下会引起漏电。

n76e003浮点_N76E003之IO控制

开漏模式

开漏输出配置关闭所有内部上拉,当端口锁定为逻辑0时,仅打开驱动端口的下拉晶体管。当端口锁存为逻辑1

时,它就和输入模式一样。通常用于I2C输出线上,开漏引脚需要加一个外部上拉电阻,典型连一个电阻到

VDD。 用户需要注意的是,开漏模式输出逻辑1的时候,应该由外部设备或电阻提供一个确定的电平。悬浮的引

脚在掉电状态下会引起漏电。

n76e003浮点_N76E003之IO控制

读-修改-写 指令

从SFR或内部RAM读一个字节,修改它,并重新写回去的指令,叫做读-修改-写指令。当目标是一个I/O端口或

一个端口位,这些指令读内部输出锁存而不是外部引脚的状态,这种指令读端口SFR的值,修改它并写回到SFR

端口。所有读-修改-写的指令如下所列:

指令 描述

ANL 逻辑 与. (ANL direct, A and ANL direct, #data)

ORL 逻辑 或. (ORL direct, A and ORL direct, #data)

XRL 逻辑 异或 OR. (XRL direct, A and XRL direct, #data)

JBC if bit = 1 转跳指令并清除. (JBC bit, rel)

CPL 位取反. (CPL bit)

INC 加一指令. (INC direct)

DEC 减一指令. (DEC direct)

DJNZ 减一不为零转跳指令. (DJNZ direct, rel)

MOV bit, C 移进位标志到位. (MOV bit, C)

CLR bit 清位. (CLR bit)

SETB bit 置位. (SETB bit)

最后三条指令看似不是明显的读-修改-写指令,实际它们就是读-修改-写指令。 可以读整个端口锁定值,修改改变位,写入新的值。

管脚控制寄存器

N76E003有许多I/O控制寄存器提供灵活的各种应用。和I/O端口相关的SFRs可以分类成四组:输入输出控制,输出模式控制、输入类型和灌电流控制,输出斜率控制。所有SFRs如下所列:

输入输出数据控制

这些寄存器是I/O输入输出数据缓存。读获取I/O输入的数据。写驱动数据输出,所有这些寄存器都是可位寻址的。

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

输出模式控制

这些寄存器控制输出模式。配置为输出模式在四种模式中:输入模式、准双向模式、推挽或开漏模式。每一个引脚可以独立地配置。对P2.0引脚,有一个上拉电阻控制位是P2S.7。

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

输入类型

每一个 I/O 引脚可以独立地配置成TTL输入或施密特触发输入。注意所有PxS 寄存器通过切换SFR页到页1来访问。

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

输出斜率控制

N76E003可单独控制管脚输出斜率。默认情况下,管脚采用普通斜率模式。当用户切换到高速斜率模式时,每个管脚斜率可看到显著变化。注更改PxSR寄存器需要将SFR页切换到页1 。

n76e003浮点_N76E003之IO控制

n76e003浮点_N76E003之IO控制

#include “N76E003.h”#include”SFR_Macro.h”#include”Function_define.h”#include”Common.h”#include”Delay.h”

//* The Following is in define in Fucntion_define.h *// Always include Function_define.h call the define you want, detail see main(void) *//*

#if 0

——————- Define Port as Quasi mode ——————-

//#define P00_Quasi_Mode P0M1&=~SET_BIT0;P0M2&=~SET_BIT0//#define P01_Quasi_Mode P0M1&=~SET_BIT1;P0M2&=~SET_BIT1//#define P02_Quasi_Mode P0M1&=~SET_BIT2;P0M2&=~SET_BIT2//#define P03_Quasi_Mode P0M1&=~SET_BIT3;P0M2&=~SET_BIT3//#define P04_Quasi_Mode P0M1&=~SET_BIT4;P0M2&=~SET_BIT4//#define P05_Quasi_Mode P0M1&=~SET_BIT5;P0M2&=~SET_BIT5//#define P06_Quasi_Mode P0M1&=~SET_BIT6;P0M2&=~SET_BIT6//#define P07_Quasi_Mode P0M1&=~SET_BIT7;P0M2&=~SET_BIT7//#define P10_Quasi_Mode P1M1&=~SET_BIT0;P1M2&=~SET_BIT0//#define P11_Quasi_Mode P1M1&=~SET_BIT1;P1M2&=~SET_BIT1//#define P12_Quasi_Mode P1M1&=~SET_BIT2;P1M2&=~SET_BIT2//#define P13_Quasi_Mode P1M1&=~SET_BIT3;P1M2&=~SET_BIT3//#define P14_Quasi_Mode P1M1&=~SET_BIT4;P1M2&=~SET_BIT4//#define P15_Quasi_Mode P1M1&=~SET_BIT5;P1M2&=~SET_BIT5//#define P16_Quasi_Mode P1M1&=~SET_BIT6;P1M2&=~SET_BIT6//#define P17_Quasi_Mode P1M1&=~SET_BIT7;P1M2&=~SET_BIT7//#define P20_Quasi_Mode P2M1&=~SET_BIT0;P2M2&=~SET_BIT0//#define P30_Quasi_Mode P3M1&=~SET_BIT0;P3M2&=~SET_BIT0

——————- Define Port as Push Pull mode ——————-

//#define P00_PushPull_Mode P0M1|=SET_BIT0;P0M2&=~SET_BIT0//#define P01_PushPull_Mode P0M1|=SET_BIT1;P0M2&=~SET_BIT1//#define P02_PushPull_Mode P0M1&=~SET_BIT2;P0M2|=SET_BIT2//#define P03_PushPull_Mode P0M1&=~SET_BIT3;P0M2|=SET_BIT3//#define P04_PushPull_Mode P0M1&=~SET_BIT4;P0M2|=SET_BIT4//#define P05_PushPull_Mode P0M1&=~SET_BIT5;P0M2|=SET_BIT5//#define P06_PushPull_Mode P0M1&=~SET_BIT6;P0M2|=SET_BIT6//#define P07_PushPull_Mode P0M1&=~SET_BIT7;P0M2|=SET_BIT7//#define P10_PushPull_Mode P1M1&=~SET_BIT0;P1M2|=SET_BIT0//#define P11_PushPull_Mode P1M1&=~SET_BIT1;P1M2|=SET_BIT1//#define P12_PushPull_Mode P1M1&=~SET_BIT2;P1M2|=SET_BIT2//#define P13_PushPull_Mode P1M1&=~SET_BIT3;P1M2|=SET_BIT3//#define P14_PushPull_Mode P1M1&=~SET_BIT4;P1M2|=SET_BIT4//#define P15_PushPull_Mode P1M1&=~SET_BIT5;P1M2|=SET_BIT5//#define P16_PushPull_Mode P1M1&=~SET_BIT6;P1M2|=SET_BIT6//#define P17_PushPull_Mode P1M1&=~SET_BIT7;P1M2|=SET_BIT7//#define P20_PushPull_Mode P2M1&=~SET_BIT0;P2M2|=SET_BIT0//#define P30_PushPull_Mode P3M1&=~SET_BIT0;P3M2|=SET_BIT0

——————- Define Port as Input Only mode ——————-

//#define P00_Input_Mode P0M1|=SET_BIT0;P0M2&=~SET_BIT0//#define P01_Input_Mode P0M1|=SET_BIT1;P0M2&=~SET_BIT1//#define P02_Input_Mode P0M1|=SET_BIT2;P0M2&=~SET_BIT2//#define P03_Input_Mode P0M1|=SET_BIT3;P0M2&=~SET_BIT3//#define P04_Input_Mode P0M1|=SET_BIT4;P0M2&=~SET_BIT4//#define P05_Input_Mode P0M1|=SET_BIT5;P0M2&=~SET_BIT5//#define P06_Input_Mode P0M1|=SET_BIT6;P0M2&=~SET_BIT6//#define P07_Input_Mode P0M1|=SET_BIT7;P0M2&=~SET_BIT7//#define P10_Input_Mode P1M1|=SET_BIT0;P1M2&=~SET_BIT0//#define P11_Input_Mode P1M1|=SET_BIT1;P1M2&=~SET_BIT1//#define P12_Input_Mode P1M1|=SET_BIT2;P1M2&=~SET_BIT2//#define P13_Input_Mode P1M1|=SET_BIT3;P1M2&=~SET_BIT3//#define P14_Input_Mode P1M1|=SET_BIT4;P1M2&=~SET_BIT4//#define P15_Input_Mode P1M1|=SET_BIT5;P1M2&=~SET_BIT5//#define P16_Input_Mode P1M1|=SET_BIT6;P1M2&=~SET_BIT6//#define P17_Input_Mode P1M1|=SET_BIT7;P1M2&=~SET_BIT7//#define P20_Input_Mode P2M1|=SET_BIT0;P2M2&=~SET_BIT0//#define P30_Input_Mode P3M1|=SET_BIT0;P3M2&=~SET_BIT0

——————-Define Port as Open Drain mode ——————-

//#define P00_OpenDrain_Mode P0M1|=SET_BIT0;P0M2|=SET_BIT0//#define P01_OpenDrain_Mode P0M1|=SET_BIT1;P0M2|=SET_BIT1//#define P02_OpenDrain_Mode P0M1|=SET_BIT2;P0M2|=SET_BIT2//#define P03_OpenDrain_Mode P0M1|=SET_BIT3;P0M2|=SET_BIT3//#define P04_OpenDrain_Mode P0M1|=SET_BIT4;P0M2|=SET_BIT4//#define P05_OpenDrain_Mode P0M1|=SET_BIT5;P0M2|=SET_BIT5//#define P06_OpenDrain_Mode P0M1|=SET_BIT6;P0M2|=SET_BIT6//#define P07_OpenDrain_Mode P0M1|=SET_BIT7;P0M2|=SET_BIT7//#define P10_OpenDrain_Mode P1M1|=SET_BIT0;P1M2|=SET_BIT0//#define P11_OpenDrain_Mode P1M1|=SET_BIT1;P1M2|=SET_BIT1//#define P12_OpenDrain_Mode P1M1|=SET_BIT2;P1M2|=SET_BIT2//#define P13_OpenDrain_Mode P1M1|=SET_BIT3;P1M2|=SET_BIT3//#define P14_OpenDrain_Mode P1M1|=SET_BIT4;P1M2|=SET_BIT4//#define P15_OpenDrain_Mode P1M1|=SET_BIT5;P1M2|=SET_BIT5//#define P16_OpenDrain_Mode P1M1|=SET_BIT6;P1M2|=SET_BIT6//#define P17_OpenDrain_Mode P1M1|=SET_BIT7;P1M2|=SET_BIT7//#define P20_OpenDrain_Mode P2M1|=SET_BIT0;P2M2|=SET_BIT0//#define P30_OpenDrain_Mode P3M1|=SET_BIT0;P3M2|=SET_BIT0

——— Define all port as quasi mode ———

//#define Set_All_GPIO_Quasi_Mode P0M1=0;P0M1=0;P1M1=0;P1M2=0;P2M1=0;P2M2=0;P3M1=0;P3M2=0

#endif

/*————————————————

The main C function. Program execution starts

here after stack initialization.

————————————————*/

void main (void)

{//unsigned char temp;

Set_All_GPIO_Quasi_Mode; //Define in Function_define.h

#if 0InitialUART0_Timer3();//set_CLOEN;//For clock out from P1.1

while(1)

{

clr_GPIO1;//Tiny board GPIO1 LED define

P0 = 0x00;

P2= 0x00;

P1= 0x00;

Timer0_Delay1ms(30);

P0= 0xff;

P2= 0xff;

P1= 0xff;

set_GPIO1;

Send_Data_To_UART0(0x35); //UART0 send ascii “U”

temp = 0x31 +P0;

Send_Data_To_UART0(temp);

temp= 0x31 +P1;

Send_Data_To_UART0(temp);

Timer0_Delay1ms(30);

}#endif

#if 1

while(1)

{

clr_GPIO1;//Tiny board GPIO1 LED define

P0 = 0x00;

P2= 0x00;

P1= 0x00;

Timer0_Delay1ms(30);

P0= 0xff;

P2= 0xff;

P1= 0xff;

set_GPIO1;

Timer0_Delay1ms(30);

}#endif}

我自己写的一个根据例程驱动继电器的例程,额,怎么说呢,就改了

//*//File Function: N76E003 Timer0/1 Mode1 demo code//*

#include “N76E003.h”#include”Common.h”#include”Delay.h”#include”SFR_Macro.h”#include”Function_define.h”

//* The Following is in define in Fucntion_define.h *// Always include Function_define.h call the define you want, detail see main(void) *//*

#if 0

#endif

#define TH0_INIT 50000

#define TL0_INIT 50000UINT8 u8TH0_Tmp,u8TL0_Tmp,u8TH1_Tmp,u8TL1_Tmp;int i=0;/

* TIMER 0 interrupt subroutine

/

void Timer0_ISR (void) interrupt 1 //interrupt address is 0x000B

{

i++;

TH0=u8TH0_Tmp;

TL0=u8TL0_Tmp;if(i==200)

{

P12=1;

i=0;

}}

void main (void)

{P12_PushPull_Mode;

clr_GPIO1;

TIMER0_MODE1_ENABLE;

clr_T1M;

u8TH0_Tmp= (65536-TH0_INIT)/256;

u8TL0_Tmp= (65536-TL0_INIT)%256;TH0=u8TH0_Tmp;

TL0=u8TL0_Tmp;

set_ET0;//enable Timer0 interrupt

set_EA; //enable interrupts

set_TR0; //Timer0 run while(1);

}

准双向是一个没有那么大的驱动电流,驱动不了电机所以选择推挽模式。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209612.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:50
下一篇 2026年3月19日 上午8:50


相关推荐

  • java局域网组建与维护题_局域网组建与维护习题(有答案).doc

    java局域网组建与维护题_局域网组建与维护习题(有答案).doc局域网组建与维护实用教程一、填空题计算机网络中常用的三种有线通信介质是双绞线、同轴电缆、光纤。局域网的英文缩写为LAN,城域网的英文缩写为_MAN_,广域网的英文缩写为WAN。计算机网络的功能主要表现在硬件资源共享、软件资源共享、数据资源共享。决定局域网特性的主要技术要素为媒体访问控制方式、拓扑结构、传输介质。计算机网络是现代_计算机_技术与通信技术密切组合的产物。局域网常用的拓扑结构有总…

    2025年7月28日
    4
  • Java中CAS 基本实现原理「建议收藏」

    Java中CAS 基本实现原理「建议收藏」一、前言了解CAS,首先要清楚JUC,那么什么是JUC呢?JUC就是java.util.concurrent包的简称。它有核心就是CAS与AQS。CAS是java.util.concurrent.atomic包的基础,如AtomicInteger、AtomicBoolean、AtomicLong等等类都是基于CAS。什么是CAS呢?全称CompareAndSwap,比较并交换。CAS有三个操作数,内存值V,旧的预期值E,要修改的新值N。当且仅当预期值E和内存值V相同时,将内存值V修改为N,否则什

    2022年7月8日
    40
  • win32创建窗口函数(windows程序内部运行机制)

    win32创建窗口函数(windows程序内部运行机制)

    2021年11月19日
    47
  • 移位运算「建议收藏」

    移位运算「建议收藏」【1】示例代码项目应用示例:【2】分析图解移位运算分析:【3】移位运算位运算应用口诀:清零取位要用与,某位置一可用或;若要取反和交换,轻轻松松用异或。【4】与移位运算有关的操作符优先级问

    2022年7月4日
    24
  • 如何实现 MySQL 删除重复记录并且只保留一条

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:千g blog.csdn.net/n950814abc/article/details/82284838 最近…

    2021年6月26日
    70
  • win10 设定计划任务时提示所指定的账户名称无效,如何解决?「建议收藏」

    win10 设定计划任务时提示所指定的账户名称无效,如何解决?「建议收藏」我想把我的python爬虫脚本设定为自动定时执行,我的设备是win10操作系统,这将用到系统自带的计划任务功能。且我希望不管用户是否登录都要运行该定时任务,但在设置计划任务的属性时,遇到一个报错:所指定的账户名称无效。该报错是如何发生的,以及如何解决?记录如下:报错是如何发生的?如下图所示,设置计划任务的属性:如果仅勾选“只在用户登录时运行”,点击“确定”后直接创建成功。…

    2022年6月10日
    133

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号