7291|20

114

帖子

3382

TA的资源

五彩晶圆(初级)

楼主
 

单片机学习经验总汇 [复制链接]

1、单片机编程技巧--功能强大的时钟中断

单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。

  下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。

  定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断时比启动时经过了N+1个机器周期。所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。这个值便是所谓的“初值”。下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一个机器周期,20mS中有10000个机器周期。(10000)10=(2710)16,则0FFFFh-2710h+1=0D8F0h。由于响应中断、保护现场及重装初值还需要7~8个机器周期,把这个值再加上7,即T0应装入的初值是0D8F7h。每次中断进入后,先把A及PSW的值压入堆栈,然后即把0D8F7h装入T0。
  设置一个单元,每次中断加1 我们可以取内部RAM中一个单元,取名为INCPI(Increase Per Interrupt),在中断中,装完T0初值后,用INC INCPI指令将其加一。从这个单元中,无论中断程序还是主程序,都可以从中获得20mS的1~256之间任意整数倍的信号。例如:有一段向数码管送显的程序,需要每0.5秒执行一次以便刷新显示器,便可以设一单元(称为等待单元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/语句让其比当前的INCPI值大25,然后在每次中断中检查是否于INCPI值相等。若相等,说明已过了25个中断周期,便执行送显程序,并且让W_DISP再加上25,等待下个0.5秒。我们可以设置多个等待单元,以便取出多个不同的时基信号。让中断程序在每次中断时依次查询各个等待单元是否与INCPI相等,若相等,则执行相应的处理,并重新设置该等待单元的值,否则跳过。例如:用0.5秒信号刷新或闪烁显示器,用1秒信号产生实时时钟,或输出一定频率的方波,以一定间隔查询输入设备等。
  在中断中读键 通常,我们在主程序中读键盘,步骤为:扫描键盘,若有键按下,则延时几十毫秒去抖动,再次确认此键确实按下,然后处理该键对应的工作,完成后再次重上述步骤。但这有两点不足:1.处理相应工作时无法锁存按键的输入,即可能漏键。2.延时去抖时CPU无法做其它事情,效率不高。如果把读键放入时钟中断中,则可避免上述不足。方法为:如果两次相邻的中断中都读到同一个键按下,则这个键是有效的(达到了去抖目的),并将其锁存到先入先出(队列)的键盘缓冲区,等主程序来处理。这样,主程序处理按键的同时,仍可响应键盘的输入。缓冲区深度通常可设为8级,若锁存的键数多于8个,则忽略新的按键,并报警提示用户新的按键将无效。若键盘缓冲队列停滞的时间大大长于主程序处理按键所需要的最大时间,说明主程序已出错或跑飞,可以在中断用指令将系统复位,起到了看门狗的目的。
  主程序中的延时 由于有常开的时钟中断,所以当主程序中有需要时间较短、精度较高的延时时,应暂时把时钟中断关闭。而程序中需要时间较长、精度不高的延时时,便可仿照下需的写法,避免多层嵌套的循环延时。
  例:在P1.1输出1秒的高电平脉冲
  MOV  A,INCPI
  INC  A
  CJNE  A,INCPI$  ;等待一次中断处理完成
  SETB  P1.1    ;设P1.1为H,脉冲开始
  ADD  A,#50    ;50个20mS为1秒
  CJNE  A,INCPI,$  ;等中断将INCPI加一50次
  CLR  P1.1    ;设P1.1为L,脉冲结束
  结束语:从上看出,要灵活地应用时钟中断,将任务合理分配给中断和主程序,并且二者要分工明确,接口简单。这其中的技巧还需要大家在实践中多多摸索与体会。另外要注意:应尽量缩短中断处理程序的执行时间,更不要长于20mS。
此帖出自单片机论坛

最新回复

回复,收藏  详情 回复 发表于 2010-6-18 13:33
点赞 关注
 

回复
举报

114

帖子

3382

TA的资源

五彩晶圆(初级)

沙发
 
2、让汇编转到C51的初学者有更清晰的认识的一篇文章
8051 是傳統 CISC 架構微控制器的代表,而 PIC 則是現代 RISC 架構微控制器的佳作。
雖然說 RISC 架構是公認未來微控制器的主流,但是 8051 藉著累積多年的發展環境與資
源,特別是 C Compiler 的成熟,在未來仍然有相當大的想像空間。
希望這是一本可以活用的互動式電子書,以討論及分享 KEIL C51 的程式設計經驗為目的。
目前的內容有 …

記憶體
8051 特有的記憶體型態
特殊資料型態
指定絕對位址的變數
隱藏的初始化程序

程式範例

軟體模擬的 Single Master I2C 介面程式

下載 KEIL C51 試用版

8051 特有的記憶體型態


code    以 MOVC @A+DPTR 讀取的程式記憶體
data    可以直接存取的內部資料記憶體
idata    以 Mov @Rn 存取的內部資料記憶體
bdata    可以位元定址(Bit Addressable)的內部記憶體
xdata    以 MOVX @DPTR 存取的外部資料記憶體
pdata    以 MOVX @Rn 存取的外部資料記憶體

特殊資料型態


bit    一般位元(bit)變數

sbit    絕對定址的位元(bit)變數

語法
sbit    my_flag    =    location;    (location 範圍從 0x00 ~ 0x7F)

範例
sbit    EA =         0xAF;

或是配合 bdata 宣告的位元(bit)變數

char    bdata        my_flags;
sbit    flag0 =              my_flags ^ 0;

(注意 sbit 前不可以加 static)
此帖出自单片机论坛
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

板凳
 
sfr    特殊功能暫存器(Special Function Register)

語法
sfr    my_sfr    =    location;    (location 範圍從 0x80 ~ 0xFF)

範例
sfr    P0    =    0x80;

指定絕對位址的變數


在單一模組內可以使用下面的語法宣告

[memory_space]    type    variable_name    _at_    location

範例
pdata        char    my_pdata    _at_    0x80;

如果該變數必須為多個模組所使用(Global Variable)則以

抽象指標(Abstract Pointer)的方式在標頭檔(Header File)定義較為方便。

#define    variable_name    *((data_type *)        location)

範例
#define    my_pdata    *((char pdata *)    0x80)

(注意 char 與 pdata 的順序)

ABSACC.H 提供了下列方便的巨集(Macro)定義。

#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)

隱藏的初始化程序

80C51 在電源重置後(Power On Reset)所執行的第一個程式模組並不是使用者的主程式
main(),而是一個隱藏在 KEIL-C51 標準程式庫中稱為 startup.a51 的程式模組。
startup.a51 的主要工作是把包含 idata、xdata、pdata 在內的記憶體區塊清除為 0,並
且初始化遞迴指標。接著 startup.a51 被執行的仍然是一個隱藏在 KEIL-C51 標準程式庫
中稱為 init.a51 的程式模組。而 init.a51 的主要工作則是初始化具有非零初始值設定的
變數。

在完成上述的初始化程序之後,80C51 的控制權才會交給 main() 開始執行使用者的程式。
研究在 C51\Lib 目錄下相關模組的組合語言程式碼,使用者將會對 KEIL-C51 的架構有進
一步的了解,同時更能掌握不同的高階應用技巧。

程式範例

軟體模擬的 Single Master I2C 介面程式:C51-I2C.C

暫存器庫(Register Bank)切換的應用

暫存器庫(Register Bank)切換的最大應用是在中斷程序的處理。一般的軟體設計會在程
式進入中斷之後,利用切換暫存器庫的方式保持主程式 R0 ~ R7 暫存器的內容,不受中斷
程序的影響而改變。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

4
 
3、MCS-51单片机地址指针及其应用
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:

MOVX A,@DPTR

MOVX @DPTR,A

MOVX A,@RI

MOVX @RI,A

其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。

MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。

执行“MOVX A,@DPTR”和“MOVX @DPTR,A”指令时,在读指令代码阶段,由程序计数器(PC)提供A0~A15,低8位地址稳定后,在单片机地址锁存信号ALE作用下,P0.X口开始读入MOVX指令代码。在对外接RAM读写阶段,其过程与前述相同,只不过低8位地址不是来自程序计数器的低8位PCL,而是来自地址寄存器的高8位DPH;高8位地址不是来自程序计数器的高8位PCH,而是来自地址寄存器的高8位PCH。当DPL稳定后,由地址锁存器锁存,P0.X口上出现的是读/写外接RAM的数据信息。

执行“MOVX A,@Ri”和“MOVX @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。

由上所述,用R0和R1对外接RAM的间接寻址,可看作是一种页面寻址,由P2锁存器(P2 SFR)的当前值决定了当前页面地址。MCS-51单片机在复位时,P2 SFR为FFH,若程序运行中没有改变P2 SFR中的值,R0和R1只能对FF00H~FFFFH范围的外接RAM进行间接寻址,即FF页面寻址。由于用指令改变P2 SFR的值并不影响程序正常运行,因此可以用R0和R1对64K外接RAM空间的任意一个单元进行间接寻址。这样就使MCS-51单片机外接RAM的地址指针由1个变成3个,大大方便了程序设计。

下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:

程序1—用DPTR做地址指针

MOV R2,#00H

MOV R3,#10H

MOV R4,45H

MOV R5,#30H

MOV R7,#50H

LOOP: MOV DPL,R2

MOV DPH,R3

MOVX A,@DPTR

INC DPTR

MOV R2,DPL

MOV R3,DPH

MOV DPL,R4

MOV DPH,R5

MOVX @DPTR,A

INC DPTR

MOV R4,DPL

MOV R5,DPH

DJNZ R7,LOOP

RET
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

5
 
程序2—使用R0和R1做地址指针

MOV DPTR,#1000H

MOV P2,#30H

MOV R0,#45H

MOV R7,#50H

LOOP: MOVX A,@DPTR

MOVX @R0,A

INC DPTR

INC R0

DJNZ R7,LOOP

RET

程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。

在应用R0和R1间址的外接RAM数据传送操作中,一般使用“MOV P2,#ADDR”和“MOV A,@RI”形式,其中#ADDR为高8位地址。在这两条指令之间不应插入有关改变P2 SFR值的指令。对P2口的读有两种情况:一种是读P2锁存器,如执行“MOV A,P2”指令,这并不会改变P2 SFR中的内容;另一种是读P2锁存器,如执行“INC P2”指令,该指令中的P2既是源操作数,又是目的操作数,通常称为“读—修改—写”指令,即从P2 SFR中读出内容,修改后又写入P2 SFR中。

在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。

当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

6
 
4. 如何产生编程器烧写文件
单片机是靠程序来运行的,程序是通过编程器烧写进单片机芯片中去的,我们编写不同的烧写文件,单片机就会按照我们的意愿来完成不同的功能,但是如何写程序和获得烧写文件,并且烧写成功,这一个部分却是很多教科书上忽略的,即使有介绍也可能因为他们介绍的编程器或者汇编软件我们无法获得,而使初学者无所适从。站长在自学单片机的过程中也花了不少精力才搞懂这一个部分。
    第一步,我们用WINDOWS自带记事本程序来写汇编语言程序,例如,在D盘下新建一个001.TXT文档,然后将程序写入,比如将下面的一个LED跑马灯的程序部分用“复制”“粘贴”命令将加粗文字的部分复制到001.TXT文档中,然后保存。
ORG 0000H
START:MOV P1,#01111111B
LCALL DELAY
MOV P1,#10111111B
LCALL DELAY
MOV P1,#11011111B
LCALL DELAY
MOV P1,#11101111B
LCALL DELAY
MOV P1,#11110111B
LCALL DELAY
MOV P1,#11111011B
LCALL DELAY
MOV P1,#11111101B
LCALL DELAY
MOV P1,#11111110B
LCALL DELAY
MOV P1,#11111111B;完成第一次LED跳灯循环
AJMP START;反复循环
DELAY:MOV R4,#02H;延时子程序,12M晶振延时约1秒
L3: MOV R2 ,#0FAH
L1: MOV R3 ,#0FAH
L2: DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R4 ,L3
RET
END
    第二步,我们需要使用一个汇编软件:宏汇编软件MASM51(下载),软件下载成功后经过ZIP解压后获得MAS51.EXE和MAS51.OVI两个文件,我们将它们放到D盘根目录下,然后双击MAS51.EXE文件,进入DOS界面的汇编程序,我们通过键盘敲入asm51 d:\001.txt后回车,如果出现00 Errors (0000)的话,表示汇编没有任何错误,成功了!
    如果出现别的文字提示,说明汇编有错误,您可以根据提示的内容找出错误的语句,一一改正,再重新汇编,直到出现00 Errors (0000)。这时在D盘的根目录下自动会产生001.HEX的编程器烧写文件,这就是最终写入单片机的文件。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

7
 
5.编写汇编语言常见错误分析:
一、 MAS51汇编软件汇编失败原因分析:
    单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误汇会造成汇编失败,常见的汇编错误如下:
1.标号重复 常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。
2.标点符号以全角方式输入 MAS51程序要求标点符号为半角方式,否则汇编失败。可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。
3.注释太长 有时为了以后读懂程序,写了很长的注释,站长发现超过20个汉子时也会造成汇编失败,解决办法可以将太长的注释分成多个注释。
4.数值#FFH 前遗漏0,根据要求应该在a~f前加0,写成#0FFH
5.字母O和数字0搞混 有时候这两个字看上去完全相同,要注意哦~~
6.标号后边遗漏":"
7.标号使用了特殊字符,比如:T1、T2、A、B这些字符有特定的含义,不允许用于标号。
8.AJMP跳转超过2K地址,AJMP属于短跳转命令,有2K地址范围的限制。
9.JB P3.2,EXIT跳转超过-128~127个地址范围。这个是最容易出现的错误!你有可能程序刚才还能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把
JB P3.2,EXIT
转换成
JNB P3.2,UUU
AJMP EXIT
UUU:
10.字母I和数字1混淆,冒失鬼的常见问题。
11.创造发明不存在的汇编语言指令,在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不认可。
12.符号“:”“;”最好用半角书写。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

8
 
6.使用汇编软件常见问题解答:
1.如果汇编软件出现** Unrecongnized Command **提示字样说明是汇编命令输入错误。正确的汇编命令是asm51 d:\001.txt 注意asm51后面要加空格。
2.如果汇编软件出现**Dos File I/O error **提示字样说明是汇编文件的路径出错。第一要注意MASM51软件的安装路径中不能出现中文名称,例如汇编软件安装在D:\单片机\下面,第二要汇编的文件的路径中也不能出现中文名称,例如D:\单片机\001.TXT。当文件后缀不是asm时,后缀不能省略。
二、程序出错:
1.寄存器重复调用 比如主程序中设定了R4=5,表示主程序循环执行5次,而其中的一个延时子程序又用到R4,使R4的值发生紊乱,造成程序无法正常执行。
2.硬件不熟悉 单片机一般采用下拉输出,往往端口输出0驱动外设工作,和常见的正逻辑相反,容易搞错。
以上是站长学单片机时发生的不止一次的错误!!
编写汇编语言的忠告:
    要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错。标号最好采用有意义的英文,这样比较直观,注释尽量详细准确,便于以后读懂,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的,在初学阶段可以对典型程序比如:延时子程序、查表子程序、按键消抖子程序等编写实践一次,这样印象深刻,便于以后引用。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

9
 
7.常见汇编语言指令解释:
1.Rn 表示R0~R7中的一个
2.#data 表示8位的数值 00H~FFH
3.direct 表示8位的地址 00H~FFH
4.@Ri 表示寄存器间接寻址 只能是R0或者R1
5.@DPTR 表示数据指针间接寻址
6.bit 表示位地址
7.$ 表示当前地址
寄存器寻址 MOV A,R1 将R1中的数值赋予A
直接寻址 MOV A,3AH 将地址3AH中的数值赋予A
立即寻址 MOV A,#3AH 将3AH数值赋予A
寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A
变址寻址 MOVC A,@A+DPTR 以A中的数值为地址偏移量进行查表
相对寻址 AJMP MATN 跳转到行号为MATNC处
位寻址 MOV C,7FH 将位地址7FH的数值赋予C
MOV A,#3AH 数据传输、赋值命令
PUSH direct 将direct为地址的数值压入堆栈中
POP direct 将direct为地址的数值弹出堆栈
XCH A,direct 将direct中的数值与A进行交换
ADD A,direct 将direct中的数值与
INC direct 将direct中的数值加1
SUBB A,direct 将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零 CLR C
DEC direct 将direct中的数值减1
DA A 用于对BCD码加减法后进行10进制调整
MUL AB 将A和B相乘,并把高八位放在B中,低八位放在A中
DIV AB 将A和B相除,并把商放在A中,余数放在B中
ANL A,direct 将A与direct中的数值进行与运算,结果保留在A中(与运算规律:有0出0,全1出1)
ORL A,direct 将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0)
XRL A,direct 将A与direct中的数值进行异或运算,结果保留在A中(异或运算规律:全0出0,全1出0,01、10出1)
CRL A 对A清零
CPL A 对A取反
RL A 对A中数右移
RR A 对A中数左移
RLC A 对A中数带Cy右移
RRC A 对A中数带Cy左移
SWAP A 对A中的数高4位低4位互相交换
LJMP 长跳转指令,64K地址范围
AJMP 短跳转指令,2K地址范围
JZ rel 如果A为0就跳转到rel行号处
JNZ rel 如果A不为0就跳转到rel行号处
CJNE A,#data,rel 如果A不等于data就跳转到rel行号处
DJNZ R1,rel 如果R1减1后不为0就跳转到rel行号处
ACALL rel 调用rel子程序,2K地址以内
LCALL rel 调用rel子程序,64K地址以内
RET 子程序返回指令
RETI 中断程序返回指令
NOP 空操作指令
MOV C,bit 将位地址bit中的值赋予C
CRL bit 将bit位地址清0
SETB bit 将bit位地址置1
CPL bit 将bit位地址取反
ANL C,bit 将地址bit中的值和C做与运算,结果存放在C中
ORL C,bit 将地址bit中的值和C做或运算,结果存放在C中
JC rel 如果Cy为1,就跳转到rel行号处
JNC rel 如果Cy为0,就跳转到rel行号处
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

