最新日志

发表于:2008-8-4 20:13:21
标签:Keil  C51  精确延时  程序执行时间  

0

Keil C51程序设计中几种精确延时方法

单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。

  实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1  使用定时器/计数器实现精确延时

  单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

  在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2  软件延时与时间计算

  在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。

2.1  短暂延时

  可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

  void Delay10us( ) {
    _NOP_( );
    _NOP_( );
    _NOP_( );
    _NOP_( );
    _NOP_( );
    _NOP_( );
  }

  Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。  可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

2.2  在C51中嵌套汇编程序段实现延时

  在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

  如:#pragma asm
    …
    汇编语言程序段
    …
    #pragma endasm

  延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:

  ◆ #pragma asm、#pragma endasm不允许嵌套使用;
  ◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;
  ◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;
  ◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;
  ◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。

  将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

2.3  使用示波器确定延时时间

  熟悉硬件的开发人员,也可以利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。方法如下:

  sbit T_point = P1^0;
  void Dly1ms(void) {
    unsigned int i,j;
    while (1) {
      T_point = 1;
      for(i=0;i<2;i++){
        for(j=0;j<124;j++){;}
      }
      T_point = 0;
      for(i=0;i<1;i++){
        for(j=0;j<124;j++){;}
      }
    }
  }
  void main (void) {
    Dly1ms();
  }

  把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3 ms的方波。其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<124;j++) {;}”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for循环而用别的语句实现延时。这里讨论的只是确定延时的方法。

2.4  使用反汇编工具计算延时时间

  对于不熟悉示波器的开发人员可用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用“for (i=0;i<DlyT;i++) {;}”。在程序中加入这一循环结构,首先选择build taget,然后单击start/stop debug session按钮进入程序调试窗口,最后打开Disassembly window,找出与这部分循环结构相对应的汇编代码,具体如下:

  C:0x000FE4CLRA//1T
  C:0x0010FEMOVR6,A//1T
  C:0x0011EEMOVA,R6//1T
  C:0x0012C3CLRC//1T
  C:0x00139FSUBBA,DlyT //1T
  C:0x00145003JNCC:0019//2T
  C:0x00160E INCR6//1T
  C:0x001780F8SJMPC:0011//2T

  可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。

  当采用while (DlyT--)循环体时,DlyT的值存放在R7中。相对应的汇编代码如下:

  C:0x000FAE07MOVR6, R7//1T
  C:0x00111F DECR7//1T
  C:0x0012EE MOVA,R6//1T
  C:0x001370FAJNZC:000F//2T

  循环语句执行的时间为(DlyT+1)×5个机器周期,即这种循环结构的延时精度为5 μs。

  通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:

  C:0x0014DFFE DJNZR7,C:0014//2T

  可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周期;但这时应该注意,DlyT初始值不能为0。

  这3种循环结构的延时与循环次数的关系如表1所列。

表1  循环次数与延时时间关系单位:μs

注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。

2.5  使用性能分析器计算延时时间

  很多C程序员可能对汇编语言不太熟悉,特别是每个指令执行的时间是很难记忆的,因此,再给出一种使用Keil C51的性能分析器计算延时时间的方法。这里还以前面介绍的for (i=0;i<124;i++)结构为例。使用这种方法时,必须先设置系统所用的晶振频率,选择Options for target中的target选项,在Xtal(MHz)中填入所用晶振的频率。将程序编译后,分别在_point = 1和T_point = 0处设置两个运行断点。选择start/stop debug session按钮进入程序调试窗口,分别打开Performance Analyzer window和Disassembly window。运行程序前,要首先将程序复位,计时器清零;然后按F5键运行程序,从程序效率评估窗口的下部分可以看到程序到了第一个断点,也就是所要算的程序段的开始处,用了389 μs;再按F5键,程序到了第2个断点处也就是所要算的程序段的结束处,此时时间为1 386 μs。最后用结束处的时间减去开始处时间,就得到循环程序段所占用的时间为997 μs。

  当然也可以不用打开Performance Analyzer window,这时观察左边工具栏秒(SEC)项。全速运行时,时间不变,只有当程序运行到断点处,才显示运行所用的时间。

3  总结

  本文介绍了多种实现并计算延时程序执行时间的方法。使用定时器进行延时是最佳的选择,可以提高MCU工作效率,在无法使用定时器而又需要实现比较精确的延时时,后面介绍的几种方法可以实现不等时间的延时: 使用自定义头文件的优点是,可实现任意时间长短的延时,并减少主程序的代码长度,便于对程序的阅读理解和维护。编写延时程序是一项很麻烦的任务,可能需要多次修改才能满足要求。掌握延时程序的编写,能够使程序准确得以执行,这对项目开发有着重要的意义。本文所讨论的几种方法,都是来源于实际项目的开发经验,有着很好的实用性和适应性。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 转贴

