2009年10月6日星期二

【转载】 VB编程的七个优良习惯


以下内容,系转载,未经验证,仅供参考。
=============================================
1、"&"替换"+".
在很多人的编程语言中,用"+"来连接字符串,这样容易导致歧义。良好的习惯是用"&"来连接字符串.
不正确:
dim sMessage as string

sMessage="1"+"2"

正确:
dim sMessage as string

sMessage="1" & "2"
注意:"&"的后面有个空格.

2.变量命名大小写,语句错落有秩
下面大家比较一下以下两段代码:
读懂难度很大的代码:
dim SNAME as string
dim NTURN as integer


if NTURN=0 then
if SNAME="sancy" then
end if
Do while until NTURN=4
NTRUN=NTURN+1
Loop
End if
容易读懂的代码:
dim sName as string
dim nTurn as integer

if nTurn=0 then

if sName="sancy" then

end if

Do while until nTurn=4
nTurn=nTurn+1
Loop
End if

3.在简单的选择条件情况下,使用IIf()函数
罗索的代码:
if nNum=0 then
sName="sancy"
else
sName="Xu"
end if
简单的代码:
sName=IIF(nNum=0,"sancy","Xu")

4.尽量使用Debug.print进行调试
在很多初学者的调试中,用MsgBox来跟踪变量值.其实用Debug.print不仅可以达到同样的功效,而且在程序最后编译过程中,会被忽略.而MsgBox必须手动注释或删除.
不正确:
MsgBox nName
正确:
Debug.pring nName

5.在重复对某一对象的属性进行修改时,尽量使用with....end with

6.MsgBox中尽量使用图标
一般来说
vbInformation用来提示确认或成功操作的消息
vbExclamation用来提示警告的消息
vbCritical用来提示危机情况的消息
vbQuestion用来提示询问的消息

7.在可能的情况下使用枚举
枚举的格式为
public enum
...
end enum
好处是加快编程速度

【转载】VB6连接11种数据库语法总结经常使用到有关数据库的操作

以下内容未经验证,仅供参考。
==========================================
VB6连接11种数据库语法总结经常使用到有关数据库的操作


包括连接代码、SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻去。一些比较少用的数据库还不一定能顺利找到,所以现在把它们全归纳到这里,提供大家参考。

<一>数据库的连接方法:

  1.Access数据库的DSN-less连接方法:

set adocon=Server.Createobject("adodb.connection")
adoconn.Open"Driver={Microsoft Access Driver(*.mdb)};DBQ="& _
Server.MapPath("数据库所在路径")


  2.Access OLE DB连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=Microsoft.Jet.OLEDB.4.0;"& _
"Data Source=" & Server.MapPath("数据库所在路径")


  3.SQL server连接方法:

set adocon=server.createobject("adodb.recordset")
adocon.Open"Driver={SQL Server};Server=(Local);UID=***;PWD=***;"& _
"database=数据库名;"


  4.SQL server OLE DB连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"provider=SQLOLEDB.1;Data Source=RITANT4;"& _
"user ID=***;Password=***;"& _
"inital Catalog=数据库名"



  5.Oracle 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"


  6.Oracle OLE DB 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"


  7.dBase 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"


  8.mySQL 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={mysql};database=yourdatabase;
uid=username;pwd=yourpassword;option=16386;"


  9.Visual Foxpro 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"


  10.MS text 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;"&_
"extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"


  11.MS text OLE DB 连接方法:

set adocon=Server.Createobject("adodb.connection")
adocon.open"Provider=microsof.jet.oledb.4.0;data source=your_path;"&_
"Extended Properties'text;FMT=Delimited'"




<二>常用的四种SQL命令:

  1.查询数据记录(Select)
  语法:Select 字段串行 From table Where 字段=内容
  例子:想从book表中找出作者为"cancer"的所有记录,SQL语句便如下:

select * from book where author='cancer'


  "*"是取出book表所有的字段,如查询的字段值为数字,则其后的"内容"便无须加上单引号,如是日期,则在Access中用(#)包括,而在SQL server中则用(')包括,
如:

select * from book where id=1
select * from book where pub_date=#2002-1-7# (Access)
select * from book where pub_date='2002-1-7' (SQL Server)


  提示:
  日期函数to_date不是标准sql文,不是所有的数据库适用,所以大家在使用的时候要参考数据库具体语法

  另外如果是查询传入的变量,则如下:

strau=request.form("author")
strsql="select * from book where author='"&strau&"'"


  如果查询的是数字,则:

intID=request.form("id")
strsql="select * from book where id="&intID


  在很多数据库中,如:oracle,上面的语句是可以写成:

strsql="select * from book where id='"&intID&"'"


  但是字符型一定不能按照数字格式写,需要注意。


  2.添加记录(Insert)
  语法:

Insert into table(field1,field2,....) Values (value1,value2,....)


  例子:添加一作者是"cancer"的记录入book表:

insert into book (bookno,author,bookname) values ('CF001','cancer','Cancer无组件上传程序')


  同样,如果用到变量就如下:

strno=request.form("bookno")
strau=request.form("author")
strname=request.form("bookname")
strsql="insert into book (bookno,author,bookname) values ('"&strno&"','"&strau&"','"&strname&"')"


  3.用Recordset对象的Addnew插入数据的方法:
  语法:

rs.addnew
rs("field1").value=value1
rs("field2").value=value2
...
rs.update


  4.修改数据记录(Update)
  语法:

update table set field1=value1,field2=value2,...where fieldx=valuex


  例子:

update book set author='babycrazy' where bookno='CF001'


  如果用到变量就如下:

strno=request.form("bookno")
strau=request.form("author")
strsql="update book set author='"&strau&"' where bookno='"&strno"'"



  5.Recordset对象的Update方法:
  语法:

rs("field1").value=value1
rs("field2").value=value2
...
rs.update


  注意:使用语法3和语法5的时候,一定要注意字段的类型(尤其是日期型)一致,否则出错的几率非常的高。

  例子:

strno=request.form("bookno")
strau=request.form("author")
set adocon=server.createobject("adodb.connection")
adocon.open "Driver={Microsoft Access Driver(*.mdb)};DBQ=" & _
Server.Mappath=("/cancer/cancer.mdb")
strsql="select * from book where bookno='"&strno&"'"
set rs=server.createobject("adodb.recordset")
rs.open strsql,adconn,1,3
if not rs.eof then '如果有此记录的话
rs("author").value=strau
rs.update
end if
rs.close
set rs=nothing
adocon.close
set adocon=nothing


  6.删除一条记录(Delete)
  语法:

Delete table where field=value


  例子:删除book表中作者是cancer的记录

delete book where author='cancer'


  (注意:如果book表中author字段的值为cancer的记录有多条,将会删除所有author为cancer的记录)

  好了,学会了用这些操作,大家在用asp操作数据库的时候,该是没有什么问题了。

【转载】VB6开发人员规程教程

最近由于工作需要,需要学习一点VB6来生成条形码序列号,所以找了一些VB6方面的学习资料,分享给路过的朋友。

VB6开发人员规程教程
1.1 VB选项参数的定义:
选项能数的规范有两方面的意义:一方面是及时排除程序中存在的拼写错误、语法错误,及时保存程序的修改;另一方面是将所有开发人员的开发界面一致化,以避免开发人员在其它开发人员的电脑上工作时因选项不同而造成的差错。
1) 打开"工具"菜单,在第一页"编辑器"中选定所有选项,并在Tab宽度中输入4。代码缩进时,先选中要缩进的代码块,然后使用快捷键是Tab(右移)和Shift+Tab(左移);如果手工输入空格完成缩进,请以4个空格为单位。
2) 在第二页"编辑器格式"中,不要修改任何选项,一律使用VB默认值,否则可能在其他人妈作时因界面不一致,而产生妈作失误。
3) 在第三页"通用"中,清除"请求时编译"前的复选框(此时"后台编译"选项会变成灰色),以确保每次程序执行时都是全编译执行。
4) 第四页"可连接的",可按自己习惯设定,建议清除所有复选框,这样会编辑代码时代码窗口可获得最大的显示空间。
5) 第五页"环境"中"启动程序时"中一定选择"提示保存改变"(第二项),这样每次程序被修改后再运行时,VB都会提示保存,避免对程序的修改因偶然因素而丢失。
6) 第六页"高级"中各选项由开发人员按自己习惯定义,但要注意当使用SDI方式进行开发时,每次在设计环境中用鼠标拖动窗体都会导致窗体的StartUpPosition变为0-手动,原来在屏幕上居中(StartUpPosition为2-屏幕中心)的窗体运行时可能会改变位置。
1.2 快捷键的使用
使用快捷键提高妈作速度。
F1 帮助
F2 显示对象浏览器
F4 查看当前选中控件的属性窗体
F5 运行
F7 由窗体设计切换到对应的代码窗体
F8 单步执行
Shift+F2 查看当前光标所在的变量或函数、子过程的定义
Shift+F7 由代码窗体切换到对应的窗体设计界面
Shift+F8 逐过程单步执行
Ctrl+F5 全编译执行
Ctrl+F 在代码窗体进行查找
Ctrl+G 查看立即窗体
Ctrl+R 查看工程窗口
 
2. 设计模块和过程
2.1 建具有很强内聚力的模块
过程的重要性往往比模块的重要性更容易理解,过程是指执行一个统一函数的一段代码。模块常被错误的视为是一个仅仅用于存放过程的容器。有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有过程放入单个模块之中。
之所以不能正确的认识模块的功能,原因之一是模块的实现实际上并不影响程序的执行。当一个工程被编译时,如果所有过程都放在单个模块中或者放在几十个模块中,这没有任何关系。虽然模块的数量对代码的执行并无太大的影响,但是当创建便于调试和维护的代码时,模块的数量有时会带来很大的影响。
模块应该用来将相关的过程组织在一起。
当模块包含一组紧密关联的过程时,该模块可以说具有强大的内聚力。当模块包含许多互不相关的过程时,该模块便具有较弱的内聚力。应该努力创建内聚力比较强的模块。
大多数工程都包含许多并不十分适合与其他过程组合在一起的过程。在这种情况下,可以为这些不合群的过程创建一个综合性收容模块。
创建模块时,应知道"模块化"这个术语的含义是什么。模块的基本目的是创建相当独立的程序单元。从根本上来讲,模块可以添加给另一个工程,并且可以通过直接调用它的公用过程来使用它。
2.2 创建松散连接和高度专用的过程
1. 使所有过程都执行专门的任务
每个过程都应执行一项特定的任务,它应出色的完成这项任务。应避免创建执行许多不同任务的过程。
创建专用过程有许多好处。首先调试将变得更加容易。
2. 尽量使过程成为自成一体的独立过程
当一个过程依赖于其他过程的调用时,称为与其他过程紧密连接的过程。紧密连接的过程会使调试和修改变得比较困难,因为它牵涉到更多的因素。松散连接的过程优于紧密连接的过程,但你不可能使每个过程都成为独立的过程。
若要使过程具备较强的独立性,方法之一是尽量减少全局变量和模块级变量。
创建过程时,设法将每个过程视为一个黑箱,其他例程不应要求了解该过程的内部工作情况,该过程也不应要求了解它外面的工程情况。这就是为什么你的过程应依靠参数而不应依靠全局变量的原因。
创建专用过程时,请考虑下列指导原则:
1) 将复杂进程放入专用过程。如果应用程序使用复杂的数学公式,请考虑将每个公式放入它自己的过程中。这样使用这些公式的其他过程就不包含用于该公式的实际代码。这样也可以更容易发现与公式相关的问题。
2) 将数据输入/输出(I/O)放入专用过程。
3) 将专用过程中可能要修改的代码隔离。如果你知道某个进程经常变更,请将这个多变的代码放入专用过程,以便以后可以更容易的进行修改,并减少无意中给其他进程带来问题的可能性。
4) 将业务规则封装在专用过程中。业务规则常属于要修改的代码类别,应与应用程序的其余部分隔开。其他过程不应知道业务规则,只有要调用的过程才使用这些规则。
3. 设计模块和过程时,要达到下列目的:
1) 创建更加容易调试和维护的过程
2) 创建具有强大内聚力的模块
3) 创建高度专用的过程
4) 创建松散连接的过程
5) 尽量使过程具有独立性
6) 提高过程的扇入性
7) 降低过程的扇出性
2.3 编程原则:
1. 为过程和模块赋予表义性强的名字
为了使代码更加容易理解,最容易的方法之一是为你的过程赋予表义性强的名字。函数名DoIt、GetIt的可读性很难与CalculateSalesTax、 RetrieveUserID相比。
由缩写过程名组成的代码很难理解和维护,没有理由再这样做了。
给过程正确的命名,可使程序工程的调试和维护工作大大的改观。请认真对待过程命名的工作,不要为了减少键入妈作量而降低过程的可理解度。
实际应用举例:
1) 给过程命名时应大小写字母混合使用。如果句子全使用大写字母,那么阅读起来就非常困难,而大小写字母混合使用的句子,阅读起来就很容易。
2) 定义过程名时不要使用缩写。如果你认为应用程序中的某些工程应使用缩写,那么请将这些情况加上注释,并确保每个人在所有时间内都使用这些缩写。决不要在某些过程中对某些单词进行缩写,而在别的过程中却不使用缩写。
2. 为每个过程赋予单个退出点
3. 创建过程时,始终都应显式地定义它的作用域。
1) VB使用Public作为默认作用域。如果你真的想创建一个公用过程,请向代码阅读者说明这一点。
2) 通过为每个过程赋予一个明确定义的作用域,可以减少代码阅读者需要投入的工作量。应确保你为过程赋予最有意义的作用域。如果一个过程只被同一模块中的另一个过程调用,那么请将它创建成专用过程。如果该过程是从多个模块中的多个过程中调用,请将该说明为公用过程。
3) 每个过程都应以Public、Private或Friend开头。
4. 用参数在过程之间传递数据
应尽量避免使用模块级变量。一般来说,变量的作用域越小越好。为了减少模块级变量和全局变量,方法之一是将数据作为参数在不同过程之间传递,而不是让过程共享模块级变量或全局变量。
1) 为每个参数指定数据类型。
2) 根据情况传递ByVal或ByRef。给每个参数冠以ByVal或ByRef所需要的规则是非常重要的
3) 始终要对数进行检验,决不要假设你得数据没有问题。程序员常犯的一个错误是在编写过程时假设数据没有问题。在初始编程阶段,当编写调用过程时,这样的假设并无大碍。这时你完全能够知道什么是参数的许可值,并按要求提供这些值。但如果你不对参数的数据进行检验,那么下列情况就会给你带来很大麻烦:另外某个人创建了一个调用过程,但此人不知道允许的值;你在晚些时候添加了新的调用过程,并错误的传递了坏数据。
4) 当参数只接受较小的一组值时,请使用枚举值。使用枚举值,可降低编码时出现数据输入错误的可能性。只要有可能,就可考虑使用枚举值。
3. 命名约定
所有变量的定义应该遵循匈牙利命名法,它使用3字符前缀来表示数据类型和控件类型,3个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字母小写,这样保证了对变量名能够进行正确的断句。
这样,在一个变量名就可以反映出变量类型和变量所存储的值的意义两方面内容,这使得代码语句可读性强、更加容易理解。
3.1 变量类型前缀列表:
数据类型 前缀 示例
Boolean bln BlnLoggedIn
Currency cur curSalary
Control ctl ctlLastControl
Double dbl dblMiles
ErrObject err errLastError
Single sng sngYears
Handle hwnd hwndPicture
Long lng lngOnHand
Object obj objUserTable
Integer int intAge
String str strName
User-defined type udt udtEmployee
Variant (including Dates) vnt vntDateHired
Array a astrEmployees
3.2 控件类型前缀列表:
控件 前缀 举例
Check chk chkPrint
Combo cbo cboTitle
Command cmd cmdCancel
Data dat datBiblio
Directory list box dir dirSource
Drive list box drv drvTarget
File list box fil filSource
Frame fra fraLanguage
Form frm frmMain
Group push button gpb gpbChannel
Horizontal scroll bar hsb hsbVolume
Image img imgIcon
Label lbl lblHelpMessage
Line lin linVertical
List box lst lstResultCodes
MDI child form mdi mdiContact
Menu mnu mnuFileOpen
OLE container ole olePhoto
Option button opt optSpanish
Panel pnl pnlSettings
Picture box pic PicDiskSpace
Picture clip clp ClpToolbar
Shape shp ShpCircle
Text box txt TxtAddress
Timer tmr TmrAlarm
Vertical scroll bar vsb VsbRate
3.3 结构
当用户定义UDT(即用户自定义结构,Type结构)时,它应加上前缀"Type_",以示与其它类型的区别。
3.4 其它
开发人员如果遇到上述表格中未列举的类型,请书面通知相关管理人员,由管理人员集中更新列表内容,不得擅自启用未经确定的新变量或控件前缀。
4. 使用常量和枚举值
4.1 使用常量
1) 常数很容易在数据输入时出错
常数存在的主要问题之一是你很容易在键入数字时出错,从而颠倒了数字的位置。例如,当你键入数字10876时,很容易的键入10867或18076。与处理变量和保留字的方法不同,vb的编译器并不在乎颠倒了位置和不正确的数字,有时简单的错误造成的问题不会立即表现出来,而当问题表现出来时,它们会以随机的计算错误的形式出现,这些错误很难准确定位。用常量来取代常数时,vb将在编译时检查常量的有效性。如果常量不存在,vb便将这一情况通知你,并拒绝进行编译,这可以消除错误键入的数字带来的问题,只要常量拥有正确的值,使用该常量的所有代码也有使用该正确值。
2) 常数很难不断更新
3) 常量使代码更容易阅读
使用常量后,得到的一个额外好处是可使创建的代码更容易阅读。常数很不直观。也许你对常数非常了解,但其他人则根本看不明白。通过合理的给常量命名,使用这些常量的代码就变得比较直观了,更容易阅读。
为常量赋予较宽的作用域,这与使用变量时的情况不同。在一个应用程序中你决不应该两次创建相同的常量。如果你发现自己复制了一个常量,请将原始的常量说明转至较宽的作用域,直到该常量可供引用它的所有过程为止。