10
 
8.单片机开发中应掌握的几个基本技巧   
    在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着
工程师。为帮助工程师解决单片机设计上的难题,《电子工程专辑》网站特邀Holtek香
港分公司工程部处长邓宏杰先生担任《单片机应用编程技巧》专题讨论的嘉宾,与广大
设计工程师交流单片机设计开发经验。现根据论坛中的讨论归纳出单片机开发中应掌握
的几个基本技巧。
一、 如何提高C语言编程代码的效率
邓宏杰指出,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。他强调:“
如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。”
他指出,各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%。他说:“对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求你对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但由于不同的MCU厂家其C语言编译系统是有所差别的,特别是
在一些特殊功能模块的操作上。所以如果对这些特性不了解,那么调试起来问题就会很多,反而导致执行效率低于汇编语言。”
二、 如何减少程序中的bug?
对于如何减少程序的bug,邓宏杰给出了一些建议,他指出系统运行中应考虑的超范围管理参数有:
1.物理参数。这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。合理设定这些边界,将超出边界的参数都视为非正常激励或非正常回应进行出错处理。
2.资源参数。这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度。在程式设计中,对资源参数不允许超范围使用。
3.应用参数。这些应用参数常表现为一些单片机、功能单元的应用条件。如E2PROM的擦写次数与资料存储时间等应用参数界限。
4.过程参数。指系统运行中的有序变化的参数。