评论(4) | 阅读(135)
发表于:2008-7-22 17:36:15
标签:KEIL,在线仿真  

0

用SST89E516RD自制51单片机仿真器

单片机实验和开发中最重要的一个环节就是程序的调试,在业余条件下大部分人都采用烧写芯片直接到目标板上试验的方法,但是这样做在程序出现问题时比较麻烦,有时候也很难找到程序的问题出在那里。另外也可以采用软件仿真的方式调试程序,但是这种方式也有局限性,软件仿真有时候并不能完全代替实际使用环境。因此单片机仿真器成了程序调试中一个重要的设备。但是在业余条件下很少有人使用价格比较高的仿真器。为解决这一问题,本文介绍一种用SST公司的单片机SST89E516RD做的基于MCS-51架构的简易51单片机仿真器,它支持与MCS-51架构兼容的芯片,成本只有20多元,很适合业余爱好者制作和使用。

一、单片机SST89E516RD简介

SST89E516RD是8位集成存储器的51系列兼容单片机,和51系列单片机软件兼容、开发工具兼容、管脚也兼容。

SST89E516RD片内有两块SuperFlash EEPROM,分为64K主块(Block0)和8K次块(Block1)。Block0的地址范围是0000h~ffffh;Block1的地址范围是10000h~11fffh。做仿真器时Block1存储区烧写SoftICE仿真监控程序。

SST89E516RD具有在应用可编程(IAP)和在系统可编程(ISP)的功能,其中IAP是通过串口实现的。

仿真器就是利用了SST89E516RD的IAP功能。由于SST89E516RD具有两块独立的SuperFlash程序存储区,当监控程序在Block1存储区中运行时可以改写Block0程序存储区中的程序,这就是仿真器的基本特性。

SST89E516RD的引脚图见图1。更详细的资料见本期配刊光盘。
单片机实验和开发中最重要的一个环节就是程序的调试,在业余条件下大部分人都采用烧写芯片直接到目标板上试验的方法,但是这样做在程序出现问题时比较麻烦,有时候也很难找到程序的问题出在那里。另外也可以采用软件仿真的方式调试程序,但是这种方式也有局限性,软件仿真有时候并不能完全代替实际使用环境。因此单片机仿真器成了程序调试中一个重要的设备。但是在业余条件下很少有人使用价格比较高的仿真器。为解决这一问题,本文介绍一种用SST公司的单片机SST89E516RD做的基于MCS-51架构的简易51单片机仿真器,它支持与MCS-51架构兼容的芯片,成本只有20多元,很适合业余爱好者制作和使用。

一、单片机SST89E516RD简介

SST89E516RD是8位集成存储器的51系列兼容单片机,和51系列单片机软件兼容、开发工具兼容、管脚也兼容。

SST89E516RD片内有两块SuperFlash EEPROM,分为64K主块(Block0)和8K次块(Block1)。Block0的地址范围是0000h~ffffh;Block1的地址范围是10000h~11fffh。做仿真器时Block1存储区烧写SoftICE仿真监控程序。

SST89E516RD具有在应用可编程(IAP)和在系统可编程(ISP)的功能,其中IAP是通过串口实现的。

仿真器就是利用了SST89E516RD的IAP功能。由于SST89E516RD具有两块独立的SuperFlash程序存储区,当监控程序在Block1存储区中运行时可以改写Block0程序存储区中的程序,这就是仿真器的基本特性。

SST89E516RD的引脚图见图1。更详细的资料见本期配刊光盘。

二、仿真器电路和工作原理

仿真器的电路见图2。仿真器通过计算机的一个串口与KeilμVision2集成开发环境进行通信。VTl、VT2、VD1、VD2、R1~R5等组成电平转换电路,其中发光二极管VD2作串口通信信号指示。
点击看大图

单片机SST89E516RD和晶振电路、复位电路一起组成单片机最小系统。SST89E516RD的引脚分别接在40脚的插针上,应用时40脚的插针插在目标板的单片机插座上。仿真器可能通过跳线的方式选择仿真器上的晶振或目标板上的晶振。仿真器使用目标板上的电源。 仿真器的工作过程就是在调试过程中随时对程序进行修改,来达到单步运行、跨步运行、断点运行和全速运行的目的。在通过KeilμVision2集成开发环境进行仿真时,需要调试的单片机程序目标代码通过串口被传送给监控芯片,并由监控程序烧写到监控芯片的Block0程序存储器中。在仿真调试过程中,监控程序可以随时改写被调试的程序来设置单步运行、跨步运行、断点运行。程序暂停执行后,在集成开发环境中可以观察单片机RAM、寄存器和单片机内部的各种状态。