4.2 使用枚举值
你不必记住参数的数值,错误地设定值的可能性也大大减少了。虽然你仍可为参数设定数值,而不是设定枚举成员的名字,但你决不应该这样去做。
1) 枚举值的所有成员都是长整型数,你不得使用其他数据类型。
2) 使用常量和枚举值的目的:
减少数字换位和键入错误带来的代码错误;
将来可以更容易更改各个值;
使代码更容易阅读。

4.3 编程原则
常量不同于变量的另一个标识特征是不使用数据类型前缀。
有些外部数据库仍然使用大写字母常量。例如,如果用 API浏览器查找和拷贝与API相关的常量,你常可看到它们是使用大写字母的常量。在这种情况下,请将这些常量保持原状,以便达成应用程序之间的一致性。

1) 将应用程序前缀或特定的前缀用于枚举成员
i. 不必用前缀来表示枚举成员的类型,因为所有成员总是属于长整型数。但应该使用专门的前缀来表示它的值来自应用程序或组件。
ii. 应该用一个指示符作为枚举成员的前缀,因为当vb遇到一个枚举成员名时,如果其他被引用的类型库中包含相同的名字,它就会搞混。
2) 若要了解键入的系统常量是否正确,方法之一是全部用小写字母键入该常量。如果该常量有效,vb就会将它转换成正确的大小写字母。如果该常量仍然保持全部为小写字母,就表示键入的名字不正确,必须进行纠正。
3) 当参数接受有限数量的值时,请使用枚举
4) 使用Select Case结构时,始终要加上一个Else子句,以便处理传递给过程的有效值。
5. 变量
5.1 定义有焦点的变量
用于多个目的的变量称为无焦点(多焦点)的变量。无焦点变量所代表的意义与程序的执行流程有关,当程序处于不同位置时,它所表示的意义是不固定的,这样就给程序的可读性和可维护性带来了麻烦。
比如:定义一个名为rs的RecordSet变量,先用这个变量取得了医院员工数据,之后又用同一个变量名取得了住院病人数据,那么单独抽取出一句使用了变量rs的语句,如果只凭这一句、不从头读起的话,很知道这句话究竟使用的是哪个表的数据。这给程序的维护带来了不必要的麻烦。
5.2 只对常用变量名和长变量名进行缩写
如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用Cnt,而在另一些区域中又使用Count,就会给代码增加不必要的复杂性。
变量名中尽量不要出现缩写。
5.3 使用统一的量词
通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。
量词列表:
量词后缀 说明
First 一组变量中的第一个
Last 一组变量中的最后一个
Next 一组变量中的下一个变量
Prev 一组变量中的上一个
Cur 一组变量中的当前变量
5.4 使用肯定形式的布尔变量
给布尔变量命名时,始终都要使用变量的肯定形式,以减少其它开发人员在理解布尔变量所代表的意义时的难度。
5.5 为每个变量选择最佳的数据类型
这样即能减少对内存的需求量,加快代码的执行速度,又会降低出错的可能性。用于变量的数据类型可能会影响该变量进行计算所产生的结果。在这种情况下,vb不会产生运行期错误,它只是迫使该值符合数据类型的要求。这类问题极难查找。
例如:对可能会出现浮点数的变量,定义为整形或长整形会导致VB在运算时将该变量的值自动取整,这种VB自动进行、隐式的的妈作会增大程序排错时的难度。
5.6 只有在绝对必要时才使用Variant数据类型
Variant还存在其他缺陷。它们占用的内存比VB的任何其他数据类型都要多,而且对Variant中的数据进行妈作时的速度几乎总是比对其他数据类型进行妈作的速度要慢,另外变体类型还可能导致VB在程序运行过程中对数据类型进行自动转换。
只有在确实不能预料变量的类型时才能使用Variant。
注意:当你使用单个As�type�子句在同一个代码行上说明多个变量时,只有Dim语句中的最后一个变量被赋予特定数据类型。所有其他变量均被赋予Variant数据类型。
5.7 尽量缩小变量的作用域
如果变量的作用域大于它应有的范围,变量可继续存在,并且在不再需要该变量后的很长时间内仍然占用资源。
它们的主要问题是,任何模块中的任何过程都能对它们进行修改,并且很难跟踪究竟是何处进行修改的。
占用资源是作用域涉及的一个重要问题。如果创建全局的Recordset(记录集)变量,问题会复杂。对于Recordset
对变量来说,尽量缩小作用域将会对应用程序的可靠性产生巨大的影响。
5.8 使用"&"字符对字符串进行并置妈作
"&"字符能清楚的传达函数的意图,消除阅读者可能存在的疑点,使阅读者清楚地理解目前的妈作是加法、还是字符串连接,并且不会因为类型的强制转换而产生不正确的结果。
6. 代码的格式化
6.1 对代码进行格式化时,要达到的目的包括:
1) 通过代码分割成功能块和便于理解的代码段,使代码更容易阅读和理解;
2) 使用空行和注释行,将程序中逻辑上不相关的代码块分开。比如:变量声明部分和代码语句间的分隔;较长的过程中,完成不同功能的代码块间的分隔。要避免出现逻辑上混乱的分隔,如:某一逻辑功能代码块中间用空行进行了分隔,但是在相邻功能代码块之间却没有分隔,这样会给程序阅读者造成错觉。
3) 减少为理解代码结构而需要做的工作;
4) 使代码的阅读者不必进行假设;
5) 使代码结构尽可能做到格式清楚明了。
6.2 编程原则:
1) 要将多个语句放在同一行上
不论是变量声明,还是语句都不要在一行上书写多个。
2) 用行接续符
对较长语句,如API声明等,在代码窗体可视范围内给予换行,不要使别人必须通过滚动窗口才能查看到完整的代码。注意,当处理长字符串时,要使用
"字符串1" & _
"字符串2"
的格式。
3) 缩进后续行
当你将变量设置为某个值时,所有后续行的缩进位置应与第一行的变量值相同;
当你调用一个过程时,后续行缩进到第一个参数的开始处;
当你将变量或属性设置为等于表达式的计算结果时,请从后面分割该语句,以确保该表达式尽可能放在同一行上。
4) 在If语句后缩进;
在Else语句后缩进
在Select Case语句后缩进
在Case语句后缩进
在Do语句后缩进
已经用行接续符分割的语句的各个行要缩进
在With语句后缩进。
对从属于行标注的代码进行缩进。
5) 在执行统一任务的各个语句组之间插入一个空行。好的代码应由按逻辑顺序排列的进程或相关语句组构成。
7. 代码的注释
7.1 使用代码注释的目的:
1) 文字说明代码的作用(即为什么要用编写该代码,而不是如何编写);
2) 确指出该代码的编写思路和逻辑方法;
3) 人们注意到代码中的重要转折点;
4)使代码的阅读者不必在他们的头脑中仿真运行代码的执行过程.
7.2 编程原则:
1. 用文字说明代码的作用:
简单的重复代码做写什么,这样的注释几乎不能给注释增加什么信息.如果你使用好的命名方法来创建直观明了的代码那么这些类型的注释绝对增加不了什么信息.
2. 如果你想违背好的编程原则,请说明为什么
有的时候你可能需要违背好的编程原则,或者使用了某些不正规的方法,.遇到这种情况时,请用内部注释来说明你在做什么和为什么要这样做。
技巧性特别高的代码段,一定要加详细的注释,不要让其他开发人员花很长时间来研究一个高技巧但不易理解的程序段。
3. 用注释来说明何时可能出错和为什么出错
4. 在编写代码前进行注释
给代码加注释的方法之一是在编写一个过程前首先写上注释.如果你愿意,可以编写完整句子的注释或伪代码.一旦你用注释对代码进行了概述,就可以在注释之间编写代码.
5. 在要注释的代码前书写注释
注释一定出现在要注释的程序段前,不要在某段程序后书写对这段程序的注释,先看到注释对程序的理解会有一定帮助。
如果有可能,请在注释行与上面代码间加一空行。
6. 纯色字符注释行只用于主要注释
注释中要分隔时,请使用一行空注释行来完成,不要使用纯色字符,以保持版面的整洁、清晰。
7. 避免形成注释框
用星号围成的注释框,右边的星号看起来很好,但它们给注释增加了任何信息吗?实际上这会给编写或编辑注释的人增加许多工作。
8. 使用撇号来指明注释
不要使用Rem语句来注释。
9. 增强注释的可读性
注释是供人阅读的,而不是让计算机阅读的。
1) 使用完整的语句。虽然不必将注释分成段落(最好也不要分成段落),但你应尽量将注释写成完整的句子。
2) 避免使用缩写。缩写常使注释更难阅读,人们常用不同的方法对相同的单词进行缩写,这会造成许多混乱,如果必须对词汇缩写,必须做到统一。
3) 将整个单词大写,以突出它们的重要性。若要使人们注意注释中的一个或多个单词,请全部使用大写字母。
10. 对注释进行缩进,使之与后随的语句对齐。
注释通常位于它们要说明的代码的前面。为了从视觉上突出注释与它的代码之间的关系,请将注释缩进,使之与代码处于同一个层次上。
11. 为每个过程赋予一个注释标头
每个过程都应有一个注释标头。过程的注释标头可包含多个文字项,比如输入参数、返回值、原始作者、最后编辑该过程的程序员、上次修改日期、版权信息。
12. 当行尾注释用在上面这种代码段结构中时,它们会使代码更难阅读。
使用多个行尾注释时(比如用于过程顶部的多个变量说明),应使它们互相对齐。这可使它们稍容易阅读一些。
13. 何时书写注释
1) 请在每个If语句的前面加上注释。
2) 在每个Select Case语句的前面加上注释。与If语句一样,Select Case语句用于评估对程序执行产生影响的表达式。
3) 在每个循环(包括For…Next循环和Do循环)的前面加上注释。每个循环都有它的作用,许多情况下这个作用不清楚直观。
4) 在修改了全局变量的每个语句前面加上注释。全局变量很讨厌。但如果非常需要使用全局变量,请说明你为何要修改它。这将使代码的调试容易一些。
8. 循环结构
1. 循环结束后不要引用计数器变量。当For…Next循环结束时,计数器变量的最后值不等于end的值,它大于或小于Step的值。
2. 所有Next语句均应包含计数器变量。如果你在Next语句中省略了计数器变量,代码仍可执行,但它的可读性要差一些,因此更难维护.
3. 为了清楚起见,应对For…Next循环中的代码主体语句进行缩进。每当你的代码结构拥有一个开始语句和结束语句时,就必须对代码主体语句进行缩进。
4. 如果你必须提早退出For…Next循环,请使用Exit For语句。不要使用GoTo和一个标注来退出循环。
5. 请在循环的开始处计Do循环的退出条件。你常可选择究竟在循环的开始处还是结尾处放置退出条件。但在循环的开始处计算退出条件,这样的循环比较容易理解。
6. 当你在While和Until之间进行选择时,请使用能实现最简单的条件的这个关键字。
7. 为了保持代码见格的一致性,尽可能使用While子句来完成Do.Loop循环。
 
9. 控制代码流
9.1 控制代码流的目的:
1) 在规定的情况下使用正确的判断构造;
2) 降低代码的复杂性,使之更容易阅读和调试;
3) 最大限度的减少表达式计算中出错的机会。
9.2 编程原则:
1. 当根据一个条件是True还是False来做出判断时,使用If…Then…Else
即使只有一个语句被执行,也应考虑使用End If构造。当condition的计算结果是True时,如果只有一个语句被执行,该语句可以与If放在同一行上,并且End If可以省略。但若要使代码更便于阅读,请将该语句单独放在一行上,并以End If作为该构造的结束。
2. 对非布尔表达式与各种可能的值进行比较时,使用Select Case语句.
Select Case可以用许多高档次的方式来使用,比如将多个结果值放在一个Case行上。
这些条件互相之间可能毫不相关。这与Select Case结构完全相反。在Select Case结构中,通过对一个(通常是非布尔)测试表达式与Case语句中的每个表达式进行比较,从而构成了各个条件。
1) 即使不需要,也应在每个Select Case构造中包含Case Else语句。如果始终都加上Case Else子句,代码将更加清楚明了,就不会迫使其他编程人员去猜测为什么要处理Case语句中的没有特殊理由的结果。
2) 所有Case语句都应使用便于理解的顺序。
不能出现条件范围大的Case子句出现在前面情况。
如:Select Case lngAge
Case is <17
Case is <13
...
End Select
这样的结构导致第二个Case子句不能被执行,从而产生逻辑上的错误。
3) 不要编写决不会产生True结果的Case语句。
3. 对表达式进行格式化
对表达式进行正确的格式化可以减少代码出错的可能性,增加代码的可读性。
1) 要将布尔表达式与True或False相比较。
如:
错误:If rsEmployees.Eof = True then
正确:If rsEmployees.Eof then
布尔表达式与True或False相比较在Select Case 子句中更容易产生错误。
2) 建的布尔变量名应反映肯定的条件而不是否定的条件。使过程变得过分复杂的一个典型例子是创建一个反映否定条件的布尔变量名。根据这种变量进行判断,就会使代码变得更加复杂。代码就增加了出错的可能性。
3) 了清楚起见,用括号将表达式括起来。即使不要求,也要使用括号。不要书写复杂的依靠运算符优先级来执行的表达式,在必要的位置使用括号强调其运算优先级。
4) oTo标识全部使用大写字母。GoTo语句使得代码很难阅读。通过将GoTo标识全部使用大写字母,就可以减少查找过程的GoTo标识所需的工作量。

10. 创建对象和工程模板
如果要创建许多个项目,那么通过创建和使用对象和项目模板,就可以节省大量的开发时间,并增强应用程序的一致性。
10.1 使用对象模板
例如,假设创建了一个窗体对象,并希望在每次从Project菜单中选择Add Form(添加窗体)时使该窗体对象出现在Add Form对话框中,只需将窗体文件的拷贝放入Template文件夹的Forms子文件夹中。如果窗体拥有一个与其相关联的二进制文件(即.frx文件),该文件也必须放入Forms子文件夹中。若不希望对象出现在模板中,就从Template文件夹的相应子文件夹中删除或移走该对象的文件。
当模板对象被添加给一个项目时,便创建该对象的一个新实例,对该对象所作的修改并不传给模板本身。
10.2 设置模板文件夹
将项目中的所有对象模板放入这个自定义模板文件夹中,并让所有开发人员将新文件夹的路径输入他们的Template Directory文本框。
10.3 使用对象和项目模板的目的:
1) 代码的复用
2) 缩短新项目和现有项目的开发时间
10.4 编程原则:
1) 不要将对象模板中的特定应用程序的值或特定组件的值进行硬编码。
对象模板应该尽可能做到通用。
注意:在对象模板中用常量取代硬编码的"幻数",这个问题很重要,这样开发人员就能更容易理解和替换各个值。
2) 不要将对象模板中的路径进行硬编码。不同的应用程序和不同的安装,其路径也不一样。就象不应该对任何对象中的路径进行硬编码一样,也不应该将对象模板中的路径进行硬编码。
3) 不要将对象模板中的应用程序进行硬编码。
4) 不要将对象模板中的版本号进行硬编码。
5) 展示模板对象的属性,以便接受来自主应用程序的数据。不要展示公用变量或使用全局变量,而应该使用Property 过程。如果使用Property过程,那么当值变更时,就能进行数据验证并执行代码。
10.5 在对象模板中提供内容广泛的注释。
将模板对象添加给项目时,不对它进行修改,这种情况是很少的。应该尽可能使开发人员将模板对象添加给项目时能够非常容易得了解必须在何处进行哪些修改,才能将对象与项目集成起来。要做到这一点的方法之一是使用统一的方法来加上注释,以便说明所做的必要修改,并将这个说明记录在程序模块的 Declaration(说明)部分中。这样,开发人员就能非常容易的搜索注释,并进行必要的修改。

2009年10月2日星期五

【转载】提问的智慧