三、如何解决单片机的抗干扰性问题
邓宏杰指出:防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机抗干扰能力够不够强了。单片机干扰最常见的现象就是复位;至于程序跑飞,其实也可以用软件陷阱和看门狗将程序拉回到复位状态;所以单片机软件抗干扰最重要的是处理好复位状态。
一般单片机都会有一些标志寄存器,可以用来判断复位原因;另外你也可以自己在RAM中埋一些标志。在每次程序复位时,通过判断这些标志,可以判断出不同的复位原因;还可以根据不同的标志直接跳到相应的程序。这样可以使程序运行有连续性,用户在使用时也不会察觉到程序被重新复位过。
四、 如何测试单片机系统的可靠性
有读者希望了解用用什么方法来测试单片机系统的可靠性,邓宏杰指出:“当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:
1.测试单片机软件功能的完善性。这是针对所有单片机系统功能的测试,测试软件是否写的正确完整。
2.上电、掉电测试。在使用中用户必然会遇到上电和掉电的情况,可以进行多次开关电源,测试单片机系统的可靠性。
3.老化测试。测试长时间工作情况下,单片机系统的可靠性。必要的话可以放置在高温,高压以及强电磁干扰的环境下测试。
4、ESD和EFT等测试。可以使用各种干扰模拟器来测试单片机系统的可靠性。例如使用静电模拟器测试单片机系统的抗静电ESD能力;使用突波杂讯模拟器进行快速脉冲抗干扰EFT测试等等。
邓宏杰强调:“还可以模拟人为使用中,可能发生的破坏情况。例如用人体或者衣服织物故意摩擦单片机系统的接触端口,由此测试抗静电的能力。用大功率电钻靠近单片机系统工作,由此测试抗电磁干扰能力等。”
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

