173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

51单片机程序库

htxw 2023-03-13 资讯中心 14 ℃

一个51单片机C程序,里面有一个bin的文件,这个bin文件应该包含了几个重要的函数;能用什么打开!

这个一般是打不开的,打开就等于是盗用人家的代码。

lib文件

意义:

lib有静态lib和动态lib之分。

使用:

lib文件通过编译才可以使用,编译分静态与动态之分。

静态:

静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序

动态:

动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持

详细说明:

lib文件是不对外公开的,不能查看一个编译过后的文件

有几个选择:

1。如果你查看有同名的dll文件,可以通过vc自带的depends查看dll接口

2。通过msdn看你使用的该lib包含的函数名,来查找其对应的头文件,头文件里面有整个lib的函数声明(可能不全)

3。查看vc或者其他工具安装目录下的src目录,查看函数的代码

lib文件是二进制文件,所以要查看它的内容,只能反汇编。

用编程语言,打开lib文件的办法有三个:

1、在object/library modules使用全路径名;

2、把*.lib放在VC的Lib目录中

3、修改project setting的Link-Input中的Addtional library path,加入你的目录。

LIB文件是库文件(与DLL文件相类似),供其它程序调用的,直接打不开。

内容

一个lib文件是obj文件的集合。当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件。我们可以通过tlib.exe(在tc2.0下的根目录)来对lib文件进行操作,你可以把自己生成的obj文件通过tlib命令加入到一个lib文件中,也可以把lib文件内的obj文件进行删除操作,还可以把内部的obj文件给提取出来。明白了lib文件的大致结构以及对它的具体操作,在学习C语言的过程中,就会又多了一个切入点对C语言具体实现进行研究。

使用步骤

在command下,把当前目录设置为tlib.exe所在目录,然后输入tlib命令回车,此时显示的内容就是对tlib命令的详细解释,语法如下:

Syntax: TLIB libname [/C] [/E] commands, listfile

libname library file pathname

commands sequence of operations to be performed (optional)

listfile file name for listing file (optional)

A command is of the form: symbolmodulename, where symbol is:

+ add modulename to the library

- remove modulename from the library

* extract modulename without removing it

-+ or +- replace modulename in library

-* or *- extract modulename and remove it

/C case-sensitive library

/E create extended dictionary

具体解释:

tlib libname [/C] [/E] commands, listfile

/C:大小写敏感标志。该选项不常用,此参数为可选项。

/E:建立扩展字典。建立扩展字典可以加速大的库文件的连接过程,此参数同样为可选项。

操作命令(可选项):

+ obj文件名 把指定obj文件添加到lib文件中

- obj文件名 把指定obj文件从lib文件中删除

* obj文件名 导出指定的obj文件(导出后对应的obj文件在lib文件内仍然存在)

-+ obj文件名 替换指定的obj文件(前提是在lib文件中存在与指定obj文件同名的obj)

-* obj文件名 导出指定的obj文件(导出后把对应的obj文件从lib文件内删除)

lib文件中obj文件列表(可选项)

此参数说明了命令运行后,生成的对应lib文件的列表文件名。它记录了当前lib文件内obj文件列表

与dll区别编辑

(1)lib是编译时需要的,dll是运行时需要的。

如果要完成源代码的编译,有lib就够了。

如果也使动态连接的程序运行起来,有dll就够了。

在开发和调试阶段,当然最好都有。