此文让我受益良多。值得一读,大家如果也觉得不错就一起来推~~~
  ---------------------------------
  
  在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。
  
  首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题。
  如若不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对黑客而言,"问得好!"是发自内心的大力称赞。
  
  尽管黑客们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏者怀有敌意,但其实不是那样的。
  
  我们不想掩饰对这样一些人的蔑视--他们不愿思考,或者在发问前不去完成他们应该做的事。这种人只会谋杀时间--他们只愿索取,从不付出,无端消耗我们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。
  我们称这样的人为"失败者"(由于历史原因,我们有时把它拼作"lusers")。
  我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效的利用时间来回答胜利者的问题。
  
  如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并没有要求你向我们屈服--事实上,我们中的大多数人最喜欢公平交易不过了,只要你付出小小努力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但让我们帮助那些不愿意帮助自己的人是没有意义的。如果你不能接受这种"歧视",我们建议你花点钱找家商业公司签个技术支持协议得了,别向黑客乞求帮助。
  
  如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一 员。立刻得到有效答案的最好方法,就是象胜利者那样提问--聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。
  
  ========
  提问之前
  ========
  
  在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:
  1. 通读手册,试着自己找答案。
  2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
  3. 在网上搜索(个人推荐google~~~)。
  4. 向你身边精于此道的朋友打听。
  
  当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。如果提问者能从答案中学到东西,我们更乐于回答他的问题。
  
  周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得 不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
  
  小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. RandomHacker)通常会用无意义的字面解释来答复你,心里想着"蠢问题...",希望着你会从问题的回答(而非你想得到的答案)中汲取教训。
  
  决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报酬。你要自己去"挣"回一个答案,靠提出一个有内涵的,有趣的,有思维激励作用的问题--一个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要知识--去挣到这个答案。
  
  另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。
  "谁能给点提示?"、"我这个例子里缺了什么?"以及"我应该检查什么地方?"比"请把确切的过程贴出来"更容易得到答复。因为你显得只要有人指点正确的方向,你就有完成它的能力和决心。
  
  ========
  怎样提问
  ========

  
  ------------
  谨慎选择论坛
  ------------
  
  小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败者:
  1. 在风马牛不相及的论坛贴出你的问题
  2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
  3. 在太多的不同新闻组交叉张贴
  
  ----------------------------
  用辞贴切,语法正确,拼写无误
  ----------------------------
  
  我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。
  回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。
  
  正确的拼写,标点符号和大小写很重要。
  更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。
  
  如果你在使用非母语的论坛提问,你可以犯点拼写和语法上的小错--但决不能
  在思考上马虎(没错,我们能弄清两者的分别)
  
  ----------------------------
  使用含义丰富,描述准确的标题
  ----------------------------

  
  在邮件列表或者新闻组中,大约50字以内的主题标题是抓住资深专家注意力的黄金时机。别用喋喋不休的"帮帮忙"(更别说"救命啊!!!!!"这样让人反感的话)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,
  别用空格代替问题的描述,哪怕是极其简短的描述。
  
  蠢问题:
  救命啊!我的膝上机不能正常显示了!
  
  聪明问题:
  XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。
  
  如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个 看起来象"Re:测试"或者"Re:新bug"的问题很难引起足够重视。另外,引 用并删减前文的内容,给新来的读者留下线索。
  
  ------------------
  精确描述,信息量大
  ------------------

  
  1. 谨慎明确的描述症状。
  2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。
  3. 说明你在提问前是怎样去研究和理解这个问题的。
  4. 说明你在提问前采取了什么步骤去解决它。
  5. 罗列最近做过什么可能有影响的硬件、软件变更。
  
  尽量想象一个黑客会怎样反问你,在提问的时候预先给他答案。
  
  Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。
  
  --------
  话不在多
  --------

  
  你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完 全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小 越好。
  
  这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得 到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼 你的bug报告的过程中,也许你自己就能找出问题所在或作出更正。
  
  ------------------
  只说症状,不说猜想
  ------------------

  
  告诉黑客们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用 向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自 己的理解和推论。让黑客们来诊断吧。
  
  蠢问题:
  我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了, 这种情况应该怎样检查最好?
  
  聪明问题:
  我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就有这种情况,开机
  前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能工作20分钟。所有 内存都换过了,没有效果。相关部分的典型编译记录如下...。
  
  ------------------
  按时间顺序列出症状
  ------------------

  
  对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明 应该包含操作步骤,以及电脑的反应,直到问题产生。
  
  如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间 顺序详述。这样黑客们就知道该在你的说明中找什么。
  
   --------------
  
  明白你想问什么
  
  --------------

  
  漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞不太感冒,因此也可以说他们对漫无边际的提问不大感冒。
  
  如果你明确表述需要回答者做什么(提供建议,发送一段代码,检查你的补丁或是别的),就最有可能得到有用的答案。这会定出一个时间和精力的上限, 便于回答者集中精力来帮你,这很凑效。
  
  要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫乏的资源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。
  
  因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助--这通常和简化问题有所区别。因此,问"我想更好的理解X,
  
  能给点提示吗?"通常比问"你能解释一下X吗?"更好。如果你的代码 不能工作,问问它有什么地方不对,比要求别人替你修改要明智得多。
  
  ------------------------
  
  别问应该自己解决的问题
  
  ------------------------
  
  黑客们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都
  
  曾自己解决这类问题。同样,这些问题得由你来搞定,你会从中学到东西。
  
  你可以要求给点提示,但别要求得到完整的解决方案。
  
  ----------------
  
  去除无意义的疑问
  
  ----------------

  
  别用无意义的话结束提问,例如"有人能帮我吗?"或者"有答案吗?"。
  
  首先:如果你对问题的描述不很合适,这样问更是画蛇添足。其次:由于这 样问是画蛇添足,黑客们会很厌烦你--而且通常会用逻辑上正确的回答来表 示他们的蔑视,例如:"没错,有人能帮你"或者"不,没答案 "。
  
  ----------------------------
  
  谦逊绝没有害处,而且常帮大忙 x
  
  ----------------------------

  
  彬彬有礼,多用"请"和"先道个谢了"。让大家都知道你对他们花费时间提供帮助心存感激。
  
  然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。
  
  (我们注意到,自从本指南发布后,从资深黑客处得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得"先谢了"的言外之意是过后就不会再感谢任何人了。我们的建议是:都道谢。)
  
  ------------------------
  
  问题解决后,加个简短说明
  
  ------------------------

  
  问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决 的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了 广泛关注,应该在那里贴一个补充说明。
  
  补充说明不必很长或是很深入;简单的一句"你好,原来是网线出了问题!谢谢大家--Bill"比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。
  
  除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。
  
  最后(至少?),这种补充有助于所有提供过帮助的人从中得到满足感。
  
  如果你自己不是老手或者黑客,那就相信我们,这种感觉对于那些你向他们求助的导师或者专家而言,是非常重要的。问题久拖未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次贴出新问题时尝到甜头。
  
  ----------
  
  还是不懂
  
  ----------

  
  如果你不是很理解答案,别立刻要求对方解释。象你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),去理解它。如果你真的需要对方解释,记得表现出你已经学到了点什么。
  
  比方说,如果我回答你:"看来似乎是zEntry被阻塞了;你应该先清
  除它。",然后:
  
  一个很糟的后续问题:"zEntry是什么?"
  
  聪明的问法应该是这样:"哦~~~我看过帮助了但是只有-z和-p两个
  参数中提到了zEntry而且还都没有清楚的解释:<你是指这两个中的
  哪一个吗?还是我看漏了什么?"
  
  ==========
  
  三思而后问
  
  ==========

  
  以下是几个经典蠢问题,以及黑客在拒绝回答时的心中所想:
  
  问题:我能在哪找到X程序?
  
  问题:我的程序/配置/SQL申明没有用
  
  问题:我的Windows有问题,你能帮我吗?
  
  问题:我在安装Linux(或者X)时有问题,你能帮我吗?
  
  问题:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
  
  提问:我能在哪找到X程序?
  
  回答:就在我找到它的地方啊蠢货--搜索引擎的那一头。天呐!
  
  还有人不会用Google吗?
  
  提问:我的程序(配置、SQL申明)没有用
  
  回答:这不算是问题吧,我对找出你的真正问题没兴趣--如果要
  
  我问你二十个问题才找得出来的话--我有更有意思的事要做呢。
  
  在看到这类问题的时候,我的反应通常不外如下三种:
  
  1. 你还有什么要补充的吗?
  
  2. 真糟糕,希望你能搞定。
  
  3. 这跟我有什么鸟相关?
  
  提问:我的Windows有问题,你能帮我吗?
  
  回答:能啊,扔掉萎软的垃圾,换Linux吧。
  
  提问:我在安装Linux(或者X)时有问题,你能帮我吗?
  
  回答:不能,我只有亲自在你的电脑上动手才能找到毛病。
  
  还是去找你当地的Linux用户组寻求手把手的指导吧(你能在这儿找到用户组的清单)。
  
  提问:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
  
  回答:想要这样做,说明你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!
  
  ==============
  
  好问题,坏问题
  
  ==============

  
  最后,我举一些例子来说明,怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。
  
  蠢问题:我可以在哪儿找到关于Foonly Flurbamatic的资料?
  
  这种问法无非想得到"STFW"这样的回答。
  
  聪明问题:我用Google搜索过"Foonly Flurbamatic 2600",但是
  
  没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料?
  
  这个问题已经STFW过了,看起来他真的遇到了麻烦。
  
  蠢问题:我从FOO项目找来的源码没法编译。它怎么这么烂?
  
  他觉得都是别人的错,这个傲慢自大的家伙
  
  聪明问题:FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ, 但里面没有提到跟Nulix有关的问题。这是我编译过程的记录,我有什么 做得不对的地方吗?
  
  他讲明了环境,也读过了FAQ,还指明了错误,并且他没有把问题的责任 推到别人头上,这个家伙值得留意。
  
  蠢问题:我的主板有问题了,谁来帮我?
  
  普通黑客对这类问题的回答通常是:"好的,还要帮你拍拍背和换尿布 吗?" ,然后按下删除键。
  
  聪明问题:我在S2464主板上试过了X、Y和Z,但没什么作用,我又试了 A、B和C。请注意当我尝试C时的奇怪现象。显然边带传输中出现了收缩,但结果出人意料。在多处理器主板上引起边带泄漏的通常原因是什么?
  
  谁有好主意接下来我该做些什么测试才能找出问题?
  
  这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的 能力,而不是坐等天上掉答案。
  
  在最后一个问题中,注意"告诉我答案"和"给我启示,指出我还应该做什么诊断工作"之间微妙而又重要的区别。
  
  事实上,后一个问题源自于2001年8月在Linux内核邮件列表上的一个真实的提问。我(Eric)就是那个提出问题的人。我在Tyan S2464主板上观察到了这种无法解释的锁定现象,列表成员们提供了解决那一问题的重要信息。
  
  通过我的提问方法,我给了大家值得玩味的东西;我让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们我所走过的弯路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。
  
  后来,当我向每个人表示感谢,并且赞赏这套程序(指邮件列表中的讨论 --译者注)运作得非常出色的时候,一个Linux内核邮件列表(lkml)成员表示,问题得到解决并非由于我是这个列表中的"名人",而是因为 我用了正确的方式来提问。
  
  我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,如果我象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这件事,给编写这个指南的人一些指导。
  
  ================
  
  找不到答案怎么办
  
  ================

  
  如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。
  
  总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。
  
  喧闹。
  
  你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。
  
  有许多网上的以及本地的用户组,由狂热的软件爱好者(即使他们可能从没亲自写过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。
  
  另外,你可以向很多商业公司寻求帮助,不论公司大还是小(RedHat和LinuxCare就是两个最常见的例子)。别为要付费才能获得帮助而
  感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了--完全可能如此--你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。
  
  对大众化的软件,就象Linux之类而言,每个开发者至少会有上万名用户。
  
  根本不可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,同你必须购买同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的技术支持费用比开放源代码软件要高得多,且内容也不那么丰富)。
  
  ----------------
  
  感谢看到这里的人们

【转载】单片机应用编程技巧 (FAQ)

简介:转:单片机应用编程技巧 (FAQ)
关键字:单片机
转:单片机应用编程技巧 I(FAQ)   
   
1. C语言和汇编语言在开发单片机时各有哪些优缺点?
答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在单片机开发中,我们还是建议采用汇编语言比较好。

2. C或汇编语言可以用于单片机,C++能吗?
答:在单片机开发中,主要是汇编和C,没有用C++的。

3. 搞单片机开发,一定要会C吗?
答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,我们还是建议采用汇编语言比较好。

而C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。

综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。

4. 当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好?
答:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。如果对这些特性不了解,那调试起来就有的烦了,到头来可能还不如用汇编来的快。

5. 在教学中要用到8088和196芯片单片机教材,请问那里可以找到关于这方面的书或资料?
答:有关这方面的教材,大学里常用的一本是《IBM-PC汇编语言程序设计》清华大学出版社出版的,在网上以及书店都是可以找到的,另外网上还可以搜索到很多其他的教材如:《微机原理及汇编语言教程》(杨延双 张晓冬 等编著 )和《16/32 位微机原理、汇编语言及接口技术》(作者: 钟晓捷 陈涛 ,机械工业出版社 出版)等,可以在较大型的科技书店里查找或者直接从网上订购。

6. 初学者到底是应该先学C还是汇编?
答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。

7. 我是一名武汉大学电子科技大3的学生,学了电子线路、数字逻辑、汇编和接口、C语言,但是总是感觉很迷茫,觉好象什么都不会。怎么办?
答:大学过程是一个理论过程,实践的机会比较少,往往会造成理论与实践相脱节,这是国内大学教育系统的通病,不过对于学生来说切不可好高骛远。一般从大三会开始接触到一些专业课程,电子相关专业会开设相关的单片机应用课程并且会有简单的实验项目,那么要充分把握实验课的机会,多多地实际上机操作练习。平时可以多看看相关的电子技术杂志网站,看看别人的开发经验,硬件设计方案以及他人的软件设计经验。有可能的话,还可以参加一些电子设计大赛,借此机会2--3个人合作做一个完整系统,会更有帮助。到了大四毕业设计阶段,也可以选择相关的课题作些实际案例增长经验。做什么事情都有个经验的积累过程,循序渐进。

8. 请问作为学生,如何学好单片机?
答:学习好单片机,最主要的是实践,在实践中增长经验。在校学生的话,实践机会的确会比较少,但是有机会的话,可以毕业实习选择相关的课题,这样就可以接触到实际的项目。而且如果单片机微机原理是一门主课的话,相信学校会安排比较多的实践上机机会。有能力的话,可以找一些相关兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到电子市场去买一些小零件,自己搭一个小系统让它工作起来。

9. 如何才能才为单片机的高手啊?
答:要成为单片机高手,应该多实践,时常关注单片机的发展趋势;经常上一些相关网站,从那里可以找到许多有用的资料。

10. 女性是否适合单片机软件编程这个行业?
答:要根据自己的兴趣,配合自己对软件编程的耐性,男女皆适合这个行业。

简介:单片机应用编程技巧(二)
关键字:单片机

12. 8位机还能延续多久!
答:以现在MCU产品主力还是在8位领域,主要应用于汽车应用、消费性电子、电脑及PC周边、电信与通讯、办公室自动化、工业控制等六大市场,其中车用市场多在欧、美地区,而亚太地区则以消费性电子为主, 并以量大低单价为产品主流,目前16位MCU与8位产品,还有相当幅度的价差,新的应用领域也仍在开发,业界预计,至少在2005年前8位的MCU仍是 MCU产品的主流。

13. 学习ARM及嵌入式系统是否比学习其它一般单片机更有使用前景?对于一个初学者应当具备哪些相关知识?
答:一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制、消费性家电等等。对于一个单片机方面的软件编程初学者,应以HOLTEK系列或8051等8位单片机来做入门练习。而初学者应当具备软件编程相关知识,单片机一般软件编程是以汇编语言为主,各家有各家的语法,但大都以RISC的MCU架构为主,其中 RISC (Reduced Instruction Set Computer) 代表MCU的所有指令。都是利用一些简单的指令组成的,简单的指令代表 MCU 的线路可以尽量做到最佳化,而提高执行速率。另外初学者要具备单片机I/O接口的应用知识,这在于周边应用电路及各种元器件的使用,须配合自己所学的电子学及电路学等。

14. 符合44PIN的80系列8位单片机的MCU有哪些?
答:符合44PIN的80系列8位单片机有Z8674312FSC、Z86E2112FSC、Z86E2116FSC。

15. 请介绍一下MCU的测试方法。
答: MCU从生产出来到封装出货的每个不同的阶段会有不同的测试方法,其中主要会有两种:中测和成测。

所谓中测即是WAFER的测试,它会包含产品的功能验证及AC、DC的测试。项目相当繁多,以HOLTEK产品为例最主要的几项如下:

; 接续性测试:检测每一根I/OPIN内接的保护用二极管是否功能无误。
; 功能测试:以产品设计者所提供测试资料(TEST PATTERN)灌入IC,检查其结果是否与当时SIMULATION时状态一样。
; STANDBY电流测试:测量IC处于HALT模式时即每一个接点(PAD)在1态0态或Z态保持不变时的漏电流是否符合最低之规格。
; 耗电测试:整颗IC的静态耗电与动态耗电。
; 输入电压测试:测量每个输入接脚的输入电压反应特性。
; 输出电压测试:测量每个输出接脚的输出电压位准。
; 相关频率特性(AC)测试,也是通过外灌一定频率,从I/O口来看输出是否与之匹配。
; 为了保证IC生产的长期且稳定品质,还会做产品的可靠性测试,这些测试包括ESD测试,LATCH UP测试,温度循环测试,高温贮存测试,湿度贮存测试等。

成测则是产品封装好后的测试,即PACKAGE测试。即是所有通过中测的产品封装后的测试,方法主要是机台自动测试,但测试项目仍与WAFER TEST相同。PACKAGE TEST的目的是在确定IC在封装过程中是否有任何损坏。

16. 能否利用单片来检测手机电池的充放电时间及充放电时的电压电流变化,并利用一个I/O端口使检测结果在电脑上显示出来?
答:目前市场上的各类智能充电器,大部分都采用MCU进行充电电流和电压的控制。至于要在电脑上显示,好象并不实用,可能只有在一些专门的电池检测仪器中才会用到;对于一般的手机用户来说,谁会在充电时还需要用一台电脑来做显示呢?要实现单片机与电脑的连接,最简单的方式就是采用串口通讯,但需要加一颗RS- 232芯片。

17. 在ARM编程中又应当如何?
答:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。

嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。

嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它接口I/O封装在同一片集成电路里。常见的有HOLTEK MCU系列、Microchip MCU系列及8051等。

嵌入式DSP专门用来处理对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT(Fast Fourier Transform)、频谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。

简介:单片机应用编程技巧(三)
关键字:单片机

18. MCU在射频控制时,MCU的时钟(晶振)、数据线会辐射基频或基频的倍频,被低噪放LNA放大后进入混频,出现带内的Spur,无法滤除。除了用layout、选择低辐射MCU的方法可以减少一些以外,还有什么别的方法?
答:在设计高频电路用电路板有许多注意事项,尤其是GHz等级的高频电路,更需要注意各电子组件pad与印刷pattern的长度对电路特性所造成的影响。最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路正常动作所致。为了避免上述问题除了设法分割两电路block之外,设计电路板之前充分检讨设计构想,才是根本应有的手法,基本上设计高频电路用电路板必需掌握下列三大原则:

            ; 高质感。
            ; 不可取巧。
            ; 不可仓促抢时间。

以下是设计高频电路板的一些建议:

(1)印刷pattern的长度会影响电路特性。尤其是传输速度为GHz高速数位电路的传输线路,通常会使用strip line,同时藉由调整配线长度补正传输延迟时间,其实这也意味着电子组件的设置位置对电路特性具有绝对性的影响。
(2)Ground作大better。铜箔面整体设置ground层,而连接via的better ground则是高频电路板与高速数位电路板共同的特征,此外高频电路板最忌讳使用幅宽细窄的印刷pattern描绘ground。

(2)电子组件的ground端子,以最短的长度与电路板的ground连接。具体方法是在电子组件的ground端子pad附近设置via,使电子组件能以最短的长度与电路板的ground连接。

(3)信号线作短配线设计。不可任意加大配线长度,尽量缩短配线长度。

(4)减少电路之间的结合。尤其是filter与amplifier输出入之间作电路分割非常重要,它相当于audio电路的cross talk对策。

(5)MCU 回路Layout考量:震荡电路仅可能接近IC震荡脚位;震荡电路与VDD & VSS保持足够的距离;震荡频率大于1MHz时不需加 osc1 & osc2 电容;电源与地间要最短位置并尽量拉等宽与等距的线,于节点位置加上104/103/102等陶瓷电容。

19. Intel系列的96单片机80c196KB开发系统时,都有那些注意事项?
答:一个即时系统的软体由即时操作系统加上应用程序构成。应用程序与作业系统的接口通过系统调用来实现。用80C196KB作业系统的MCU,只能用内部RAM作为TCB和所有系统记忆体(含各种控制表)以及各个任务的工作和资料单元。因此一定要注意以下几点:

(1)对各个任务分配各自的堆迭区,该堆迭区既作为任务的工作单元,也作为任务控制块的保护单元。

(2) 系统的任务控制块只存放各任务的堆迭指标,而任务的状态均存放于任务椎栈中。在一个任务退出运行时,通过中断把它的状态进栈,然后把它的堆迭指标保存于系统的TCB中;再根据优先取出优先顺序最高的已就绪任务的堆迭指标SP映象值送入SP中;最后执行中断返回指令转去执行新任务。

(3)各任务的资料和工作单元尽量用堆迭实现,这样可以允许各任务使用同一个子程序。使用堆迭实现参数传递并作为工作单元,而不使用绝对地址的RAM,可实现可重入子程序。该子程序既可为各个任务所调用,也可实现递回调用。

简介:单片机应用编程技巧(四)
关键字:单片机

20. 在demo板上采样电压时,不稳定,采样结果有波动,如何消除?
答:一般来说,仿真器都是工作在一个稳压的环境(通常为5V)。如果用仿真器的A/D时,要注意其A/D参考电压是由仿真器内部给出,还是需要外部提供。A /D转换需要一个连续的时钟周期,所以在仿真时不能用单步调试的方法,否则会造成A/D采样值不准。至于A/D采样不稳定,可以在A/D输入口加一电容, 起到滤波作用;在软件处理时采用中值滤波的方法。

21. 在车载DVD系统中,如何设计电子防震系统?
答:在车载DVD系统,最好选择高档DVD机,因为高档DVD机都采用电子防震系统(ADVANCEDESP),当记忆缓冲区内的读数降低,先进的电子防震设计会以双速读数系统,做出比正常速度快两倍的读数速率,以减低噪声,即使连续震荡仍可避免跳线情况出现,现在就说说什幺叫电子防震。简单地说:电子防震就是一个信号的储存--释放过程,首先CD要先把信号进行提前读取,也就是我们见到机子的加速,再把信号储存在RAM中,而我们在开防震的时候所听到的就是经过RAM的声音,这样就是它的过程。当没有防震时是由于信号是1比1读取的,所以当受到冲击后,就会出现跳音。而当开了防震时,机子受到冲击后,由RAM释放出来的声音使音乐不停地播放,而与此同时,光头迅速进行复位检索,当检索到信号后立即补充,所以不会出现跳音。大概的情况就是这样。但是这样还没有满足用家的要求,由于这种的方法带来的时间短,通常只有3秒,所以跳音的机会还是蛮高,如果增大RAM又带来造价的增高因为RAM这东西价格较贵,尤其是质量好的。

22. 在电子防震技术中,有那些IC或器件可供选择?
答:在电子防震技术中,最重要的技术之一要数是RAM技术,而一直以来都是因为它的成本问题,所以防震时间都一直不能增加,也就是说RAM本身就有限制,RAM的容量越大,造价就越高。而许多厂家就如何在RAM的限制里得到最大限度的记忆时间展开了开发研究。

23. 如何进行编程可以减少程序的bug?
答:在此提供一些建议,因系统中实际运行的参数都是有范围的。系统运行中要考虑的超范围管理参数有:
 
; 物理参数。这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。合理设定这些边界,将超出边界的参数都视为非正常激励或非正常回应进行出错处理。

; 资源参数。这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆迭深度。在程序设计中,对资源参数不允许超范围使用。

; 应用参数。这些应用参数常表现为一些单片机、功能单元的应用条件。如E2PROM的擦写次数与资料存储时间等应用参数界限。

; 过程参数。指系统运行中的有序变化的参数。

在上述参数群对一程序编写者而言,须养成良好习惯,在程序的开头,有顺序的用自己喜欢文字参数对应列表来替代,然后用自己定义的文字参数来编写程序,这样在做程序的修改及维护时只在程序的开头做变动即可,不用修改到程序段,才比较容易且不会出错。

24. 有人认为单片机将被ARM等系列结构的嵌入式系统所取代。单片机的生命期还有多长?
答:因为8位单片机与嵌入式系统的ARM在功能结构和单价的差异,故应用层次上就有很大的不同。 ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制,消费性家电……等等。评估单片机近期是否会给ARM取代,要观察两个因素:

; 芯片成本
因ARM的工作频率较高,电路较庞大,所需的芯片制造工艺要求在0。25U以上,成本较高。8位单片机工作频率相对较低,电路较小,所需的芯片制造工艺在0。5U 即可,成本较低。

; 功能定位
ARM的功能较单片机强,但两者定位不同。就如现阶段不会有人用ARM去作一个简单的工业定时开关。当然,如果两者单价相同也无不可,但现实是有很大的单价差距。

至于将来,因芯片制造成本会不断下降,上述的成本差异影响愈来愈少!但我估计在往后5年单片机仍有价格优势,仍能存活!但ARM是否会精简架构,降低成本, 抢夺低阶市场?我想可能性不大,ARM应该会向上发展。同样,单片机也只能向上发展,如16位,高功能……等。原因就是因为芯片制造工艺进步太快。压迫芯片设计往高集成发展。

简介:单片机应用编程技巧(五)
关键字:单片机

25. 在单片机C编成时,如何才能使生成的代码具有和汇编一样的效率?
答:如果是使用C语言编程时,不太可能生成的代码具有1:1和汇编一样的效率。

C 语言命令要被硬件识别并执行,必须通过编译器编译。编译器分为前端、中端、后端。前端与各种计算机语言写的程序打交道,后端与处理器的基本指令集接轨。所以如果使用C编程时,要达到最高的效率,最好能够很了解所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句,这样就能确保单片机C编程的时候同样的功能不同的C程序,编译效率最高。但是各家的C编译器都会有一定的差异,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%,所以不同厂家的C编译器的编译效率也会有所不同。

26. ARM单片机和哪种内核的单片机比较接近?
答:严格的说,ARM不是单片机,是一个嵌入式的实时操作系统。ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。所以市场上像Intel、IBM、LG半导体、NEC、SONY、菲利浦和国半这样的大公司都有ARM系列,现在不存在什幺ARM单片机和哪种内核的单片机比较接近的问题。而且由于厂家购买内核后会根据自己芯片应用方向的不同,自行添加不同的外挂功能模块,所以,同样内核的芯片其提供的功能是不同的。

27. 从51转到ARM会有困难吗?
答:从51转到ARM,其实编程之类的原理都是一样的,但是要注意的是ARM是一个RISC的架构,在ARM的应用开放源代码的程序很多,要想提高自己,就要多看别人的程序,linux,uc/os-II等等这些都是很好的源码。

28. 我学过MCS51单片机教材,很有兴趣,但缺乏实践经验,手头没有任何道具可供演练,资金又有限,请问该怎么办?
答:在没有任何条件进行实践时,如果真的有兴趣,可以下载一些具有软件仿真功能仿真软件进行一些编程,像一些做得比较好的51仿真软件应该具有这种功能。

29. 如果已经有了针对某MCU的C实现的某个算法,保持框架不变,对核心的部分用汇编优化,有没有一些比较通用的原则?
答:每个人的编程都有自己的风格与习惯,如果要利用别人的程序,在其中修修改改,如果他的程序并没有很好的模块化的话,建议最好不要这幺做,否则本来预期达到事倍功半,说不定反而事半功倍了。要参考他人的程序当然可以,但是首要是要看懂并理解他人程序的算法精髓,而不是在他的基础上打补丁。而关于算法方面的优化,可以购买一些数据结构的书籍,上面有比较详细的说明。

30. 如果准备估计一个算法的MIPS,有什么好的途径?
答:算法的运行时间是指一个算法在计算机上运算所花费的时间。它大致等于计算机执行简单操作(如赋值操作,比较操作等)所需要的时间与算法中进行简单操作次数的乘积。通常把算法中包含简单操作次数的多少叫做算法的时间复杂性。它是一个算法运行时间的相对量度,一般用数量级的形式给出。度量一个程序的执行时间通常有两种方法:

; 一种是事后统计的方法。因为很多计算机内部都有计时功能,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种事前分析估算的方法。

; 一种是事前分析估算的方法。一个程序在计算机上运行时所消耗的时间取决于下列因素:

(1)依据的算法选用何种策略;
(2)问题的规模。例如求100以内还是1000以内的素数;
(3)书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低;
(4)编译程序所产生的机器代码的质量。这个跟编译器有关;
(5)机器执行指令的速度。

显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同。这表明使用绝对的时间单位衡量算法的效率是不合适的。撇开这些与计算机硬件、软件有关的因素,可以认为一个特定算法"运行工作量"的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。

一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间度量。

算法的MIPS有专门的一门学问,可以去好好参考相关的数据结构书籍。

【转载】从51初学者到电子工程师

简介:转:从51初学者到电子工程师1
关键字:单片机
从51初学者到电子工程师1 


从初学者到电子工程师

一、前言

 

很多电子工程师在某个方面精深钻研,成为某一个特殊领域的专家,从一开始的养

家糊口、慢慢小有收益、最后宝马豪宅,也是有的;这些电子工程师可能没有全面

掌握这些知识,因为这些行业用不上,例如,液晶显示器,很多行业就不需要;但

是,对于一个初学者,我认为,这个提纲是切合实际的,对于面向控制而言,已经

基本够用了;对于初学者,全面地掌握这些知识是很有必要的,因为你不知道今后

需要使用什么哪些知识,而这些知识, 80%以上你会在今后的工作中使用上,因为

这是都是最基本的。熟练掌握这些知识和应用,根据不同的地区、行业和老板,月

薪应该可以在3000元~5000元之间,甚至更高。

其实,可能有些你用不上,但是知道了也没有坏处;所谓书到用时方很少,又有谓

艺不压身。知识=月薪=年薪=金钱=香车宝马=…….. ,呵呵。

为什么要掌握这些知识?

实际上,电子工程师就是将一堆器件搭在一起,注入思想(程序),完成原来的这

些器件分离时无法完成的功能,做成一个成品。所需要的技能越高、功能越复杂、

成本越低、市场上对相应的东东的需求越大,就越成功。这就是电子工程师的自身

的价值。从成本到产品售出,之间的差价就是企业的追求。作为企业的老板,是在

市场上去寻找这样的应用;对电子工程师而言,是将老板提出的需求或者应用按照

一定的构思原则(成本最低、可*性最高、电路板最小、功能最强大等)在最短的

时间内完成。最短的时间,跟电子工程师的熟练程度、工作效率和工作时间直接有

关。这就是电子工程师的价值。

将电子产品抽象成一个硬件的模型,大约有以下组成:

1) 输入
2) 处理核心
3) 输出

输入基本上有以下的可能:

1) 键盘
2) 串行接口(RS232/485/can bus/以太网/USB)
3) 开关量(TTL,电流环路,干接点)
4) 模拟量(4~20ma、 0~10ma、0~5V(平衡和非平衡信号))

输出基本上有以下组成:

1) 串行接口(RS232/485/can bus/以太网/USB)
2) 开关量(TTL、电流环路、干接点、功率驱动)
3) 模拟量(4~20ma, 0~10ma,0~5V(平衡和非平衡信号))
4) LED显示:发光管、八字
5) 液晶显示器
6) 蜂鸣器

处理核心主要有:

1) 8位单片机,主要就是51系列
2) 32位arm单片机,主要有atmel和三星系列

51系列单片机现在看来,只能做一些简单的应用,说白了,这个芯片也就是做单一

的一件事情,做多了,不如使用arm来做;还可以在arm上加一个操作系统,程序既

可*又容易编写。

最近三星的arm受到追捧,价格便宜,以太网和USB的接口也有,周立功的开发系统

也便宜,作为学习ARM的产品来说,应该是最好的;作为工业级的控制,是不是合

适,在网友中有不同的看法和争议。本公司使用atmel ARM91系列开发的1个室外使

用的产品,在北京室外使用,没有任何的通风和加热的措施,从去年的5月份到现

在,运行情况良好。已经有个成功应用的案例。

但对于初学者来说,应该从51着手,一方面,51还是入门级的芯片,作为初学者练

手还是比较好的,可以将以上的概念走一遍;很多特殊的单片机也是在51的核的基

础上增加了一些I/O和A/D、D/A;也为今后学习更高一级的单片机和ARM打下基础。

再说了,哪个老板会将ARM级别的开发放在连51也没有学过的新手手中?

在51上面去做复杂的并行扩展是没有必要的,比如,扩展I/O口和A/D、D/A等等,

可以直接买带有A/D、D/A的单片机;或者直接使用ARM,它的I/O口线口多。可以使

用I2C接口的芯片,扩展I/O口和A/D、D/A,以及SPI接口扩展LED显示,例如:

MAX7219等芯片。

市面上一些比较古老的书籍中还有一些并行扩展的例子,如:RAM、EPROM、A/D、

D/A等,我觉得已经没有必要去看了,知道历史上有这些一回事就行了;

这些知识,是所有产品都具备的要素。所以要学,再具体应用。

说一个小的故事:野人献曝。

从前,有一个农民,冬天干了活后,休息晒太阳。好舒服呀。
他想,这么舒服的享受,我要献给国王,让他也能得到享受。
于是他兴冲冲地到了王宫,将他的宝贵经验献给了国王。