11
 
单片机MCS-51系列指令快速记忆法
随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。学习、使用单片机的人越来越多,而生产单片机的厂家很多,单片机种类繁杂,不知如何选择。据统计,八位单片机占全球单片机销量的65%。在八位单片机中,Intel公司的8051单片机内核已成为8位单片机事实上的标准。因此,对初学者而言,选择8051单片机来学习不失为明智的选择。
    学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。MCS-51共有111条指令,现介绍我们总结出的快速记忆MCS-51指令的方法,供大家参考。
    大家都知道,汇编语言指令由操作码、操作数两部分组成。MCS-51使用汇编语言指令,它共有44个操作码助记符,33种功能,其操作数有#data、direct、Rn、@Ri等。这里先介绍指令助记符及其相关符号的记忆方法。
  一、助记符号的记忆方法
  1?表格列举法
  把44个指令助记符按功能分为五类,每类列表记忆。此处从略,请读者自己总结。
  2?英文还原法
  单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照
汉语有助于理解其助记符含义,从而加强记忆。例如:
增量 INC-Incremect  减量 DNC-Decrement
短转移 SJMP-Short jump  长转移 LJMP-Long jump
比较转移 CJNE-Compare jump not equality 
绝对转移 AJMP-Absolute jump 空操作 NOP-No operation
交换 XCH-Exchange    加法 ADD-Addition
乘法 MUL-Multiplication  除法 DIV-Division
左环移 RL-Rotate left  进位左环移 RLC-Rotate
                    left carry