(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL文件必须随应用程序一起发行,否则应用程序将会产生错误。

加载方法编辑

直接加入

在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。

设置

打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。

程序代码

加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。

当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。

详解

节的概念编辑

Lib格式只有四种类型的节(Section),即First Sec,Second Sec,Longname Sec和Obj Sec;其中Second Sec与Longname Sec是可选节,很多Lib文件中都没有。而开头的Singature只是一个标识,它相当于COFF目标文件中的魔法数字。它是一个长度为8的字符串,值为“!arch\n”。

First Sec 顾名思义,就是第一个节。它包含了库中所有的符号名以及这些符号所在的目标文件在库中的位置(绝对偏移)。

Second Sec 就是第二节。它的内容和First Sec是相同的。不同的是,Second Sec是一个有序表,通过它来查找库中的符号比通过First Sec来查找要快很多。

Longname Sec 是长名称节。这一节是一个字符串表。它包含了所有长目标文件名。如果后面的Obj Sec中没有给出相应的目标文件名,我们就要到这一节中来查找。

Obj Sec 就是目标文件节。这些节中存储着不同的目标文件的原始数据。

在库文件中,每一节都有两个部分。一个部分是头,另一个部分才是该节的数据;数据紧跟在头的后面。头描述了该节数据的类型、长度等信息。这些头的格式都是相同的。其结构用C语言描述如下:

typedef struct {

char Name[16]; // 名称

char Time[12]; // 时间

char UserID[6]; // 用户ID

char GroupID[6]; // 组ID

char Mode[8]; // 模式

char Size[10]; // 长度

char EndOfHeader[2];// 结束符

} SectionHeader;

可以看到,头中的数据全都是字符串。用字符串的好处是可以提高格式的兼容性,因为在不同的机器上,数据的排列方式是不同的。有的机器是以Little-Endian方式工作,还有的是以Big-Endian方式工作,它们互不兼容(这两种方式的区别!?请看我的《COFF格式》一文,其中的文件头一节有说明)。用字符串就不会有这种问题(后面我们将会遇到)。但它也有不方便的地方,就是必须把字符串转换成数值,多了一个步骤。

在这个结构中,最常用的Name、Size以及EndOfHeader三个成员。Name就是节的名称啦!Size也很好理解,就是该节数据的长度。其内容为“`\n”(注意,这里没有打错,是两个字符“`”和“\n”)。怎么样?有点奇怪吧?为什么要有这个结束符?每一节的头长度一定,每节中的数据长度也知道。按顺序向下读不行吗?答案是:不行!因为每一节之间存在间隙!通常是一个字节或零个字节。如果是零个字节倒好,按顺序向下读是OK的。可是如果不为零的话,这样读就要错位了。要知道错位没有,只好用一个结束符来定位了。如果在读头的时候发现结束符不对,那就要一个字节一个字节地向下查找,直到找到结束符,才能算是对齐了。切记!切记!

当然,通过First Sec或Second Sec中给出的偏移来读数据就不存在这个问题。不会发生错位,放心读吧!

First Sec

第一节,通常就是Lib中的每一个小节。它的名称是“/”。其数据部分的结构如下:

typedef struct {

unsigned long SymbolNum; // 库中符号的数量

unsigned long SymbolOffset[n]; // 符号所在目标节的偏移

char StrTable[m]; // 符号名称字符串表

}FirstSec;

第一个成员SymbolNum是符号的数量。注意!它是以Big-Endian方式储存的(x86平台上的数据是以Little-Endian方式储存的。这里应该注意转换。后面给出的convert函数可以在Little-Endian格式与Big-Endian格式之间进行相互转换)。

第二个成员SymbolOffset是一个数组,它的长度n就是符号的数量,也就是SymbolNum。这个数组储存了每一个符号所在的目标节的偏移。我们可以方便地通过它来查找符号所在的目标文件。注意!它也是以Big-Endian格式储存的。

第三个成员StrTable是一个字符串表,它的长度m就是SectionHeader.Size的值减去(SymbolNum+1)*4。其结构很简单,就是一堆以‘\0’结尾的字符串(和COFF文件中的字符串表结构相同)。在有的系统中,它还可能是以“/\n”这两个字符结尾的字符串的集合。

很简单的一个结构,不过有两个成员的长度是不定的。怎么才能方便地从Lib中读出这些数据,留给大家自己想吧!下面我只给出一个进行Little-Endian与Big-Endian互转的函数。

inline void convert(void * p // 要转换的数据的指针

,size_tsize = 4 // 数据的长度,long为4,short为2

) {

char * buf=(char*)p;

char temp;

for ( size_t i=0;isize/2;i++ ) {

temp=buf[i];

buf[i]=buf[size-i-1];

buf[size-i-1]=temp;

}

}

Second Sec

第二节

这一节与第一节很相似!它通常也就是Lib文件的第二个节。它的名字也是“/”(注意:文件中第一个叫“/”的节是第一节,第二个就是第二节)。不过它的结构与第一节有些不同,如下:

