51单片机函数库
- 格式:doc
- 大小:181.00 KB
- 文档页数:64
keil C51 中的本征函数库及使用说明本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而不用ACALL 和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率.函数原型extern void _nop_ (void);extern bit _testbit_ (bit);extern unsigned char _cror_ (unsigned char, unsigned char);extern unsigned int _iror_ (unsigned int, unsigned char);extern unsigned long _lror_ (unsigned long, unsigned char);extern unsigned char _crol_ (unsigned char, unsigned char);extern unsigned int _irol_ (unsigned int, unsigned char);extern unsigned long _lrol_ (unsigned long, unsigned char);extern unsigned char _chkfloat_(float);头文件#include说明extern void _nop_ (void);产生一个nop 指令extern bit_testbit_ (bit);产生一个JBC 指令,若该位置位,返回1,否则为0;只能作用于直接寻址的位变量,不能用于表达式之中extern unsigned char _cror_ (unsigned char val, unsigned char n);(unsigned char)val 右移n 位extern unsigned int _iror_ (unsigned int val, unsigned char n));(unsigned int)val 右移n 位extern unsigned long _lror_ (unsigned long val, unsigned char n));(unsigned long)val 右移n 位extern unsigned char _crol_ (unsigned char val, unsigned char n));(unsigned char)val 左移n 位extern unsigned int _irol_ (unsigned int val, unsigned char n));(unsigned int)val 左。
51 单片机定时器延时1s函数1.引言1.1 概述本文介绍了51单片机中的定时器功能以及如何通过定时器实现延时1秒的函数。
在单片机应用中,定时器是一种非常重要且常用的功能模块之一。
它能够精确计时,并可用于实现周期性的任务触发、计时、脉冲输出等功能。
本文首先将对51单片机进行简要介绍,包括其基本概念、结构和特点。
随后,重点讲解了定时器的基本原理和功能。
定时器通常由一个计数器和一组控制寄存器组成,通过预设计数器的初值和控制寄存器的配置来实现不同的计时功能。
接着,本文详细介绍了如何通过编程实现一个延时1秒的函数。
延时函数是单片机开发中常用的功能,通过定时器的计时功能可以实现精确的延时控制。
本文将以C语言为例,介绍延时函数的编写步骤和原理,并给出示例代码和详细的说明。
最后,本文对所述内容进行了总结,并展望了定时器在单片机应用中的广泛应用前景。
通过学习定时器的相关知识和掌握延时函数的编写方法,我们可以更好地应用定时器功能,提高单片机应用的效率和精确性。
综上所述,通过本文的学习,读者可全面了解51单片机中定时器的功能和应用,并能够掌握延时函数的编写方法,为单片机应用开发提供一定的参考和指导。
1.2 文章结构本文以51单片机定时器功能为主题,旨在介绍如何使用定时器进行延时操作。
文章分为引言、正文和结论三个主要部分。
在引言部分,首先会对文章的背景进行概述,介绍单片机的基本概念和应用领域。
然后,给出本文的整体结构,并阐述文章的目的和意义。
正文部分将分为两个小节。
在2.1节中,将对单片机进行详细介绍,包括其构造与工作原理。
这部分的内容将帮助读者全面了解单片机的基本知识,为后续的定时器功能介绍打下基础。
2.2节将重点介绍定时器的功能和特点。
这部分将涵盖定时器的基本原理、工作模式以及在实际应用中的使用方法。
同时,还将详细讲解如何使用定时器进行1秒钟的延时操作,包括具体的代码实现和注意事项。
结论部分将对全文进行总结,并强调定时器的重要性和应用前景。
51单片机引脚读写函数51单片机是一种常见的微控制器,它有多个引脚用于连接外部设备和执行各种功能。
在使用51单片机时,我们通常需要编写读取和写入引脚的函数来控制外部设备或与其他设备进行通信。
首先,让我们来看看如何编写一个读取引脚状态的函数。
在51单片机的编程中,我们可以使用特定的语言(比如C语言)来编写这样的函数。
一个简单的读取引脚状态的函数可能如下所示:c.int readPin(int pinNumber) {。
return P0 & (1 << pinNumber);}。
在这个函数中,我们使用了P0寄存器来读取引脚的状态。
我们通过将1左移pinNumber位来创建一个掩码,然后使用按位与操作来获取该引脚的状态。
这个函数可以根据具体的引脚编号来读取相应引脚的状态。
接下来,让我们来看看如何编写一个写入引脚状态的函数。
一个简单的写入引脚状态的函数可能如下所示:c.void writePin(int pinNumber, int value) {。
if (value == 1) {。
P0 |= (1 << pinNumber);} else {。
P0 &= ~(1 << pinNumber);}。
}。
在这个函数中,我们同样使用了P0寄存器来写入引脚的状态。
根据传入的value参数,我们使用按位或操作或按位与非操作来设置或清除相应的引脚位。
需要注意的是,以上的示例函数是针对51单片机的特定引脚操作的示例,实际使用时需要根据具体的引脚编号和端口寄存器进行相应的修改。
同时,还需要考虑到引脚的输入输出模式、上下拉电阻等其他因素。
总之,编写51单片机引脚的读写函数需要考虑到具体的引脚编号、端口寄存器的操作以及引脚的输入输出模式等因素,以确保准确可靠地控制引脚的状态。
希望这个回答能够帮助你更好地理解51单片机引脚的读写函数。
51单片机延时函数在嵌入式系统开发中,51单片机因其易于学习和使用、成本低廉等优点被广泛使用。
在51单片机的程序设计中,延时函数是一个常见的需求。
通过延时函数,我们可以控制程序的执行速度,实现定时器功能,或者在需要的时候进行延时操作。
本文将介绍51单片机中常见的延时函数及其实现方法。
一、使用for循环延时这种方法不精确,但是对于要求不高的场合,可以用来估算延时。
cvoid delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);}这个延时函数的原理是:在第一个for循环中,我们循环了指定的时间次数(time次),然后在每一次循环中,我们又循环了1275次。
这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。
但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有很大差异,所以只适用于对延时时间要求不精确的场合。
二、使用while循环延时这种方法比使用for循环延时更精确一些,但是同样因为硬件和编译器的不同,延时时间会有差异。
cvoid delay(unsigned int time){unsigned int i;while(time--)for(i=0;i<1275;i++);}这个延时函数的原理是:我们先进入一个while循环,在这个循环中,我们循环指定的时间次数(time次)。
然后在每一次循环中,我们又循环了1275次。
这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。
但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有差异,所以只适用于对延时时间要求不精确的场合。
三、使用定时器0实现精确延时这种方法需要在单片机中开启定时器0,并设置定时器中断。
在中断服务程序中,我们进行相应的操作来实现精确的延时。
这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。
51单片机中断函数单片机的中断是指当单片机在正常运行的过程中,突然接收到来自外部设备或者其他源的信号时,能够立即停止正在执行的程序,转而执行一个特定的子程序,完成接收到的信号处理。
单片机中断函数是在中断发生时执行的一段程序代码。
下面将详细介绍51单片机中断函数的原理和使用方法。
首先,需要了解51单片机的中断原理。
51单片机有5个中断源,分别是外部中断0和1(INT0和INT1),定时器/计数器0和1的中断,以及串口中断(RI/TI)。
每个中断源都有自己的中断标志位,当中断源发生时,相应的中断标志位会被设置为1在单片机的中断函数中,需要首先设置中断使能位,使能相应的中断源。
然后,需要编写中断服务子程序(ISR)的函数体,该函数用于处理中断发生时需要完成的任务。
在ISR中,需要首先清除中断标志位,以防止重复中断。
然后,根据需要进行相关的处理,例如读取外部触发的信号或者发送/接收数据等。
以下是一个简单的外部中断0的中断函数示例:```C#include <reg52.h>void ExtInt0_ISR( interrupt 0//处理中断//...//清除中断标志位EX0=0;//使能外部中断0//...EX0=1;void main//设置中断使能位EA=1;//总中断使能位EX0=1;//使能外部中断0//...while (1)//主程序代码//...}```在上述代码中,`ExtInt0_ISR`函数是外部中断0的中断服务子程序,它使用`interrupt 0`关键字来声明,表示该函数用于处理外部中断0。
在`ExtInt0_ISR`函数体中,可以编写处理中断的代码。
在`main`函数中,首先使用`EA=1`来使能总中断,然后使用`EX0=1`使能外部中断0。
在主程序中的循环中,单片机会一直运行,直到外部中断0发生。
当外部中断0发生时,单片机会立即跳转到`ExtInt0_ISR`函数执行相应的任务。
第3章 MCS-51单片机软件开发环境
37 3.3.2 C51的部分常用库函数
本小节将简要介绍C51的部分常用库函数。
1.abs 函数
abs 函数的详细介绍如表3.14所示。
表3.14 abs 函数介绍 函 数 原 型
#include <math.h> int abs(int x); 函数参数
x :整型 函数功能 计算x 的绝对值 函数返回值
x 的绝对值,整型
说明:在math.h 头文件中,除了abs 函数之外,还有类似的acos 、asin 、atan 等函数。
2.ceil 函数
ceil 函数的详细介绍如表3.15所示。
表3.15 ceil 函数介绍 函 数 原 型
#include <math.h> float ceil(float x); 函数参数
x :浮点数 函数功能
求大于或等于x 的最小整数 函数返回值
大于或等于x 的最小整数,浮点数
说明:在math.h 头文件中,有类似ceil 的求小于或等于x 的最大整数的floor 函数。
3.getchar 函数
getchar 函数的详细介绍如表3.16所示。
表3.16 getchar 函数介绍 函 数 原 型
#include <stdio.h> char getchar(void); 函数参数
无 函数功能
从MCS-51单片机硬件的输入接口用_getkey 函数读入一个字符并且将此字符传递给putchar 函数用于回应 函数返回值
来自输入接口的下一个字符,整型,有ASCII 对应码值
4.gets 函数
gets 函数的详细介绍如表3.17所示。
Keil C51使用详解第一章Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)第三节Keil C51工具包的安装 (7)1. C51 for Dos 72. C51 for Windows的安装及注意事项: (7)第四节Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51,Tscope51及Monitor51. 84. Ishell及uVision. 9第二章Keil C51软件使用详解 (10)第一节Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类: (10)3. 列表文件(listing)控制类: (10)第二节dScope51的使用 (11)1. dScope51 for Dos 112. dScope for Windows 12第三节Monitor51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4. 串口连接图: (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章Keil C51 vs 标准C.. 15第一节Keil C51扩展关键字 (15)第二节内存区域(Memory Areas): (16)1. Pragram Area: (16)2. Internal Data Memory: 163. External Data Memory. 164. Speciac Function Register Memory. 16第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2. 可位寻址区说明20H-2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明: (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明,见上例。
《MCS-51单片机实用子程序库(96年版)》;; 周航慈;;; 目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个;子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方;面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭;代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国;广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错;误,成为现在这个最新版本。
; 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:; (1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库;的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
; (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮;点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
; (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理;程序的工作变得更简单直观。
; 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈;需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序;清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
; 子程序库的使用方法如下:; 1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺;点是程序太长,大量无关子程序也包含在其中。
; 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程;序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是;需要对子程序库进行仔细删节。
; (一)MCS-51定点运算子程序库及其使用说明;;; 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:; 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数;据。
地址小的单元存放数据的高字节。
例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,;(31H)=34H,(32H)=56H。
; 2.运算精度:单次定点运算精度为结果最低位的当量值。
; 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无;关的或非消耗性的信息,程序就具有较好的透明性。
; (1)标号:BCDA功能:多字节BCD码加法;入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
;出口信息:和在[R0]中,最高位进位在CY中。
;影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET; (2)标号:BCDB功能:多字节BCD码减法;;入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
;出口信息:差在[R0]中,最高位借位在CY中。
;影响资源:PSW、A、R2、R3 堆栈需求:6字节;BCDB: LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET; (3)标号:NEG功能:多字节BCD码取补;;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中。
;影响资源:PSW、A、R2、R3 堆栈需求:2字节;NEG: MOV A,R7 ;取(字节数减一)至R2中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0: CLR CMOV A,#99HSUBB A,@R0 ;按字节十进制取补MOV @R0,A ;存回[R0]中INC R0 ;调整数据指针DJNZ R2,NEG0 ;处理完(R2)字节MOV A,#9AH ;最低字节单独取补SUBB A,@R0MOV @R0,AMOV A,R3 ;恢复指针MOV R0,ARET; (4)标号:BRLN功能:多字节BCD码左移十进制一位(乘十);;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
;影响资源:PSW、A、R2、R3 堆栈需求:2字节BRLN: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV R3,#0 ;工作单元初始化BRL1: DEC R0 ;调整数据指针MOV A,@R0 ;取一字节SWAP A ;交换十进制高低位MOV @R0,A ;存回MOV A,R3 ;取低字节移出的十进制高位XCHD A,@R0 ;换出本字节的十进制高位MOV R3,A ;保存本字节的十进制高位DJNZ R2,BRL1 ;处理完所有字节RET; (5)标号:MULD功能:双字节二进制无符号数乘法;;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节MULD: MOV A,R3 ;计算R3乘R7MOV B,R7MUL ABMOV R4,B ;暂存部分积MOV R5,AMOV A,R3 ;计算R3乘R6MOV B,R6MUL ABADD A,R4 ;累加部分积MOV R4,ACLR AADDC A,BMOV R3,AMOV A,R2 ;计算R2乘R7MOV B,R7MUL ABADD A,R4 ;累加部分积MOV R4,AADDC A,BMOV R3,ACLR ARLC AXCH A,R2 ;计算R2乘R6MOV B,R6MUL ABADD A,R3 ;累加部分积MOV R3,AMOV A,R2ADDC A,BMOV R2,ARET; (6)标号:MUL2功能:双字节二进制无符号数平方;;入口条件:待平方数在R2、R3中。
;出口信息:结果在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R5 堆栈需求:2字节MUL2: MOV A,R3 ;计算R3平方MOV B,AMUL ABMOV R4,B ;暂存部分积MOV R5,AMOV A,R2 ;计算R2平方MOV B,AMUL ABXCH A,R3 ;暂存部分积,并换出R2和R3XCH A,BXCH A,R2MUL AB ;计算2×R2×R3CLR CRLC AXCH A,BRLC AJNC MU20INC R2 ;累加溢出量MU20: XCH A,B ;累加部分积ADD A,R4MOV R4,AMOV A,R3ADDC A,BCLR AADDC A,R2MOV R2,ARET; (7)标号:DIVD功能:双字节二进制无符号数除法;;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7 堆栈需求:2字节DIVD: CLR C ;比较被除数和除数MOV A,R3SUBB A,R7MOV A,R2SUBB A,R6JC DVD1SETB OV ;溢出RETDVD1: MOV B,#10H ;计算双字节商DVD2: CLR C ;部分商和余数同时左移一位MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AXCH A,R2RLC AXCH A,R2MOV F0,C ;保存溢出位CLR CSUBB A,R7 ;计算(R2R3-R6R7)MOV R1,AMOV A,R2SUBB A,R6ANL C,/F0 ;结果判断JC DVD3MOV R2,A ;够减,存放新的余数MOV A,R1INC R5 ;商的低位置一DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)MOV A,R4 ;将商移到R2R3中MOV R2,AMOV A,R5MOV R3,ACLR OV ;设立成功标志RET; (8)标号:D457功能:双字节二进制无符号数除以单字节二进制数;;入口条件:被除数在R4、R5中,除数在R7中。
;出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源:PSW、A、R3~R7 堆栈需求:2字节D457: CLR CMOV A,R4SUBB A,R7JC DV50SETB OV ;商溢出RETDV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)DV51: MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV F0,CCLR CSUBB A,R7ANL C,/F0JC DV52MOV R4,ADV52: CPL CMOV A,R3RLC AMOV R3,ADJNZ R6,DV51MOV A,R4 ;四舍五入ADD A,R4JC DV53JC DV54DV53: INC R3DV54: CLR OVRET; (9)标号:DV31功能:三字节二进制无符号数除以单字节二进制数;;入口条件:被除数在R3、R4、R5中,除数在R7中。
;出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
;影响资源:PSW、A、B、R2~R7 堆栈需求:2字节DV31: CLR CMOV A,R3SUBB A,R7JC DV30SETB OV ;商溢出RETDV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5DM23: CLR CMOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV F0,CCLR CSUBB A,R7ANL C,/F0JC DM24MOV R3,AINC R5DM24: DJNZ R2,DM23MOV A,R3 ;四舍五入ADD A,R3JC DM25SUBB A,R7JC DM26DM25: INC R5JNZ DM26INC R4DM26: CLR OVRET ;商在R4R5中; (10)标号:MULS功能:双字节二进制有符号数乘法(补码);;入口条件:被乘数在R2、R3中,乘数在R6、R7中。