介绍几款适合爱好者的软件

如果您是个初学电子的学生,或是个入门级的电子爱好者,在开始学习使用电脑绘制电路图PCB时肯定对像PROTEL、POWERPCB这类软件感到上手比较难,或者您在为不想画正规的图纸而又想把您的电子作品分享给朋友们而发愁。还有的就是爱好者经常会使用到面包板、洞洞板来制作电子实验或作品,而在动手前很难得知元件及线路的布置状况,使得制作难度加大。下面介绍三款方便实用的绘图软件则可以帮助到我们解决这些问题,而且图纸十分直观,能反映出元件及布线的真实状况,使得在动手做实际电路之前就能先了解作品的最后形态,增加作品的成功性和分享度。

先来介绍Fritzing,这是一款完全免费的共享软件,支持简体中文,使用方便,功能强大,可以方便的画出实物连线画或原理图,而且有非常丰富的元件库,像arduino、xbee等成品模块都有,可自行定义面包板、洞洞板的尺寸规格,十分适合爱好者使用。可以直接上它的官方网站http://www.fritzing.org/进行下载。先来看一个arduino的实例图,是不是超直观真实呀。

图一 arduino实例图

 

那如何使用呢?下面以一个555时基电路的例子简单说明一下。首先在文件菜单里新建一个项目(图二),项目默认的电路板是使用面包板(图三),在这个例子里我们要使用的是洞洞板,所以需要先删除面包板(图四),在右侧的元件面板中的面包板视图中选洞洞板,并将其拖拉到左边的工作区域(图五),同时可以根据你实际的洞洞板大小进行尺寸设置,然后把工作区切换到原理图界面(图六),进行元件的添加。使用元件搜索功能,输入555,查找到555元件,拖放到工作界面,并在指示栏中修改参数,选项封装形式为DIP(图七)。添加别的元件后(图八),可以进行元件的布置,选中元件右击后有各种操作项,如旋转(图九),选择需要连接的元件引脚,进行连接,软件有自动连线功能十分方便(图十),按电路连接完,所有的元件后就可以得到一份绘制好的原理图了(图十一),最后可以把界面切换到面包板工作界面,这时元件及连线的实物图都有了,只需要布置和整理,就可以得到理想的效果图了(图十二)。

图二新建文件

图三新文件

图四删除

图五添加洞洞板

图六界面切换

图七添加元件

图八添加更多元件

图九旋转元件

图十连接元件

图十一原理图

图十二实物图

 

同样可以方便用于画洞洞板的软件还有Diy Layout Creator和LochMaster,Diy Layout Creato为免费软件,汉化版本可以到http://www.cdle.net/article-144-1.html下载,英文原版本可以到下载http://diy-layout-creator.en.malavida.com/,LochMaster试用版可以到http://www.abacom-online.de/uk/html/demoversionen.html下载,此连接也有别的相关软件下载,有兴趣的朋友也可以下载来试试。

图十三Diy Layout Creator

图十四LochMaster

 

Diy LayoutCreator 功能比Fritzing简单,适用于爱好者在制作小的电子制作时进行对电路元件的预先排放,避免了在制作时元件放置不当而增加了制作难度,也可以用于制作电路连接图或PCB图用于爱好者间的相互交流,但不适合于绘制电路原理图。目前的免费版本元件也比较少。下面我们来试用它画一个简单的LED连接电路。首先打开软件,按左边栏的快速任务栏中的新建项目,弹出项目选择框如图十五所示,有三种电路板形式可以选,设置大小和项目名称,然后就可以电路板上放置所需元件,在图十六中1处选项元件,在2的电路板需要的位置上放置元件,放置元件后可输入元件的参数,元件放置好后可以在图十七的1资源管理器上选择元件进行参数更改,也可以用2中的工具对元件进行移位、旋转等操作,全部无成后可以用3的渲染图片工具,可以得到如图十八的效果图,用于分享制作心得。

图十五新建项目

图十六 放置元件

图十七 修改

图十八 分享

 

LochMaster的功能及实用性我个人感觉都比以上介绍的好,不过是款收费软件,试用版本有限制,有需要的朋友可以上网找别的版本使用。在这里笔者只简单介绍下一些它的实用功能。图十九中的1是LochMaster软件是元件库,都是以实物形状为主,元件库分类比较丰富,每类元件也有多种实物封装,元件是尺寸比例和实物相当,使得绘制的制作图纸十分直观,出来的效果有如照片一般。图十九的2中的工具栏有多种绘制工具,可以绘制连线、焊点等。图中3所指的位置是视图切换工具,可以切换到实物图、顶面图、底面图等多种显示方式。图二十所示的是实物的顶面视图,元件和焊点都十分直观,在制作前先规划好元件位置和连线方式,这样就会使制作变得快捷,而且出错的机会也变少。图二十一是底面视图,有了这功能使这款软件更人性化了,这是众多同类软件所没有的。

图十九 黑白线图

图二十实物视图

