打印

弄的我都想哭了,不知道怎么修改这个程序,求救。。

[复制链接]
2780|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
impenger|  楼主 | 2011-11-16 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, TE, os, ISP, play
P153_BA,00 衰减1000 倍,01 衰减100 倍,10 衰减10 倍,11 衰减0 倍。
P153_A EQU P1.1
P153_B EQU P1.0
FREQ_LOSS EQU 30H;用于存放当前的频率衰减档位0--3
PORT_LED EQU P0; LED 驱动端口
PORT_LED_138 EQU P2; LED 位选择口
DISPLAY_DATA_ADDR EQU 31H;用于存放算好的显示代码首地址
DISPLAY_DATA0 EQU 31H;用于存放算好的显示代码
DISPLAY_DATA1 EQU 32H;
DISPLAY_DATA2 EQU 33H;
DISPLAY_DATA3 EQU 34H;
DISPLAY_DATA4 EQU 35H;
DISPLAY_DATA5 EQU 36H;
COUNTER_DISPLAY EQU 37H;用于存放当前显示的是第几位
DATA_ADDR EQU 38H;
DATA0 EQU 38H;用于存放计数器所计数据转10 进制后的数据
DATA1 EQU 39H
DATA2 EQU 3AH
DATA3 EQU 3BH
DATA4 EQU 3CH
DATA5 EQU 3DH
TEMP1 EQU 40H
TEMP2 EQU 41H
TEMP3 EQU 42H
TEMP4 EQU 43H
COUNTER_BUF_H EQU 50H;用于存放计数器的值
COUNTER_BUF_L EQU 51H
TIMES_50MS EQU 53H;50 毫秒计数器,每50 毫秒加1
TIMES_1S EQU 54H;1 秒计数器,每秒加1
COUNT_DELAY1 EQU 55H; 用于延时计数
COUNT_DELAY2 EQU 56H; 用于延时计数
;******** BIT RAM (20~2F) flag defined ********
B_T1IF EQU 00H;定时器1 溢出标记位
ORG 0000H
LJMP INITIAL
ORG 001BH
LJMP TIMER1_INT ;T0 FOR IR
;定时器1 中断,中断周期:50ms。读取一次计时器内容,50ms 中断次数累加
器TIMES_50MS 加1
;50ms 中断溢出标记置1
TIMER1_INT:
PUSH ACC
PUSH PSW
MOV TH1,#03CH
MOV TL1,#0AFH ;50ms time base
MOV COUNTER_BUF_H,TH0
MOV COUNTER_BUF_L,TL0
CLR C
MOV A,TH0
CJNE A,COUNTER_BUF_H,INT1
SJMP INT2
INT1: MOV COUNTER_BUF_H,A
INT2:
INC TIMES_50MS

