• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

STC单片机学习积累

1

51单片机的data,xdata,code

dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。

idATa:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)

xdATa: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。

pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

全部回复(5)
正序查看
倒序查看
dulai1985
LV.10
2
2013-11-01 15:48

const用法详解                              另外一个解释

0
回复
dulai1985
LV.10
3
2013-11-01 17:01
@dulai1985
const用法详解                另外一个解释

在单片机学习、开发和应用中,IO口的配置对功能的实现起着重要的作用,下面介绍常见的四种配置,而现在很多单片机都兼有这四种配置,可供选择。

一.准双向口配置

如下图,当IO输出为高电平时,其驱动能力很弱,外部负载很容易将其拉至低电平。当IO输出为低电平时,其驱动能力很强,可吸收相当大的电流。

准双向口有三个上拉晶体管,一个“极弱上拉”,当端锁存器为逻辑“1”时打开,当端口悬空时,“极弱上拉”将端口上拉至高电平。

第二个上拉晶体管为“弱上拉”,当端口锁存器为逻辑“1”且端口本身也为“1”时打开,此上拉提供的电流,使准双向口输出为“1”。如果此时端口被外部装置拉到逻辑“0”时,通过施密特触发器,控制“弱上拉”关闭,而“极弱上拉”维持开状态,为了把这个端口拉低,外部装置必须有足够的灌电流能力,使管脚上的电压,降到门槛电以下。

第三个上拉晶体管为“强上拉”,当端口锁存器由“0”跳变到“1”时,这个上拉用来加快端口由逻辑“0”到逻辑“1”的转换速度。

准双向口做为输入时,通个一个施密特触如器和一个非门,用以干扰和滤波。

准双向口用作输入时,可对地接按键,如下图1,当然也可以去掉R1直接接按键,当按键闭合时,端口被拉至低电平,当按键松开时,端口被内部“极弱上拉”晶体管拉至高电平。当端口作为输出时,不应对地外接LED如图形控制,这样端口的驱动能力很弱,LED只能发很微弱的光,如果要驱动LED,要采用图3的方法,这样准双向口在输出为低时,可吸收20mA的电流,故能驱动LED。图4的方法也可以,不过LED不发光时,端口要吸收收很大电流。

二.开漏输出配置

这种配置,关闭所有上拉晶体管,只驱动下拉晶体管,下拉与准双向口下拉配置相同,因此只能输出低电平(吸收电流),和高阻状态。不能输出高电平(输也电流)。如果要作为逻辑输出,必须接上拉电阻到VCC。这种配置也可以通过上图3和图4来驱动LED。

三.推挽输出配置

这种配置的下拉与准双向口和开漏配置相同,具有较强的拉电流能力,不同的是,具有持续的强上拉。因此可以用上图2的方法来驱动LED。

四.仅为输入配置(高阻配置)

这种配置不能输出电流,也不能有收电流,只能作为输入数据使用。

以上四种配置各有其特点,在使用中应根据其特点灵活运用。

准双向口的最大特点是既可以作为输入,也可以作为输出,不需要通过控制切换。

推挽输出的特点是,无论输也高电平还是低电平都有较大的驱动能力,在输也高电平时,也能直接点亮LED,这在准双向口中是不能办到的。这种配置不宜作为输入,因为这需要外部设备有很强的拉电流的能胃。

仅为输入配置的特点是端口只能作为输入使用,可以获得很高的输入阻抗,在有模拟比较器或ADC的端口中用得较多。

开漏输出配置与准又向口相似,但内部没有上拉电阻。有很好的电气兼容性,外部接上拉电阻到3V电源,就能和3V逻辑器件连接。外部接上拉电阻到5V电源,就要以和5V器件连接。

需要说明的是以上四种配置均可以作为输入,也就是都可以检测端的逻辑状态,但其特性不同,不是每种配置都可以直接接按键。