三、仿真器的制作

为了避免制作双面印制电路板的麻烦,仿真器可用万能电路板安装。单片机使用IC插座安装。

仿真器的监控芯片SST89E516RD中要预先烧写监控程序,SST、公司为部分SST89类单片机提供了仿真监控程序,但其中不包括SST89E516RD的监控程序,由于SST89E516RD和SST89E564RD兼容,因此可以用SST89E564RD的监控程序代替,SST89E564RD监控程序的下载地址为:www.sst.com/prod-ucts/software.utiIs/softice/index.xhtml,下载网页软件列表中的SoftICE_564.zip文件,解压缩后即可得到Softlce564.hex目标文件。用能够烧写SST89E516RD芯片的编程器将SoftIce564.hex目标文件烧入Block1程序存储区。烧写时注意两点1.加载目标文件时缓冲区开始地址要改为10000;2.加密位SB1、SB2、SB3和配置位SC0等都不要勾选。只有这样才能正常使用IAP功能。如果自己没有可用的编程器,可在购买单片机芯片时请商家代写,现在网上也有已烧写好监控程序的SST89E516RD芯片出售。

制作中40脚插针和IC插座焊接是一个难点,先焊接好40脚插针,然后在其对面即铜箔面焊接IC插座,IC插座除18、19脚要接跳线外,其余各引脚焊接在插针的对应焊点上。仿真器到串口插头的连线可使用双芯屏蔽线,其中屏蔽层作接地线。如果没有屏蔽线也可以用三根导线作连线。 制作好的仿真器照片实物见图3。

四、使用Keil μVision2进行仿真调试

仿真器做好以后就可以配合Keil μVision2进行仿真调试,笔者为仿真调试建了一个项目test.Uv2,在本期配刊光盘中,这是一个流水灯的程序,对应的单片机目标板电路见图4。项目中有关仿真器的选项都已设置好。如果自己建项目进行设置,则相关设置过程如下:

在菜单Project中选择Optionsfor Target'Targetl',在"Optionsfor Trarget 'Targetl'"对话框的Debug 页面里,选择"Use:KeilMonitor-51 Driver"。相关设置见图5。
             

然后单击"Settings"选择要使用的计算机串行端口。Keil μ Vision2默认设置为COM1/9600。仿真器在一定范围内对串行通信波特率是自适应的,晶振频率为11.0592MHz时波特率可在4800~38400 之间选择。一般取最大值,以提高串口通信速度。相关设置见图6。最后单击"确定"按钮保存设定。仿真器或目标板也可以选择其他频率的晶振,比如晶振频率为6MHz时波特率可在2400~19200之间选择。如果使用目标板上的晶振,波特率要根据目标板上的晶振频率确定。

打开项目test.Uv2,完成上述设置后就可以进行仿真调试了。先单击工具栏上的Build target按钮 编译项目,编译成功后将生成目标代码。将仿真器按正确的方向插在目标板上,串口和计算机连接好后接通目标板的电源,按一下仿真器的复位键SB,再单击Start/Stop Debug session按钮 ,启动仿真调试环境,这时目标代码将被自动下载到仿真器的Block0用户程序空间。连接成功会后出现如图7所示的画面,连接过程中我们会发现发光二极管VD2在闪烁。连接不成功时请检查软件设置和硬件电路。

仿真时使用的主要调试按钮的功能如下:

上述各按钮的使用方法和软件仿真时相同。

进入仿真调试环境后,按一下全速运行按钮 ,目标板上的8个发光二极管就会轮流点亮,表示运行成功。如果我们在delay(100)前插入一个断点,按一下全速运行按钮 你会发现程序运行到断点后停止向下执行,只有第一个发光二极管点亮;再按一下全速运行按钮 ,刚轮流到第二个发光二极管点亮,以此类推。退出仿真时,请先按仿真器的复位键,然后再点一下按钮 ,就回到编辑模式,修改程序后重新编译,可以再次进入仿真调试环境。注意每次进入仿真调试环境前都要先按一下仿真器的复位按钮SB。

使用仿真器时请注意下面两点:

