89c51单片机程序 求解释

ORG 1000h
START:MOV r0, #0c8h
mov r1,#14h
mov tmod,#20h
mov th1,#06h
mov tl1,#06h
setb tr1
loop:jnb tf1,$
clr tf1
djnz r0,loop
mov r0,#0c8h
djnz r1,loop
mov r1,#14h
cpl p1.1
sjmp loop
end

ORG 1000h
START:MOV r0, #0c8h ;200
mov r1,#14h ;20
mov tmod,#20h ;定时器T1定时方式2,自动重装8 位
mov th1,#06h ;定时初值
mov tl1,#06h ;定时初值,tl1溢出时,th1的值自动装到tl1。定时时间为250us
setb tr1 ;启动T1
loop:jnb tf1,$ ;等待定时器溢出,溢出时,计数溢出标志位tf1机器置1
clr tf1 ;人工清0
djnz r0,loop ;r0减1,不为0 ,返回loop
mov r0,#0c8h ;为0 ,重赋值200
djnz r1,loop
mov r1,#14h ;即循环 200X20=4000次 X250us=1000000us=1S
cpl p1.1 ;1S求反一次,如果P1.1接一LED,即每秒亮或灭一次。
sjmp loop ;返回loop,继续。
end追问

谢谢啊。我其实就是不知道 那个250us怎么来的。不过好像 你把 震荡周期当做1/12mhz 是吗?

追答

是的,12M晶振。
当计数器+1直到00H时溢出 ,所以:256-6=250

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-18
汇编早就淘汰了
因为它效率太低了
你写一个汇编程序的时间,你可以写出来10个C语言程序了
第2个回答  2011-06-18
我不同意汇编早就被淘汰的谬论,汇编执行效率不是C语言能比的,写C你能知道程序执行的过程吗?你能搞清RAM是怎样分配的?不能吧,学会汇编能够让你更好的理解单片机。此程序是一个LED的闪烁程序吧!采用定时器1工作方式2自动重载方式,此程序没有采用定时器1中断,而是用查询方式,,ORG 1000h
START:MOV r0, #0c8h;200
mov r1,#14h ;20
mov tmod,#20h ;定时器工作方式2,自动重载
mov th1,#06h ;赋初值
mov tl1,#06h
setb tr1 启动定时器1
loop:jnb tf1,$ ;判断定时时间是否溢出,查询方式溢出标志位TF1
clr tf1 ;清零,下次用
djnz r0,loop ;循环两百次,200*6=1200US
mov r0,#0c8h ;重新赋值,下次用
djnz r1,loop ;循环20次,20*1200,=2.4S
mov r1,#14h
cpl p1.1 对P1.1取反
sjmp loop
end

参考资料:;

第3个回答  2011-06-20
汇编是不可能淘汰的。
大学扩招多年,很多低层次的人,都参与了编程工作,
一堆一片的人,都停留在C语言的层次上,难以上进。
相似回答