右环移 RR-Rotate right  进位右环移RRC-Rotate
                    right carry
3?功能模块记忆法
  单片机的44个指令助记符,按所属指令功能可分为五大类,每类又可以按功能相似原则为2~3组。这样,化整为零,各个击破,实现快速记忆。
  1)数据传送组。      2)加减运算组
   MOV 内部数据传送    ADD 加法
   MOVC 程序存储器传送   ADDC 带进位加法
   MOVX 外部数据传送    SUBB 带进位减法
  3)逻辑运算组。      4)子程序调用组。
   ANL 逻辑与         LCALL 长调用
   ORL 逻辑或       ALALL 绝对调用
   XRL 逻辑异或       RET 子程序返回
  二、指令的记忆方法
  1?指令操作数的有关符号
  MCS-51的寻址方式共有六种:立即数寻址、直接寻址、寄存器寻址、寄存器间址、变址寻址、相对寻址。我们必须掌握其表示的方法。
  1)立即数与直接地址。?ata表示八位立即数,#data16表示是十六位立即数,data或direct表示直接地址。
  2)Rn(n=0-7)、A、B、CY、DPTR寄存器寻址变量。
  3)@R0、@R1、@DPTR、SP表示寄存器间址变量。
  4)DPTR+A、PC+A表示变址寻址的变量。
  5)PC+rel(相对量)表示相对寻址变量。
  记住指令的助记符,掌握不同寻址方式的指令操作数的表示方法,为我们记忆汇编
