您的位置:社区首页 > 单片机 >单片机技术 > 如何产生编程器烧写文件
 
信息主题:
标题:如何产生编程器烧写文件
如何产生编程器烧写文件

    单片机是*程序来运行的,程序是通过编程器(本站的stc编程实验一体板也可以)烧写进单片机芯片中去的,我们编写不同的烧写文件,单片机就会按照我们的意愿来完成不同的功能,但是如何写程序和获得烧写文件,并且烧写成功,这一个部分却是很多教科书上忽略的,即使有介绍也可能因为他们介绍的编程器或者汇编软件我们无法获得,而使初学者无所适从。站长在自学单片机的过程中也花了不少精力才搞懂这一个部分。


    第一步,我们用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的编程器烧写文件,这就是最终写入单片机的文件。


    在学习单片机的过程中您可以在理解的基础上修改我网站的程序范例,然后:软件汇编--编程器烧写--at89c51实验板验证,这样可以快速掌握单片机技术。


编写汇编语言常见错误分析:

一、 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.符号“:”“;”最好用半角书写。


使用汇编软件常见问题解答:


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驱动外设工作,和常见的正逻辑相反,容易搞错。


以上是站长学单片机时发生的不止一次的错误!!


编写汇编语言的忠告:


    要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错。标号最好采用有意义的英文,这样比较直观,注释尽量详细准确,便于以后读懂,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的,在初学阶段可以对典型程序比如:延时子程序、查表子程序、按键消抖子程序等编写实践一次,这样印象深刻,便于以后引用。


常见汇编语言指令解释:


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行号处

第 2 楼
2006-4-28 3:34:11
   
软件汇编--编程器烧写--at89c51实验板验证
第 3 楼
2006-4-28 3:34:11
   
好帖子好帖子 顶顶顶◎◎◎
第 4 楼
2006-4-28 3:34:11
   

为什么不用keil呢

用keil 方便多了  功能也多

第 5 楼
2006-4-28 3:34:11
   
谢谢楼主!全收下了!
第 6 楼
2006-4-28 3:34:11
   
好帖,谢谢!
[ 1 ]  
共 1 页 5 条主题,当前第 1 页