0
回复
dulai1985
LV.10
4
2013-11-05 15:20
@dulai1985
单片机的几种IO口配置在单片机学习、开发和应用中,IO口的配置对功能的实现起着重要的作用,下面介绍常见的四种配置,而现在很多单片机都兼有这四种配置,可供选择。一.准双向口配置如下图,当IO输出为高电平时,其驱动能力很弱,外部负载很容易将其拉至低电平。当IO输出为低电平时,其驱动能力很强,可吸收相当大的电流。准双向口有三个上拉晶体管,一个“极弱上拉”,当端锁存器为逻辑“1”时打开,当端口悬空时,“极弱上拉”将端口上拉至高电平。第二个上拉晶体管为“弱上拉”,当端口锁存器为逻辑“1”且端口本身也为“1”时打开,此上拉提供的电流,使准双向口输出为“1”。如果此时端口被外部装置拉到逻辑“0”时,通过施密特触发器,控制“弱上拉”关闭,而“极弱上拉”维持开状态,为了把这个端口拉低,外部装置必须有足够的灌电流能力,使管脚上的电压,降到门槛电以下。第三个上拉晶体管为“强上拉”,当端口锁存器由“0”跳变到“1”时,这个上拉用来加快端口由逻辑“0”到逻辑“1”的转换速度。准双向口做为输入时,通个一个施密特触如器和一个非门,用以干扰和滤波。[图片]准双向口用作输入时,可对地接按键,如下图1,当然也可以去掉R1直接接按键,当按键闭合时,端口被拉至低电平,当按键松开时,端口被内部“极弱上拉”晶体管拉至高电平。当端口作为输出时,不应对地外接LED如图形控制,这样端口的驱动能力很弱,LED只能发很微弱的光,如果要驱动LED,要采用图3的方法,这样准双向口在输出为低时,可吸收20mA的电流,故能驱动LED。图4的方法也可以,不过LED不发光时,端口要吸收收很大电流。[图片]二.开漏输出配置这种配置,关闭所有上拉晶体管,只驱动下拉晶体管,下拉与准双向口下拉配置相同,因此只能输出低电平(吸收电流),和高阻状态。不能输出高电平(输也电流)。如果要作为逻辑输出,必须接上拉电阻到VCC。这种配置也可以通过上图3和图4来驱动LED。[图片]三.推挽输出配置这种配置的下拉与准双向口和开漏配置相同,具有较强的拉电流能力,不同的是,具有持续的强上拉。因此可以用上图2的方法来驱动LED。[图片]四.仅为输入配置(高阻配置)这种配置不能输出电流,也不能有收电流,只能作为输入数据使用。[图片]以上四种配置各有其特点,在使用中应根据其特点灵活运用。准双向口的最大特点是既可以作为输入,也可以作为输出,不需要通过控制切换。推挽输出的特点是,无论输也高电平还是低电平都有较大的驱动能力,在输也高电平时,也能直接点亮LED,这在准双向口中是不能办到的。这种配置不宜作为输入,因为这需要外部设备有很强的拉电流的能胃。仅为输入配置的特点是端口只能作为输入使用,可以获得很高的输入阻抗,在有模拟比较器或ADC的端口中用得较多。开漏输出配置与准又向口相似,但内部没有上拉电阻。有很好的电气兼容性,外部接上拉电阻到3V电源,就能和3V逻辑器件连接。外部接上拉电阻到5V电源,就要以和5V器件连接。需要说明的是以上四种配置均可以作为输入,也就是都可以检测端的逻辑状态,但其特性不同,不是每种配置都可以直接接按键。
单片机IO口的使用对所有单片机玩家来说都是“家常便饭”,但是你真的了解IO口吗?你真的能按你的需要配置IO口吗?

    一、准双向口输出

        准双向口输出类型可用作输出和输入功能而不需重新配置口线输出状态。这是因为当口线输出为1时驱动能力很弱,允许外部装置将其拉低。当引脚输出为低时,它的驱动能力很强,可吸收相当大的电流。(准双向口有3个上拉晶体管适应不同的需要)

      准双向口读外部状态前,要先锁存为 ‘1’,才可读到外部正确的状态.

   二、强推挽输出

         推挽输出配置的下拉结构与开漏输出以及准双向口的下拉结构相同,但当锁存器为1时提供持续的强上拉。推挽模式一般用于需要更大驱动电流的情况。

  三、仅为输入(高阻)

     输入口带有一个施密特触发输入以及一个干扰抑制电路。

  四、开漏输出配置(若外加上拉电阻,也可读)

   当口线锁存器为0时,开漏输出关闭所有上拉晶体管。当作为一个逻辑输出时,这种配置方式必须有外部上拉,一般通过电阻外接到Vcc。如果外部有上拉电阻,开漏的I/O口还可读外部状态,即此时被配置为开漏模式的I/O口还可作为输入I/O口。这种方式的下拉与准双向口相同。

   开漏端口带有一个施密特触发输入以及一个干扰抑制电路。