图二十一 底面视图

简单易用的BlocksCAD

BlocksCAD是一个免费在线式的积木化编程建模软件。可以使用图形积木化或OpenSCAD编程语言来建模,无需要安装任何软件或插件就可以在浏览器上渲染模型和导出STL等格式的文档。非常适合学生或初级DIY玩家使用,生成的STL文件可以直接使用于3D打印软件或其它CAD软件。下面简单介绍一下BlocksCAD的使用方法。

用浏览器进入网址:https://www.blockscad3d.com/editor 可以进入后注册,也可以不注册使用,注册使用的好处是可以在网站上保存你自己的项目。怎么注册这里就不说了。浏览器建议使用Google Chrome。

进去的界面默认是英文的,可以选择设置为中文简体。

默认是积木模式界面,左边是积木功能块,右边是渲染视图。左上角是项目名称。点击右上角的“OpenSCAD代码”进入代码模式,可以查看当前积木功能块所转换成的OpenSCAD代码。渲染视图中的相机图标的功能是把当前渲染视图的内容转化成JPG图片并下载到本地。

以建立一个‘磁动力电子网‘的字符模型为例,我们先点击左边功能块中的“文本”,再点击“3D文本块”,再修改块中的文本高度等参数,然后点击“渲染”。模型就可以出现在渲染视图中了 。渲染的速度会视图形的复杂程度等因素来决定,中文字需要稍微等一下。如果想让模型偏移到指定坐标,可以点击“变换”功能块,选择“移动模型”功能块,然后设置坐标,并把先前的“3D文本块”和“移动模型”块拼接起来,再次渲染。使用变量、逻辑、数学等功能组合就可以搞出复杂的模型。

渲染完成后,可以点击“生成STL”,会自动下载STL文件到本地,用3D切片软件打开后就可以打印了。

C语言高效编程的几招

第1招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招–以空间换时间。

例如:字符串的赋值。

方法A,通常的办法:

#define LEN 32

char string1 [LEN];

memset (string1,0,LEN);

strcpy (string1,”This is an example!!”)

方法B:

const char string2[LEN]=”This is an example!”

char*cp;

cp=string2;

(使用的时候可以直接用指针来操作。)

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了 大量的内存,但是获得了程序执行的高效率。

如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。

该招数的边招–使用宏函数而不是函数。举例如下:

方法C:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

int BIT_MASK (int_bf)

{

return ((IU<<(bw##_bf))-1)<<(bs##_bf);

}

void SET_BITS(int_dst,int_bf,int_val)

{

_dst=((_dst) & ~ (BIT_MASK(_bf)))I\ (((_val)<<<(bs##_bf))&(BIT_MASK(_bf)))

}

SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumber);

方法D:

#define bwMCDR2_ADDRESS 4

#define bsMCDR2_ADDRESS 17

#define bmMCDR2_ADDRESS BIT_MASK (MCDR2_ADDRESS)

#define BIT_MASK(_bf)(((1U<<(bw##_bf))-1)<< (bs##_bf)

#define SET_BITS(_dst,_bf,_val)\ ((_dst)=((_dst)&~(BIT_MASK(_bf)))I (((_val)<<(bs##_bf))&(BIT_MASK(_bf))))

SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumber);

函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。

第2招:数学方法解决问题

现在我们演绎高效C语言编写的第二招–采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。

举例如下,求1~100的和。

方法E

int I,j;

for (I=1; I<=100; I++){

j+=I;

}

方法F

int I;

I=(100*(1+100))/2

这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式Nx(N+1)/2来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值、100个判断、200个加法(I和j);而方法F仅仅用了1个加法、1个乘法、1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

第3招:使用位操作

实现高效的C语言编写的第三招–使用位操作,减少除法和取模的运算。

在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:

方法G

int I,J;

I=257/8;

J=456%32;

方法H

int I,J;

I=257>>3;

J=456-(456>>4<<4);

在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法 G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁、效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C,ARM C来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。

第4招:汇编嵌入

高效C语言编程的必杀技,第四招–嵌入汇编。

“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法–嵌入汇编、混合编程。

举例如下,将数组一赋值给数组二,要求每一个字节都相符。char string1[1024], string2[1024];

方法I

int I;

for (I=0; I<1024; I++)

*(string2+I)=*(string1+I)

方法J

#int I;

for(I=0; I<1024; I++)

*(string2+I)=*(string1+I);

#else

#ifdef_ARM_

_asm

{

MOV R0,string1

MOV R1,string2

MOV R2,#0

loop:

LDMIA R0!,[R3-R11]

STMIA R1!,[R3-R11]

ADD R2,R2,#8

CMP R2, #400

BNE loop

}

#endif

方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。

虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙、险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记。

使用C语言进行高效率编程,我的体会仅此而已。在此以本文抛砖引玉,还请各位高手共同切磋。希望各位能给出更好的方法,大家一起提高我们的编程技巧。

资料来源网络,作者不详,如有侵权,请通知删除。