打印

救火啊!急用

[复制链接]
1817|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
clc1011|  楼主 | 2007-10-19 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, AC, hm, hb, se
我是新手,刚转入作单片机,公司让我作一个判频程序,就是在一个额定频率的时候输出高压,大概过程是收集频率比较频率与判频值大小然后比较,要是小的话继续收集,要是大的话就收集5次然后比较,我采用的是t0计时1秒t1读数的方法计算频率,要是大的话就设置5s然后比较5倍的额定判频值大小,
程序如下:
org 0000h
ljmp star
org 0030h
star:mov sp,#70h
     mov p3,0ffh
jp1:mov r2,#014h     设置时间
    acall dsjs
    acall js
    acall hb
    subb a,#01h  比较频率
    jc jp1
    cjne a,#00h,jp2
    acall lb
    subb a,#25h
    jc jp1
    ajmp jp2
jp2:mov r2,#064h   5倍频率比较
    acall dsjs
    acall js
    acall hb
    subb a,#10h
    jc jp1
    cjne a,#00h,jp2
    acall lb
    subb a,#69h
    jc jp1
    ajmp zg
     ajmp jp1
zg:setb acc.7
dsjs:anl tmod,#0fh          定时计数
     orl tmod,#51h
     mov th0,#3ch
     mov tl0,#0b0h
     mov th1,#00h
     mov tl1,#00h
     setb tr0
     setb tr1
      ret
js:jbc tf0,lp
   sjmp js
lp:mov th0,#3ch
   mov tl0,#0b0h
   djnz r2,js
    ret
hb:mov a,th1        高位置a
lb:mov a,tl1        低位置a     
ret
       end
那位好心帮我看一下程序那里有错误啊!
我烧进片子以后根本就跟没烧的时候一样

相关帖子

沙发
沈老| | 2007-10-19 20:37 | 只看该作者

程序思路不清

    MOV A,TH1
    RET;漏 !!!!!!!!!!!!!!!!!!!!!!!!
LB:
    MOV A,TL1
    RET
END

使用特权

评论回复
板凳
会流泪的鱼| | 2007-10-19 20:53 | 只看该作者

晕,C语言看多了,汇编看不进去了

使用特权

评论回复
地板
clc1011|  楼主 | 2007-10-21 09:44 | 只看该作者

谢谢

使用特权

评论回复
5
古道热肠| | 2007-10-21 09:53 | 只看该作者

用仿真器调试吧!

 在LP处设断点。

使用特权

评论回复
6
沈老| | 2007-10-22 20:06 | 只看该作者

一个例子,请仔细阅读

;Assume:
CpuClck        EQU 12000  ;12000Khz=12Mhz
TmrClck        EQU CpuClck/12;1M=1000K
ReferF        EQU 1000;HZ=1khz
ReferT        EQU 1000;us=1ms
WatchedF    EQU    40;KHZ=0x28 

CurrTH1 EQU R0
CurrTL1 EQU R1
LastTH1 EQU R2
LastTL1 EQU R3
DeltTH1 EQU R4
DeltTL1 EQU R5
Cmppare EQU R6

    ORG 0000H
    LJMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;
    ORG 000BH
;T0 Int
    PUSH  PSW
    PUSH  ACC;save waht we used
    CLR   TR0
    ACALL ReReadT1
;T1 in R0,R1;Delta=Current-Last
    CLR   C
    MOV   A,CurrTL1
    SUBB  A,LastTL1
    MOV   DeltTL1,A
    MOV   A,CurrTH1
    SUBB  A,LastTH1
    MOV   DeltTH1,A
;update
    MOV   A,CurrTL1
    MOV   LastTL1,A
    MOV   A,CurrTH1
    MOV   LastTH1,A
;
    CLR   C
    MOV   A,DeltTL1
    SUBB  A,#Low(WatchedF)
    JC    Less;<
;>=
    MOV   A,DeltTH1
    SUBB  A,#High(WatchedF)
    JC    Less;<
;>=
    INC   Cmppare;
    MOV   A,Cmppare
;
    SUBB  A,#5
    JC    Less;<5
;if >5 do something
;    MOV   P3,#0;
Less:
;Re Set T0
         MOV   TH0,#High(-ReferT)
         MOV   TL0,#Low(-ReferT)
         SETB  TR0
    POP   ACC;restore
    POP   PSW
    RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;
ReReadT1:;T1 still counts 
    MOV   A,TH1
    MOV   CurrTL1,TL1
;if a carry from low byte to high byte occures,
;we read it again.
    CJNE  A,TH1,ReReadT1
    MOV   CurrTH1,A
    JNB   TF1,NotTF1;TF1
;TF1 
    CLR   TF1