关于I/O口应用注意事项:

     1.有些是I/O口由低变高读外部状态时,读不对,实际没有损坏,软件处理一下即可。       因为1T的8051单片机速度太快了,软件执行由低变高指令后立即读外部状态,此时由于实际输出还没有变高,就有可能读不对,正确的方法是在软件设置由低变高后加1到2个空操作指令延时,再读就对了.

    有些实际没有损坏,加上拉电阻就OK了有些是外围接的是NPN三极管,没有加上拉电阻,其实基极串多大电阻,I/O口就应该上拉多大的电阻,或者将该I/O口设置为强推挽输出.

  2.驱动LED发光二极管没有加限流电阻,建议加1K以上的限流电阻,至少也要加470欧姆以上

     做行列矩阵按键扫描电路时,实际工作时没有加限流电阻,实际工作时可能出现2个I/O口均输出为低,并且在按键按下时,短接在一起,我们知道一个CMOS电路的2个输出脚不应该直接短接在一起,按键扫描电路中,此时一个口为了读另外一个口的状态,必须先置高才能读另外一个口的状态,而8051单?片机的弱上拉口在由0变为1时,会有2时钟的强推挽高输出电流输出到另外一个输出为低的I/O口,就有可能造成I/O口损坏.建议在其中的一侧加1K限流电阻,或者在软件处理上,不要出现按键两端的I/O口同时为低.

一种典型三极管控制电路:

如果用弱上拉控制,建议加上拉电阻R1(3.3K~10K),如果不加上拉电阻R1(3.3K~10K),建议R2的值在15K以上,或用强推挽输出。
 
典型发光二极管控制电路:
       推挽/强上拉口,用拉电流驱动发光二极管
    弱上拉/准双向口,用灌电流驱动发光二极管限流电阻尽量大于1K,最小不要小于470Ω
 
混合电压供电系统3V/5V器件I/O口互连
 
          5V单片机连接3.3V器件时,为防止3.3V器件承受不了5V,可将相应的5V单片机I/O口先串一个330Ω的限流电阻到3.3V器件I/O口,程序初始化时将5V器件的I/O口设置成开漏配置,断开内部上拉电阻,相应的3.3V器件I/O口外部加10K上拉电阻到3.3V器件的Vcc,这样高电平是3.3V,低电平是0V,输入输出一切正常。
 
 
 
         3V单片机连接5V器件时,为防3V器件承受不了5V,如果相应的I/O口是输入,可在该I/O口上串接一个隔离二极管,隔离高压部分。外部信号电压高于单片机工作电压时截止,I/O口因内部上拉到高电平,所以读I/O口状态是高电平;外部信号电压为低时导通,I/O口被钳位在0.7V,小于0.8V时单片机读I/O口状态是低电平。
 
 
 3V单片机连接5V器件时,为防止3V器件承受不了5V,如果相应的I/O口是输出,可用一个NPN三极管隔离
 
 
 
如何让I/O口上电复位时为低电平
   普通8051单片机上电复位时普通I/O口为弱上拉高电平输出,而很多实际应用要求上电时某些I/O口为低电平输出,否则所控制的系统(如马达)就会误动作,现STC12系列单片机由于既有弱上拉输出又有强推挽输出,就可以很轻松的解决此问题。
   现可在STC12系列单片机I/O口上加一个下拉电阻(1K/2K/3K),这样上电复位时,虽然单片机内部I/O口是弱上拉/高电平输出,但由于内部上拉能力有限,而外部下拉电阻又较小,无法将其拉高,所以该I/O口上电复位时外部为低电平。如果要将此I/O口驱动为高电平,可将此I/O口设置为强推挽输出,而强推挽输出时,I/O口驱动电流可达20mA,故肯定可以将该口驱动为高电平输出。
 