typedef struct {

unsigned long ObjNum; // Obj Sec的数量

unsigned long ObjOffset[x]; // 每一个Obj Sec的偏移

unsigned long SymbolNum; // 库中符号的数量

unsigned short SymbolIdx[n]; // 符号在ObjOffset表中的索引

char StrTable[m]; // 符号名称字符串表

}SecondSec;

第一个成员ObjNum是库中Obj Sec的数量。

第二个成员ObjOffset是一个偏移表,它记录了库中所有Obj Sec的偏移。这个表的记录数x就是ObjNum。

第三个成员SymbolNum与First Sec中的SymbolNum意义相同。

第四个成员SymbolIdx变成了一个索引,它记录了相应名称字符串在ObjOffset这个表中的位置,我们要通过两次索引才能找到我们所要符号的Obj Sec位置。它的项目数n为SymbolNum。但请注意,这个索引是unsigned short型,不再是unsigned long型。

第五个成员StrTable结构与First Sec中的一样。不过,它的长度m为SectionHeader.Size的值减去((ObjNum+1)*4+(SymbolNum+2)*2)。

值得注意的是,这里的所有数据都是Little-Endian格式的。千万不要弄错了!Longname Sec

这个小节就是一个字符串表,它的名称为“//”,其结构同FirstSec.StrTable。这里就不多说了。

Obj Sec

这一节中的数据就是COFF文件的原始数据,把它读出来存成文件,就是一个COFF文件。它的格式请参考《COFF格式》一文。

要指出的是它的命名方式有些特殊。如果Obj文件的名称少于16个字符,它就会被保存在SectionHeader的Name成员中,以‘/’字符结尾。如果无法保存在Name成员中,则Name成员的第一个字符就为‘/’,之后再跟上这个名称在Longname Sec中的偏移。

例如:

!arch\n

……

LongName Sec:

This_Is_Long_Name0001\0

This_Is_Long_Name0002\0

……

Obj Sec1:

Name[16]:“shortname/”

……

Obj Sec2:

Name[16]:“/0” // 这里使用了第一个长文件名This_Is_Long_Name0001

……

Obj Sec3:

Name[16]:“/22” // 这里使用了第二个长文件名This_Is_Long_Name0002

求51单片机利用定时器消抖的程序!!

定时器消抖就是利用定时器运行一段时间以消耗一段程序运行周期达到延时目的,再关闭定时器,如果你的想法是这样那很好办,一般我们都用delay函数来粗虐延时,你只要将TRx=1(定时器1或0的开关)去替换delay就行,然后根据定时器的初始化来确定延时长短,然后进去中断服务函数,重装初值后TRx=0,关闭定时器就行了,然后下一次消抖又打开,进去中断又关闭,这样反复就达到了延时目的。

有其他想法可以回复一起讨论。

希望我的回答能帮助到你。

用51单片机控制3个步进电机时的程序!越详细越好。

程序是指基本指令,通过范围内的修改达到使用目的。

一个步进电机控制器和3个步进电机的控制器只是脉冲输出点位不一样而已(芯片不一样)当然,输出的IO点也会增加,3个步进电机的控制器可以控制1~3个步进电机不同的工作,基于51单片机的开发代码指令和软件由芯片生产商提供,基础代码由控制器工程师提供,一款产品是基于硬件和软件的结合,开发者一般从硬件设计开始,如果你可以提供控制器硬件,我相信软件就会非常简单。

程序其实就是写代码,和PLC接近,但比PLC复杂,因为PLC是开放式的。

下面是我们的三轴控制器。

三轴运动控制器简介

控制器的功能:

⑴ 显示屏分辨率可选两种128×64点、192×64点单色图形屏(黄绿屏或蓝屏),分别可显示16×16标准点阵汉字4行8列、4行12列。

⑵ 内置蜂鸣器,可以通过软件配合按键发声,或做报警等其他通途。

⑶ 控制器须外接DC5V工作电源。如果系统要用到模拟量输出(0~10VDC)功能,则需要外部的±12VDC电源。

