51单片机宝马5系负极在哪哪儿

后使用快捷导航没有帐号?
查看: 5293|回复: 33
【51单片机】基础学习资料整理(转)(对单片机感兴趣的一定要看看)
本帖最后由 Romatom1008 于
13:42 编辑
下面是一个网友的总结,我觉得相当经典。分享给大家
什么是单片机?51单片机学前预备知识
时间: 16:12:29 来源:21ic 作者:一.单片机的概念:
在一片集成电路芯片上集成微处理器、存储器、I/O接口电路,从而构成了单芯片微型计算机,即单片机。
扩展阅读:51单片机是什么
二.单片机的用途:
工业自动化:数据采集,测控技术;
智能仪器仪表:数字示波器、数字信号源、数字万用表、感应电流表等;
消费类电子产品:洗衣机、电冰箱、空调机、手机等;
凡是与控制或简单计算有关的电子设备都可以用单片机来实现,再根据具体实际情况选择不同性能的单片机,如:atmel,stc,pic,avr,凌阳,80C51,arm等。
三.怎么学单片机:
实践第一;补充必要的理论知识,即缺什么补什么;做工程项目积累经验。(可在网络上搜索些题目,也可自己有什么想法大胆的去试验。)。
四.为什么选择51单片机作为单片机学习的入门:
学51单片机成本低,而且51单片机技术最成熟、资料最丰富、学习难度相对比较低。
四.电平特性:
数字电路中只有两种电平:高和低(本课程中)定义单片机为TTL电平:高+5V、低0V。RS232电平:计算机的串口,高-12V、低+12V。
所以单片机与计算机之间进行通讯时需要加电平转换芯片max232。
五.与、或、非及异或的基本运算:
逻辑“与”: 0*0=0 1*0=0
0*1=0 1*1=1
“必须都有,否则就没有”
逻辑“或”: 0+0=0 1+0=1
0+1=1 1+1=1
“只要其中之一有,就有”
逻辑“非” : 非0=1 非1=0 “求反”
逻辑“异或”: 0⊕0=0 1⊕0=1
0⊕1=1 1⊕1=0
“必须不同,否则就没有”
六.二进制、十进制、十六进制的表示及相互转换:
十 二 十六 十 二 十六 十 二 十六 十 二 十六
1010 A 14 1110 E
1011 B 15 1111 F
七.80c51单片机简介:
Inter公司推出了MCS-51系列单片机:集成8位CPU、4K字节ROM、128字节RAM、4个八位并口、一个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。单板机—单片机。
80C51是MCS-51系列中的典型品种;其它厂商以80C51为基核开发出的CMOS(场效应管)工艺单片机产品统称为80C51系列。
什么是51单片机?51单片机主要产品有哪些?
时间: 17:08:04 来源:21ic 作者:51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。
当前常用的51系列单片机主要产品有:
*Intel的:80C31、80C51、87C51,80C32、80C52、87C52等;
*ATMEL的:89C51、89C52、89C2051等;
*Philips、华邦、Dallas、Siemens(Infineon)等公司的许多产品
51单片机有哪些特性?
时间: 15:49:20 来源: 作者:MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。我们也以这一代表性的机型进行系统的讲解。
MCS-51系列单片机主要包括和8751等通用产品,其主要功能如下:
·4kbytes 程序存储器(ROM)
·128bytes的数据存储器(RAM)
·32条I/O口线
·111条指令,大部分为单字节指令
·21个专用寄存器
·2个可编程定时/计数器
·5个中断源,2个优先级
·一个全双工串行通信口
·外部数据存储器寻址空间为64kB
·外部程序存储器寻址空间为64kB
·逻辑操作位寻址功能
·双列直插40PinDIP封装
·单一+5V电源供电
MCS-51以其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“名机”,为以后的其它单片机的发展奠定了基础。正因为其优越的性能和完善的结构,导致后来的许多厂商多沿用或参考了其体系结构,有许多世界大的电气商丰富和发展了MCS-51单片机,象PHILIPS、Dallas、ATMEL等著名的半导体公司都推出了兼容MCS-51的单片机产品,就连我国的台湾WINBOND公司也发展了兼容C51(人们习惯将MCS-51简称C51,如果没有特别声明,二者同指MCS-51系列单片机)的单片机品种。
近年来C51获得了飞速的发展,C51的发源公司INTEL由于忙于开发PC及高端微处理器而无精力继续发展自己的单片机,而由其它厂商将其发展,最典型的是PHILIPS和ATML公司,PHILIPS公司主要是改善其性能,在原来的基础上发展了高速I/O口,A/D转换器,PWM(脉宽调制)、WDT等增强功能,并在低电压、微功耗、扩展串行总线(I2C)和控制网络总线(CAN)等功能加以完善。
PHILIPS公司在发展C51的低功耗,高速度和增强型功能上作了不少贡献,当初主要由其来发展C51单片机,他们的83Cxx和87Cxx系列省去了并行扩展总线,适合于作为家用电器类控制的经济型单片机。
ATMEL公司推出的AT89Cxx系列兼容C51的单片机,完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来,仍采用C51的总体结构和指令系统,Flash的可反擦写程序存储器能有效地降低开发费用,并能使单片机作多次重复使用。
Siemens公司也沿用C51的内核,相继推出了C500系列单片机,在保持了与C51指令兼容的前提下,其产品的性能得到了进一步的提升,特别是在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣的场合。亦适用于通信和家用电器控制领域。
还有台湾的WINBOND公司亦开发了一系列兼容C51的单片机,其产品通常具备丰富的功能特性,而且与其质优价廉在市场也占有一定的分额。
下表是80C51系列单片机的主要分类及功能特性:
系列 典型芯片 I/O口 定时/计数器 中断源 串行通信口 片内RAM 片内ROM 说明
51系列 80C31 4x8位 2x16位 5 1 128字节 无
80C51 4x8位 2x16位 5 1 128字节 4kB掩膜ROM
87C51 4x8位 2x16位 5 1 128字节 4kBEPROM
89C51 4x8位 2x16位 5 1 128字节 4kBEEPROM
52系列 80C32 4x8位 2x16位 6 1 256字节 无
80C51 4x8位 2x16位 6 1 256字节 8kB掩膜ROM
87C52 4x8位 2x16位 6 1 256字节 4kBEPROM
89C52 4x8位 2x16位 6 1 256字节 4kBEEPROM
8051是MCS-51系列单片机中的代表产品,它内部集成了功能强大的中央处理器,包含了硬件乘除法器、21个专用控制寄存器、4kB的程序存储器、128字节的数据存储器、4组8位的并行口、两个16位的可编程定时/计数器、一个全双工的串行口以及布尔处理器。
MCS-51具有比较大的寻址空间,地址线宽达16条,即外部数据存储器和程序存储器的寻址范围达216=64kB,这作为单片机控制来说已是比较大的,这同时具备对I/O口的访问能力。此外,MCS-51采用模块化结构,可方便地增删一个模块就可引脚和指令兼容的新产品。从而容易使产品形成系列化。
由于MCS-51集成了几乎完善的8位中央处理单元,处理功能强,中央处理单元中集成了方便灵活的专用寄存器,硬件的加、减、乘、除法器和布尔处理机及各种逻辑运算和转移指令,这给应用提供了极大的便利。
MCS-51的指令系统近乎完善,指令系统中包含了全面的数据传送指令、完善的算术和逻辑运算指令、方便的逻辑操作和控制指令、对于编程来说,是相当灵活和方便的。
MCS-51单片机的工作频率为2-12MHz,当振荡频率为12MHz时,一个机器周期为1us,这个速度应该说是比较快的。
8051中集成了完善的各种中断源,用户可十分方便地控制和使用其功能,使得它的应用范围加大,可以说它可以满足绝大部分的应用场合。
MCS-51把微型计算机的主要部件都集成在一块心片上,使得数据传送距离大大缩短,可靠性更高,运行速度更块。由于属于芯片化的微型计算机,各功能部件在芯片中的布局和结构达最优化,抗干扰能力加强,工作亦相对稳定。因此,在工业测控系统中,使用单片机是最理想的选择。单片机属于典型的嵌入式系统,所以它是低端控制系统最佳器件。
MCS-51的开发环境要求较低,软件资源十分丰富,介绍其功能特性书籍和开发软件随处可取,只需配备一台PC(个人电脑——对电脑的配置基本上无要求),一台仿真编程器即可实现产品开发,早期的开发软件多使用DOS版本,随着Windows视窗软件的普及,现在几乎都使用Windows版本,并且软件种类繁多,琳琅满目,在众多的单片机品种中,C51的环境资源是最丰富的,这给C51用户带来极大的便利。
51单片机和AVR单片机的部分区别
时间: 17:05:56 来源:21ic整理 作者:一、51单片机的I/O端口大部分是准双向口,在复位期间全部输出高电平,对端口的输入和输出操作也试直接通过I/O端口的地址进行的。AVR的I/O端口为标准双向口,在复位期间所有端口处于没有上拉电阻的输入状态(高阻态,管脚电平完全由外部电路决定),这在强调复位状态的场合是很有用的。AVR的每个端口对应三个地址,即DDRX、PORTX和PINX。
DDRX为端口方向寄存器,当DDRX的某一位置1时,相应端口的引脚作为输出使用;当DDRX的某一位清0 时,对应端口的引脚作为输入使用。PORTX为端口数据寄存器,当引脚为输出使用,PORTX的数据由相应引脚输出;当引脚作为输入使用时,PORTX的数据决定相应端口的引脚是否打开上拉功能。PINX为相应端口的输入引脚地址,如果希望读取相应引脚的逻辑电平值,一定要读取PINX而不能读取PORTX
二、51单片机的定时/计数器有两个基本用法,即以晶振频率的十二分频信号作为输入的定时器工作方式,或以外部引脚INT0、INT1 上输入信号的计数器工作方式。AVR的定时/计数器用作定时器时,其输入信号可选为晶振品率的某一个分频信号,分频比为1、8 、64 、256 、1024五种,作为计数器使用时,即可上升沿触发也可下降沿触发。
三、51单片机有6个中断源(5个中断入口地址),分为两个优先级,并且是通过IE寄存器控制中断的使能,通过IP控制中断的优先等级,而AVR中根据不同单片机有不同数量的中断源,
四、51单片机川口通讯的波特率发生需要使用一个定时器,而且支持的波特率也比较低,AVR单片机可以有较高的波特率,最高可达115200bps.而且有专用的波特率发生器。
最小系统需要大家来补充
本帖最后由 Romatom1008 于
13:50 编辑
MCS-51单片机引脚功能介绍时间: 17:04:12 来源:jiaoshi8 作者:
40只引脚双列直插封装(DIP)。40只引脚按功能分为3类:
(1)电源及时钟引脚: Vcc、VXTAL1、XTAL2。
(2)控制引脚: PSEN*、EA* 、ALE、RESET (即RST)。
(3)I/O口引脚:P0、P1、P2、P3,为4个8位I/O口的外部引脚。
2.2.1 电源及时钟引脚
1.电源引脚
(1)Vcc(40脚):+5V电源;
(2)Vss(20脚):接地。
2.时钟引脚
(1)XTAL1(19脚):如果采用外接晶体振荡器时,此引脚应接地。
(2)XTAL2(18脚):接外部晶体的另一端。
2.2.2 控制引脚
提供控制信号,有的引脚还具有复用功能。
(1) RST/VPD(9脚):复位与备用电源。
(2) ALE/PROG*(30脚):第一功能ALE为地址锁存允许,可驱动8个LS型TTL负载。PROG*为本引脚的第二功能。为编程脉冲输入端。
(3) PSEN* (29脚):读外部程序存储器的选通信号。可以驱动8个LS型TTL负载。
(4) EA*/VPP (Enable Address/Voltage Pulse of Programing,31脚) EA*为内外程序存储器选择控制端。 EA*=1,访问片内程序存储器,但在PC(程序计数器)值超过0FFFH(对于)时,即超出片内程序存储器的4K字节地址范围时,将自动转向执行外部程序存储器内的程序。EA*=0,单片机则只访问外部程序存储器。VPP为本引脚的第二功能。用于施加编程电压(例如+21V或+12V)。对89C51,加在VPP脚的编程电压为+12V或+5V。
2.2.3 I/O口引脚
(1) P0口:双向8位三态I/O口,此口为地址总线(低8位)及数据总线分时复用口,可驱动8个LS型TTL负载。
(2) P1口:8位准双向I/O口,可驱动4个LS型TTL负载。
(3) P2口:8位准双向I/O口,与地址总线(高8位)复用,可驱动4个LS型TTL负载。
(4) P3口:8位准双向I/O口,双功能复用口,可驱动4个LS型TTL负载。
要特别注意准双向口与双向三态口的差别。当3个准双向I/O口作输入口使用时,要向该口先写“1”,另外准双向I/O口无高阻的“浮空”状态。
s.gif (4.42 KB, 下载次数: 3)
13:50 上传
MCS-51单片机片内RAM的空间分配
简述MCS-51单片机片内RAM的空间分配。内部RAM低128字节分为哪几个主要部分?各部分主要功能是什么?
片内数据存储器按照寻址方式,可以分为三个部分:低128字节数据区,高128字节数据区间,特殊功能寄存器区。低128字节数据区分为三个区域:工作寄存器区,位寻找区和通用数据区。工作寄存器区4组工作寄存器;位寻找区既可以做位操作,也可以字节操作;通用数据区用于堆栈和存放程序运行时的数据和中间结果。
C51单片机存储器类型有哪些?
时间: 13:54:58 来源: 作者:C51存储器类型有bit sbit data xdata bdata pdata sfr code等,可能不全面有遗漏
对应的物理存储器是:
bit,即位数据:数据存储器位寻址区,即20H~2FH的范围,共16个字节,16*8=128个位,位地址00h~7fh,连续的。
sbit:特殊功能寄存器中的位数据:只有能够被8整除的那些特殊功能寄存器中的各个位才能被称为sbit,位地址80H~FFH,不连续的,间断的。
data:数据区,对51为00H~7FH共128个字节,对52为00H~FFH,共256个字节,用MOV寻址,前128用直接寻址或寄存器(R0~R7)寻址,后128用R0、R1间接寻址。
xdata:外部数据区,0000H~FFFFH连续,用DPTR间接寻址(MOVX指令)
bdata:位寻址去的字节,20H~2FH
sfr:特殊功能寄存器(80H~FFH),直接寻址
pdata:外部数据区,P2口保持数据,用R0R1间接寻址(MOVX指令)
code:程序存储器,用MOVC指令只读
MCS-51单片机的存储器分为哪几个空间?
时间: 11:53:13 来源: 作者:MCS-51单片机的存储器分为哪几个空间?如何区分不同空间的寻址?
MCS-51单片机有4个存储空间,它们是片内程序存储器和数据存储器,在片外可以扩展的程序存储器和数据存储器。这4个存储空间可以分成三类:片内数据存储空间(256B的RAM和128B的特殊功能寄存器)、片外数据存储空间(64KB)、片内和片外统一编址的程序存储空间(64KB)。不同的存储空间,它们有各自的寻址方式和访问指令。片内数据存储空间用MOV指令访问。片外数据存储空间用MOVX指令访问。片内和片外统一编址的程序存储空间用MOVC指令访问。
C51单片机存储器类型有哪些?
时间: 13:54:58 来源: 作者:C51存储器类型有bit sbit data xdata bdata pdata sfr code等,可能不全面有遗漏
对应的物理存储器是:
bit,即位数据:数据存储器位寻址区,即20H~2FH的范围,共16个字节,16*8=128个位,位地址00h~7fh,连续的。
sbit:特殊功能寄存器中的位数据:只有能够被8整除的那些特殊功能寄存器中的各个位才能被称为sbit,位地址80H~FFH,不连续的,间断的。
data:数据区,对51为00H~7FH共128个字节,对52为00H~FFH,共256个字节,用MOV寻址,前128用直接寻址或寄存器(R0~R7)寻址,后128用R0、R1间接寻址。
xdata:外部数据区,0000H~FFFFH连续,用DPTR间接寻址(MOVX指令)
bdata:位寻址去的字节,20H~2FH
sfr:特殊功能寄存器(80H~FFH),直接寻址
pdata:外部数据区,P2口保持数据,用R0R1间接寻址(MOVX指令)
code:程序存储器,用MOVC指令只读
MCS-51单片机的存储器分为哪几个空间?
MCS-51单片机的存储器分为哪几个空间?如何区分不同空间的寻址?
MCS-51单片机有4个存储空间,它们是片内程序存储器和数据存储器,在片外可以扩展的程序存储器和数据存储器。这4个存储空间可以分成三类:片内数据存储空间(256B的RAM和128B的特殊功能寄存器)、片外数据存储空间(64KB)、片内和片外统一编址的程序存储空间(64KB)。不同的存储空间,它们有各自的寻址方式和访问指令。片内数据存储空间用MOV指令访问。片外数据存储空间用MOVX指令访问。片内和片外统一编址的程序存储空间用MOVC指令访问。
51单片机片外扩展RAM
这一章原作者为分享
本帖最后由 Romatom1008 于
14:02 编辑
51单片机总线时序
时间: 16:00:01 来源:21ic 作者:一、总线概述
计算机系统是以微处理器为核心的,各器件要与微处理器相连,且必须协调工作,所以在微处理机中引入了总线的概念,各器件共同享用总线,任何时候只能有一个器件发送数据(可以有多个器件同时接收数据) 。
计算机的总线分为控制总线、地址总线和数据总线等三种。而数据总线用于传送数据,控制总线用于传送控制信号, 地址总线则用于选择存储单元或外设。
二、单片机的三总线结构
51系列单片机具有完善的总线接口时序,可以扩展控制对象,其直接寻址能力达到64k( 2的16次方) 。在总线模式下,不同的对象共享总线,独立编址、分时复用总线,CPU 通过地址选择访问的对象,完成与各对象之间的信息传递。
单片机三总线扩展示意如图1 所示。
1、数据总线
51 单片机的数据总线为P0 口,P0 口为双向数据通道,CPU 从P0 口送出和读回数据。
2、地址总线
51 系列单片机的地址总线为16 位。
为了节约芯片引脚,采用P0 口复用方式,除了作为数据总线外,在ALE 信号时序匹配下,通过外置的数据锁存器,在总线访问前半周期从P0口送出低8位地址,后半周期从P0 口送出8 位数据。
高8位地址则通过P2 口送出。
3、控制总线
51 系列单片机的控制总线包括读控制信号P3.7 和写控制信号P3.6 等,二者分别作为总线模式下数据读和数据写的使能信号。
三、单片机总线时序分析
51 单片机总线时序如图2 所示。
从图2 中可以看出,完成一次总线( 读写) 操作周期为T,P0 口分时复用,在T0 期间,P0 口送出低8 位地址,在ALE 的下降沿完成数据锁存,送出低8位地址信号。在T1 期间,P0 口作为数据总线使用,送出或读入数据,数据的读写操作在读、写控制信号的低电平期间完成。
需要注意的是,在控制信号( 读、写信号) 有效期间,P2 口送出高8位地址,配合数据锁存器输出的低8 位地址,实现16 位地址总线,即64kB 范围的内的寻址。
由于CPU不可能同时执行读和写操作,所以读、写信号不可能同时有效。
四、常见单片机编址电路
1、简单地址扩展
51 单片机的P2 口可以直接作为高8位地址总线使用,在一些简单系统电路中,常使用P2口直接编址驱动。
下面以使用数据缓冲器74LS273 驱动数码显示为例,分析P2 口编址驱动的静态数码显示电路的设计。
一位LED 数码显示单元电路如图3 所示。
WR 与A8( P2.0) 相或提供74LS273的时钟信号,当执行“MOVX @DPTR,A”指令时,地址信息由DPTR 寄存器确定,会出现有效的写信号WR,只有当地址A8 为满足“0”时,写信号才可以作为74LS273 的时钟信号输入,完成数据锁存。
P2 口为A8~A15 的8 位地址线,很容易扩展到8 只LED 数码管,WR 信号分别与A8~A15 按或关系连接,每位地址线均为低电平有效,即可实现8 个有效地址。
该方案电路简单,但有效地址数太少,不适用于复杂系统设计。
2、低8 位地址锁存
通常的设计电路是使用8D 锁存器74LS373 实现地址锁存,74HC573 与之逻辑功能相同,只是引脚布局不一样,使用74HC573 布线更容易。
74LS373 真值表如图4所示。
在输出允许OE 为L、控制使能LE 为H 时,输出为跟随状态;
OE 为L、LE 为L 时,输出为保持状态。
地址锁存电路如图5 所示。OE 接地,LE 接单片机的ALE脚将产生满足时序的低8 位地址信号。
执行以下三条指令会得到如图6所示的时序图。
MOV DPTR,# 0FF55H; 低8 位地址为55H
MOV A,# 0AAH; 待发送数据0AAH→A( 55H 取反)
MOVX,@DPTR,A; A 中的0AAH送地址为0FF55H 的对象中会。
从图6 中可以看出,P0 口先送55H,在ALE 下降沿实现地址锁存,随后送出数据0AAH,在WR 有效( 低电平) 期间锁存器输出低8 位地址55H,P0 口送出数据0AAH。
3、带译码器的复杂地址接口电路
理论上高8 位地址线可以产生256 个有效地址,如何实现地址“扩展”呢? 地址扩展准确描述是地址译码,例如3 根地址线可以译码成8 个地址,4根译码成16 个有效地址。这里选择3-8 译码器实现地址译码,电路图以及对应的编址如表1 所示。
五、单片机总线编址电路实例
带总线扩展接口的单片机系统,包括外部32k RAM 扩展、LCD1602 接口、输入输出口。
带编址扩展的单片机最小系统电路如图7 所示。
使用74HC573 锁存低8 位地址;74138 实现8 个地址扩展,74138 的A、B、C 接A8 ~A10,E1 接A15, E2、E3 接地常有效,得到0F8FFH 到0FFFFH8 个地址( 无关位用1 表示) 或者8000H 到8700H( 无关位用0 表示) 。
32k RAM 接口如图8 所示。
D0~D7 接数据总线P0 口,地址线A0~A14接单片机地址总线低15 位,单片机地址线A15 接RAM 片选信号,低电平有效,这样RAM 地址分配从0000H 到7FFFH,与74138 译码地址不冲突。
LCD1602 接口电路如图9 所示。
RS、RW 分别接A12、A13,使能信号编址为Y7,这样LCD 的四个驱动地址( 数据读写和命令读写) 为0CFFFH 到0FFFFH ( 无关位为1) 或者8700H 到0B700H( 无关位为0)。
有些时候单片机引脚不够用,还要进行扩展,输入口扩展电路如图10 所示。
利用74HC573( 74LS373) 的高阻态功能,将其输出Q0~Q7 接P0 口,在满足总线地址读操作中,可以把输入InPORT的数据读入单片机的累加器,地址为0F8FFH 或8000H。
输出口扩展电路如图11 所示。
利用74LS273 数据锁存功能,在满足总线地址写操作中,可以把单片机累加器里的数据写入273 锁存输出,地址为0F8FFH 或8000H。由于所用控制总线不同,可以和输入共用地址。
六、结束语
总线扩展是设计单片机控制电路必须掌握的技术,大量的特殊功能IC都支持总线接口, 如ADC0809,TLC7528,DDS 器件AD9851 等。
总线接口的要点就是在严格的控制时序下,总线被分时复用,以实现复杂系统设计。
原文:/jichuzhishi/mcu/shixu//.html
51单片机编程技巧整理
时间: 17:31:56 来源:21ic 作者:1.定义的变量不要太多。低128位为用户定义变量的存放区域(默认时),也可以把变量放在高128位,但容易出错,尽量少放,最好不放。通过*.M51可以查看内存变量的存放,最好不要超过110个字节,否则程序无法运行或出错。
2.如一个变量多处使用可定义为全局变量。例如循环变量i、j,尽量减少参数传递。
3.静态变量最好放在程序存储区,用code定义。
4.变量应定义为无符号数,像标志位等仅占一位的变量应定义为bit。
5.子程序在main()主程序之后的应事先声明,放在前面的不用声明。
6.变量、子程序定义但没使用,系统给出警告。
7.虽然局部变量和全局变量不同名,但运行时可能被全局变量改变。
8.程序在编译后,有可能产生非常大的文件。比如原来5k,编译后变成10k,这是C汇编时程序空间分配太随意造成的。可首先屏蔽一部分程序编译,然后再去屏蔽再编译,可恢复,或一部分一部分复制到另一个文件中编译。
9.如产生脉冲信号用到定时器,要去掉脉冲信号时,应先关定时器,再按要求把电平置为高电平或低电平。
10.可使用软件实现“看门狗”功能。比如:一个程序运行一个循环需要50ms,则定时器可定位100ms,当超过100ms时,程序将复位,在程序循环最下面都重装定时器或重置定时器参数。
11.为了提高所求值的精度,可多次测量,然后排序,去掉最大值和最小值,求平均值,或直接求平均值。
12.可使用一个定时器进行多个定时。一般来说,两个定时器对大一点的程序就不够用了,假如几个定时时间分别为10ms、200us、50ms,则定时值可定位200us,另设两个变量即可。在需要多个定时时,找到他们的最小公约数定时即可。
13.我们往单片机中写程序时,写的是*.hex,不要被它的大小所迷惑,对于8k的单片机,小于20k的程序都可写进去。
51单片机烧写程序过程以及详细说明
编程用keil,烧写的STC用ISP
51单片机的调试
时间: 17:33:20 来源:21ic 作者:对于一个新设计的电路板,调试起来往往会遇到一些困难,特别是当板比较大、元件比较多时,往往无从下手。但如果掌握好一套合理的调试方法,调试起来将会事半功倍。对于刚拿回来的新PCB板,我们首先要大概观察一下,板上是否存在问题,例如是否有明显的裂痕,有无短路、开路等现象。如果有必要的话,可以检查一下电源跟地线之间的电阻是否足够大。
然后就是安装元件了。相互独立的模块,如果您没有把握保证它们工作正常时,最好不要全部都装上,而是一部分一部分的装上(对于比较小的电路,可以一次全部装上),这样容易确定故障范围,免得到时遇到问题时,无从下手。一般来说,可以把电源部分先装好,然后就上电检测电源输出电压是否正常。如果在上电时您没有太大的把握(即使有很大的把握,也建议您加上一个保险丝,以防万一),可考虑使用带限流功能的可调稳压电源。先预设好过流保护电流,然后将稳压电电源的电压值慢慢往上调,并监测输入电流、输入电压以及输出电压。如果往上调的过程中,没有出现过流保护等问题,且输出电压也达到了正常,则说明电源部分OK。反之,则要断开电源,寻找故障点,并重复上述步骤,直到电源正常为止。
接下来逐渐安装其它模块,每安装好一个模块,就上电测试一下,上电时也是按照上面的步骤,以避免因为设计错误或/和安装错误而导致过流而烧坏元件。
寻找故障的办法一般有下面几种:
①测量电压法。首先要确认的是各芯片电源引脚的电压是否正常,其次检查各种参考电压是否正常,另外还有各点的工作电压是否正常等。例如,一般的硅三极管导通时,BE结电压在0.7V左右,而CE结电压则在0.3V左右或者更小。如果一个三极管的BE结电压大于0.7V(特殊三极管除外,例如达林顿管等),可能就是BE结就开路。
②信号注入法。将信号源加至输入端,然后依次往后测量各点的波形,看是否正常,以找到故障点。有时我们也会用更简单的办法,例如用手握一个镊子,去碰触各级的输入端,看输出端是否有反应,这在音频、视频等放大电路中常使用(但要注意,热底板的电路或者电压高的电路,不能使用此法,否则可能会导致触电)。如果碰前一级没有反应,而碰后一级有反应,则说明问题出在前一级,应重点检查。
③当然,还有很多其它的寻找故障点的方法,例如看、听、闻、摸等。“看”就是看元件有无明显的机械损坏,例如破裂、烧黑、变形等;“听”就是听工作声音是否正常,例如一些不该响的东西在响,该响的地方不响或者声音不正常等;“闻”就是检查是否有异味,例如烧焦的味道、电容电解液的味道等,对于一个有经验的电子维修人员来说,对这些气味是很敏感的;“摸”就是用手去试探器件的温度是否正常,例如太热,或者太凉。一些功率器件,工作起来时会发热,如果摸上去是凉的,则基本上可以判断它没有工作起来。但如果不该热的地方热了或者该热的地方太热了,那也是不行的。一般的功率三极管、稳压芯片等,工作在70度以下是完全没问题的。70度大概是怎样的一个概念呢?如果你将手压上去,可以坚持三秒钟以上,就说明温度大概在70度以下(注意要先试探性的去摸,千万别把手烫伤了)。
好了,关于调试的问题,我们今天就暂时讲这么多,如果想要了解更多的调试方法和经验,可以去找一些家用电器维修的书来看看,一个好的设计人员,首先应该是一个好的维修人员。
首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的“X10”档。另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。另外还要注意的地方是,如果使用片内ROM的话(大部分情况下如此,现在已经很少有用外部扩ROM的了),一定要将EA引脚拉高,否则会出现程序乱跑的情况。有时用仿真器可以,而烧入片子不行,往往是因为EA引脚没拉高的缘故(当然,晶振没起振也是原因只一)。经过上面几点的检查,一般即可排除故障了。如果系统不稳定的话,有时是因为电源滤波不好导致的。在单片机的电源引脚跟地引脚之间接上一个0.1uF的电容会有所改善。如果电源没有滤波电容的话,则需要再接一个更大滤波电容,例如220uF的。遇到系统不稳定时,就可以并上电容试试(越靠近芯片越好)。
51单片机复位后的状态
时间: 17:24:26 来源:21ic 作者:单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值,见下表。
值得指出的是,记住一些特殊功能寄存器复位后的主要状态,对于了解单片机的初态,减少应用程序中的韧始化部分是十分必要的。
说明:表中符号*为随机状态;
A=00H,表明累加器已被清零;
PSW=00H,表明选寄存器0组为工作寄存器组;
SP=07H,表明堆栈指针指向片内RAM 07H字节单元,根据堆栈操作的先加后压法则,第一个被压入的内容写入到08H单元中;
Po-P3=FFH,表明已向各端口线写入1,此时,各端口既可用于输入又可用于输出;
IP=×××00000B,表明各个中断源处于低优先级;
IE=0××00000B,表明各个中断均被关断;
系统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。
51单片机在系统复位时,将其内部的一些重要寄存器设置为特定的值,(在特殊寄存器介绍时再做详细说明)至于内部RAM内部的数据则不变。
AVR,51单片机IO结构
AVR的IO是真正双向IO结构,由于大部分网友都是从标准51转过来的,受标准51的准双向IO和布尔操作概念影响,没能掌握AVR的IO操作,所以有必要撰文说明一下
其实采用真正双向IO结构的新型MCU很多,常用的有 增强型51,PIC,AVR等
先简单的回顾一下标准51的准双向IO结构
这种准双向IO结构的特点是
1 输出结构类似 OC门,输出低电平时,内部NMOS导通,驱动能力较强(800uA);输出高电平靠内部上拉电阻,驱动能力弱(60uA)。
2 永远有内部电阻上拉(P0口除外),高电平输出电流能力很弱,所以即使IO口长时间短路到地也不会损坏IO口
(同理,IO口低电平输出能力较强,作低电平输出时不能长时间短路到VCC)
3 作输入时,因为OC门有&线与&特性,必须把IO口设为高电平(所以按键多为共地接法)
4 作输出时,输出低电平可以推动LED(也是很弱的),输出高电平通常需要外接缓冲电路(所以LED多为共阳接法)
5 软件模拟 OC结构的总线反而比较方便-----例如 IIC总线
* P0口比较特殊,做外部总线时,是推挽输出,做普通IO时没有内部上拉电阻,所以P0口做按键输入需要外接上拉电阻。
* OC门:三极管的叫集电极开路,场效应管的叫漏极开路,简称开漏输出。具备&线与&能力,有0得0。
* 为什么设计成输出时高电平弱,低电平强----是考虑了当年流行的TTL器件输入特性
AVR的真正双向IO结构就复杂多了,单是控制端口的寄存器也有4个 PORTx.DDRx,PINx,SFIOR(PUD位),不过功能也强劲多了
作为通用数字I/O 使用时,所有AVR I/O 端口都具有真正的读- 修改- 写功能。
这意味着用SBI 或CBI 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会无意地改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
并有保护二极管与VCC 和地相连。
* (很多数字器件都有保护二极管,在低功耗应用时要考虑保护二极管的电流倒灌的影响)
每个端口都有三个I/O 存储器地址:
数据寄存器 – PORTx
数据方向寄存器 – DDRx
端口输入引脚 – PINx。
数据寄存器PORTx和数据方向寄存器DDRx为读/ 写寄存器,而端口输入引脚PINx为只读寄存器。
但是需要特别注意的是,对PINx 寄存器某一位写入逻辑&1“ 将造成数据寄存器相应位的数据发生&0“ 与“1“ 的交替变化。
当寄存器MCUCR 的上拉禁止位PUD置位时所有端口引脚的上拉电阻都被禁止。
在( 高阻态) 三态({DDxn, PORTxn} = 0b00) 输出高电平({DDxn, PORTxn} = 0b11) 两种状态之间进行切换时,
上拉电阻使能({DDxn, PORTxn} = 0b01) 或输出低电平({DDxn,PORTxn} = 0b10) 这两种模式必然会有一个发生。
通常,上拉电阻使能是完全可以接受的,因为高阻环境不在意是强高电平输出还是上拉输出。
如果使用情况不是这样子,可以通过置位SFIOR 寄存器的PUD 来禁止所有端口的上拉电阻。
在上拉输入和输出低电平之间切换也有同样的问题。
用户必须选择高阻态({DDxn,PORTxn} = 0b00) 或输出高电平({DDxn, PORTxn} = 0b10) 作为中间步骤。
不论如何配置DDxn,都可以通过读取PINxn 寄存器来获得引脚电平
PINxn寄存器的各个位与其前面的锁存器组成了一个同步器。
这样就可以避免在内部时钟状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。
其缺点是引入了延迟。
AVR IO具备多种IO模式:
1 高阻态 ,多用于高阻模拟信号输入,例如ADC数模转换器输入,模拟比较器输入
2 弱上拉状态(Rup=20K~50K),输入用。为低电平信号输入作了优化,省去外部上拉电阻,例如按键输入,低电平中断触发信号输入
3 推挽强输出状态,驱动能力特强(&20mA),可直接推动LED,而且高低驱动能力对称.
使用注意事项:
写用PORTx,读取用PINx
实验时,尽量不要把管脚直接接到GND/VCC,当设定不当,IO口将会输出/灌入 80mA(Vcc=5V)的大电流,导致器件损坏。
作输入时:
1通常要使能内部上拉电阻,悬空(高阻态)将会很容易受干扰。(表面看好像是51的抗干扰能力强,是因为51永远有内部电阻上拉,)
2尽量不要让输入悬空或模拟输入电平接近VCC/2,将会消耗太多的电流,特别是低功耗应用场合------CMOS电路的特点
3读取软件赋予的引脚电平时需要在赋值指令out 和读取指令in 之间有一个时钟周期的间隔,如nop 指令。
4功能模块(中断,定时器)的输入可以是低电平触发,也可以是上升沿触发或下降沿触发。
5用于高阻模拟信号输入,切记不要使能内部上拉电阻,影响精确度。例如ADC数模转换器输入,模拟比较器输入
作输出时:
采用必要的限流措施,例如驱动LED要串入限流电阻
复位时内部上拉电阻将被禁用。如果应用中(例如电机控制)需要严格的电平控制,请使用外接电阻固定电平
作输出的,依然维持状态不变
作输入的,一般无效,但如果使能了第二功能(中断使能),其输入功能有效。例如 外部中断的唤醒功能。
AVR的C语言IO操作:
AVR的C语言基于ANSI C,没有像51那样扩展了位操作(布尔操作),虽然汇编指令里面有SBI/CBI/SBIC/SBIS指令
所以需要采用 位逻辑运算 来实现,这是必须要掌握的。
IO口和功能寄存器的操作方法一样,但对于部分功能寄存器的读写有特殊要求,请参看手册。
不必考虑代码效率的问题,如果可能,GCCAVR会自动优化为SBI/CBI/SBIC/SBIS指令,跟汇编的效率是一样的。
例如 iom16.h 里面定义了 #define PA7 7
(这标准头文件定义了MCU的所有官方定义(包括寄存器,位,中断入口等),但管脚的第二功能没有定义)
想PA7为1 PORTA|=(1&
想PA7为0 PORTA&=~(1&
想PA7取反 PORTA^=(1&
想检测PA7是否为1 if (PINA&(1&
想检测PA7是否为0 if !(PINA&(1&
* && 为左移运算符,不懂的就要好好复习C语言基础了。
注意IO操作的顺序:
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
假设PA口驱动LED的负极,低电平灯亮
初始化方法1:
PORTA=0xFF; //内部上拉,高电平
DDRA=0xFF; //输出高电平---------灯一直是灭的
初始化方法2:
DDRA=0xFF; //输出低电平--------灯被错误点亮了
PORTA=0xFF; //输出高电平--------马上被熄灭了,时间很短(1个指令不到uS时间),灯闪了一下,眼睛无法察觉
但要是这个IO口是控制炸药包的点火信号呢?工控场合要考虑可靠性的问题
模拟OC结构的IIC总线的技巧:
虽然AVR大多带有硬件IIC接口,但也有需要使用软件模拟IIC的情况
可以通过使用外部上拉电阻+控制DDRx的方法来实现OC结构的IIC总线。
IIC的速度跟上拉电阻有关,内部的上拉电阻阻值较大(Rup=20K~50K),只能用于低速的场合
#define SDA 0 //PC0
#define SCL 1 //PC1
(程序初始化设定 SDA和SCL都是 PORT=0,DDR=0)
#define SDA_0() DDRA|=(1&
#define SDA_1() DDRA&=~(1&
#define SCL_0() DDRA|=(1&
#define SCL_1() DDRA&=~(1&
使用上面的SDA_0()/SDA_1()/SCL_0()/SCL_1()宏即可,直观,而且效率跟汇编是一样的。
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置
机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需
要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51
系列只提供一个串口,那么另一个串口只能靠程序模拟。
1. 本文所说的模拟串口, 就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高
低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则
将其置1,各种数据位和校验位则根据情况置1或置0。
2. 串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特
率为9600bps,即每一位传送时间为1000ms/ms,即位与位之间的延时为0.104毫
秒。单片机的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指令周期,可
通过若干个指令周期来进行延时,
3. 单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。用此频率则每个指令
周期的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?
指令周期s=(0)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为
96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。
至于别的晶振频率大家自已去算吧。
现在就以11.0592M的晶振为例,谈谈三种模拟串口的方法。
*************************************************************************************/
/***********************************************************************************
方法一: 延时法
分 析: 此种方法在接收上存在一定的难度,主要是采样定位需较准确,另外还必须知道
每条语句的指令周期数。此法可能模拟若干个串口,实际中采用它的人也很多,但如
果你用Keil C,本人不建议使用此种方法,上述程序在P89C52、AT89C52、W78E52三种
单片机上实验通过。
通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期。
**************************************************************************************/
#define uchar unsigned char
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
#define RXD P1_0 //接收脚
#define TXD P1_1 //发送脚
#define WRDYN 44 //写延时
#define RDDYN 43 //读延时
//延时程序*
void Delay2cp(unsigned char i)
while(--i); //刚好两个指令周期。
//往串口发送一个字节
void WByte(uchar input)
uchar i=8;
TXD=(bit)0; //发送启始位
Delay2cp(39);
//发送8位数据位
while(i--)
TXD=(bit)(input&0x01); //先传低位
Delay2cp(36);
input=input&&1;
//发送校验位(无)
TXD=(bit)1; //发送结束位
Delay2cp(46);
//从串口接收一个字节
uchar RByte(void)
uchar Output=0;
uchar i=8;
uchar temp=RDDYN;
//接收8位数据位
Delay2cp(RDDYN*1.5); //此处注意,等过起始位
while(i--)
Output &&=1;
if(RXD) Output |=0x80; //先收低位
Delay2cp(35); //(96-26)/2,循环共占用26个指令周期
while(--temp) //在指定的时间内搜寻结束位。
Delay2cp(1);
if(RXD) //收到结束位便退出
/***********************************************************************************
方法二: 计数法
分 析: 51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以
通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志
来决定是否发送或接收下一位。
接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和发送
都很准确,另外不需要计算每条语句的指令周期数。
**************************************************************************************/
//计数器初始化
void S2INI(void)
TMOD |=0x02; //计数器0,方式2
TH0=0xA0; //预值为256-96=140,十六进制A0
TR0=1; //开始计数
//查询计数器溢出标志位
void WaitTF0( void )
while(!TF0);
//向串口发送一个字节数据
void WByte(uchar input)
//发送启始位
uchar i=8;
TXD=(bit)0;
WaitTF0();
//发送8位数据位
while(i--)
TXD=(bit)(input&0x01);//先传低位
WaitTF0();
input=input&&1;
//发送校验位(无)
//发送结束位
TXD=(bit)1;
WaitTF0();
/***********************************************************************************
方法三:中断法
分 析:中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以
在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位,当然程
序中需对中断进行初始化,同时编写中断程序。本程序使用Timer0中断。
中断法也是我推荐的方法,和计数法大同小异。发送程序参考计数法,相信是件很容
另外还需注明的是本文所说的串口就是通常的三线制异步通信串口(UART),只用
RXD、TXD、GND。
**************************************************************************************/
#define TM0_FLAG P1_2 //设传输标志位
//计数器及中断初始化
void S2INI(void)
TMOD |=0x02; //计数器0,方式2
TH0=0xA0; //预值为256-96=140,十六进制A0
TR0=0; //在发送或接收才开始使用
ET0=1; //允许定时器0中断
EA=1; //中断允许总开关
//接收一个字符
uchar RByte()
uchar Output=0;
uchar i=8;
TR0=1; //启动Timer0
WaitTF0(); //等过起始位
//接收8位数据位
while(i--)
Output &&=1;
if(RXD) Output |=0x80; //先收低位
WaitTF0(); //位间延时
while(!TM0_FLAG) if(RXD)
TR0=0; //停止Timer0
//中断1处理程序
void IntTimer0() interrupt 1
TM0_FLAG=1; //设置标志位。
//查询传输标志位
void WaitTF0( void )
while(!TM0_FLAG) ;
TM0_FLAG=0; //清标志位
Powered by
Copyright &

我要回帖

更多关于 硅碳负极 的文章

 

随机推荐