SETB B_T1IF;50ms 中断溢出标记置1
POP PSW
POP ACC
RETI
INITIAL: MOV IE,#00H
MOV SP,#0E0H
MOV R0,#01H
CLR_RAM: MOV @R0,#00H ;clr RAM(01H~FFH)
INC R0
CJNE R0,#00H,CLR_RAM
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2, 0
MOV TMOD,#00010101B ;Set T0 as 16bits Timer,T1 as
16bits counter
MOV TH0,#00H
MOV TL0,#00H
MOV TH1,#03CH
MOV TL1,#0AFH ;50ms time base
SETB TR0 ;T0 RUN
SETB TR1 ;T1 RUN
CLR ET0 ;Enable T0 int
SETB ET1 ;Enable T1 int
SETB EA
SETB P153_A
SETB P153_B
CLR A
MOV FREQ_LOSS,A
;******************************************************************
; ------------------------------- MAIN -------------------------------------
;******************************************************************
MAIN: NOP
CALL DISPLAY0;LED 动态显示刷新
CALL DELAY100
JNB B_T1IF,MAIN;每50ms 处理一次。
CLR B_T1IF
MOV A,TIMES_50MS
CJNE A,#20,NO_1S
JMP YES_1S; 满20 次即为一秒钟
NO_1S:
MOV A,TIMES_50MS
CJNE A,#1,NO_1S_END ;TIMES_50MS 不为1,返回
;当TIMES_50MS 为1 时,判断当前所选档位是否过高或者过低
;若计数器BUF 大于100,则说明满1 秒时必然大于2000,则提前调高频率衰
减档位,
;并清零各计数值,重新在新档位测量
MOV A,COUNTER_BUF_H
JNZ NO_1S_1;计数器高位不为0,说明超100
MOV A,COUNTER_BUF_L
CJNE A,#100,NO_1S_0
NO_1S_0:JC NO_1S_LOW;计数器BUF 小于100,继续跳转到NO_1S_LOW 判
断是否需要调低档位
NO_1S_1:
MOV A,FREQ_LOSS;超量程,判断当前频率衰减档位,若小于3 则加1
CJNE A,#3,NO_1S_2
JMP NO_1S_END
NO_1S_2:JC NO_1S_3
MOV A,#3
MOV FREQ_LOSS,A;档位大于3,则修正为3
NO_1S_3:
INC FREQ_LOSS;频率衰减档位加1
MOV A,FREQ_LOSS
CJNE A,#1,NO_1S_4
SETB P153_B;FREQ_LOSS=1
CLR P153_A
JMP NO_1S_20
NO_1S_4:CJNE A,#2,NO_1S_5
CLR P153_B;FREQ_LOSS=2
SETB P153_A
JMP NO_1S_20
NO_1S_5:
CLR P153_B;FREQ_LOSS=3
CLR P153_A
JMP NO_1S_20
;========================================
NO_1S_LOW:
MOV A,COUNTER_BUF_L
CJNE A,#10,NO_1S_10
NO_1S_10:JNC NO_1S_END
;偏低,则判断是否需要降低频率衰减档位
MOV A,FREQ_LOSS;
JZ NO_1S_END;已经是最低档,无需调整
DEC FREQ_LOSS;减一档
MOV A,FREQ_LOSS
CJNE A,#0,NO_1S_11
SETB P153_B;FREQ_LOSS=0
SETB P153_A
JMP NO_1S_20
NO_1S_11:CJNE A,#1,NO_1S_12
SETB P153_B;FREQ_LOSS=1
CLR P153_A
JMP NO_1S_20
NO_1S_12:
CLR P153_B;FREQ_LOSS=2
SETB P153_A
JMP NO_1S_20
NO_1S_20:;调整档位后,重新计数
CLR A
MOV TIMES_50MS,A
MOV COUNTER_BUF_L,A
MOV COUNTER_BUF_H,A
NO_1S_END:JMP MAIN
;===================================
;===================================
YES_1S:
;把计数器的数转换成10 进制,并根据当前档位设定好要显示的6 个数字,
;存放在DISPLAY_DATA1-DISPLAY_DATA6 中。
;
MOV A,COUNTER_BUF_H
MOV R7,A
MOV A,COUNTER_BUF_L
MOV R6,A
CALL CHANGE16_10
;====================================
;在频率衰减控制下,计数器数据不会超出2000 多少,因此只取转换
后的低4 位转换成数据显示
MOV A,R3
ANL A,#0FH
MOV TEMP1,A
MOV A,R3
ANL A,#0F0H
SWAP A
MOV TEMP2,A
MOV A,R4
ANL A,#0FH
MOV TEMP3,A
MOV A,R4
ANL A,#0F0H
SWAP A
MOV TEMP4,A
;====================================
;根据频率衰减档位调整数位
MOV A,FREQ_LOSS
CJNE A,#0,LOSS_1
CLR A
MOV DATA4,A
MOV DATA5,A
JMP LOSS_END
LOSS_1:
CJNE A,#1,LOSS_2
MOV A,DATA3
MOV DATA4,A
MOV A,DATA2
MOV DATA3,A
MOV A,DATA1
MOV DATA2,A
MOV A,DATA0
MOV DATA1,A
CLR A
MOV DATA0,A
MOV DATA5,A
JMP LOSS_END
LOSS_2:
CJNE A,#2,LOSS_3
MOV A,DATA3
MOV DATA5,A
MOV A,DATA2
MOV DATA4,A
MOV A,DATA1
MOV DATA3,A
MOV A,DATA0
MOV DATA2,A
CLR A
MOV DATA0,A
MOV DATA1,A
JMP LOSS_END
LOSS_3:
MOV A,DATA2
MOV DATA5,A
MOV A,DATA1
MOV DATA4,A
MOV A,DATA0
MOV DATA3,A
CLR A
MOV DATA0,A
MOV DATA1,A
MOV DATA2,A
LOSS_END:
;高位若为0,则置为11,取出显示代码为LED 全灭
MOV R0,#DATA5;取最高位数据地址
MOV R2,#5
LOOP_CLR:
MOV A,@R0
JNZ DISCD
MOV A,#11
MOV @R0,A
DEC R0
DJNZ R2,LOOP_CLR
;====================================
;取表找相应显示代码
DISCD:
MOV R0,#DATA_ADDR;
MOV R1,#DISPLAY_DATA_ADDR;
MOV R2,#6;
MOV DPTR,#TAB
DILP: MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R2,DILP
;=======================================
;重新计数
CLR A
MOV TIMES_50MS,A
MOV COUNTER_BUF_L,A
MOV COUNTER_BUF_H,A
JMP MAIN
TAB: ;/显示码码表/
DB 3FH,06H,5BH,4FH,66H;
DB 6DH,7DH,07H,7FH,6FH,0FFH;
RETI
; ------------------------------- 显示子程序 ----------------------------------
;******************************************************************
**************
DISPLAY0:
MOV A,#0FFH
MOV PORT_LED,A;变换数据前先灭LED,以消除闪动
MOV A,COUNTER_DISPLAY
MOV PORT_LED_138,A
MOV R1,#DISPLAY_DATA_ADDR
ADD A,#DISPLAY_DATA_ADDR;计算当前要显示数据的地址,初始地
址+相应位数
MOV R1,A
MOV A,@R1;取出要显示的相应位的数据
MOV PORT_LED,A;送出显示数据
MOV A,COUNTER_DISPLAY
INC A
CJNE A,#6,DISPLAY1
DISPLAY1: JC DISPLAY2
CLR A
DISPLAY2: MOV COUNTER_DISPLAY,A;显示位加1
RETI
; ------------------------------- DELAY ----------------------------------
;******************************************************************
DELAY100:
MOV A,#2000
DELAY1:
JB B_T1IF,DELAY2
DEC A
JNZ DELAY1
DELAY2: RETI
;******************************************************************
; ------------------------------- 16 进制转10 进制 ----------------------------
;******************************************************************
;双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在R6、R7 中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5 中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
CHANGE16_10:
CLR A ;BCD码初始化
MOV R3, A
MOV R4, A
MOV R5, A
MOV R2, #10H ;转换双字节十六进制整数
CHANG_1:
MOV A, R7 ;从高端移出待转换数的一位到CY 中
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, CHANG_1 ;处理完16bit
RET