指令打下了基础。MCS-51指令虽多,但按功能可分为五类,其中数据传送类28条,算术
运算类24条,逻辑操作类25条,控制转移类17条,布尔位操作类17条。在每类指令里,
根据其功能,抓住其源、目的操作数的不同组合,再辅之以下方法,是完全能记住的。
我们约定,可能的目的操作数按(#[email=data/direct/A/Rn/@Ri]data/direct/A/Rn/@Ri[/email])顺序表示。

对于MOV指令,其目的操作数按A、Rn、direct、@Ri的顺序书写,则可以记住MOV的
15条指令。例如以累加器A为目的操作数,可写出如下4条指令。
  MOV A,#[email=data/direct/A/Rn/@Ri]data/direct/A/Rn/@Ri[/email]
  以此类推,写出其它指令。
  MOV Rn,#data/direct/A
  MOV direct,#[email=data/direct/A/Rn/@Ri]data/direct/A/Rn/@Ri[/email]
  MOV @Ri,#data/direct/A
  2?指令图示记忆法
  图示记忆法是把操作功能相同或相似、但其操作数不同的指令,用图形和箭头将目的、源操作数的关系表示出来的一种记忆方法。例如:由助记符MOV、MOVX、MOVC组成的送数组指令,可以用图1、2帮助记忆。
  由助记符CJNE形成的四条指令,也可以用图示法表示,如图3。
CJNE A,#data,rel   CJNE A,direct,rel
CJNE @Rn,#data,rel CJNE @Ri,#data,rel
  另外,对于由(ANL、ORL、ARL)形成的18条逻辑操作指令,有关A的四条环移指令,也可以用图示法表示,请读者自行画出记忆。
  3?相似功能归类法
  在MCS-51指令中,我们发现部分指令其操作码不同,但功能相似,而操作数则完全一样。相似功能归类法就是把具有这样特点的指令放在一起记忆,只要记住其中的一条,其余的也就记住了。如加、减法的十二条指令,与、或、非的十八条指令,现列举如下。
  ADD/ADDC/SUBB A,#[email=data/direct/Rn/@Ri]data/direct/Rn/@Ri[/email]
  ANL/ORL/XRL A,#[email=data/direct/Rn/@Ri]data/direct/Rn/@Ri[/email]
  ANL/ORL/XRL direct,#data/a
  上述每一排指令,功能相似,其操作数都相同。其它的如加1(INC)、减1(DEC)指令也可照此办理。
  4?口诀记忆法
  对于有些指令,我们可以把相关的功能用精练的语言编成一句话来记忆。如PUSH direct和POP direct这两条指令。初学者常常分不清堆栈SP的变化情况,为此编成这样一句话:(SP的内容)加1(direct的内容)再入栈,(SP的内容)弹出(到direct单元)SP才减1。又如乘法指令中积的存放,除法指令中被除数和除数以及商的存放,都可以编成口诀记忆如下。
  MUL AB  高位积(存于)B,低位积(存于)A。
  DIV AB  A除以B,商(存于)A余(下)B。
  上面介绍了几种快速记忆单片机指令的方法,希望能起到抛砖引玉的作用,相信读者在学习单片机的过程中能找到适合自己的方法来记忆。但是,有了好的方法还不够,还需要实践,即多读书上的例题和别人编写的程序,自己再结合实际编写一些程序。只有这样,才能更好更快地掌握单片机指令系统。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

12
 
[转帖]给初学者的一些建议! 这是我在一篇文章上摘录下来的一段关于单片机开发的资料,现在贴出来给各位看看:
  目前介绍单片机应用的文章很多,但介绍单片机开发工具制作的文章却较少。由于单片机是一门实践性很强的课程,如果采用传统的开发模式,则要购买价格昂贵的仿真器、编程器等开发工具来作实验。其实由于芯片功能的日益完善,我们可以利用芯片的在系统编程(ISP)功能制作出实用而低价的开发工具。本文旨在帮助DIY爱好者开发制作出适合自己的开发工具。
1 当前常用开发模式
  目前,基本上有两种开发模式可供选择:用仿真器、用编程器。
① 用仿真器。优点:方便,可以设置断点,可以观察存储器及寄存器的内容。缺点:价格昂贵,不同类型的单片机要购买不同的仿真器;仿真器终究不是单片机,有时代码在仿真器上能通过,但在单片机中不能正常工作,反而增加了调试的难度。
② 用编程器。优点:价格相对便宜,通常一款编程器可编程多种器件。缺点:操作相当不便,每次要将芯片在目标板与编程器之间转移,并且还要在编译操作界面与编程器操作界面之间切换,大部分时间在做简单的重复工作。
2 新的开发模式介绍及芯片选择
  本文介绍的开发工具采用一种新的开发模式(类似于编程器开发模式)。由于利用了芯片的在系统编程功能,因此不需要移动芯片。在软件设计时设计成:一旦代码文件被重新编过,即自动下载到芯片,并自动复位运行,是真正的“所编即所得”。
  目前很多单片机都支持在系统编程。8051系列单片机支持在系统编程的也很多,但大多数是支持通过PC机的串口对单片机进行编程。这样有四个不方便的地方:一是项目本身与PC机串行通信不方便;二是要增加1片MAX232电平转换芯片;三是有的芯片要按特定的步骤进入下载模式,编程过程需要手工干预;四是有的芯片需要固件(定制的程序)的支持,如果不小心损坏了固件,则芯片的在系统编程功能也没有了。
  经过比较,Atmel公司生产的AT89S8252是一种比较理想的芯片,适合制作开发工具。此芯片有如下特点:
◆ 与8051兼容;
◆ 内含8KB可擦写1000次的程序存储器,2KB可擦写超过100 000次的数据存储器及256字节8位宽内部RAM;
◆ 可通过SPI接口在系统串行编程,与8051兼容
◆ 串行编程时有自动擦写周期,在调试大程序时可以分段下载,节约时间;
◆ 低电压下载,无需12V编程电压

如何成为单片机开发高手(转)
也许是比较旧的文章了。
       单片机适用于电子玩具、工业控制、民用电器、机电一体化产品、航天航海等众多领域,而单片机的应用开发不单是软件的开发,其开发语言和硬件密切相关。所以只有开发者对单片机的内部结构非常了解,才能编好软件。而单片机的开发应用还涉及到硬件扩展接口和各类传感器,更重要的是必须尽可能地了解各学科中适应单片机完成的控制项目以及控制过程。
掌握单片机的应用开发需要一个过程。首先必须掌握数字电路和模拟电路方面的知识,还必须学习单片机原理、硬件结构、扩展接口和编程语言。初次开发时由于没经验,可能要经过多次反复才能完成项目。这时,你会得到较大的收获和积累,表现在以下几个方面:硬件设计方面的积累;
软件设计方面的积累;
设计经验方面的积累。
硬件开发是单片机应用开发的基础,软件的开发是建立在硬件之上,软硬件设计的巧妙结合是项目开发质量保证的关键。在单片机硬件开发设计中应注意以下几个方面:
单片机应用开发者必须学习应用最新单片机(MCU),新型的MCU的优势表现在时钟频率的进一步提高(从6MHz提高到33MHz),指令执行速度的提高(从12个机器周期到6个机器周期,甚至到1个机器周期),处理器相关功能的提高(如增加了数学处理、模糊控制等),内部程序存储器和数据存储器容量的进一步扩大(ROM扩到64K,RAM扩到2K),A/D和D/A转换器的内部集成,LCD显示等功能模块的内部集成,外部扩展功能的增强。如Philips的P89C884单片机内部有64K FLASH(快闪存储器)、3个计数器、33MHz时钟、6个机器周期执行一条指令、I2C总线、ISP/IAP等。

扩展接口的开发尽可能采用PSD、FPGA(或CPLD)等器件开发。这类器件都有开发平台的支持,开发难度较小,开发出的硬件性能可靠、结构紧凑、利于修改、保密性好。这种方法也是硬件接口开发的趋势。如Altera公司生产的EPM7128S应用较广,在中国市场也容易买到;WSI推出的新型可编程的单片机外围器件PSD813F,把单片机外围电路中的许多功能模块组合在一起,为用户提供体积更小、成本更低、开发更快的解决方案。
扩展了RS-232等标准串口以后,单片机可和PC机通信,对于众多测控方面的人机对话、报表输出、集成控制等功能进行优势互补。如果芯片支持1SP/IAP功能还可以进行在线仿真和远程调试远程软件升级。例如,Dallas的1位总线接口、Philips的I2C总线等接口,均配有较多的专用扩展接口,接口扩展十分方便,所配软件有标准模式,也较容易编写。
C语言是普及最广泛的程序设计语言,它既有高级语言的各种特点,又可对硬件进行操作,并可进行结构化程序设计,用C语言编写的程序较容易移植。目前已有专为单片机设计的C语言编译器,如Franklin C51、KEIL C51,它们可生成简洁可靠的目标代码,在代码效率和代码执行速度上完全可以和汇编媲美。

有时开发一个单片机应用项目,在仿真调试完成后系统运行正常,而接入现场后出现不能正常运行或运行时好时坏,脱离现场后一切正常,这种现象就涉及到可靠性问题。解决这种问题可以从以下几个方面考虑:
1、选择性能好、抗干扰能力强的供电系统,尽量少地从电源引入干扰;
2、设计电路板时排除可能引起干扰的因素,合理布线,避免高频信号的干扰,图1显示了合理的布线和不合理的布线:
3、选择较好的接地方式,如模拟地和数字地采用一点接地方式,驱动大电流信号时捎霉獾绺衾耄?br>
4、数据采集时进行数字滤波处理,常用的数字滤波方式有:程序判断滤波、中位值滤波、算术平均滤波、递推平均滤波法、防脉冲干扰平均值滤波、一阶滞后滤波等。
由于干扰问题可能是由于不同的原因引起,在设计时要根据项目应用场所分析可能出现的干扰,有目的地设计抗干扰电路。
单片机应用项目的开发还有一个更简捷的方法就是借助“单片机应用开发平台”。西安北斗星公司近期也计划推出这种“单片机应用开发平台”的1.0版本。
单片机开发平台如图2。
其中,开发平台部分为用户提供了一个简易,方便的开发环境,使用户可对单片机应用项目进行可视化开发。
硬件智能开发部分提供了一个通过选项开发硬件原理图的方法,这个过程中根据硬件方案平台自动的生成一部分配套软件。
可视化软件开发可简单方便的开发出用户程序,成品系统库中有大量已开发成功的项目,在产品开发时如开发项目功能相近,只要略加修改便可成为一个新的项目。成品系统库开发为用户升级成品库提供了一个开放式的环境。
         子程序开发中为子程序的升级提供了一个开放式的环境。实用信息部分提供了开发方面用到的大量实用信息。
    在平台上开发单片机应用项目不同于传统的开发模式。平台集成了大量专业技术人员的优秀设计思想,使用单片机开发平台可使技术人员迅速成长,彻底根除产品开发中大量低水平重复工作。平台的知识集成减少了企业对个别技术人员的依赖性,技术人员的流动不会影响企业的技术实力。平台最大限度的包容性大大缩短了产品的开发周期。平台的可靠性积累,保证了基于平台开发的产品具有良好的可靠性。平台的标准化、系统化、规范化及大的有利于嵌入式产品的大规模生产,售后服务和产品更新。只有采用平台化开发模式,才能将单片机的应用开发推进到一个新的阶段。
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

13
 
单片机初学者几个不易掌握的概念
   
   
一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中 ,连连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很 多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各 器件之间的工作必须相互协调?所以就需要的连线就很多了,如果仍如同模拟电路一样 ,在各微处理器和各器件间单独连线线,则线的数量将多得惊人,所以在微处理机中引 入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线 上,即相当于各个器件并联起来,但仅这样还不行,如果有两?器件同时送出数据,一 个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是是不允许的,所以 要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有 多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称 控制 总线。
在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配 地址,才能 用,分配地址当?也是以电信号的形?给出的,由于存储单元比较多,所以 ,用于地址分的线也较多,这些线被称为地址总线。
  二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的─数字,或者说都是?串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据 。指令由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的 一一对应关,不可以由 单片机的开发者更改。地址:是寻找单片机内部、外部的存储 单元、输入输出口的依据,内 单元的地址值已由芯?设计者规定好,不可更改,外部的 单元可以由单片机开发者自行决,但有一些地址单元是一定要有的(详见程序的执行过 程)。数据:这是由微处理机处理的 象,在各种 不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:
1地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。
2方式字或控制字(如MOV TMOD,#3),3即是控制字。
3常数(如MOV TH0,#10H)10H即定时常数。
4实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗, 则执 兄 令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实 际?出的值。 理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指 令来 行了。

三、P0口、P2口和P3的第二功能用法 初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间 要有个切换的过程,或者说要有一条指令,事实?,各端口的第二功能完全是自动?,不需要?指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口 时,它们挥作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从 P3. 或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能?而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条S ETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会 这么做,因为这通常这会导致系统当溃(即死机)。
  
四、程序的执行过程 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000?,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’?个单元,并且在‘0000’单元中存放的一定是一条指令。  

五、堆栈 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的 一?份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且 堆栈有特 的数据传输指令,即‘PUSH’和甈OP’,有一个特殊的专为其服务的单元,即堆栈指 针SP 每当执一次 PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原 来值基础上)?动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP值,就可以把堆栈设置在规定的内存单元中,如在程序开始时?用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这 么?条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元 开始往后?8H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成 数?的浑乱。不? 作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问 题。当设置好堆栈区?,并不意味着该区域成为一种专用内存,它还是可以象普通内存 区域一样使用,只是一般情 下编程者不会把它当成?通内存用了。   
六、单片机的开发过程 这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好 硬件下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实?这些 常?、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其 地址也就确定了,当 器件的功能被确定下来后,其控制字也就被确定了。然后用文本编缉器(如EDIT、CCED 等)写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简 单?程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后, 就可以写(将程序固 化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够 识别种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举 一?说明: ORG 0000H LJMP START ORG 040H START: MOV SP,#5FH ;设堆栈 LOOP: NOP LJMP LOOP ;循环 END ;
此帖出自单片机论坛
 
 
 

回复

114

帖子

3382

TA的资源

五彩晶圆(初级)

14
 
为什么要使用仿真器

1.1 仿真的概念:
----仿真的概念其实使用非常广,最终的含义就是使用可控的手段来模仿真实的情况。
----在嵌入式系统的设计中,仿真应用的范围主要集中在对程序的仿真上。例如,在单片机的开发过程中,程序的设计是最为重要的但也是难度最大的一种最简单和原始的开发流程是:编写程序烧写芯片验证功能,这种方法对于简单的小系统是可以对付的,但在大系统中使用这种方法则是完全不可能的。

1.2 仿真的种类:
---软件仿真:这种方法主要是使用计算机软件来模拟运行,实际的单片机运行因此仿真与硬件无关的系统具有一定的优点。用户不需要搭建硬件电路就可以对程序进行验证,特别适合于偏重算法的程序。软件仿真的缺点是无法完全仿真与硬件相关的部分,因此最终还要通过硬件仿真来完成最终的设计。
---硬件仿真:使用附加的硬件来替代用户系统的单片机并完成单片机全部或大部分的功能。使用了附加硬件后用户就可以对程序的运行进行控制,例如单步,全速,查看资源断点等。硬件仿真是开发过程中所必须的。

1.3 为什么要使用仿真器?
---在与一些有经验的工程师交谈中,我们会发现有相当一部分工程师在开发中不使用或很少仿真器。向他们询问,原因得到的回答是"仿真器不可靠"但是他们是如何解决程序开发中遇到的问题呢?通过深入的交流才明白他们是按照这样的方法来开发程序的:
---(1) 根据自己的设计建立一个符合要求的硬件平台,如果该平台涉及的程序比较复杂。还要搭建一个人机交流的通道人机交流通道可能是一个简单的发光二极,管蜂鸣器,复杂的可能是串口通讯口LCD显示屏。
---(2) 写一个最简单的程序例,如只是将发光二极管连续的闪烁。程序编译后烧写到单片机芯片中,验证硬件平台是否工作正常。
---(3) 硬件平台正常工作后编写系统最低层的驱动程序,每次程序更改后都重新烧写单片机芯片验证。如果在程序验证中遇到问题,则可能在程序中加入一些调试手段。例如通过串口发送一些信息到PC 端的超级终端上,用于了解程序的运行情况。
---(4) 系统低层驱动程序完成后再编写用户框架程序,由于这部分已经不涉及到硬件部分,所以程序中的问题用户一般能够发现。
---但是更多的调查表明,使用以上方法的工程师总的看来所设计的程序不是很庞大或很复杂。因为在做简单的项目时,我们可以通过一个发光二极管就可以表达出内部的信息:如果程序复杂,可能需要更多的信息来表示内部的状态,这样可能就需要串口协助调试:如果程序更复杂,硬件更多,实时性更强,那工程师就要更多的增强调试手段,串口可能就不能满足了,需要类似于断点的功能,因为我想知道在某一个时刻单片机内部的状态究竟是怎样?

--如果用户程序的修改非常频繁,可能一次又一次地的烧写芯片占用的时间就很多,这时用户就会想能下载程序并运行的装置。
---到这里,您会看到,随着用户要求的越来越高,调试装置已经越来越象一个通用的仿真器了。因此我们的建议是:不要回避使用仿真器因为使用仿真器能提高您的开发速度。
---但是不能否认的是,用户回避使用仿真器也是有原因的。因为仿真器也是一种电子装置,非常依赖于设计者的水平。如果一个仿真器设计者的水平有欠缺,那将给仿真器的使用者带来很大的问题。因为仿真器的使用者将分不清楚究竟是程序的问题还是出在那里。随着电子设备的复杂化,设计工程师面临前所未有的压力。您可以想象,用户发现了程序中有一个问题,首先怀疑是自己系统中的问题,可能是软件方面也可能是硬件方面。因为用户系统处于开发阶段,用户基本上不会怀疑仿真器。在这种情况下,用户将耗费很大的精力在自己的系统中寻找并不存在的问题。如果用户最终发现问题来源于仿真器,并通过烧写芯片验证确,实如此那这个仿真器用户以后可能会逐渐放弃使用仿真器。
---用户放弃使用仿真器,对用户的影响是巨大的。因为放弃使用一个设计不完善的仿真器,也放弃了使用其它设计完善的仿真器,关键是放弃了合理的开发方法。因此我们的建议是:不要回避使用仿真器但要挑选好的仿真器。

1.4 仿真器的附加服务更加重要
---在购买仿真器的同时,还要注意仿真器厂家的服务,这一点很关键。这里说的服务包含仿真器本身的服务,例如仿真器使用上的指导服务,仿真器的维修服务,这些都是一个产品的最基本的服务。对于仿真器这种特殊产品来将还不是全部的服务。
---使用仿真器来开发产品,会遇到很多问题:产品本身的问题,仿真器的问题,仿真器和用户系统的问题。如果用户开发经验不是很丰富,他并不能排除遇到的问题究竟来源于哪个方面。这时,他可能求助于仿真器生产厂商。如果仿真器的生产厂商只专注于仿真器的设计,而对于其它的单片机应用不熟悉,他可能对用户提出的问题不能作出正确的判断而一味的强调自己的仿真器没有问题。与之相反,一个既熟悉仿真器的使用,又有丰富开发经验的仿真器支持厂商则能协助用户快速的找出问题。实践证明这两种情况带来的效果是完全不一样的。
此帖出自单片机论坛
 
 
 

回复

87

帖子

0

TA的资源

纯净的硅(高级)

15
 
好东西  收获甚多!谢谢楼主共享!
此帖出自单片机论坛
 
 
 

回复

120

帖子

0

TA的资源

一粒金砂(高级)

16
 
确实不错
此帖出自单片机论坛
 
 
 

回复

875

帖子

0

TA的资源

五彩晶圆(高级)

17
 
不错哈
此帖出自单片机论坛
 
 
 

回复

116

帖子

0

TA的资源

纯净的硅(中级)

18
 
不错,经典总结!









































111
此帖出自单片机论坛
 
 
 

回复

38

帖子

2

TA的资源

一粒金砂(中级)

19
 
不错,较全面
此帖出自单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

20
 
谢谢呵
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表