1.仿真器占用了仿真单片机的串行通信接口和用作波特率发生器的定时器2的资源,只有在全速运行时才释放这些资源,因此当目标板使用这些资源时就不能进行单步、跨步、断点等运行。这也是这个仿真器的一个不足之处。 2.仿真器监控芯片的SuperFlashEEPROM擦写寿命一般为每个存储单元1万次,而每一个单步执行都将擦写一次存储单元,因此应尽量少使用单步执行,多使用断点、跨步、断点和执行到光标行等节省擦写次数的功能,以延长仿真器的使用寿命。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(194)
发表于:2008-7-14 16:27:36
标签:程序,调试  

0

程序DEBUG的两条原则

一个项目的程序可以分成3个部分完成.规划程序结构--写代码--调试程序.第一步和第三部是最困难的.总结我做的项目.在调试程序过程中有两条原则:

1、每一个问题都有它存在的原因

   对于测试出的问题一定要找出原因,不要抱侥幸心理。

2、每个问题都有它解决的办法

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(85)
发表于:2008-7-7 11:49:10
标签:atmel89,命名  

0

atmel89系列单片机命名方式

89系列单片机一共有7种型号,分别为AT89C51,AT89LV51,AT89C52,AT89LV52,AT89C2051,AT89C1051,AT89S8252。其中AT89LV51和AT89LV52分别是AT89C51和AT89C52的低电压产品,最低电压可以低至2.7V。而AT89C1051和AT89C2052则是低档型低电压产品。它们的引脚只20脚,最低电压也为2.7V。

89系列单片机的型号编码由三个部分组成,它们分别是前缀,型号、后缀。它们的格式如下:

AT89C;××× ××××
其中:AT是前缀;
89C××××是型号;
××××是后缀。
下面分别对这三个部分进行说明,并且对其中有关参数的表示和意义作出相应的解释。

1.前缀
前缀由字母“AT”组成,它表示该器件是ATMEL公司的产品。
2.型号
型号由“89C××××”或“89LV××××”或“89S××××”等表示。
“89C××××”中,9是表示内部含Flash存储器;C表示是CMOS产品。
“89LV××××”中,LV表示低电压产品。
“89S××××”中,S表示含可下载Flash存储器。
在这个部分的××××表示器件型号数,例如:51,1051,8252等。
3.后缀
后缀由“××××”这4个参数组成。每个参数的表示和意义不同。在型号与后缀部分有“-”号隔开。
后缀中的第一个参数×用于表示速度,它的意义如下:
×=12,表示速度为12MHz,
×=16,表示速度为16MHz,
×=20,表示速度为20MHz,
×=24,表示速度为24MHz,

后缀中的第二个参数×用于表示封装。它的意义如下:
×=D,Cerdip。
×=J,塑料J引线芯片载体。
×=L,无引线芯片载体。
×=P,表示塑料双列直插DIP封装。
×=S,表示SOIC封装。
×=Q,表示PQFP封装。
×=A,表示TQFP封装。
×=W,表示裸芯片。

后缀中第三个参数×用于表示温度范围,它的意义如下:
×=C,表示商业产品,温度范围为0至+70℃。
×=I,表示工业产品,温度范围为-40至+85℃。
×=A,表示汽车用产品,温度范围为-40至+125℃。
×=M,表示军用产品,温度范围为-55至+150℃。

后缀中的第四个参数×用于说明产品的处理情况,它的意义如下:
×为空,则表示处理工艺是标准工艺。
×=/883,则表示处理工艺采用MIL-STD-883标准。

例如,有一个单片机型号为“AT89C51-12PI”,则表示意义为,该单片机是ATMEL公司的Flash单片机,内部是C51结构,速度为12MHz,封装为DIP,是工业用产品,按标准处理工艺生产。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 整理

评论(0) | 阅读(88)
发表于:2008-6-23 17:55:34
标签:辞职,找工作  

0

又要辞职了

公司马上要搬到关外.我也不得不准备辞职.以前说过这是自己最后的一份工作.要塌实做,争取做出成绩,也好给自己的打工生涯增加一抹亮色.但是现在不得不考虑离开这里.

 

公司的管理混乱,产品前期的规划不清晰,导致开发出来后,一直打不开市场.一年来一直处于亏损状态.工资也很低,目前的状态应该舍的花高工资招有经验的人,尽快开发新产品.但是恰恰相反.招了不少毕业不久的新手来培养.给别人一点工资.新手多了,每个人分到任务就少了.由于缺乏经验,往往一个任务来来回回修改几次才能完成.效率极其低.

 