PWM输出时I/O口的状态(针对STC系列)
0
回复
dulai1985
LV.10
5
2013-11-21 10:08
@dulai1985
单片机IO口的使用对所有单片机玩家来说都是“家常便饭”,但是你真的了解IO口吗?你真的能按你的需要配置IO口吗?    一、准双向口输出        准双向口输出类型可用作输出和输入功能而不需重新配置口线输出状态。这是因为当口线输出为1时驱动能力很弱,允许外部装置将其拉低。当引脚输出为低时,它的驱动能力很强,可吸收相当大的电流。(准双向口有3个上拉晶体管适应不同的需要)      准双向口读外部状态前,要先锁存为‘1’,才可读到外部正确的状态.   二、强推挽输出         推挽输出配置的下拉结构与开漏输出以及准双向口的下拉结构相同,但当锁存器为1时提供持续的强上拉。推挽模式一般用于需要更大驱动电流的情况。  三、仅为输入(高阻)     输入口带有一个施密特触发输入以及一个干扰抑制电路。  四、开漏输出配置(若外加上拉电阻,也可读)   当口线锁存器为0时,开漏输出关闭所有上拉晶体管。当作为一个逻辑输出时,这种配置方式必须有外部上拉,一般通过电阻外接到Vcc。如果外部有上拉电阻,开漏的I/O口还可读外部状态,即此时被配置为开漏模式的I/O口还可作为输入I/O口。这种方式的下拉与准双向口相同。   开漏端口带有一个施密特触发输入以及一个干扰抑制电路。关于I/O口应用注意事项:     1.有些是I/O口由低变高读外部状态时,读不对,实际没有损坏,软件处理一下即可。       因为1T的8051单片机速度太快了,软件执行由低变高指令后立即读外部状态,此时由于实际输出还没有变高,就有可能读不对,正确的方法是在软件设置由低变高后加1到2个空操作指令延时,再读就对了.    有些实际没有损坏,加上拉电阻就OK了有些是外围接的是NPN三极管,没有加上拉电阻,其实基极串多大电阻,I/O口就应该上拉多大的电阻,或者将该I/O口设置为强推挽输出.  2.驱动LED发光二极管没有加限流电阻,建议加1K以上的限流电阻,至少也要加470欧姆以上     做行列矩阵按键扫描电路时,实际工作时没有加限流电阻,实际工作时可能出现2个I/O口均输出为低,并且在按键按下时,短接在一起,我们知道一个CMOS电路的2个输出脚不应该直接短接在一起,按键扫描电路中,此时一个口为了读另外一个口的状态,必须先置高才能读另外一个口的状态,而8051单?片机的弱上拉口在由0变为1时,会有2时钟的强推挽高输出电流输出到另外一个输出为低的I/O口,就有可能造成I/O口损坏.建议在其中的一侧加1K限流电阻,或者在软件处理上,不要出现按键两端的I/O口同时为低.一种典型三极管控制电路:[图片]如果用弱上拉控制,建议加上拉电阻R1(3.3K~10K),如果不加上拉电阻R1(3.3K~10K),建议R2的值在15K以上,或用强推挽输出。 典型发光二极管控制电路:[图片]       推挽/强上拉口,用拉电流驱动发光二极管[图片]    弱上拉/准双向口,用灌电流驱动发光二极管限流电阻尽量大于1K,最小不要小于470Ω 混合电压供电系统3V/5V器件I/O口互连           5V单片机连接3.3V器件时,为防止3.3V器件承受不了5V,可将相应的5V单片机I/O口先串一个330Ω的限流电阻到3.3V器件I/O口,程序初始化时将5V器件的I/O口设置成开漏配置,断开内部上拉电阻,相应的3.3V器件I/O口外部加10K上拉电阻到3.3V器件的Vcc,这样高电平是3.3V,低电平是0V,输入输出一切正常。[图片]            3V单片机连接5V器件时,为防3V器件承受不了5V,如果相应的I/O口是输入,可在该I/O口上串接一个隔离二极管,隔离高压部分。外部信号电压高于单片机工作电压时截止,I/O口因内部上拉到高电平,所以读I/O口状态是高电平;外部信号电压为低时导通,I/O口被钳位在0.7V,小于0.8V时单片机读I/O口状态是低电平。[图片]   3V单片机连接5V器件时,为防止3V器件承受不了5V,如果相应的I/O口是输出,可用一个NPN三极管隔离 [图片]  如何让I/O口上电复位时为低电平   普通8051单片机上电复位时普通I/O口为弱上拉高电平输出,而很多实际应用要求上电时某些I/O口为低电平输出,否则所控制的系统(如马达)就会误动作,现STC12系列单片机由于既有弱上拉输出又有强推挽输出,就可以很轻松的解决此问题。   现可在STC12系列单片机I/O口上加一个下拉电阻(1K/2K/3K),这样上电复位时,虽然单片机内部I/O口是弱上拉/高电平输出,但由于内部上拉能力有限,而外部下拉电阻又较小,无法将其拉高,所以该I/O口上电复位时外部为低电平。如果要将此I/O口驱动为高电平,可将此I/O口设置为强推挽输出,而强推挽输出时,I/O口驱动电流可达20mA,故肯定可以将该口驱动为高电平输出。[图片] PWM输出时I/O口的状态(针对STC系列)[图片]

bdata就是可位寻址内部数据存储区 允许位与字节混合访问(16B) 盛群的单片机我没有用过 单片机的原理应该和51的也差不多吧 

#define unsigned char uchar; 

uchar bdata sta; 

sbit RX-DR=sta^6;

0
回复
dulai1985
LV.10
6
2013-11-21 10:09
@dulai1985
bdata就是可位寻址内部数据存储区允许位与字节混合访问(16B)盛群的单片机我没有用过单片机的原理应该和51的也差不多吧 #defineunsignedcharuchar; ucharbdatasta; sbitRX-DR=sta^6;
uchar bdata问题#define uchar unsigned charuchar DATA = 0x01;uchar bdata sta;sbit RX_DR = sta^6;sbit TX_DS = sta^5;sbit MAX_RT = sta^4;这什么意思呢,RX_DR=1;这样的话, 对什么脚操作呢------解决方案--------------------uchar bdata sta;//在位寻址区定义一个变量sbit RX_DR = sta^6;//声明RX_DR对应sta的位6RX_DR=1;//对sta的位6置1
0
回复