⑷ 用宏晶STC12C系列高性能CPU,同时钟频率下,运算速度比其他51系列CPU快8~12倍。

⑸ 64KB程序空间,8KB + 256KB数据空间,带实时日历时钟。

⑹ 自带512KB字库,含16×16点阵汉字、16×16点阵字符、8×16点阵ASCII字符、12×12点阵汉字、12×12点阵字符、6×12点阵ASCII字符。两种汉字字库均包含全部一、二级汉字。

⑺ 19个按键,其中6个按键上可配有LED指示灯。LED指示灯可单独控制亮暗,和按键本身不直接关联,用于系统中一些常用功能选择之用。

⑻ 3轴运动控制,脉冲+方向,差分输出,最大脉冲频率50KHz,极强的抗干扰能力。也可以接成共阳极输出,系统有+5V输出端子。16位脉冲计数,也可无限发脉冲。

⑼ 2路AB相输入解码。

⑽ 20路DI输入,12~24VDC共阳极。

⑾ 16路DO输出,晶体管输出,可以外接继电器等,外接继电器等感性负载时,须在继电器线圈两端并联反向二极管。

⑿ 支持RS232、RS485通信。

⒀ 串口下载,宏晶官方提供的下载软件。

⒁ 开发环境是KEIL公司的C51开发平台μVision3,也可以自行在网上升级更高版本。

⒂ 开发库是C51格式的库文件。

DFC111.h---------------------------------------基本头文件

DFC_MU102_Sys.h---------------------------系统头文件

DFC_MU102_SYS.LIB---------------------------系统库文件

DFC_MU102_LCD.h------------------------LCD控制头文件

DFC_MU102_LCD.Lib------------------------LCD控制库文件

DFC_MU102_KB19.h------------------------按键控制头文件

DFC_MU102_KB19.Lib------------------------按键控制库文件

DFC_IO111.h------------------------------输入输出头文件

DFC_IO111.Lib------------------------------输入输出库文件

为什么C程序可以在51单片机上运行?51单片机上有C的运行环境和函数库?

51单片机上没有C的运行环境和函数库,你用的是keil软件吧,当你把c程序编写到keil中后,编译后就会生成二进制代码也就是机器码,然后烧进单片机中运行,单片机只识别机器码呀,还不会继续追问,呵呵

很简的51单片机C语言流水灯程序

1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。

例程:

#includereg51.h  //51单片机头文件

#include intrins.h //包含有左右循环移位子函数的库

#define uint unsigned int    //宏定义

#define uchar unsigned char  //宏定义

sbit beep=P2^3;

void delay(uint z)  //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.

{                    //delay(500);大约延时500ms.

    uint x,y;

    for(x=z;x0;x--)

        for(y=110;y0;y--);    

}

void main()            //主函数

{

    uchar a,i,j;

    while(1)        //大循环

    {

        a=0xfe;     //赋初值

        for(j=0;j3;j++) for(i=0;i8;i++)   //左移三次

        {

            P1=a;       //点亮小灯

            beep=0;     //开启蜂鸣器

            delay(50); //延时50毫秒

            beep=1;     //关闭蜂鸣器

            delay(50);  //再延时50毫秒

            a=_crol_(a,1); //将a变量循环左移一位

        }

        a=0x7f;

       for(j=0;j3;j++) for(i=0;i8;i++)  //右移三次

        {

            P1=a;       //点亮小灯

            beep=0;     //开启蜂鸣器

            delay(50); //延时50毫秒

            beep=1;     //关闭蜂鸣器

            delay(50);   //再延时50毫秒

            a=_cror_(a,1); //将a变量循环右移一位

        }        

    }

}

2、51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。

51单片机显示八位数码管的C语言程序

1、最开始,我们先打开keil。

2、接着,我们要定义好库函数,想要实现动态数码灯,这个步骤是很重要的。

3、接着,我们加上一条循环语句。

4、最后,我们把先前定义的延时语句delayms写好。

5、最后,点击这里进行编译,生成一个hex文件。

6、如果这里无错误警告的话,就说明我们的程序写对了,那我们就可以点亮动态数码管了。

51单片机程序库的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:51单片机程序库

<