我在这的工资在同事里面算高了(因为大部分都是毕业一两年的).但是和我的同学比就很低了.当时来的时候,我正是非常困难的时候.生活几乎难以维持.所以公司给了我这个工作机会,一直都心存感激.在公司也都是认真做事.本来想把今年做完再离开.(但是现在公司要搬,我不得不提前走了.因为去年下半年从关内搬到关外,年初从关外搬到关内,现在又搬到关外.简直是瞎折腾).

 

现在到底要找什么样的工作?我现在在做安防行业,我希望能找个行业内的公司.这样在这里的经验才不会浪费.去了新公司也不用从头开始.现在才明白积累的重要.以前找工作我都习惯辞职后再找.因为不想上班的时候请假去面试.其实这样找工作是很不好的.因为辞职后,如果长时间找不到工作,会有压力.如果一两个月不上班,天天找工作,既浪费时间,也浪费了很多钱.往往难找到满意的工作.所以这次一定要找到满意的工作后再辞职.

 

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 原创

评论(0) | 阅读(108)
发表于:2008-6-5 14:14:22
标签:无标签

0

一个电子工程师的经验之谈3

培养自己的学习方法也是工程师的必修课。知识爆炸的年代里,仅仅靠学校里学来的一点皮毛想成为优秀的工程师是不可能的,90%的知识都要靠自己去学习。很多学校刚毕业的学生并不会自学。拿过一本书来一阵看,看不懂就咬牙看下去,最后仍在一边。其实自学是非常讲究技巧和方法的。当然每个人都有自己的一套好办法。我通常把知识分成几类:

1.
基础知识 ----包括数物化和专业基础。

2.
流行的技术 ----比如潜入式系统开发,大家都在做的技术。

3.
未来将要流行的技术 ----比如生物DSP技术,就是你对未来的预测。

4.
我要用到的技术 ----就是你工程中急需使用的。