相关帖子

沙发
impenger|  楼主 | 2011-11-16 23:16 | 只看该作者
那个大侠发发慈悲,给我看看,这是一个频率计程序,但好像有问题,感觉计数和计时的定义不对,测的范围是1HZ-1MHZ。:'(

使用特权

评论回复
板凳
相信哥咯| | 2011-11-16 23:19 | 只看该作者
汇编好恐怖

使用特权

评论回复
地板
hotpower| | 2011-11-16 23:55 | 只看该作者
主频多少?用51?

使用特权

评论回复
5
mugenwon| | 2011-11-17 08:11 | 只看该作者
:lol当年第一个程序就是用51的汇编来写的,比这个长10倍不止。搞定你就上了个台阶。

使用特权

评论回复
6
impenger|  楼主 | 2011-11-17 08:41 | 只看该作者
是12MHZ晶振,51芯片,谢谢各位。

使用特权

评论回复
7
impenger|  楼主 | 2011-11-17 08:42 | 只看该作者
麻烦四楼大侠给看一下:loveliness:

使用特权

评论回复
8
teddeng| | 2011-11-17 14:29 | 只看该作者
看汇编源码,是没办法的办法,关键是思路。51做频率计,网上**到处都是,搜搜,弄明白了自己写,不难的。

使用特权

评论回复
9
zhuyjgh| | 2011-11-17 21:00 | 只看该作者
为什么要搞个衰减??搞不懂,,
搞一个一秒的定时,,搞个计数器,,不就可以了吗??显示不够,,以k为单位显示小数点就可以了吧,,

使用特权

评论回复
10
zhuyjgh| | 2011-11-17 21:00 | 只看该作者
本帖最后由 zhuyjgh 于 2011-11-17 21:09 编辑

重复了,,

使用特权

评论回复
11
zhuyjgh| | 2011-11-17 21:08 | 只看该作者
本帖最后由 zhuyjgh 于 2011-11-17 21:09 编辑

重复,,

使用特权

评论回复
12
impenger|  楼主 | 2011-11-18 21:46 | 只看该作者
那重复了?求教。:loveliness: 。

使用特权

评论回复
13
NE5532| | 2011-11-18 21:53 | 只看该作者

使用特权

评论回复
14
impenger|  楼主 | 2011-11-19 20:47 | 只看该作者
谢谢啊,真是高手多多:loveliness:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

66

帖子

1

粉丝