单片机一些基础问题
2013-05-16 来源:21ic
一般说1T 4T 6T 12T的单片机是指的什么?
标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的大多多于一个周期,乘除法更多。所以如果计算指令时间可以这样算。
而现在很多51核的单片机工艺质量上去后,频率大大提高,增强型51有6T的,如果接12M的话,一个nop就只需要0.51uS,如果是STC的部分单片机12T的话,那只需要1/12uS。
单片机的晶振不是随便选,要看技术手册,看最高频率,看支持类型等等。一般12M,接串口的话11.0592M。如果是PIC,很多4M,8M。
不是越高越好,对很多不需要大量处理,只是控制的情况,为了增加可靠性,降低编程难度,降低功耗,往往可选用低频的,例如实时时钟的32768晶振。
外接晶体引脚
XTAL1 是片内振荡器的反相放大器输入端,XTAL2 则是输出端,使用外部振荡器
时,外部振荡信号应直接加到XTAL1,而XTAL2 悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF 左右。
每个8051处理周期包括12 个振荡周期每12 个振荡周期用来完成一项操作如取指令和计算指令执行时间可把时钟频率除以12 取倒数然后指令执行所须的周期数。因此如果你的系统时钟是11.059MHz 除以12 后就得到了每秒执行的指令个数为921583条指令取倒数将得到每条指令所须的时间1.085ms。
复位 RST
在振荡器运行时,有两个机器周期(24 个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51 芯片便循环复位。复位后P0-P3 口均置1 引脚表现为高电平,程序计数器和特殊功能寄存器SFR 全部清零。当复位脚由
高电平变为低电平时,芯片为ROM 的00H 处开始运行程序,复位操作不会对内部 RAM 有所影响。
输入输出引脚
(1) P0 端口[P0.0-P0.7] P0 是一个8 位漏极开路型双向I/O 端口,端口置1(对端口写1)时作高阻抗输入端。作为输出口时能驱动8 个TTL。对内部Flash 程序存储器编程时,接收指令字节;校验程序时输出指令字节,要求外接上拉电阻。在访问外部程序和外部数据存储器时,P0 口是分时转换的地址(低8 位)/数据
总线,访问期间内部的上拉电阻起作用。
(2) P1 端口[P1.0-P1.7] P1 是一个带有内部上拉电阻的8 位双向I/0 端口。输出时可驱动4 个TTL。端口置1 时,内部上拉电阻将端口拉到高电平,作输入用。对内部 Flash 程序存储器编程时,接收低8 位地址信息。
(3) P2 端口[P2.0-P2.7] P2 是一个带有内部上拉电阻的8 位双向I/0 端口。输出时可驱动4 个TTL。端口置1 时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash 程序存储器编程时,接收高8 位地址和控制信息。在访问外部程序和16 位外部数据存储器时,P2 口送出高8 位地址。而在访问8
位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(4) P3 端口[P3.0-P3.7] P2 是一个带有内部上拉电阻的8 位双向I/0 端口。输出时可驱动4 个TTL。端口置1 时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash 程序存储器编程时,接控制信息。除此之外P3 端口还用于一些专门功能,具体请看
P3 引脚兼用功能
P3.0 串行通讯输入(RXD)
P3.1 串行通讯输出(TXD)
P3.2 外部中断0( INT0)
P3.3 外部中断1(INT1)
P3.4 定时器0 输入(T0)
P3.5 定时器1 输入(T1)
P3.6 外部数据存储器写选通WR
P3.7 外部数据存储器写选通RD
波特率与比特率:
波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示,其单位是波特(Baud)。比特率:每秒钟传送的二进制位数,用 b / s 表示(b表示bit)波特率与比特率的关系是比特率=波特率X单个调制状态对应的二进制位数。
两相调制(单个调制状态对应1个二进制位)的比特率等于波特率;四相调制(单个调制状态对应2个二进制位)的比特率为波特率的两倍;八相调制(单个调制状态对应3个二进制位)的比特率为波特率的三倍;依次类推。
晶振可以根据自己的情况使用,一般实验板上是用11.0592MHz 或12MHz,使用前者的好外是可以产生标准的串口波特率,后者则一个机器周期为1 微秒,便于做精确定时。在自己做实验里,注意的是VCC 是+5V 的,不能高于此值,否则将损坏单片机,太低则不能正常工作。在31 脚要接高电平,这样我们才能执行片内的程序,如接低电平则使用片外的程序存储器。
KEIL uVision2 C51 编译器所支持的数据类型
数据类型长度值域
Unsigned char单字节0~255
Signed char单字节-128~+127
Unsigned int双字节0~65535
Signed int双字节-32768~+32767
Unsigned long四字节0~4294967295
Signed long四字节-2147483648~+2147483647
float四字节±1.175494E-38~±3.402823E+38
bit1位0或1
sfr单字节0~255
sfr16双字节0~65535
Sbit1位0或1
变量的定义可以使用所有C51 编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位标量
长整型就在数字后面加字母L,如104L,034L,0xF340 等。浮点型常量可分为十进制和指数表示形式(12e5表示12*10^5)
8051 结构提供给用户3 个不同的存储空间
第一个存储空间是代码段(CODE)用来存放可执行代码被16 位寻址空间可达64K;除了可执行代码还可在代码段中存储查寻表为达此目的8051 提供了通过数据指针DPTR 或程序计数器加上由累加器提供的偏移量进行寻址的指令这样就可以把表头地址装入DPTR 中把表中要寻址的元素的偏移量装入累加器中8051 在执行指令时的过程中把这两者相加由此可节省不少指令周期。
第二个存储区是8051 内128 字节的内部RAM 或8052 的前128 字节内部RAM 这部分主要是作为数据段称为DATA 区指令用一个或两个周期来访问数据段访问DATA 区比访问XDATA 区要快因为它采用直接寻址方式而访问XDATA 须采用间接寻址必须先初始化DPTR 通常我们把使用比较频繁的变量或局部变量存储在DATA 段中但是必须节省使用DATA 段因为它的空间毕竟有限。在数据段中也可通过R0 和R1 采用间接寻址R0 和R1 被作为数据区的指针将要恢复或改变字节的地址放入R0 或R1 中根据源操作数和目的操作数的不同执行指令需要一个或两个周期。数据段中有两个小段第一个子段包含四组寄存器组每组寄存器组包含八个寄存器共32 个寄存器可在任何时候通过修改PSW 寄存器的RS1 和RS0 这两位来选择四组寄存器的任意一组作为工作寄存器组8051 也可默认任意一组作为工作寄存器组工作寄存器组的快速切换不仅使参数传递更为方便而且可在8051 中进行快速任务转换另外一个子段叫做位寻址段BDATA 包括16 个字节共128 位每一位都可单独寻址8051 有好几条位操作指令这使得程序控制非常方便并且可帮助软件代替外部组合逻辑这样就减少了系统中的模块数位寻址段的这16 个字节也可像数据段中其它字节一样进行字节寻址。
8051 系列的一些单片机如8052 有附加的128 字节的内部RAM 位于从80H 开始的地址空间中被称为IDATA 因为IDATA 区的地址和SFRs (特殊功能寄存器)的地址是重叠的通过区分所访问的存储区来解决地址重叠问题因为IDATA 区只能通过间接寻址来访问。8051 的最后一个存储空间为64K 和CODE 区一样采用16 位地址寻址称作外部数据区简称XDATA 区这个区通常包括一些RAM 如SRAM 或一些需要通过总线接口的外围器件。
8051 可对存储区直接或间接寻址这些是典型的寻址方式直接寻址是在指令中直接
包含所须寻址的字节地址直接寻址只能在DATA 区和SFR 中进行。
SBUF 串行缓冲区 DPTR 数据指针 MOVX 读入或写入外部寄存器的数据
fosc (frequency oscillate)晶振频率
指针寄存器而不是直接使用地址
中断系统
基本的8051 支持6 个中断源两个外部中断两个定时/计数器中断一个串行口输
入/输出中断中断发生后处理器转到将五个中断入口处之一执行中断处理程序中断向
量位于代码段的最低地址出串行口输入输出中断共用一个中断向量
reg51.h 详细说明
是c51(用于单片机开发的一种c语言)的头文件。类似于头文件AT89X52.h。这两个头文件基本是一样的,只是在使用时对位的定义不一样,at89x52.h文件中对P1.1的操作是写成P1_1;reg52.h文件中的操作则写成P1^1。表示方法不一样而已。另外前者是特指ATMEL公司的52系列单片机,后者指所有52系列的单片机。
LED3.C(8): error C141: syntax error near \'=\'
在c51单片机里面不可以用#define LED1 P0^1
正确的使用sbit LED1=P0^1;
还有keil编译器不支持像P0^1=0;或P0^1=1;这样的赋值
本征库函数(intrinsic routines)和非本征证库函数
C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。
C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:
_crol_(_cror_):将char型变量循环向左(右)移动指定位数后返回
_iror_(_irol_):将int型变量循环向左(右)移动指定位数后返回
_lrol_(_lror_):将long型变量循环向左(右)移动指定位数后返回
_nop_: 相当于插入NOP “空指令”,在x86的CPU中机器码为0x90(144)。
_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_: 测试并返回源点数状态。
使用时,必须包含#inclucle
如不说明,下面谈到的库函数均指非本征库函数。
TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。
其格式为:
工作原理
其中低四位(即D0 ~ D3)定义定时器/计数器T0,高四位(即D4 ~ D7)定义定时器/计数器T1。各位的说明:
Ⅰ,GATE——门控制。
●GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。
当INT0引脚为高电平时TR0置位,启动定时器T0;
当INT1引脚为高电平时TR1置位,启动定时器T1。
●GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。
Ⅱ,C/T——功能选择位
C/T=0时为定时功能,C/T=1时为计数功能。
置位时选择计数功能,清零时选择定时功能。
Ⅲ,M0、M1——方式选择功能
由于有2位,因此有4种工作方式:
M1M0工作方式功能说明
00方式013位定时器/计数器
01方式116位定时器/计数器
10方式2自动重装8位定时器/计数器
11方式3T0分为2个8位独立计数器,T1停止计数
TR0,TR1:分别为T0,T1的运行控制位。1启动,0停止。
GATE:门控制位。GATE=0,由TR0或TR1启动定时器;GATE=1,只有TR0或TR1为1且INT0 或INT1 为高电平时才能启动定时器。
单片机中的TH0 TL0
TH0和TL0是控制定时/计数器T0的,TH1和TL1是针对T1的。也就是用TH0和TL0中的数来控制T0到底定时多久或计数多少再进入中断,TH1和TL1也一样。
16位定时器/计数器的高低位,TL0是低八位,TH0=是高八位,当低八位计数记满了之后,向高八位进一位,计数器,由于51单片机是8位机,所以要分成两个八位的寄存器来存储16位的计数器!
单片机 TH0=0xd8;TL0=0xf0是什么意思
这是为 T0 计数器赋初值,(高位)TH0=0xd8(0xffd8,初始地址为0xffff),(低位)TL0=0xf0(0xfff0)
换成 10 进制是:55536
那么 65536-55536=10000
表明 T0 计数器 计数 10000 个机器周期后溢出。
如果使用 12M 晶振,那么计数 10000 个机器周期使用 10ms,可以作为定时用。
由于TH0和TL0已知,那么可得T0寄存器中为:0xFF00(16)=65280(10)
X=65536-T0=65536-65280=256,,X即为定时机器周期数
如果是12MHz的话,机器周期=1us,那么定时为256us
如果是6MHz的话,机器周期=2us,那么定时时间为512us
机器周期=12*晶振周期,晶振周期=1/晶振频率
指令周期是看一条指令包含有多少个机器周期,如_nop_就一个机器周期
延时函数delay()
c语言里不是那么算的,编译的时候转汇编了用汇编才算的出,不用纠结这个的精确延时的话也都用定时器,大致的延时的话用软件去算就行了
void delay_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<125;j++);
}
AJMP
是无条件跳转指令之一,叫做绝对跳转。 主要是用来改变程序执行的路线,到需要的指令或程序去执行。 AJMP的范围为正负2K单元。使用时注意跳的目的地和当前地址的距离范围不能超过上述值,否则,就会跳过不去。
$
$代表它自己所在位置的地址
中断允许寄存器IE
中断允许控制寄存器寄存器地址A8H,位寻址AFH~A8H。
中断的允许或禁止是由片内可进行位(什么是位,大家可别到现在还说不知道哦)寻址的 8位中断允许寄存器 IE 来控制的,单片机中断系统中有两种不同类型的中断:一种称为非屏蔽中断;另一种称为屏蔽中断。对于非屏蔽中断,用户不能用软件方法加以禁止,一旦有中断申请,CPU 将根据自然优先级予以响应。这里主要讲屏蔽中断,对于屏蔽中断,我们可以通过软件的方法来予以控制(允许中断我们把它称为中断开放,不允许中断我们把它称之为中断屏蔽),如何操作,说穿了其实很简单,就是通过对 IE 的相应位的置“1”或请“0”来允许或禁止某个中断,请看下面的表格:
EA × × ES ET1 EX1 ET0 EX0
(1)EA:总中断允许开关。它是个总开关,凡是要设置中端都得先通过它。EA=1,开放所有的中断;EA=0,则所有中断都被禁止。
(2)ES:串行口中断控制位。ES=1,允许中断;ES=0,禁止中断。
(3)ET1:定时/计数器 1 中断控制位。ET1=1,允许中断;ET1=0,禁止中断。
(4)EX1:外中断 1 中断控制位。EX1=1,允许中断;EX1=0,禁止中断。
(5)ET0:定时器 0 中断控制位。ET0=1,允许中断;ET0=0,禁止中断。
(6)EX0:外中断 0 中断控制位。EX0=1,允许中断;EX0=0,禁止中断。
SETB
SETB是汇编指令,意思是把其后面的那个寄存器的位置1。
DJNZ
功能:减1,若非0则跳转
说明:DJNE指令首先将第1个操作数所代表的变量减1,如果结果不为0,则转移到第2个操作数所指定的地址去执行。如果第1个操作数的值为00H,则减1后变为0FFH。该指令不影响标志位。跳转目标地址的计算:首先将PC值加2(即指向下一条指令的首字节),然后将第2操作数表示的有符号的相对偏移量加到PC上去即可。byte所代表的操作数可采用寄存器寻址或直接寻址。
为什么要通过了74HC14把持ULN2003 驱动芯片驱动蜂鸣器
74HC14是六反相施密特触发器集成电路,其基础作用就是反相器,一般用于信号输入电路,用施密特触发器对输入信号进行波形整形,对干扰信号有必定的克制作用,其输出为标准的TTL电平。ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理本来需要标准逻辑缓冲器来处理的数据。所以,ULN2003 是通过74HC14把持的,而74HC14是反相器,不加是不行的。。。
ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,可以在高负载电流并行运行。 74HC14实现了6路施密特触发反相器。 蜂鸣器和继电器是电流型驱动的器件,直接用单片机的引脚驱动的话电流不够,所以用ULN2003 进行驱动,74HC14是反向器,也就是把输入的1变为0
2003是反向的三极管输出阵列(有7路),但是,其集电极是开路输出的。输入高就输出低;输入低时,其输出三极管截止,电平悬浮,高电平靠外部负载上的电源V+实现。
2003的第8脚,通常接地;第9脚COM接电源V+,可以为负载电流在断流时提供续流通路.
2003的电流驱动能力就相当于是多个普通的分离的三极管,总电流可达五百毫安。加74HC14主要是确保上电后2003无输出,否则上电后蜂鸣器会先叫一声。
继电器的引脚怎么接
2和6是常开,1和6是常闭,3和4是线圈,5和6是连着的,用哪个都行。
其实不用看引脚图,用万能表一测便知。
把万能表跳到电阻X1K档,有一定值的是线圈,等于0的是常闭,无穷大的是常开,一试就知道了
74HC与74LS的区别
LS的驱动能力要比HC的强一些,所以如果后级的负载比较重的话,要选LS的.同时,LS的功耗也比HC的大一些.HC采用高速CMOS工艺制作,自身功耗低,输出高低电平范围宽。 LS采用早期的双极型工艺,驱动能力相对较大些。
74系列集成电路大致可分为6大类:l 74××(标准型);l 74LS××(低功耗肖特基);l 74S××(肖特基);l 74ALS××(先进低功耗肖特基);l 74AS××(先进肖特基);l 74F××(高速)。近年来还出现了高速CMOS电路的74系列,该系列可分为3大类:l HC为COMS工作电平;l HCT为TTL工作电平,可与74LS系列互换使用;l HCU适用于无缓冲级的CMOS电路。这9种74系列产品,只要后边的标号相同,其逻辑功能和管脚排列就相同。根据不同的条件和要求可选择不同类型的74系列产品,比如电路的供电电压为3V就应选择74HC系列的产品。
TTL和CMOS有什么区别
1,TTL电平:
输出高电平>2.4V,输出低电平<0.4V。在室温下,一般输出高电平是3.5V,输出低电平是0.2V。最小输入高电平和低电平:输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是0.4V。
2,CMOS电平:
逻辑电平电压接近于电源电压,0逻辑电平接近于0V。而且具有很宽的噪声容限。
3,电平转换电路:
因为TTL和COMS的高低电平的值不一样(ttl 5v<==>cmos 3.3v),所以互相连接时需要电平的转换:就是用两个电阻对电平分压,没有什么高深的东西。
4, OC门,即集电极开路门电路,OD门,即漏极开路门电路,必须外界上拉电阻和电源才能将开关电平作为高低电平用。否则它一般只作为开关大电压和大电流负载,所以又叫做驱动门电路。
5,TTL和COMS电路比较:
1)TTL电路是电流控制器件,而coms电路是电压控制器件。
2)TTL电路的速度快,传输延迟时间短(5-10ns),但是功耗大。
COMS电路的速度慢,传输延迟时间长(25-50ns),但功耗低。
COMS电路本身的功耗与输入信号的脉冲频率有关,频率越高,芯片集越热,这是正常现象。
3)CMOS是场效应管构成,TTL为双极晶体管构成
4)COMS的逻辑电平范围比较大(5~15V),TTL只能在5V下工作
5)CMOS的高低电平之间相差比较大、抗干扰性强,TTL则相差小,抗干扰能力差
数码管的8位二进制是高位在前底位在后
74HC573本身能提供20mA的电流,足以使数码管点亮,不必再用三极管驱动了。
关于ULN2003
ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。
ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA.资料的最后有引用电路,9脚可以悬空。
比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
uln2003的作用:
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。
输入5VTTL电平,输出可达500mA/50V。
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。 该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器。
ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
lcd12864与1602的区别
一般12864的控制芯片通常有ST7920、KS0108和T6963C等;但1602是字符的模块控制芯片是KS0066等,1602它现在的芯片也有不少,但都是可以兼容的;简单的来说:12864是图形点阵,是显示图形和汉字,当然也是可以显示字母和阿拉伯数字了;但1602只能显示字母和阿拉伯数字;同时他们的芯片不一样,所以他们的编程上中的程序也是不一样!
1602是指的16字符2行的那种吧。如果是,其点阵是这样的结构。其IC带有字库。想显示字符,只需要输入对应字的地址。
而12864的点阵是连续的。一般不带有字库。想写一个圆点,都要自己想好要写那些位置。屏上每个点都对应字IC内部RAM中一个BIT.
12864 顾名思义像素是128*64,能显示8*4个汉字,因型号不同,有的带汉字库,有的不带,能显示图像效果,功能比1602强大,1602只能显示字母、数字和符号能显示16*2个字符,但寄存器不止32个,具体也忘了,有一些显示效果,如字符一个个显示、字符从左到右或从右到左显示等等,显示效果简单,价格低,大约6块钱,而12864最少40块钱一块,在编程使用方面,两者难度差不多,原理差不多,都是写指令、写地址、写数据等等。
头文件INTRINS.H的作用(转自http://blog.csdn.net/sky0829/article/details/6043230)
在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便.
内部函数 描述
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作8051 NOP 指令
_testbit_ 测试并清零位8051 JBC 指令
函数名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
举例:
_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回
_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_: 测试并返回源点数状态。
就是汇编中的子函数。
_crol_,_cror_:如国二进制数为01010101 那么_crol_(1) 左移1位后将高位补低位。
结果10101010。
功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
C-5 1 程序设计 37
y=0x00ff;
y=_irol_(y,4);
}
函数名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4);
}
函数名: _nop_
原 型: void _nop_(void);
功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。
例:
P()=1;
_nop_();
P()=0;
函数名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。
在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便.
内部函数 描述
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
_nop_ 空操作8051 NOP 指令
_testbit_ 测试并清零位8051 JBC 指令
函数名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
举例:
_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回
_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_: 测试并返回源点数状态。
就是汇编中的子函数。
_crol_,_cror_:如国二进制数为01010101 那么_crol_(1) 左移1位后将高位补低位。
结果10101010。
功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
C-5 1 程序设计 37
y=0x00ff;
y=_irol_(y,4);
}
函数名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4);
}
函数名: _nop_
原 型: void _nop_(void);
功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。
例:
P()=1;
_nop_();
P()=0;
函数名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。
上一篇:单片机入门经验谈
下一篇:单片机串口必备基础知识