5.
其他学科的重要进展 ----紧跟科技发展的脚步是必须的。

   
我通常均匀的分配时间,而不忽略任何任何一个方面的进展。这样才能保证知识体系的不断更新和扩充。这只是宏观上的精力分配。具体的学习过程当然因人而定,但一定要有战略的进行。工程师做任何事情都要有计划有步骤的去执行。逻辑不仅仅是体现在程序中更要体现在学习和生活的进程中,也就是做任何事都要科学的安排时间,根据自己的情况制定方案。大家可以参考大脑思维图谱的方法。

   
工程师做事要严谨求实。神州飞船由多少复杂的系统构成,如果每个部件都有99.9%的成功率,恐怕到最后返回的时候连一半的安全性都谈不上。所以工程师一定要严谨,从整体到每个细节都要有足够的重视程度。千里之堤溃于蚁穴就是这个道理。工程师不能接受差不多这样的词汇。行就是行,不行就是不行,这是工程师最基本的素质。一次公司里的一个工程师拿了一块作好的超声前端板交给我,并说板已OK了。可当我问他信噪比如何时,却回答我差不多。我理解差不多就还差,让他拿回去什么时候不差了再交给我。所以工程师要用指标说话,要用实践说话,差不多不是工程师的嘴里应该出现的词汇。

   
工程师还要注重积累,一个好的程序员和电路设计师就是一个好的收藏家。不仅收藏自己的智慧结晶更要收藏别人的智慧结晶。IT技术领域有无数的巨匠和天才将他们智慧沉淀于现代科技之中。所以我们要不断的积累好的做法和前人的思想。你的周围会有很多人的很多东西值得你学习,你应该将这些作为财富积累起来,总有一天会发挥出作用。另外我们学习的不仅是简单的知识更是前人对知识的理解和对工程的看法。比如每个人眼中的电阻都不相同,你要主动去了解高手眼中的电阻是什么东西。

   
工程师不要过分的将注意力放到开发本身而看不清开发。这样的话听起来有些绕口,但其实很简单,就是要在一定的高度上看整个开发过程,而不要陷入某个具体问题无法自拔。不识庐山真面目,只因身在此山中。就是这个道理。尤其是遇到问题后容易出现无法自拔的现象,结果一头雾水什么都是一团糟,这时就需要从

   
更高的角度从新审视问题,找到突破口,而不要钻了牛角尖。

   
工程师不要轻易问别人问题,解决问题的过程和结果同样重要。有一些同学会经常向老师提出问题,这也是好事,说明某某学生爱学习。可我们并不提倡这些,相反的如果能自己解决问题才是最好的。要学会独立的猎取信息和知识,并从其中得到自己判断。每个人在工作中都会遇到很多问题,在学校的时候有老师去解答,在工作单位又有谁能解答呢?或者当你做的是最尖端的技术时你能去问谁呢!所以工程师要有独立处理问题的能力。不要做思想上懒惰的人。中国教育往往要求学生考出高分,答对答案就是好学生。所以老师告诉的答案只要记住就OK。可老师告诉你的答案能说明你自己具备了解题能力吗?请不要相信这样的分数,至少它无法反映你的真实水平。

   
工程师要有《亮剑》精神。用都梁的话说,古代剑客明知对方是天下第一剑客,明知是死也要亮出宝剑,没有这个本事就别当剑客。尽管敌强我弱,尽管身陷重围,我们也要亮剑。工程师也要敢于挑战对手,敢于战胜自己。一项工程如果连做都不敢做还能谈成功的问题吗?成功是一种习惯,一种来源于自己的信心。战略上轻视敌人,战术上重视敌人

   
工程师即要有个人英雄主义情节又要能融入团队。出色的个人能力和人格魅力是何等的宝贵。我们在崇拜盖茨和乔布斯的同时不要忘记他们身后庞大而又高效的研发团队。以一戟之力完成霸业的英雄已不属于这个时代。所以团队的合作才是创造神话的必经之路。

   
工程师要有发展的眼光,不仅要能在复杂的技术和市场面前游刃有余,更要对未来的发展态势做出精确的展望。只有比别人想的远才能比对手走的更远。当然这与坚实的基础和勤奋的思考是密不可分的,在群雄逐鹿的当今IT界,恐怕需要更多的胆识才能做到。要不断的关注技术和市场以及其它领域的发展,什么时候这种关注放松,什么时候就会被竞争所淘汰。

   
要在竞争和解决问题中体会生活,研发和竞争是每个工程师不可避免的现实。大家每天都会遇到新的困难,可这才是工程师的生活,要轻松的活在这些问题之中,并体会其中的快乐和成功时刻的兴奋。很多工程师抱怨说做研发太累了,这里的是一种心理的感受,工程师的职业就是不断的克服困难迎接新的挑战。我刚开始做研发时也整天愁眉不展,可现在同时做几个大的工程,同时面对几十个技术难题,我觉得自己每天因为能做这样的事情而感到非常的快乐和充实,如果哪天自己没事可做就会觉得很不适应,总要找些问题来思考。

   
中国的未来需要太多的工程技术人员和科学家,我在此向所有从事或者有志从事科技工作的工程师和科学家致敬。我们为了民族的振兴,为了中国科技的腾飞而努力工作,拜托大家了。我只是给年轻的同学和同志们谈一下自己的见解,片面之处请大家原谅。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(180)
发表于:2008-6-5 14:13:49
标签:无标签

0

一个电子工程师的经验之谈2