NotTF1:
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;
;main
STAR:
    MOV   SP,#70h
    MOV   P3,0FFH
    MOV   TMOD,#0101$0001B;T1=16 ¼ÇÊý,T0=16 ¶¨Ê± 

    MOV   TH0,#High(-ReferT)
    MOV   TL0,#Low(-ReferT)

    MOV   TH1,#0
    MOV   TL1,#0
    MOV   Cmppare,0
;
    SETB  EA
;
    SETB  ET0
 
    SETB  TR0
    SETB  TR1
LOOP:
#define SIMULATE
;comment above if run on target
#ifdef SIMULATE
;T1+1
    INC   TL1
    MOV   A,TL1
    JNZ   goon
;high byte +1
    INC   TH1
goon:;add NOP to adjust the watched frequency
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
;10us
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP;40KHZ
#endif    
    JMP   LOOP
END

使用特权

评论回复
7
一级菜鸟| | 2007-10-22 20:10 | 只看该作者

沈老确实强,中断内ACC都不保护

使用特权

评论回复
8
clc1011|  楼主 | 2007-10-23 08:47 | 只看该作者

谢谢沈老

先谢过沈老!我的程序里没有中断,直接就是计数的。我是新入门的公司要用项目考核我,在月底之前要作出来,弄不出来就要走人了。你作的也是一个中断计数程序吧,大概跟我的意思一样,可能设置的比较值不一样,只改一下判频值可以使用吗?   

使用特权

评论回复
9
沈老| | 2007-10-23 19:26 | 只看该作者

几点说明

1> 中断现场保护是:
PUSH PSW
PUSH ACC
不要被人搞糊涂了.
2> 测频要考虑测频范围和测频精度.
a.测频范围.由于T0最大时间为63.535毫秒(15.7hz),所以被测频率要高于参考频率即15.7hz以上.如果再低就要对T0溢出记数了.
b.测频精度.和T0的精度有关,当被测频率高时,T0中断服务时间就要从T0设定时间中扣除.另外被测频率和参考频率的比高时测频精度高.因为总是有一个+-1的随机误差.
请你根据公司要求,作进一步考虑.

使用特权

评论回复
10
clc1011|  楼主 | 2007-10-24 08:29 | 只看该作者

继续请教

我要测的是533hz,精度要求不怎么高,只要能判定在大于533hz输出高压就可以,小于的时候要一直置低压,其中要涉及到16位数的比较。在我原程序中加入中断可以达到我的目的吗?

使用特权

评论回复
11
ayb_ice| | 2007-10-24 10:12 | 只看该作者

定时+计数。。。

使用特权

评论回复
12
ksslx| | 2007-10-24 10:41 | 只看该作者

现在也是看不进去汇编了

现在也是看不进去汇编了

使用特权

评论回复
13
沈老| | 2007-10-24 19:21 | 只看该作者

参考频率50HZ,被测频率533HZ大10倍.可以用.

可以参考我给你程序,先在KEIL 51 上"debug"一下.
祝成功.

使用特权

评论回复
14
5_0_5| | 2007-10-24 19:50 | 只看该作者

采样定理

使用特权

评论回复
15
baibing255| | 2007-10-25 13:53 | 只看该作者

我觉得可以借用锁相环的原理

我觉得可以借用锁相环的原理
用数字锁相环芯片
最后输出就是高低电平而已
很简单
而且鉴频的额定值还可以随意改动
比较方便
看看mc145152吧
后边加滤波电路和比较电路就好

使用特权

评论回复
16
BitFu| | 2007-10-25 13:54 | 只看该作者

好想帮你,但我看不下去汇编程序.

sorry

使用特权

评论回复
17
clc1011|  楼主 | 2007-10-29 12:24 | 只看该作者

感谢大家

使用特权

评论回复
18
toney163| | 2007-10-29 12:43 | 只看该作者

给你个参考思路

看别人的程序是很要命的事,况且还是汇编写的。
其实这个应该不是难事,给你一个参考思路:
    如果只要做这样的事件的话,可以用一个外部中断加一个事件中断来做。外部中断作为脉冲累加器,时间中断做一秒计时。这样结合一起就可以做起来了。 这也是最精准的做发。当然条件是你的中断源够用的情况下。如果不够用,也可以用一个普通的i/o引脚作为脉冲累加器,只是这样程序烦一点。至于比较大小那些只是程序里的一些运算的事了。

使用特权

评论回复
19
jdb1| | 2007-10-29 14:17 | 只看该作者

一个思路

我建议你从简单到复杂一步一步调试,让程序先运行起来,然后逐步增加功能,一定可以的。

使用特权

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

本版积分规则

23

主题

60

帖子

1

粉丝