我现在就象这个农民,把自己认为很宝贵的经验献给大家。希望大家多提宝贵意见

;拍板砖也可以,骂我也无所谓,呵呵,随便。

简介:从51初学者到电子工程师2
关键字:单片机
从51初学者到电子工程师2 

第一课:51单片机最小系统

实际上,51单片机核心外围电路是很简单的,一个单片机+一个看门狗+一个晶振

+2个磁片电容;

1. 单片机:atmel的89C51系列、winbond的78E52系列,还有philips的系列,都差

不多;现在有一些有ISP(在线下载的),就更好用了;

2. 看门狗:种类很多,我常用的有max691/ca1161和DS1832等,具体看个人习惯、

芯片工作电压、封装等。Max系列和DS系列,还有IMP公司的,种类很多,一般只需

要有最基本的功能就可以了;原来我使用max691,但是max691比较贵,因为它有电

池切换功能,后来新设计电路板,就都采用ca1161了。

很早以前的电路设计中,现在可能还有人使用,使用一个电阻和一个电容达成的上

电复位电路;但是,这样的复位电路一个是不可*,为什么不可*,网络上能找得

到专门论述复位电路的文章;更重要的是,51系列的单片机比较容易受到干扰;没

有看门狗电路是不行的,当程序跑飞时,回不来了,死在那里。

常规的做法是买一个专门的看门狗电路,完成复位电路和看门狗电路的功能。
这些芯片的资料很容易在网络上找到,通常使用百度搜索就可以了;看见有PDF的

字样,就点击下载;使用网际快车flashget下载也是最好的;

这些资料通常是pdf格式的文件,所以,还需要一个pdf的阅读器。

实际上,有了百度和google以及其它的搜索引擎,很方便下载到这些芯片的资料,比光盘还方

便,不需要去到处找。

单片机和单片机抗干扰能力是不一样的。如果你的产品是工作在干扰比较大的环境

,可以试试选用不同品牌的单片机;原来我在一个光电所,做YAG激光治疗机的控

制部分,脉冲激光机的电源放电的时候,能量是很大的,在采取了所有能够想到的

光电隔离等措施之后,还是不行;后来,选用了intel的8031,就可以了。小声的

说:当时的philips的单片机抗干扰性能是最差的,可能跟Philips主要是用在民用

领域有关。现在不知道怎么样了,有人知道的话告诉我。

单片机的输入输出口线是最容易引进干扰的地方;在严重干扰的情况下,需要将所

有的口线光电隔离。

3. 晶振:一般选用11.0592M,因为可以准确地得到9600波特率和19200波特率;也

可以使用36.864M,这个频率是1.8432M的20倍,看别人的电路板上用过,我也没有

用到。这2种晶振很容易买到,价钱跟12M的一样。书上说,12M的晶振也能得到

9600的波特率,但是,实际用的时候,会每隔一段时间就出错一次,好像累积误差

一样,比较奇怪。

即使你的单片机系统不使用RS232接口,也可以做一个Rs232,留着做测试,或者预

留等等,没有坏处。除非你的单片机系统的口线不够用了。

4. 磁片电容:22pf~30pf,可以在有些书上找到什么晶振频率对应什么容量的磁

片电容,但是,我都是随便拿来使用,反正在11.0592M下,都没有问题;如果你用

到了更高的频率,最好还是找找资料看看。

参见以下电路图:

如果你的单片机系统没有工作,检查步骤如下:

1. 查看门狗的复位输出,可能的话在电路板上加一个LED,下拉,这样看起来就更

方便;要是看门狗复位信号有,往下;

2. 查单片机,看看管脚有没有问题;一般编程器能够将程序写入,说明单片机是

好的;最好手头上准备一个验证过的单片机,内部有一个简单的程序,比如,在某

个口线上输出1个1秒占空比的方波等,可以使用万用表测量。

加一句:设计产品时,要在关键的地方:电源、串口、看门狗的输出和输入、I/O

口等加不同颜色的LED指示,便于调试;作为批量大的产品,可以去掉部分LED,一

方面是降低成本、一方面是流程保密;

3. 再查磁片电容,有些瓷片电容质量不行,干脆换了;顺便说一下,换器件最好

使用吸锡带,将焊盘内的锡吸干净,再将器件拔出,这样不会损伤焊盘内的过孔;

再将新的瓷片电容焊接上去的时候,用万用表量量是好的再焊;

4. 最后只有换晶振了;切记要买好的晶振,有些品牌质量比较好。

5. 以上按照以上步骤检测时,将无关的外围芯片去掉;因为有一些是外围器件的

故障导致单片机最小系统没有工作。

 

简介:从51初学者到电子工程师3
关键字:单片机

从51初学者到电子工程师3 
第二课 基本的芯片和分立器件
2.1 简述
2.2 74系列
2.3 CD4000系列
2.4 光耦与光电管
2.5 三极管
2.6 电容电阻
2.7 固态继电器
2.8 继电器
2.9 变压器和三端稳压器
2.10 开关电源芯片
2.11 封装知识、芯片批号等
2.12 接插件
2.13 器件选购的知识
第三课 数字量的输入输出
第四课 单片机的通讯接口
第五课 单片机系统设计的硬件构思
第六课 单片机程序的框架(汇编版本)
第七课 模拟量的输入输出
……
各位多提宝贵意见。
保证实用。如果程序里面有一些例程,也是已经经过测试可以拿来就用的;实际上

是我早年的一些产品的程序的一部分;不好意思,都是汇编的。
写的时间只有周末会多一些,可以保证做到一周一课;尽量能够提前,但是这要看

看工作忙不忙了。
坊间有一些参考书,准备今天上午到北京中发市场转了一圈,我记得以下参考书目

较好:
1. 周航慈:《单片机程序设计》
2. 徐涵芳:《MCS-51单片机结构与设计》
3.  何立民:《......》

有了这些就基本够用了;其它的很多都是资料的翻译;如果英文不好,可以看看;

英文好的话,可以不必了,省电钱买开发系统和编程器、开发板什么的,需要什么

资料直接下载PDF文件好了。
要想成为电子工程师,需要宽带,在家里安装包月的adsl或者长宽,绝对值得。
实际上,网络上什么都有了,就是一个网络数据库,要好好利用。
网上自有黄金屋,网上自有颜如玉……

第二课 基本的芯片和分立器件
2.1 简述
有必要对以下系列的芯片和分立器件进行介绍。
除了单片机作为控制器的核心外,作为一个产品,由很多东西构成;所以,在讲系

统之前,先将这些零零碎碎的东西一并交待。就好像一栋房子,有各种各样的构件

组成,下面的这些东东就像砖瓦一样,没有不行。

2.2 74系列芯片
74系列的芯片的下载地址:
http://www.dainau.com/TTLDATASHEET.htm
http://www.100y.com.tw/asp/class36_40.htm
http://www.mcu51.com/download/digitpdf/74xx/default.htm

74系列的芯片是古老的一族,大部分的芯片现在均已不用了,但是,实际上,在目

前的系统中,还能看到一些芯片,有些芯片现在还在系统中使用,例如:

1、 7404 � 6个反相门

下载地址:
http://www.hqew.com/document/detail.asp?pdid=125533
将输入的TTL逻辑反相,如:0->1,1->0

2、 7407 � 6个集电极开路门

下载地址:
http://www.hqew.com/document/detail.asp?pdid=125518
由于集电极开路门可以外接高电压,可以最高到DC30V,电流最大到39mA,通常我

用它驱动8字数码管和继电器等大电流的负载;开路门内部结构是达林顿管的,输

出的逻辑是正的;
与其类似的芯片是7406,只不过是反相开路门。

3、 74LS573与74LS373 � 8 数据锁存器

74LS373下载地址:
http://www.hqew.com/document/detail.asp?pdid=129171
74LS573下载地址:
http://www.yddz.net/yddzsourse/pdf/74hc573.pdf

引入几个概念:
1. 真值表

参见74LS373的PDF的第2页:
Dn    LE  OE  On
H  H  L  H
L  H  L  L
X  L  L  Qo
X  X  H  Z

这个就是真值表,表示这个芯片在输入和其它的情况下的输出情况。
每个芯片的数据手册(datasheet)中都有真值表。
布尔逻辑比较简单,在此不赘述;

2. 高阻态

就是输出既不是高电平,也不是低电平,而是高阻抗的状态;在这种状态下,可以

多个芯片并联输出;但是,这些芯片中只能有一个处于非高阻态状态,否则会将芯

片烧毁;
高阻态的概念在RS232和RS422通讯中还可以用到。

3. 数据锁存

当输入的数据消失时,在芯片的输出端,数据仍然保持;
这个概念在并行数据扩展中经常使用到。

4. 数据缓冲

加强驱动能力。74LS244/74LS245/74LS373/74LS573都具备数据缓冲的能力。

OE:output_enable,输出使能;
LE:latch_enable,数据锁存使能,latch是锁存的意思;
Dn:第n路输入数据;
On:第n路输出数据;

再看这个真值表,意思如下:
第四行:当OE=1是,无论Dn、LE为何,输出端为高阻态;
  第三行:当OE=0、LE=0时,输出端保持不变;
  第二行第一行:当OE=0、LE=1时,输出端数据等于输入端数据;
  结合下面的波形图,在实际应用的时候是这样做的:
a. OE=0;
b. 先将数据从单片机的口线上输出到Dn;
c. 再将LE从0->1->0
d. 这时,你所需要输出的数据就锁存在On上了,输入的数据在变化也影响不到输

出的数据了;实际上,单片机现在在忙着干别的事情,串行通信、扫描键盘……单

片机的资源有限啊。
在单片机按照RAM方式进行并行数据的扩展时,使用movx @dptr, A这条指令时,这

些时序是由单片机来实现的。
后面的表格中还有需要时间的参数,你不需要去管它,因为这些参数都是几十ns级

别的,对于单片机在12M下的每个指令周期最小是1us的情况下,完全可以实现;如

果是你自己来实现这个逻辑,类似的指令如下:

mov  P0,A ;将数据输出到并行数据端口
clr  LE
setb  LE
clr  LE  ;上面三条指令完成LE的波形从0->1->0的变化

74ls573跟74LS373逻辑上完全一样,只不过是管脚定义不一样,数据输入和输出端

各在一侧,PCB容易走线;所以大家都喜欢使用这个芯片。

4、 74LS244 � 数据缓冲器

下载地址:
http://www.mcu51.com/download/digitpdf/74xx/74F244.pdf

数据输出能力比较强,输出电流可以到40mA以上;
4个缓冲器分成2组,具有高阻态控制端口

5、 74LS245 � 总线缓冲器

http://www.mcu51.com/download/digitpdf/74xx/74F245.pdf

双向数据接口,通常在ISA板卡上可以看到;
早期的51系统中,为了扩展RAM、eprom、A/D、D/A、I/O等经常可以看到这个片子

;
为了增强驱动能力,有时是为了隔离输入和输出,主要是布线方便,象74LS573一

样,输入、输出在一侧,经常用到这个片子

6、 74LS138 � 三-八译码器

http://www.mcu51.com/download/digitpdf/74xx/74F138.pdf

在早期的51系统的扩展中,作为地址选通的片子,可以经常看到。
另外一个类似的芯片是74LS154,是4-16译码器,现在更是少见了。
有兴趣的可以研究一下何立民的经典著作中的有关章节。
知道有这么一个芯片就可以了。

2.3  CD4000系列

CD4000系列的芯片,除了跟74系列的电气特性有所区别外,例如:
1) 电压范围宽,应该可以工作在3V~15V,输入阻抗高,驱动能力差外,跟74系列

的功能基本没有区别;
2) 输入时,1/2工作电压以下为0,1/2工作电压以上为1;
3) 输出时,1=工作电压;0=0V
4) 驱动能力奇差,在设计时最多只能带1个TTL负载;
5) 如果加上拉电阻的话,至少要100K电阻;
6) 唯一现在使用的可能就是计数器,CD4060的计数器可以到14级二进制串行计数/

分频器,这个74系列的做不到这么高;
下载地址:
http://www.100y.com.tw/asp/class36_40.htm
http://www.100y.com.tw/pdf_file/CD4060.PDF


2.4 ULN2003/ULN2008

它的内部结构也是达林顿的,专门用来驱动继电器的芯片,甚至在芯片内部做了一

个消线圈反电动势的二极管。ULN2003的输出端允许通过IC 电流200mA,饱和压降

VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算

。采用集电极开路输出,输出电流大,故可以直接驱动继电器或固体继电器(SSR)

等外接控制器件,也可直接驱动低压灯泡。

经常在工控的板卡中见到这个芯片。
有个完全一样的型号:MC1413,不过现在好像不怎么见到这个型号了,但是管脚与

2003完全兼容。

ULN2003可以驱动7个继电器;ULN2008驱动8个继电器。

ULN2003下载地址:
http://www.hqew.com/document/detail.asp?pdid=148212
ULN2008下载地址:
没有找到。奇怪啊。

2.5 光耦

光耦是做什么用的?光耦是用来隔离输入输出的,主要是隔离输入的信号。
在各种应用中,往往有一些远距离的开关量信号需要传送到控制器,如果直接将这

些信号接到单片机的I/O上,有以下的问题:

1) 信号不匹配,输入的信号可能是交流信号、高压信号、按键等干接点信号;
2) 比较长的连接线路容易引进干扰、雷击、感应电等,不经过隔离不可*

所以,需要光耦进行隔离,接入单片机系统。

常见的光耦有:
1) TLP521-1/ TLP521-2/ TLP521-4,分别是1个光耦、2个光耦和4个光耦,HP公司

和***的东芝公司生产。

下载地址:
http://www.100y.com.tw/pdf_file/TLP521-1-2,4.PDF

发光管的工作电流要在10mA时,具有较高的转换速率;
在5V工作时,上拉电阻不小于5K,一般是10K;太小容易损坏光耦;

2) 4N25/4N35,motorola公司生产
下载地址:

http://www.100y.com.tw/pdf_file/4N25-8,35-7,H11A1-5.PDF
隔离电压高达5000V;

3) 6N136,HP公司生产

下载地址:
http://www.100y.com.tw/pdf_file/6N135-6.PDF
要想打开6N136,需要比较大的电流,大概在15~20mA左右,才能发挥高速传输数据

的作用。
如果对速率要求不高,其实TLP521-1也可以用,实际传输速率可以到19200波特率

。

选择光耦看使用场合,tlp521-1是最常用的,也便宜,大概0.7~1元;
要求隔离电压高的,选用4N25/4N35,大概在3元左右;
要求在通讯中高速传输数据的,选用6N136,大概在4元左右。

光耦应用的原理框图如下所示:
1. 输入干接点隔离

2. 输入TTL电平隔离


3. 输入交流信号隔离

4. 输出RS232信号隔离


5. 输出RS422信号隔离


光耦除了隔离数字量外,还可以用来隔离模拟量。将在今后的章节中描述。

简介:从51初学者到电子工程师(4)
关键字:单片机

从51初学者到电子工程师(4) 
从51初学者到电子工程师

2.6 三极管
2.7 光电管
2.8 电容
2.9 电阻
2.10 固态继电器
2.11 继电器
2.12 变压器与整流桥
2.13 三端稳压器
2.14 开关电源芯片
2.15 封装知识、芯片批号等
2.16 接插件
2.17 器件选购的知识


2.6 三极管

2.6.1 三极管的4种工作状态

1) 饱和导通状态

饱和导通=0

2) 截止状态

饱和导通=1

3) 线性放大状态

作为低频放大器时使用,具体的可参见有关电子线路的书籍;

4) 非线性工作状态

在无线电通信系统中,作为混频器等使用。具体的可参见有关电子线路的书籍;
愚记得南京工学院也就是现在的东南大学在80年代初期有一套《电子线路》5本,

是电子专业的书籍,比较难懂;现在,即使是在电子专业的学生中,也应该降低了

对三极管的哪些复杂的参数的要求了吧;在实际使用时,即使是模拟电路、非线性

电路,也都是集成电路了,谁还使用三极管自己做呢?如果万一需要,现学也来得

及。这套书很强的。编写人在那个年代肯定都是牛人。

学三极管这些参数很繁琐的,要是现在的非电子类的大学生或者大专生们还学这些

玩意,我只能说是学校在误人子弟了。

好多学校都在扩招,很多学生念了4年下来,学了一堆过时的理论,跟实际的东西

一点没有接轨,不知道7407是干什么用得,不知道三极管的几个状态;我只能无话

可说。

所以,念了4年下来,跟企业的需求还有一段距离,还需要从头来过;聪明的学生

赶紧抓住机会去学习,去实习,这样,还可以赶紧补上实际应用的这一课。

言归正传。

参见下图:

当单片机的口线输出电平为1时,三极管的be结导通,ce结导通,输出的电压值为

0V;
当单片机的口线输出电平为0时,三极管的be结不导通,ce结截止,输出的电压值

为5V;

在这种数字电路的应用中,相当于三极管是一个反相开路门。

计算是否导通,公式如下:

I=B(放大倍数,希腊字母的贝塔)×Ibe

当Ice<I时,即为饱和导通;

相差越大,饱和程度越深,Vce越小,三极管的输出内阻越小;