每个人的思维着眼点和注意的方面都不相同,很多人从小就会将注意放在自然科学之上,这些孩子中有很多就是未来的工程师。比如一个10岁的小学生看到一幢大楼,他会马上考虑大楼是如何建造的,塔吊又是怎么一节一节接起来的,那么高的大楼外墙的玻璃是如何安装的。另一个孩子会想工程师真伟大,还会想到一些诗句来抒发内心的感受。显然两个孩子一个可能更适合作工程师另一个适合成为文学家。所以人们经常说,每个人都有自己的长处和优点。有些人的长处和思维方式在工程师职业中无法发挥,可中国教育的教条化却无法让每个人都能做自己喜欢的专业。我的一个大学同学是文学爱好者,对中国历史和社会有许多见解,阅读广泛文笔也好,可偏偏学了电子这个专业,这不是人才的浪费吗。所以工程师和科学家在生活中也是工程师和科学家,而不是工作时和端起书本时才是。很多学生很努力的去学习,可一直无法入门就是这个原因。当拿起书本时发现一个问题或者老师提出一个问题后他们会努力的解决,可放下书本就不会再自己提出问题和独立的思考了。

   
我从来不认为中国的教育是真正的教育,书本、试卷、分数、所谓的答案都是教条的,就好象一条生产线给每个经过其中的学生盖上一个学历的烙印。将创造性和个人的特长统统抹杀,再加上长期以来的教育大跃进和人才评定标准的偏差,无数天才失去了发展机会。本来没有那么多的教育资源却非要扩招--扫盲。将大学教育至于尴尬境地,应届生就业就是最好的例子。所以请不要抱怨工作机会少,中国是非常缺乏工程师的呀!缺到让很多公司开始呐喊的程度。工程师的缺乏又和应届理工科毕业生的过剩形成矛盾。所以你不要以为学习成绩高就能成为一个好的工程师。要清楚的认识到学校的教育和社会需求之间的距离。

   
工程师要有自己的思想,很多学生在读书过程中养成了一些很不好的习惯。比如思考深度不够,和不会独立思考。一个公式放在面前能做题,能考试就OK吗?自然科学好比一个花园,一些科学巨匠写下了无数不朽的文章来描述它。数学公式就好比文章中的文字和句子,只是做文字游戏或者简单的背诵有什么意义吗?请问问自己你对这个大花园了解多少。你闭上眼睛能想象出这个花园的景象吗?记得我曾问一个大四毕业设计的学生你物理学的怎么样。他回答我还好,可又补充说就是公式忘了。工作中他看到我随笔可以写出很多方程,惊讶的说我的记忆力真好。我说我根本就没背过公式。因为我记得花园是什么样的,即使哪位大家用什么词汇描述的花园我记不清,可我依然能清楚的描述出来。这才是理论,理论不是指文字和公式而是前人的思想。 

   
许多学电子的学生说模拟技术难学,我告诉他们其实学好模拟技术并不是要学好模拟电子本身。世界本来就是模拟的,所有的物理量都是模拟的,这就是模拟。所以你对自然科学的最根本看法和世界观直接决定模拟水平的高低,也就是物理学水平的高低。我的意见是:不要以为拿着模电书学下去就能有本质的改变,一定要提高对事物的认识和对自然科学的理解,提高对模拟量的驾御能力。重要的是思维方式,和对概念的感性认识。

   
思考问题要有深度,思维的深度是一种习惯。有些人总是喜欢点到为止,他甚至没有意识到我还可以再深入的思考。作为工程师和科学家要培养深邃的思考习惯。一些学生看到一道物理题,认为作对就好的人居多。可你是否发现了其中的内在联系,甚至从考点中受到启发。有很多高中学生喜欢做大量的习题,结果效果却不理想。就是因为这些学生只是在做题,没有付出更多的思考。所以工程师要注重概念性的思考然后深入进去。知其然,更要知其所以然。

   
工程师要重视实践,自然科学不管发展到何时都离不开实验。电子学本身就是为了指导工程实践。所以不要谈空洞的理论。现在很多院所都面临这样的问题,总是谈一些空洞的理论,甚至错误的但还不以为然的理论。实践可以提高对自然科学的认识甚至改变着我们的世界观,只有这种认识提高了才可能创造和应用有价值的理论。我们不要玩弄理论,但要重视理论。理论是思想,是认识,不是公式和文字。

   
另一方面,我们还要重视理论。因为你是电子工程师,而不是电子爱好者。工程师要从整体到细节全面的把控你的工程。人做事是一定要犯错误的,工程师要将这样的错误减到最少。因此全面的理论和对工程对象的认识是必须的。一些从电子爱好者出身的工程师比较容易忽视理论,认为把东西做出来了就可以。当然是要把东西作出来,但我们最终是要掌握尖端的技术,推动中国科技的发展。不可能象电子爱好者那样拿过别人的图纸来制作了事。IT技术发展迅速,理论的发展也非常迅速。我们一定要接受潮水般的新观念和新技术,工程师必须有全面而又坚实的理论作为后盾。我们学习信息技术就好比盖一座大厦,我们可以很快掌握流行的开发工具和技术--可以盖个比较高的大楼,可是没有全面坚实的理论作为地基,是不可能盖成摩天大厦的。

   
而且理论体系一定要完整,IT技术本身就是多学科交叉产生的,他已经涉及太多的东西了。所以在这个行业内如果掌握更多更全面的知识是非常必要的。搞硬件的往往容易忽略软件方面的东西。现在哪里有离开软件的硬件和离开硬件的软件呢?而且一个工程师不仅要懂得本专业的知识,还要有广泛的自然科学知识,只有这样才能成为出色的工程技术人员。 

   

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类: 无分类    |    来源: 转贴

评论(0) | 阅读(160)
发表于:2008-5-30 8:59:10
标签:电子工程师,职业规划  

0

一个电子工程师的经验之谈1

