刀锋舞者
做了2天了,依旧没有成功,自我感觉是浪费了很多时间,因为没有成功
,写的近200行的汇编程序,真是个浩繁的工程,这算是失败么?有点不
想做了,耽误了太多学习的时间了,这么长时间,做了一个电压表,而
我的自行车测速加里程的程序则没有做完,一种矛盾的感觉,有点迷茫
,人说,做电子的有那么多的东西要做,你不肯能学会很多,会做一样
就可以了,而我的这点编程都没弄好,以前打算这个学期一直到毕业,
疯狂的练习,设计硬件和编写程序,学好C和ARM,可是这个半学期,又
是这样快的过去了,不想在课本的理论上下很大的功夫,虽然理论很重
要。又要面临一个决定,现在想想,我的决定怎么总是那么多呢。
明天阿妈要来济南了,去看下阿妈,也放松一下,让自己的心情好一点
,亲情无价,我爱我的阿妈,阿爸,阿姐,阿哥,还有我的熊猫。
自己还得走下去,无论有多难,我爱我的编程和设计。
没有烟,几天的泡面和挂面,过来了,除了上几节课,就是整天的呆在
电脑旁,看着那程序,调。。调。作为一个初学者,有那么多要学的,
发现这需要的不仅仅是兴趣了,需要毅力,坐在电脑旁6,7个小时的感
觉,眼睛变成了熊猫眼,肩膀累得要死,想哭得感觉,我的熊猫走了。
过几天,好好上几节课,调整一下,1年半的时间,我的电子科技大学还
在等着我。疯狂。
贴上我的程序哈,还有仔细调试,写了一个下午,终于把尾巴补完了。
有高手帮忙看下。一个自行车的测速,和里程的小系统。
我希望交很多很多的朋友,热爱单片的朋友,我的
QQ543396320
邮箱:1226ehziy@163.com
很菜,可很努力。
;SPEED,WHEN THE DISTANCE REACHS TO 4999 THEN LOAD 0.
SCL BIT P1.0
SDA BIT P1.1
A1 BIT P1.2
SPEED EQU 40h;41h 40h为存储的速度
DISTANCE EQU 35H;35H到30h之间要显示的距离十进制形式
COUNT EQU 39H;39H存储中断次数
ORG 0000H
AJMP START
ORG 0003H
AJMP IN0
ORG 000BH
AJMP TIMER00
ORG 0013H
AJMP IN1
ORG 001BH
AJMP TIMER11
ORG 0030H
;主程序的开始
START:
MOV SP,#60H;堆栈的赋初值
MOV R0,#00H
DJNZ R0,$;等待系统稳定
SETB RS0
MOV R0,#40H
SETB RS1
CLR RS0
MOV R0,#0A0H;
MOV R1,#0A1H;这是I2C的读写器件地址
CLR RS1
MOV R0,#30H
MOV R1,#8
ANL A,#00H
CLEAR:
MOV @R0,A
INC R0
DJNZ R1,CLEAR;从30H到37H全部清零
MOV TH1,#3CH
MOV TL0,#0B0H;50MS中断1次
MOV TMOD,#25H;T1 MODE 1 TIME,T0 MODE 1 COUNT
SETB IT0
SETB IT1
SETB TR0
MOV IE,#1FH;一系列的中断初始化
CALL I2C_R;读I2C
LOP:
CALL BCD
CALL DECIMAL
CALL DISPDIS;调用距离显示程序
CALL I2C_W;写入I2C,以供以后调用,因为每次电源复位后RAM中的数据变了,要调用以前存储的数据。
AJMP LOP
;主程序结束,以下为子程序
BCD:;这是把距离的16进制数变为BCD码,最后BCD码存在42H,41H,40H从高到低。
;要转化的值放在R6,R7中;转换完后的值放在R2,R3,R4中
MOV R6,TH0
MOV R7,TL0
CLR A;唬拢茫穆氤跏蓟?
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H;转换双字节十六进制整数
HB3:MOV A,R7;
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3;处理完16bit
MOV 42H,R3
MOV 41H,R4
MOV 40H,R5
RET
DECIMAL:;这是把BCD码分解,把十进制的各个数分别存在6个单元中,以供调用显示方便。
MOV A,42H;把BCD码分解放在6个单元中,以备调用,37H..32H
ANL A,#0F0H;下面是把BCD码变成单个的十进制数
SWAP A
MOV 37H,A
MOV A,42H
ANL A,#0FH
MOV 36H,A
MOV A,41H
ANL A,#0F0H
MOV 35H,A
SWAP A
MOV A,41H
ANL A,#0FH
MOV 34H,A
MOV A,40H
ANL A,#0F0H
SWAP A
MOV 33H,A
MOV A,40H
ANL A,#0FH
MOV 32H,A
RET
DISPDIS:;显示子程序
MOV A,#0FEH
MOV R0,#37H
MOV R1,#8
D1:MOV P2,A
MOV P0,@R0
DEC R0
RL A
CALL DELAY
DJNZ R1,D1
RET
;以下为一些列的I2C操作
I2C_W:
CLR RS0
SETB RS1
CALL I2C_START
;写入字节地址
MOV A,#00H
CALL I2C_IW
;写入TH0
MOV A,TH0
CALL I2C_IW
;写入TL0
MOV A,TL0
CALL I2C_IW
CLR RS0
CLR RS1
RET
I2C_START:
;启动信号
SETB SDA
SETB SCL
NOP
CLR SDA
NOP
NOP
CLR SCL
MOV A,@R0
I2C_IW:
MOV R7,#08H
ASHIFT:
CLR SCL
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
DJNZ R7,ASHIFT
SETB SDA
SETB SCL
JB SDA,$ ; 等待IC卡确认信号
CLR SCL
NOP
NOP
RET
I2C_R:
CLR RS0
SETB RS1
INC R0
CALL I2C_START
;写入字节地址
MOV A,#00H
CALL I2C_IW
;读出
CALL I2C_IR
MOV TH0,A
;读出
CALL I2C_IR
MOV TL0,A
CLR RS0
CLR RS1
I2C_IR:
MOV R7,#08H
ASHIFT1:
CLR SCL
RLC A
MOV C,SDA
NOP
NOP
SETB SCL
NOP
NOP
DJNZ R7,ASHIFT1
SETB SDA
SETB SCL
JB SDA,$ ; 等待IC卡确认信号
CLR SCL
NOP
NOP
RET
DELAY:;显示的时候用的延时程序
MOV R6,#35
D2:MOV R7,#250
DJNZ R7,$
DJNZ R6,D2
RET
;以下为中断服务的程序
IN0:
RETI
IN1:
RETI
TIMER00:
CLR TF0
RETI
TIMER11:;主要是用来计算速度的,主要的思想是,因为自行车的速度不会很快,所以每次只看TL0的值,因为T1没隔50MS中断一次,所以需要20次才等到1S,然后把两次的TL0值相减,就得到了速度值。
CLR TF1
SETB RS0;使用第1组寄存器,这也是为什么一开始就用1组
MOV @R0,TL0
INC R0
MOV TH1,#3FH
MOV TL1,#0B0H
CJNE R0,#60H,TT
PUSH ACC
PUSH PSW
MOV A,59H
SUBB A,40H
MOV B,#10
DIV AB
MOV 31H,A
MOV 30H,B
TT:CLR RS0
RETI
END
文章评论(0条评论)
登录后参与讨论