这个概念要用到光电管中。

设计使用时大概算算,心里有个数;在电路板上试试,行的通,那就是它了。可以

测量Vce值,至少要小于0.1V就可以了。

常用的PNP三极管是2N5551,驱动40mA的LED(电压在24V)、蜂鸣器等均没有问题

。

2.6.2 三极管的具体应用

实际上,已经有象7407、ULN2003可以取代三极管在数字电路中的作用;但是,有

时是受到PCB面积的制约,有时是为了降低成本,有时是因为布局方便,在1~2个输

出点时,还是可以使用三极管来做驱动的。

例如:驱动一个蜂鸣器;往往系统中的蜂鸣器跟其它驱动设备,继电器等,距离较

远;这时,没有必要使用一片7407,或者ULN2003来驱动;驱动的接口如下:


Re:从51初学者到电子工程师(转帖) 

 

2.7 光电管


我这里所谓的光电管有2种:

1) 反射型光电管
2) 对射型光电管

这2种产品在市场上又可分为调理好的和没有调理好的;

这2种光电管在电子产品世界和电子技术应用杂志上都有大量的广告。随便找一本

都有。

我所说的调理好的指的是内部已经加了限流电阻和输出的放大驱动电路了。它的特

点是只有3根线,电源2根,输出信号一根,TTL电平的;但是,有时受到某种限制

,需要使用没有调理好的,怎么办呢?

参见下图:光电管原理框图

这种没有调理好的光电管在使用时,需要做一块小的电路板,在发光管加限流电阻

,在光电三极管的集电极加上拉电阻到5V,如下图所示:光电管工作框图1。

但是,在使用中我发现,输出的信号不稳定,尤其是在使用比较长的电缆传输到单

片机的时候;究其原因,我认为是由于反射或者对射的红外光落在光电三极管的靶

面上,光强未能导致光电三极管深度饱和,使得输出的内阻偏大,环境的噪声和电

缆的干扰信号容易在线路上叠加的缘故;

为了可*工作,仿照达林顿管的结构,在光电三极管的输出端加一个限流电阻接到

NPN的B结,当无光的时候,2N5551饱和导通,输出电压为0V;实际测量小于0.1V;

当有光,甚至是弱光时,2N5551截至,输出电压为5V。将3K电阻换成更大或更小的

电阻,可以调整光电三极管的输出的灵敏度。

具体工作过程可以自行分析,做个实验。


2.8 电容

2.8.1 电容的主要种类

电容有以下几大类:

1) 电解电容
2) 独石电容
3) 磁片电容
4) 胆(左金右旦)电解电容
5) 涤纶电容等

电容的指标是:耐压值和电容容量。例如:220u/50V,就是说,这个电解电容耐压

值为50V,容量为220u。

电容的容量跟电容的介质有关。

顾名思义:

电解电容为电解质作为介质的,铝作为电极;

独石电容是使用石头作为介质的;

磁片电容是磁片作为介质的;

胆(左金右旦)电解电容使用电解质作为介质,但是,电极采用胆(左金右旦)金

属。
涤纶电容采用涤纶作为介质。

有兴趣的网友可以拆一个电容看看。


2.8.2 电容的使用场合

1. 电源稳压和滤波

电解电容主要是用来稳压和低频交流滤波的;高频滤波是使用磁片电容和独石电容

。
当电解电容作为稳压时,接在整流桥和三端稳压器的输出端,起到稳定电压的作用

。其工作机理相当于一个水库,从上游来的带有波浪的水到了水库,就变的平滑了

。

但是,铝电解电容的电解质随着时间的推移会干涸,所以在设计时需要留有余量,

保证系统正常工作到它的寿命。

有些远端供电的直流电源,接到电路板的输入端时,需要在电路板的电源输入端加

一个大的电解电容,通常可以是220u/25V,这样,这块电路板需要供电时,不是直

接从电源处取,而是从电容中取电,可以得到稳定的电流供给;

但是,电解电容只能滤除低频的波动;对于直流电源中的高频波动,可以加一个

0.1u或0.01u的独石电容或者磁片电容。

很多教科书都指出,在每一个芯片的电源和地两端接一个0.1u或0.01u的独石电容

或者瓷片电容,解决芯片的供电过程中,由于电路板的走线电感产生的电源开关噪

声尖峰。这种作用下的电容叫去耦电容。这是电路板的常规的设计;

2. 定时参数

对于象555这样需要外接电容产生稳定的脉冲的器件,涤纶电容是首选。可以想象

,涤纶一层又一层缠绕,受到温度变化引起的涤纶的面积的变化的相对值要远远小

于独石电容的介质石头受到温度变化而引起的变化值。

3. 产生其它电压

有些需要从单一电压产生其它的电压的芯片,如:max232,需要外接电容才能实现

。
参见max232技术资料。
外接01.u的胆电容。

简介:从51初学者到电子工程师(5)
关键字:单片机

从51初学者到电子工程师(5) 

电容有直插和表面贴的不同封装。

电解电容表面贴封装的通常耐压值不超出25V,电容值不超出100u。再大,就只好

使用直插的了。其它的电容,磁片和独石都有表面贴封装的。


2.9 电阻和电位器

2.9.1电阻的种类

2.9.1.1 普通电阻


电阻种类按照工艺可以分为碳膜电阻和金属膜电阻;

按照功率可以分为小功率电阻和大功率电阻,大功率电阻通常是金属电阻,实际上

应该是在金属外面加一个金属(铝材料)散热器,所以可以有10W以上的功率;在

电子配套市场上专门卖电阻的市场上可以很容易地看到。

金属电阻通常是作为负载,或者作为小设备的室外加热器,如,在CCTV的一些解码

器箱和全天候防护罩中可以看到。

电阻在电路中起到限流、分压等作为。通常1/8W电阻已经完全可以满足使用。但是

,在作为7段LED中,要考虑到LED的压降和供电电压之差,再考虑LED的最大电流,

通常是20mA(超高亮度的LED),如果是2×6(2排6个串联),则电流是40mA。

不同厂家选用不同材料的,压降有所不同。所以,需要加上电试一下,但是,不要

让Led的电流超出20mA(单只LED),这时加大电流亮度也不会增加,但是LED的寿

命会下降,限流电阻的大小就是压降除以电流。电阻的功率随之可以算出。

这个使用初中的知识就够用了。

2.9.1.2 电位器

电位器就是可调电阻。在初中学物理时,中学老师拿一个很大的圆筒状的东东,上

面有一个滑杆,跟这个东西很类似。

它的阻值在1~n之间变化。

N=102、502、103……
102=10*10的2次方,也就是1000欧姆,1K
同理,502=5K。

这种表示的方法跟电容是一样的。

电容104=10*10的4次方pf,电容的基本单位是pf,1u=1000000pf,所以,

104=100000pf=0.1u;

电位器又分单圈和多圈电位器。

单圈的电位器通常为灰白色,面上有一个十字可调的旋纽,出厂前放在一个固定的

位置上,不在2头;

多圈电位器通常为蓝色,调节的旋纽为一字,一字小改锥可调;

多圈电位器又分成顶调和侧调2种,主要是电路板调试起来方便。
有些是仪器仪表设备,通常是模拟电路,有一些不确定的因素,需要调节才能达到

最理想的效果;有些是设备本身就需要输出一个可变的东东,如电压和电流,也需

要一个电位器。

2.9.1.3 排电阻

是sip n的封装,比较常用的就是阻值502和103的9脚的电阻排;象sip9就是8个电

阻封装在一起,8个电阻有一端连在一起,就是公共端,在排电阻上用一个小白点

表示。排电阻通常为黑色,也有黄色;51系统的P0需要一个排电阻上拉,否则,作

为输入的时候,不能正常读入数据;作为输出的时候,接7407是可以的,不需要上

拉电阻;但是,接其它的芯片,还是不行。有兴趣可以看看51的P0的结构;没有兴

趣,依葫芦画瓢,照做没错。

2.9.1.4 光敏电阻

当照在光敏电阻上的光强变化时,电阻值也在变化。显然这是半导体材料的特性。
使用光敏电阻可以检测光强的变化。

思考题1:

有一个LED显示设备,要求,当光强变化的时候,LED的亮度随着光强变化;光线越

强,LED越亮;反之亦然。怎么使用单片机实现此项功能?可以是多级调光,如8级

调光;也可以做成无级调光。

2.9.2 电阻的封装

电阻的封装有表面贴和轴向的封装。

轴向封装有:axial0.4、axial0.6、axial0.8等等;axial在英语中就是轴的意思

;
表面贴电阻的封装最常用的就是0805;当然还有更大的;但是更大的电阻我想就不

是很常用了。

电位器的封装在protel的书种可以很方便地找到。但是如果直接使用,可能会有一

些偏差。老树早期就犯过这种错误,导致电位器旁边的器件安装费劲。

搞硬件和软件是有所不同的,搞硬件的人,一定要精确。

在硬件上的一个小的错误,都会造成这块板的推倒重来;因为产品是不能有飞线的

;而这个小小的错误相当于软件上的一条语句,在软件调试阶段悄悄改掉,可以神

不知鬼不觉;在PCB上,特别恶心。而且谁都知道-老板最知道。

什么是精确呢?

1. 对你所要实现的工作的目标理解准确;

2. 对你的电路图要清楚每一个器件在其中所起的作用;如果不明白,可以找一个

专家问问,得到确认;如果不清楚,可以先试试;

3. 对每一个器件的封装要严格把握,该是什么形状、外形一定要完全一致;还有

考虑到空间是不是对其它的板卡器件有影响;对边缘连接器件与电路板的边缘之间

的距离、ISA和PCI的边缘连接件与挡板之间的关系要完全把握才能去做电路板;否

则只是浪费金钱和时间;

对边缘器件与边缘之间的距离要是不能有把握的话,可以找3个人,每个人都计算

一遍,取个平均值,基本上就差不多了。

4. 对单片机的资源能不能作成这件事情一定要有把握,CPU运算速度和字长、内

存够不够大、程序存储器够不够大,需要仔细的规划;

5. 原理图经过专家认可无误后,画出来的PCB需要做网络检查,做到与原理图完

全一致;

 

2.10 继电器、固态继电器

2.10.1 继电器

继电器,就是利用继电器的线包在加电后产生的磁力,将2个电极吸合在一起;初

中还是高中的物理有它的原理。有兴趣可以打开一支看看,很好玩的。

继电器有:
1) 公共端:COM
2) 常开:normal open,NO
3) 常闭:normal close,NC

继电器主要指标:

工作电压:

工作电压有直流和交流的2种;

在PCB上,通常是直流的;交流的继电器通常是AC24V的居多,当然,还有AC220V的

。交流的继电器国产的比进口的,比如,idec,OMRON,fujitsu便宜很多,当然,

质量也差一些。

可以在百度上专门搜索一下继电器,上面有一些厂家产品的介绍。

常用的小功率的继电器是national 的居多,OMRON也有,便宜一些,一盒50只。

常用的电压有:

DC5V/DC9V/DC12V/DC24V等;

根据触点数量,可以分为:

单刀单掷/SPST

单刀双掷/SPDT

双刀双掷/DPDT

四刀双掷等/?

还要根据触点容量来分。

一般的都是DC30V/1A或者DC30V/2A,AC110V/0.2A,再大,就不能使用继电器了,

因为在触点切换,电流通过的瞬间,会产生拉弧,烧毁触点,使得切换不可*;这

是,可以使用固态继电器。

实际上,在PCB上的继电器的任务就是给出一个干接点信号,作为控制信号使用,

传递的是一个信号,而不是能量。或者控制一个大功率的开关等,让大功率的开关

去控制功率的传递;但是,后者也不如固态继电器来得方便。

继电器的封装通常是DIP16或者以上;也有更小的继电器,但是,价钱跟DIP16的差

不多。

注意:DIP16的继电器只有8个管脚;所以设计封装时,不要图省事直接使用DIP16

,这样容易在焊接的时候焊反了,导致出错。要专门设计继电器的封装,该有几个

脚就使用几个脚。


2.10.2 固态继电器

固态继电器,说白了,就是使用发光管触发的过零触发的可控硅。
可以说,跟光耦很相似,也是4个管脚,只是区别在:

4) 直接使用直流电压控制;可以认为内部已经有了一个限流电阻;
5) 接收光信号的一端是过零触发的可控硅;

可以说是一个电子开关,无触点的继电器。

因为无触点,所以可以通过大电流而不产生拉弧,工作寿命与开关次数无关。

触点作为信号使用的继电器的时间的工作寿命是100万次到300万次,可以查看技术

手册;

固态继电器可以认为是无限次的,所以在大电流和频繁开关的场合,使用固态继电

器。

固态继电器触点通过的信号通常是交流电压,但是也有直流电压的。

固态继电器可以通过AC220V或者AC380V以下的交流电;它的2个指标:

1) 工作电压,通常为DC5V和DC12V,也有DC24V的;
2) 工作电流:AC220V/1A/2A/4A不等。

国产的固态继电器质量不错,跟进口的没有区别,就是封装的质量太差,一批买回

来,个个都不一样,焊在电路板上东倒西歪,不美观;至于小功率的国产的继电器

市场上比较少见,有也不敢使。

进口的固态继电器有美国的和***的,4A以上的比较贵,***的OMRON的固态继电

器2A的才卖8元,侃侃价估计还能便宜,体积小,封装绝对的准确,可以很整齐地

在电路板上排列,不占地方;

2.12 线性电源:变压器、整流桥与三端稳压器

什么是线性电源?为什么叫线性?老树查了网络上的资料,也没有答案,只好等待

高明教我。

PCB上需要供电,就需要电源。电源分2种,一种是线性电源,象7805,就是线性电

源;

一种是开关电源,是将AC220V直接整流滤波成高压,推动功率管工作在100Khz以上

,再整流滤波成低压。

开关电源的工作原理可以通过百度查到。

线型电源需要工频变压器,将AC220V变换成低压,经过全桥的整流,和大电容的滤

波,成为脉动的直流,再经过三端稳压器,输出直流电压。

输出端还需要大的电解电容滤波。注意这时要选用足够大的电容容量和耐压值的电

解电容。耐压值不够,你就等着听响吧。电容容量不够,整流输出的电压和输出的

电压的压差不够,输出电压会有纹波,单片机系统工作不正常。

通常电路板上需要的是DC5V,一般来说,现在的电路板,一片7805,再加散热片也

基本够用了。功率越大,散热片也越大。

变压器有多种规格:

1、 普通E型矽钢片绕制的变压器,现在最大量的是广西普宁雄英出的变压器,通

过了长城认证,质量是不错的,最大的好处是便宜,现货量大;通常的规格是单9V

、12V,双9V、12V等;可能这个地方出矽钢片,有这样的矿藏。

2、 环型变压器,象个椭圆型;

3、 最近好像圆形的变压器也多起来了,后2种变压器应该是漏磁小、发热少、效

率高,大功率的整流时使用,当然单位瓦数也贵啊,按照1元/W计算预算应该差不

多了。

这2种变压器都需要定制,可以定制各种规格的。

4、 焊在电路板上的变压器,比较有名的是兵字品牌。在《电子技术应用》和《电

子产品世界》上常年做广告。秦皇岛也有一家,好像叫耀华。

怎么计算变压器需要多大的功率?

首先,计算功耗。比如:Dc5V/0.25A,也就是1.25W的功耗。

7805效率50%,变压器效率50%,就是说,需要6W的变压器。

Dc5V/0.25A的输入压差大概在3V,6V的变压器整流出来的电压是大约6×1.4=8.4V

,也差不多了。所有选用AC6V/6W的变压器。再到市场上找一个差不多的变压器用

上就行了。

注意:电流越大,压差越大;在电路工作的时候,可以拿示波器看看电源的波形是

不是平稳。

78系列的芯片做的比较多而好的是美国国家半导体公司(national semiconductor

)的LM780X和摩托罗拉公司MC780X 等2大系列。

78系列是高压差的稳压芯片,现在有低压差的稳压芯片,其机理参见沙占友老师的

书籍。有LM2930、LM2937、LM2940C、LM2990等4个系列。

如果需要更大的电源供给,或者使用开关电源,或者去买成品的线性电源,象辽宁

朝阳4NIC的电源,质量不错,价格也不错。

简介:从51初学者到电子工程师(6)
关键字:单片机

从51初学者到电子工程师(6) 
 

开关电源和线性电源的区别

  线性电源的调整管工作在放大状态,因而发热量大,效率低(35%左右),需要

加体积庞大的散热片,而且还需要同样也是大体积的工频变压器,当要制作多组电

压输出时变压器会更庞大。开关电源的调整管工作在饱和和截至状态,因而发热量

小,效率高(75%以上)而且省掉了大体积的变压器。但开关电源输出的直流上面

会叠加较大的纹波(50mV at 5V output typical),在输出端并接稳压二极管可

以改善,另外由于开关管工作是会产生很大的尖峰脉冲干扰,也需要在电路中串连

磁珠加以改善。相对而言线性电源就没有以上缺陷,它的纹波可以做的很小(5mV

以下)。对于电源效率和安装体积有要求的地方用开关电源为佳,对于电磁干扰和