工程师是科学家;工程师是艺术家;工程师也是思想家。一位伟大的工程师曾经提出过这样的一段感言。不错,工程师是利用自然科学来创造工程的人。工程既是物质的也是思想上的。许多不朽的工程,伟大的发明以及出神入化的技术方案,许多人往往只看到了他们的瑰丽,而作为工程师则更应该看到设计的灵魂。因此我们应该深入的理解工程师也是艺术家和思想家。工程设计的本身就是一种艺术,也是工程师思想的结晶。一部精密的机械设备,一个高效而又健壮的程序,一个复杂而又无懈可击的电路,这些都反映着一些杰出工程师的思想和灵魂,有时你甚至会认为他们的生命已经融入到设计中。

   
成为一个杰出工程师最重要的因素就是热爱自己的职业。毕竟兴趣是最好的老师,许多优秀的电子工程师都是从小作为电子爱好者的。爱好不仅要体现在行动中更要深入内心甚至深入骨髓。有许多人问:每天应该花多长时间在学习中和工作中。可以肯定一份耕耘就会换来一份收获,但作为工程师和科学家想取得成功并不是比赛谁花的时间最多,而是看谁付出了更多的思考。不要以为一个学生坐在自习教室里看了多少小时的书就是勤奋,也可能比呆在寝室里的学生还要懒惰。也就是说勤奋是大脑的勤奋,而不是身体和和形式上的勤奋。我学电子也差不多有15年了,也发现了很多问题。一次别人问我你每天花多长时间来工作。我回答他:每天除了吃饭睡觉几乎都在思考。不夸张的说我的很多工程构想都是在梦境中诞生的。每天早起床后刷牙的时候、上班的路上、吃饭的时候甚至和别人谈话的空闲瞬间都有可能诞生灵感。当然热爱工程师职业的前提是一定要能领略到工程和自然科学中的美感。一个优秀的工程师同时也是一个热爱科学的人,从科学的常识到科学的精神都会渗透到他的生活中。一次我看到一位教研室里的老师安排答辩的顺序,尽管这位老师在机电领域写了很多的书也在所谓理论领域有很多建树,单从他安排这样一个简单的顺序来看,他并不是个理论很高的人。因为在我看来他的工作方法是效率极低的。换句话说就是在他的生活中没有科学的精神可言。

   
一个工程师和科学家在生活中也是工程师和科学家。这个问题引出后我们要提到的是培养自己的思维品质。包括思维的习惯,深度和广度,以及思维方式和思维素材的选取。成为一个工程师确实有很多品质是天生的和决定性的,学校的培养和自己的努力也只是一些辅助措施。一个人曾经问我一个关于感性负载的问题,其实我心理很清楚他并不理解这里面最基本的物理概念,首先对电感的认识就不是用语言和数学公式能解释得了的。所以物理学和数学的基础是对工程师有很高要求的,这里所提到的物理学和数学是指一种最基本的认识而不是停留于表面的文字和公式。我可以推断这个人不太适合作工程师,其实他提出的问题都真真切切的存在于生活中,抬头看看日光灯的启动,或者当你看到电源插头的放电瞬间。可这每一个瞬间都被示为理所应当的话就错了。那样当牛顿看到苹果落地时也会感觉理所应当的。 

   

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(151)
发表于:2008-5-28 11:14:00
标签:无标签

0

C语言外部变量的使用

C语言的外部变量的定义和引用对初学者来说,是个难点.

对外部变量的说明和定义不是一回事.对外部变量的说明,只是声明该变量是在外部定义过的一个全局变量..在这里引用.而对外部变量的定义,则是要分配存储单元.一个全局变量只能定义一次,却可以多次引用.

用extern声明外部变量,目的是可以在其它的文件中调用.具体使用见下面的例子:

                file1.c                                                       file2.c

        int i,j;//定义全局变量                                extern   int i,j;//外部变量说明

        char c;                                                        extern char c;

       void func()                                                    void func1()

     {                                                                     {

         }                                                                    }

在file2.c中对外部变量i,j,c进行了说明,就可以直接调用file1.c中定义的全局变量了

静态变量static的使用

有时在中断程序中定义了变量,不希望每次进入中断程序,变量就被赋初值.这时就要使用static变量.静态局部变量在编译时赋初值,既只赋初值一次.见下例:

  void serial_interrupt() interrupt 4 using 3

{ static uchar i="0";

   i++;

}

上例中,编译时,i被赋初值0,以后每进入一次中断,i+1,而不是每次进入中断,i都被请零,再加1

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(97)
发表于:2008-5-19 16:51:44
标签:地震  

0

悼念汶川地震死难同胞

今天是哀悼日。为了死去的人,活着的人要好好的活着。

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 原创

评论(0) | 阅读(273)
2下一页总共 , 当前 /