电源纯净性有要求的地方(例如电容漏电检测)多选用线性电源。另外当电路中需

要作隔离的时候现在多数用DC-DC来做对隔离部分供电(DC-DC从其工作原理上来

说就是开关电源)。还有,开关电源中用到的高频变压器可能绕制起来比较麻烦。

2.14  开关电源芯片

相对于线性稳压器来说,开关电源在计算机主板上、工控机主板和各种各样的电路

板上起着电压变换的作用。例如:将低电压,比如:电池转换成稳定的3.3V或者5V

,或者将高电压转化成DC5V、DC3.3V,或者将DC5V转换成3.3V和1.8V,例如,ARM

的电路板就需要这样的芯片,3.3V给ARM供电,1.8V给arm的core供电。以上
由于采用了开关电路,电源芯片的工作频率高,发热小,效率高。

同样的,还是芯片的巨头,MAXIM、LINEAR和TI等公司在电源转换芯片上是最为卓

越,无论从产品的种类,还是质量都是上佳的;

经常看电子产品世界和电子技术应用的网友一定对maxim的电源芯片印象巨深。五

花八门的电源芯片,让你无法选择到底选用那种是自己的所需要的。

在maxim的产品树中,对电源是这样分类的:

Power Supplies and Battery Management  
Switchmode DC-DC Power Supplies 408  
Isolated Power Supplies 22  
Low-Dropout Linear Regulators 75  
White LED Drivers 13  
Low-Side MOSFET Drivers 14  
High-Side MOSFET Drivers 6  
ORing MOSFET Controllers 2  
Battery Chargers 36  
Battery Protectors, Selectors and Monitors 17  
Regulator + Reset Circuits 4  
Current Sense Amplifiers 22  
LCD/ECB/CCFL Display Bias Supply 87  
ALSO SEE: Hot-Swap and Power Switching  
ALSO SEE: Voltage References  

我们经常使用到的是Switchmode DC-DC Power Supplies ,这里有分成n种。老树

比较熟悉的是step-down电源芯片,也就是所谓的从高电压下降到低的电压的芯片

;从低到高,当然是step-up电源芯片。

象philips的电动剃须刀,里面肯定有电源管理芯片,当电池电压下降,但是,电

池又有电的时候,能够输出恒定的电压,榨干电池内的最后一点电能,能够舒适地

使用一段很长的时间。

比如,你的电路板上只有DC24V电压,但是,还需要Dc5V/2A的电源,这么高的压降

,使用线性稳压器显然不合适,如果使用DC/DC模块,成本太高,体积也比较大,

所以,得选用一款芯片完成这个功能。

按照maxim给出的复杂的选择,根据你的要求,多选择几项,maxim会给出一个清单

,在清单中去选择你最适合你的需求的芯片。

老树原来使用过的完成此项功能的芯片是:MAX724、LT1076;这2款芯片需要1个

50uH的电感才能输出Dc5V电源;但是,这种开关电源芯片有个好处,就是输入只要

在它的允许的范围内波动,或者负载在变化,输出DC5V电源十分稳定。

电源的范围从Dc10V~DC40V,max724均能输出5A的DC5V电源。

Maxim724下载连接地址:

http://www.hqew.com/document/detail.asp?pdid=153160

LT1076下载链接地址:

http://www.hqew.com/document/detail.asp?pdid=157742

在ARM上使用的电源芯片是TI公司的TPS767D318。

下载链接:

http://www.hqew.com/document/detail.asp?pdid=122122

在沙老师的书中,也介绍了几款电源转换芯片,可供参考。

如果是作为隔离电压产生,例如:5V转换成隔离的5V,用在光耦、通讯等电路中,

去自己做隔离电路就有点划不来,不如去买现成的DC/DC模块。这点国产的模块做

的不错,象老树常用的Dc12V/DC5V500mA的模块,大约30元,质量还是不错的。


2.15 器件选购、芯片批号、封装知识等

在市场上买芯片,千万注意不要买到旧片、拆机片;旧片、拆机片有些凑合能用,

有些干脆不行;即使现在能用,寿命肯定有限;

旧的就是旧的,肯定瞒不过有心人;主要是从芯片的管脚的崭新程度、芯片印刷的

质量等仔细观察。

旧的芯片往往管脚参差不齐、搪锡发乌、包装的管子不够新;而且往往是芯片的表

面发白,那是因为被打磨过了,然后重新丝网印刷上厂家名称、批号等;

所以最好是买激光打标的器件,激光打标的产品肯定是新货,或者没有使用过的货

;而且买的时候需要注意,器件的批号最好是最近当年的或者是最近几个星期的产

品;总而言之,别花冤枉钱,还影响产品的质量。

同样的产品,不同厂家的质量也不一样。我比较喜欢的是美国TI、摩托罗拉MC、

MAXIM、LINEAR的产品;假的也少;

例如,max7219芯片上有一下标志:
MAXIM
MAX7219CNG
0323PY

MAXIM就是芯片的厂家;
MAX7219CNG是厂家的型号,CNG跟封装和7219这个系列产品的细微的差别有关;
03是指2003年;23是指该年的第23周;一年是52周,所以这个数字不会超出52;

激光打标是在芯片上形成一个暗色的与芯片表面有一个明显对比的标志;中关村的

大恒公司就有激光打标机的业务;但是未必是在芯片上打标;

有时,激光打标会产生类似暗黄色的标志,这跟激光器功率和芯片封装材料有关。

 

简介:从51初学者到电子工程师(7)
关键字:单片机

从51初学者到电子工程师(7) 
不好意思,第二课没有写完,又开一课--老树当过老师,有毁人不倦的习惯,再者

,这个问题想了很久了,也基本想通了。

在网络上很多初学者在问:怎样成为一个合格的电子工程师?

这个问题有很多答案。老树谈谈自己的看法。

第一步 入门-51核心和基本电路

中国人有10亿啊,每年有多少大学生毕业呢?我不知道。但是我看到有一张照片,

招聘会上熙熙攘攘,人来人往,十分震撼。从来没有一个时刻让我感觉到中国的人

力资源是如此的丰富。但是,从现在的大学毕业出来的学生学到了什么东西呢?一

些理论,跟实际脱钩的理论。有没有用呢?有点用。但是,在企业中,需要的是实

际干点事情出来,实际解决问题。所以说,很多企业不想要大学本科出来的大学生

,说动手,没有动手能力,不知道电阻电容长得什么样子,能够做什么?但是又自

视甚高,对工资的期望值比较高。等到能够干点事情了,又拍拍屁股跑了。所以企

业现在喜欢使用大专中专甚至是职业学校培训出来的小孩,至少这些孩子们知道自

己的份量,能够实实在在地做事。要知道,他们很多人的天赋并不差,有些人甚至

可以说聪明,只是因为很多人是家庭条件不好,打小就是苦孩子,没有条件接受良

好的教育。一旦给机会,他们都比较珍惜。

现在的大学,误人子弟甚多。扩招是没有错,但是,实验室扩了吗?教室扩了吗?

教师扩了吗?至少实验室是没有扩。老树认得的一个研究生说,只有到了一个阶段

,才能到实验室作实验。很多导师就是把学生当奴隶一样干活,要是在干活中能够

学到东西那就算是运气好的;运气不好的,直接就是导师的廉价的劳力了,学不到

东西,活倒干了不少。

但是,既然学生要拿文凭,要应付考试,没有办法,那怎么自救?

如果励志要做一名出色的电子工程师,老树可以谈谈自己的看法。

做一个电子工程师,先从51学起,这是得到公认的。不需老树饶舌。

首先,去买一个开发板,越便宜的越好,在上面可以练练keil C。最好再买一个仿

真器,这样调试的效率高。当然这个不便宜,但是我觉得可以志同道合的哥几个合

买。反正1天24小时,每人8个小时轮流上,有个几个月,C51语言也就差不多了。

其次,看看老树的文章,看看需要学点什么基本的东西。北京的大学生有福啊,没

事到中发去转转,认认老树的文章上说得哪些电阻、电容、三极管、芯片、接插件

什么的,看看自己的电脑上的主板、网卡、声卡、显卡是怎么画的,找找感觉,这

些板卡都是高手的杰作啊。

构思一个小的产品,按照老树文章上的思考题,找本protel99se的书,从每个菜单

练起,循序渐进,从单片机最小系统->输入->LED->RS232/RS422/RS485->固态继电

器、继电器等原理图画起,边画边学,一点一点做,做好了,最好找个高手看看,

找出毛病在哪里,再反复改进。在这样的模拟实战中找到感觉。

推荐老虎工作室的protel 99系列4本,写的还是循序渐进的,当然不便宜;咬咬牙

,可以合买一套,轮着看。

顺便说一句我对市场上的开发板的看法,这些开发板当然都不错,但是,只能学到

语言,不能教你画原理图和PCB,实际做的时候,还是需要高手带一带是最快的。

我就是一个朋友教我的,也就半天的功夫,就会了。当时还是DOS下的protel 3.16

版本。

以战养战。找个公司、企业,帮他们做个小产品,既能得到公司的高手的指点,又

能赚到一笔费用,岂不甚佳?这时,你的开发板、仿真器的费用就出来了。从原理

图->PCB->C51,单片机也入门了。

第二步:登堂入室-掌握系统的电路知识

这时,需要对电子技术的所有东东进行全面的了解,主要是看看杂志、BBS、网站

上的技术文章、何立民先生主持编著的《单片机应用技术大全》系列,将单片机和

它的配套的电路,输入输出、通讯等等做一个全面的了解。目标是为什么?系统的

技术储备。知道什么问题可以使用什么方法解决,可能在什么地方找到解决的方法

,这对你以后走上工作岗位,解决实际问题是非常有好处的。如果你真能这么做,

那么,你今后肯定比单位中的老同志还要棒。

老树在国营研究所的时候,曾经有一段时间无所事事,就是在那一两年的时间内将

研究所的技术杂志看了一遍,尤其是《电子技术应用》。打下了一个良好的基础。

这时,争取机会,学习高手们的硬件设计。一个比较快的办法就是到工控机的厂家

那里,看看工控机的板卡和调理板是怎样设计的,都使用了哪些东西。记得老树第

一次看到国外的一个器件,到处去问,也不知道是什么东东。后来在四通工控那里

看到了,原来是固态继电器。这时,脑子里关于固态继电器的知识都冒出来了。再

一看,配套市场大把的。

什么东西就是这样,你要是不知道它是干什么的,你天天看见,也熟视无睹。

有心人就是这样,在什么样的情况下,都能慢慢积蓄知识和力量。毕竟一个产品,

不是只会单片机就可以了,还是需要很多的外围电路,按照何老师的分类,前向、

后向、人机、互相通道等,才能做成一件产品的。

这个时候,抓住任何机会,去参与一个大型产品开发,在其中做一件事情,你可以

学到沟通、协作、界面等产品开发的一些要素。

第三步:勤奋至卓越

中国人多啊,每个人都是智商100,谁比谁傻啊。凭什么你比别人强?你能有好的

工作、好的收入,你能香车宝马,醇酒美人?老树认为,没有别的办法,就是*勤

奋。

勤奋学习-这个道理大家知道,知识就是金钱啊;

勤奋工作-想比别人多赚钱,在智商相同的情况下,就是*多付出时间干活,再提

高工作效率。别人5×8小时工作,你是7×16小时,再提高工作效率一倍,你不久

赚了比别人多5倍的钱吗?老树公司有2个员工,原来在老家种苹果,没有赚到钱,

到老树的公司中干活,计件,活忙的时候,早晨8:00起来,晚上12:00收工,年

底也赚了一笔钱回家,高高兴兴,老树也开心,原来一屋子人干的活,现在2个人

干了,公司管理省事了,员工也赚到了钱。

开发也是一样。当然,这个需要你的公司有这个机制,多劳多得的机制。但是,要

是现在没有,你要不要这样干呢?

我认为,需要。一方面,干别人的活,练自己的技术,长自己的本事。另一方面,

多干活,才能快速增长本事,技术才能跃变、突破,登堂入室,再得心应手、出神

入化。至少,熟练工种是没有问题的吧。

就象一壶水,老是小火,烧了半天,也是温吞水;可是大火一上,一会就开了,就

是这个意思。

你看《射雕英雄转》中的郭靖,没有别的本事,就是傻练,有一天开窍了,如有神

助。技术这个东西就是这样,突破了门槛,就是坦途。需要勤奋勤奋再勤奋。有一

天这个日子来了,你就苦尽甘来了。

勤奋还有另外一个含意,就是天道酬勤。其实是每个人看见勤奋的人,都会给他机

会的,觉得帮助这样的人,高兴;把事情放在他的手里,也放心。

还有一个含意是触类旁通。知识需要很多的参照物,去比较、联想、萃取、升华。

换句话,你可能付出的是其他人的n倍的努力,可是你得到的是n倍以上的回报,你

的知识已经不是简单的累加了,已经质变了。

如果你在这个单位,勤奋了,也出成果了,就是没有得到公平的待遇,也没有关系

。换一个环境就是了,总有人会欣赏你的。再说了,付出总有回报。

有些人习惯怨天尤人,没有好的老爸老妈,没有好的老师,没有好的同伴,没有好

的环境,没有好的老板。这些人需要去看看周立功的文章,看看周老师怎样一步步

成长的。

第四步:沟通、协作

原来还有,现在越来越少,做一个小的产品,就可以生活无忧。


第五步:对某个行业深入理解

每个人生存在这个世界上,大都需要有一门独到的技术;更何况你是这个论坛的读

者;

有的人天生千娇百媚,有的人天生金嗓子,有的人有个好的老爸老妈;这些都不足

为恃,更何况没有这些天赋呢?

当你掌握了单片机、ARM、CPLD/FPGA等高端的技术,应该说,养身立命是没有问题

了,可以解决人生的基本问题了;但是,还想更上一步,就需要对某个行业进入深

入的理解和挖掘。

我认识的*技术过上宝马豪宅生活的工程师,并不是在技术上一开始就有什么过人

之处,也不是说他的产品一开始就会比别人好很多,而是都是特别有韧性的人,都

在捕捉某个行业的机会,在某个行业内精耕细作,坚持不懈,别人都干其它的去了

,只有他还在这个行业中慢慢来,过上5年或者更多的时间,慢慢得到业内人士的

认可,产品不断改进,慢慢打开了销路,最后站住脚,机会来了,一下发达了。我

的一个朋友,就是这样修炼成了正果。

有个笑话,说:刚刚离开的行业,发展最快。说得就是这个道理。

中国大啊,市场大啊,只要认真耕耘,就会有收获。

所以,在目前的中国,技术人员还是有机会的,再过10年,可能就一点机会都没有

了。

需要去从事多个行业吗?就个体而言,不需要。那个行业都有金子。

就公司而言,需要吗?那要看你的公司有没有这方面的人才;还需要看有没有这个

方面的机制。否则,盲目的进行多个行业的扩展,没有必要。需要做的是至少在某

个行业做到前三名。

你看,原来的LOTUS的notes,卖给了IBM,原来只卖出去300万份,到了IBM,就卖

到了1000万份(大概吧)。产品就是这样,占领市场的同时,利润就有了,规模效

益就有了。一个公司的产品不需要太多,但是要卖的多,才是正路。想想看,同样

是产值100万,一个产品和10个产品的差别那就大了,研发、服务、维修,差的多

呢。

象吉列,就是那么个小刀片,作成这么大的企业,多么舒服。

象GE,每个行业都是业内的翘楚,那是资本主义社会200年的技术积累。在中国,

需要做的是每一个小的公司都是某个产品最突出的。从小的产品做起,做到国内最

好、亚洲最好、世界最好。就行了。中国就强大了。

到那个时候,才有可能出现象GE这样的大公司。才有形成这样的大公司的技术基础

。

单片机应用产品设计经验---抗干扰篇

EE见闻录2

简介:单片机应用产品设计经验---抗干扰篇1
关键字:单片机

单片机应用产品设计经验---抗干扰篇1 
 
  [分享]单片机应用产品设计经验---抗干扰篇1

如何提高电子产品的
抗干扰能力和电磁兼容性
    在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性?

1、  下面的一些系统要特别注意抗电磁干扰:

(1)  微控制器时钟频率特别高,总线周期特别快的系统。

(2)  系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等。

(3)  含微弱模拟信号电路以及高精度A/D变换电路的系统。

2、  为增加系统的抗电磁干扰能力采取如下措施:

(1)  选用频率低的微控制器:

    选用外时钟频率低的微控制器可以有效降低噪声和提高系统的抗干扰能力。同样频率的方波和正弦波,方波中的高频成份比正弦波多得多。虽然方波的高频成份的波的幅度,比基波小,但频率越高越容易发射出成为噪声源,微控制器产生的最有影响的高频噪声大约是时钟频率的3倍。

(2)  减小信号传输中的畸变

    微控制器主要采用高速CMOS技术制造。信号输入端静态输入电流在1mA左右,输入电容10PF左右,输入阻抗相当高,高速CMOS电路的输出端都有相当的带载能力,即相当大的输出值,将一个门的输出端通过一段很长线引到输入阻抗相当高的输入端,反射问题就很严重,它会引起信号畸变,增加系统噪声。当 Tpd>Tr时,就成了一个传输线问题,必须考虑信号反射,阻抗匹配等问题。

    信号在印制板上的延迟时间与引线的特性阻抗有关,即与印制线路板材料的介电常数有关。可以粗略地认为,信号在印制板引线的传输速度,约为光速的1/3到1/2之间。微控制器构成的系统中常用逻辑电话元件的Tr(标准延迟时间)为3到18ns之间。

    在印制线路板上,信号通过一个7W的电阻和一段25cm长的引线,线上延迟时间大致在4~20ns之间。也就是说,信号在印刷线路上的引线越短越好,最长不宜超过25cm。而且过孔数目也应尽量少,最好不多于2个。

    当信号的上升时间快于信号延迟时间,就要按照快电子学处理。此时要考虑传输线的阻抗匹配,对于一块印刷线路板上的集成块之间的信号传输,要避免出现Td>Trd的情况,印刷线路板越大系统的速度就越不能太快。

  用以下结论归纳印刷线路板设计的一个规则:

  信号在印刷板上传输,其延迟时间不应大于所用器件的标称延迟时间。

(3)  减小信号线间的交叉干扰:

    A点一个上升时间为Tr的阶跃信号通过引线AB传向B端。信号在AB线上的延迟时间是Td。在D点,由于A点信号的向前传输,到达B点后的信号反射和AB 线的延迟,Td时间以后会感应出一个宽度为Tr的页脉冲信号。在C点,由于AB上信号的传输与反射,会感应出一个宽度为信号在AB线上的延迟时间的两倍, 即2Td的正脉冲信号。这就是信号间的交叉干扰。干扰信号的强度与C点信号的di/at有关,与线间距离有关。当两信号线不是很长时,AB上看到的实际是两个脉冲的迭加。

    CMOS工艺制造的微控制由输入阻抗高,噪声高,噪声容限也很高,数字电路是迭加100~200mv噪声并不影响其工作。若图中AB线是一模拟信号,这种干扰就变为不能容忍。如印刷线路板为四层板,其中有一层是大面积的地,或双面板,信号线的反面是大面积的地时,这种信号间的交叉干扰就会变小。原因是,大面积的地减小了信号线的特性阻抗,信号在D端的反射大为减小。特性阻抗与信号线到地间的介质的介电常数的平方成反比,与介质厚度的自然对数成正比。若AB 线为一模拟信号,要避免数字电路信号线CD对AB的干扰,AB线下方要有大面积的地,AB线到CD线的距离要大于AB线与地距离的2~3倍。可用局部屏蔽地,在有引结的一面引线左右两侧布以地线。

简介:单片机应用产品设计经验---抗干扰篇2
关键字:单片机
单片机应用产品设计经验---抗干扰篇2 
 
  [分享]单片机应用产品设计经验---抗干扰篇2

(4)  减小来自电源的噪声

    电源在向系统提供能源的同时,也将其噪声加到所供电的电源上。电路中微控制器的复位线,中断线,以及其它一些控制线最容易受外界噪声的干扰。电网上的强干扰通过电源进入电路,即使电池供电的系统,电池本身也有高频噪声。模拟电路中的模拟信号更经受不住来自电源的干扰。

(5)  注意印刷线板与元器件的高频特性

    在高频情况下,印刷线路板上的引线,过孔,电阻、电容、接插件的分布电感与电容等不可忽略。电容的分布电感不可忽略,电感的分布电容不可忽略。电阻产生对高频信号的反射,引线的分布电容会起作用,当长度大于噪声频率相应波长的1/20时,就产生天线效应,噪声通过引线向外发射。

  印刷线路板的过孔大约引起0.6pf的电容。

  一个集成电路本身的封装材料引入2~6pf电容。

    一个线路板上的接插件,有520nH的分布电感。一个双列直扦的24引脚集成电路扦座,引入4~18nH的分布电感。

    这些小的分布参数对于这行较低频率下的微控制器系统中是可以忽略不计的;而对于高速系统必须予以特别注意。

(6)  元件布置要合理分区

    元件在印刷线路板上排列的位置要充分考虑抗电磁干扰问题,原则之一是各部件之间的引线要尽量短。在布局上,要把模拟信号部分,高速数字电路部分,噪声源部分(如继电器,大电流开关等)这三部分合理地分开,使相互间的信号耦合为最小。

G  处理好接地线

    印刷电路板上,电源线和地线最重要。克服电磁干扰,最主要的手段就是接地。

    对于双面板,地线布置特别讲究,通过采用单点接地法,电源和地是从电源的两端接到印刷线路板上来的,电源一个接点,地一个接点。印刷线路板上,要有多个返回地线,这些都会聚到回电源的那个接点上,就是所谓单点接地。所谓模拟地、数字地、大功率器件地开分,是指布线分开,而最后都汇集到这个接地点上来。与印刷线路板以外的信号相连时,通常采用屏蔽电缆。对于高频和数字信号,屏蔽电缆两端都接地。低频模拟信号用的屏蔽电缆,一端接地为好。

    对噪声和干扰非常敏感的电路或高频噪声特别严重的电路应该用金属罩屏蔽起来。

(7)  用好去耦电容。

    好的高频去耦电容可以去除高到1GHZ的高频成份。陶瓷片电容或多层陶瓷电容的高频特性较好。设计印刷线路板时,每个集成电路的电源,地之间都要加一个去耦电容。去耦电容有两个作用:一方面是本集成电路的蓄能电容,提供和吸收该集成电路开门关门瞬间的充放电能;另一方面旁路掉该器件的高频噪声。数字电路中典型的去耦电容为0.1uf的去耦电容有5nH分布电感,它的并行共振频率大约在7MHz左右,也就是说对于10MHz以下的噪声有较好的去耦作用,对 40MHz以上的噪声几乎不起作用。

    1uf,10uf电容,并行共振频率在20MHz以上,去除高频率噪声的效果要好一些。在电源进入印刷板的地方和一个1uf或10uf的去高频电容往往是有利的,即使是用电池供电的系统也需要这种电容。

    每10片左右的集成电路要加一片充放电电容,或称为蓄放电容,电容大小可选10uf。最好不用电解电容,电解电容是两层溥膜卷起来的,这种卷起来的结构在高频时表现为电感,最好使用胆电容或聚碳酸酝电容。

    去耦电容值的选取并不严格,可按C=1/f计算;即10MHz取0.1uf,对微控制器构成的系统,取0.1~0.01uf之间都可以。

简介:单片机应用产品设计经验---抗干扰篇3
关键字:单片机

单片机应用产品设计经验---抗干扰篇3 
 
  [分享]单片机应用产品设计经验---抗干扰篇3

降低噪声与电磁干扰的一些经验。

(1)  能用低速芯片就不用高速的,高速芯片用在关键地方。

(2)  可用串一个电阻的办法,降低控制电路上下沿跳变速率。

(3)  尽量为继电器等提供某种形式的阻尼。

(4)  使用满足系统要求的最低频率时钟。

(5)  时钟产生器尽量靠近到用该时钟的器件。石英晶体振荡器外壳要接地。

(6)  用地线将时钟区圈起来,时钟线尽量短。

(7)  I/O驱动电路尽量靠近印刷板边,让其尽快离开印刷板。对进入印制板的信号要加滤波,从高噪声区来的信号也要加滤波,同时用串终端电阻的办法,减小信号反射。

(8)  MCD无用端要接高,或接地,或定义成输出端,集成电路上该接电源地的端都要接,不要悬空。

(9)  闲置不用的门电路输入端不要悬空,闲置不用的运放正输入端接地,负输入端接输出端。

(10)  印制板尽量使用45折线而不用90折线布线以减小高频信号对外的发射与耦合。

(11)  印制板按频率和电流开关特性分区,噪声元件与非噪声元件要距离再远一些。

(12)  单面板和双面板用单点接电源和单点接地、电源线、地线尽量粗,经济是能承受的话用多层板以减小电源,地的容生电感。

(13)  时钟、总线、片选信号要远离I/O线和接插件。

(14)  模拟电压输入线、参考电压端要尽量远离数字电路信号线,特别是时钟。

(15)  对A/D类器件,数字部分与模拟部分宁可统一下也不要交叉。

(16)  时钟线垂直于I/O线比平行I/O线干扰小,时钟元件引脚远离I/O电缆。

(17)  元件引脚尽量短,去耦电容引脚尽量短。

(18)  关键的线要尽量粗,并在两边加上保护地。高速线要短要直。

(19)  对噪声敏感的线不要与大电流,高速开关线平行。

(20)  石英晶体下面以及对噪声敏感的器件下面不要走线。

(21)  弱信号电路,低频电路周围不要形成电流环路。

(22)  任何信号都不要形成环路,如不可避免,让环路区尽量小。

(23)  每个集成电路一个去耦电容。每个电解电容边上都要加一个小的高频旁路电容。

(24)  用大容量的钽电容或聚酷电容而不用电解电容作电路充放电储能电容。使用管状电容时,外壳要接地。

2009年9月30日星期三

【转载】sim300的一些知识点

转载sim300的一些知识点


如果你的结果是仅仅返回OK,我会说这远远不够的,因为这只是说你的指令格式是正确的,你必须at+cipstatus查看一下状态,如果是connect ok,才真的是OK了,否则可能是Connecting状态,表示一直在连接。
在一个问题就是你的卡虽然支持GPRS,但是不代表就一定能实现你的数传模式。因为GPRS接入方式有两种:CMNET和CMWAP。默认的情况是 CMNET,当然你可以设置,如果你的卡不支持CMNET方式接入的话,那你是一直Connect Fail,还会出现你上面的情况。如果是CNWAP模式的话,你只能上Wap,不过通过代理,你还是可以上web的,就是说你的手机随能上网,但是就是无法实现GPRS CMNET数传.

一下是我个人的一些理解和总结,希望对你有帮助:
Sim300 GPRS应用相关AT CMD

1. AT+CGATT=1 (Attach or detach from GPRS service, GPRS 附着状态)
说的简单点,这一步就是让SGSN (服务GPRS节点,你可以把它理解成与基站紧密相连的一台设备,他可能记录你的移动终端的位置,状态等等很多很多信息)知道你的存在并且认为你拥有 GPRS功能。由于GSM和GPRS用的都是相同的基站,所以通常你的MS开启,注册上网络了,你就已经是GSM的一个节点了,可以打电话了。但是,如果你想使用GPRS数据业务,你就要附着GPRS服务,这个命令就是干这个的。

2. AT+CGDCONT=1,"IP","CMNET" (Define PDP context, 定义PDP 上下文)
如果打算用 PDP(Packet Data Protocol )传输数据,你就要为他建立一个背景,就是所谓的上下文,你得告诉SGSN和GGSN (网关GPRS节点,可以把它理解成一台与SGSN和INTERNET紧密相连的设备,它把从SGSN的一些信息处理后发送到INTERNET的服务器同时把服务器的信息处理后再发送给SGSN,SGSN再给你的终端设备)一些基本信息,比如你的本地标识(cid),你希望的pdp_type(这里就是 IP),还有你的接入点信息。这里的接入点是CMNET,实际上他应该是一台服务器,是INTERNET和SGSN的纽带。而中国移动公司提供了一个名字 CMNET(China Mobile NET),我们通过它就能连接INTERNET了。而在国外,这个参数通常是一个域名性质的东西。另外,得特别注意,就是中国移动人为的分出两种就如方式,我们刚刚使用的是CMNET,另一种是CMWAP,很明显,这个只能上WAP,但是通过他们的HTTP代理服务器,我们已能够上INTERNET,但是仅仅局限于HTTP而已。(有些移动的SIMCARD不支持CMNET接入方式,所以要特别小心,)

3. at+CGACT=1,1 (PDP context activate or deactivate, 激活或解除PDP 移动场景)
前面的定义PDP 上下文其实只是说我们有一种想要使用GPRS通信的想法,并且声明了我们想如何使用,但是这仅仅是个概念,如果你真的想付诸实施,就必须让网络知道你的意愿,并且记录你的信息,为你分配资源等等,所以,激活他吧。这个命令里的第一个参数,就是我们前面定义的cid标识值,第二个就是激活状态,如果你想激活,就设置1,如果你想解除就设置0。

4. AT+CIPSTART="TCP", "111.111.111.111"," 2222"( Start up TCP or UDP connection, 建立TCP 连接或注册UDP 端口号)
如果说前面的都是前期准备工作的话,那么现在就要尝试TCP连接了。这个命令很简单,第一个参数指定连接方式,第二个参数是IP地址,第三个参数是端口号。跟在计算机上写程序是一样的。

5. AT+CIPSEND( Send data through TCP or UDP connection, 发送数据)
如果前面连接建立成功你就可以发送数据了,AT+CIPSEND然后加一个回车符 <CR>,就会出现个命令提示符>(当然这个可以设置),然后就是你的发送数据,最后加个结束符 <Ctrl+Z>。当然你也可以发送定长数据串,这样就不需要结束符了。

6. AT+CIPCLOSE( Close TCP or UDP Connection, 关闭TCP 或UDP 连接)
关闭连接仅仅意味着你的这个连接通道断开了,但是你还可以建立新的连接,同时也意味着你的本地的IP地址并没有变。你的IP地址是在激活的时候分配的。

7. AT+CIPSHUT( Disconnect wireless connection, Close Moving Scene)
关闭移动场景,当你执行这个的时候你就进入IP INITIAL 状态,如果你再重新尝试连接的时候你的本地IP地址很可能已经就不是原来的了。

需要注意的一些问题:
1. 通常上面提到的前三个命令我们基本不需要使用,因为默认值都符合我们刚刚的要求,而芯片基本把这些事情都做了。可以通过相应的查询命令获得这些信息,如果有不符合的,可以另行处理。

2. 有些移动的SIMCARD不支持CMNET接入方式,所以要特别小心,当你发现你所有的参数都正确,能够发送短信和打电话,就是无法连接或者连接总是失败,你就该检查你一下你的卡到底支不支持CMNET接入方式。全球通基本两种接入方式都支持,而动感地带和神州行就不一定了。

3. 如果你查询的状态总是+PDP: DEACT,就是说无法激活,那你应该看看天线是否接牢固或者是否有断线的地方。

4. 在进入业务操作之前,确保你的模块没有工作在最小功能模式(minimum functionality),你可以通过AT+CFUN查询模块的工作状态。

5. 在尝试连接一个服务器和某个端口之前,最好先在计算机上用SOCKET工具连接一下,看看是否是通的,有些网络和防火墙很可能会封杀端口的,如果你寻找或调试了一天后,发现是这个问题,唉,大家知道会有多郁闷。(另外SP可以为你的ADSL分配动态或者固定公网IP,有些在ipconfig或者网络设置里显示两个IP,别混淆了)

6. 在尝试连接(AT+CIPSTART)之前,一定要查询(AT+CIPSTATUS)当前状态,一共有下面几种状态
0 IP INITIAL Initializing state
1 IP START Starting State
2 IP CONFIG Configure Scene
3 IP IND Accept Scene Configuration
4 IP GPRSACT Scene Activated
5 IP STATUS Get Local IP Address
6 TCP/UDP CONNECTING establish connection state with SERVER
7 IP CLOSE Connection has been closed
8 CONNECT OK Connection Established Successfully
9 PDP DEACT Detach from GPRS network
而 AT+CIPSTART只在IP_INITIAL、IP_CLOSE、IP_STATUS三种状态下才能正确建立连接,否则返回ERROR。所以有时候会连接失败(比如信号不好等原因),而模块通常会进入TCP/UDP CONNECTING状态,就是一直不停的尝试连接,而此时如果执行连接命令就会返回错误信息。虽然此时的状态是TCP/UDP CONNECTING,但是实际上很多模块已经不再连接了。只不过处在连接状态上而已,这时你最好通过CIPCLOSE或者CIPSHUT命令,回到一个可连接的状态。

 

 

非常感谢elusa的指点。但是还有几个问题要请教一下。我用AT+CIFSR指令,能得到移动分配给我的ip 地址。我的卡能支持CMNET,但是为什么我还是链接不到服务器呢?我用AT+CIPSTATUS,总是显示TCP CONNECTING,然间是显示连接失败。请问以您的经验,问题会出在哪里呢?

 

NO CARRIER 的意思是没有载体为什么会出现这种情况呢?
原因是:
当你发送ADT*99***1#指令后
会出现一大堆乱码,而且是重复的(大概10次)
这些乱码其实是服务器向你发送进行LCP协商的请求信息,因为是你没有应答,所以对方会不断的请求,直到请求10次后,对方认为你没有响应,就会NO CARRIER.

你没有应答的解决方法:
1.因为你的gprs模块没有自带ppp协议,只要去买块带ppp协议的gprs模块就可以解决这个问题,比如mc55模块.
2.也可以自己实现ppp协议,自己写或者去网上下ppp协议的代码.

该怎么应答??
1.自带ppp协议的模块,你可以不考虑这个问题
2.你还是使用原来的模块的话,就需要了解PPP链路的建立的过程,以及ppp协议的结构.网上 有很多资料.