论坛风格切换切换到宽版
  • 10608阅读
  • 40回复

MB1504例程 [复制链接]

上一主题 下一主题
离线小比尔/5
发帖
2582
只看该作者 20楼 发表于: 2007-08-29
改类似于这些语句:
start: mov ckfh,#1
mov ckfl,#1
mov tmcf, #48
mov bcfh,#0h
mov bcfl,#63
离线永远的FM
发帖
12230
只看该作者 21楼 发表于: 2007-08-29
那个地方我们改了。。。。。92与32
楼主的程序我用了完全正常。下面倒位的改进版我们一直没成功。。。。pdout一直都高电平,调vco没用。。。。。。不知程序问题还是我们分频比算错了????
离线cctvcctv
发帖
412
只看该作者 22楼 发表于: 2007-08-29
参照15楼的改
离线BA2Bi
发帖
3502
只看该作者 23楼 发表于: 2007-08-30
c150 好像用它
离线pjh
发帖
1096
只看该作者 24楼 发表于: 2007-08-30
我就是从c150上面拆下来的
离线永远的FM
发帖
12230
只看该作者 25楼 发表于: 2007-08-30
我的hx260拆的
现在用n种程序试过了,几乎都不能工作(除了楼主那个可以)
关键是我们要改成自己用的频率,不知程序本生问题还是数据问题
离线pjh
发帖
1096
只看该作者 26楼 发表于: 2007-08-30
[quote=永远的fm]谢谢!
现在我预想的输出频率是29.6mhz,频率步进5k,晶振10.24m,参考分频2048,n=92,a=32,请问要改哪里?[/quote]


前置分频是32还是64?
离线BG2WAH
发帖
708
只看该作者 27楼 发表于: 2007-08-30
mb1504有如下计数器:除p、除a、除b、除r。n=(p×b)+a。设:参考频率(除r)=10.24mhz÷2048=5khz,那么,n=29.6mhz÷5khz=5920,设:除p=32/33, 设:除a=0,则,除b=5920÷32=185。把上述结果代入公式n=(32×185)+0=5920。vco=29.6mhz÷5920=5khz,与参考频率一致。在此需要说明的是:为使输出频率连续,在编程上要确保除a最大值≤32且a≤b;向mb1504发送控制字时高位在前 (hex=0xb9、0x00、0x00,高19bit有效)。仅供参考。
离线yjg
发帖
274
只看该作者 28楼 发表于: 2007-08-30
'
前置分频是32还是64?
'
前置分频是64
29600khz=(92*64+32)*5khz
离线BG2WAH
发帖
708
只看该作者 29楼 发表于: 2007-08-30
n=(p×b)+a。设:除r=10.24mhz÷2048=5khz,那么,n=29.6mhz÷5khz=5920,设:除p=64/65,则,除b=5920÷64=92.5取整数92,除a =5920-64×92=32,把上述结果代入公式n=(64×92)+32=5920。vco=29.6mhz÷5920=5khz,与参考频率一致。为使输出频率连续,在编程上要确保除a≤p且a≤b;向mb1504发送控制字时高位在前 (hex=0x0b、0x88、0x00,高19bit有效)。
离线BG2WAH
发帖
708
只看该作者 30楼 发表于: 2007-08-30
pic系列单片机汇编(演示)源程序,仅供参考。

            list   p=16f876a, st=off
                errorlevel -302, -306
                include <p16f876a.inc>   ; fosc=11.0592mhz

  cblock 0x20
u_send   ; 串行数据发送(移位寄存器)高8位
h_send   ; 中8位
l_send   ; 低8位
accdhi   ; mb1504频率计数器高8位
accdmid   ; 中8位
accdlo   ; 低8位
bits     ; 发送计数器
  endc

#define   sck     portb,1   ; 时钟线(1504-09)
#define   ser     portb,2   ; 数据线(1504-10)
#define   le     portb,3   ; 锁存线(1504-11)
;-----------------------------------------------------------------
        org   0x0000
        goto   picstart
        org   0xf
picstart   bsf   status,rp0
        bcf   status,rp1
        movlw   b�'
        movwf   trisb       ; 定义rb端口
      bcf   status,rp0
        clrf   portb
     
initial   movlw   0x10         ; 初始化除r计数器
      movwf   u_send       ; (晶体10.240mhz,步距5khz)
        movlw   0x01
        movwf   h_send
        clrf   l_send
     
        movlw   .16         ; 发送16bit
        movwf   bits
        call   locate       ; 发送控制字到mb1504除r计数器
     
    movlw   0x0         ; vco频率29.600mhz
      movwf   accdhi       ; (29600/5=5920,hex=1720)
      movlw   0x17
      movwf   accdmid
      movlw   0x20
      movwf   accdlo
;---------------------------------
main_mb   call   multi_64     ; 格式调整
      call   mb1504       ; 发送控制字
     
      movlw   .1         ; 频率加5khz
        addwf   accdlo,f
        btfsc   status,c
        addwf   accdmid,f
        btfsc   status,c
        addwf   accdhi,f
        goto   main_mb       ; 继续
;-----------------------------------------------------------------
; mb1504数据格式调整子程序
; 预分频器除64/65时,为使频率输出连续; 应保持余数吞除(除a)计数器7bit=0

multi_64   clrf     l_send       ; 清零备用
      movf   accdmid,w
        movwf   u_send       ; 复制中8位
      movf   accdlo,w
        andlw   0xc0         ; 屏蔽掉其它位
      movwf   h_send
        rrf     accdlo,w     ; 右移→w
        rrf     l_send,f
        andlw   0x1f         ; 始终保持6bit=0
        iorwf   h_send,f     ; 合成中8位
      rrf     accdhi,w
        rrf     u_send,f     ; 整理,使之符合mb1504的数据格式
      rrf     h_send,f
        rrf   l_send,f
        return
;---------------------------------
; mb1504数据发送子程序;串行输入,高位在前

mb1504     movlw   .19         ; 发送19bit
        movwf   bits
     
locate     bcf   ser         ; 数据线=0
        bcf   status,c   ; c=0
        rlf     l_send,f     ; 高位在前, 输出1bit
        rlf     h_send,f
        rlf     u_send,f
        btfsc   status,c     ; 查询, 数据为0?
        bsf   ser         ; 否
      ill   0x0,2       ; 延时2个时钟周期(1us)
        bsf   sck         ; 时钟线,sck=1
        fill     0x0,2
        bcf   sck
        decfsz bits,f       ; 结束(已发送16/19bit)?
        goto   locate       ; 否, 继续
      bsf   le         ; le=1,锁存
      fill   0x0,3
        bcf   le
        return
;-----------------------------------------------------------------
        end
离线BG7RMU
发帖
434
只看该作者 31楼 发表于: 2007-10-24
学习了     !
离线bg8aby
发帖
222
只看该作者 32楼 发表于: 2007-10-26
强,学习中
离线wb4916
发帖
213
只看该作者 33楼 发表于: 2009-11-28
http://www.hellocq.net/forum/showthread-t-220417.mb1504%c0%fd%b3%cc%a3%a88051%b5%c4asm%b0%e6%b1%be%d7%aac%d3%ef%d1%d4%b0%e6%b1%be%a3%a9.html
mb1504例程(8051的asm版本转c语言版本)

把例子中的程序转换了一下。欢迎大家的指正!
离线杨坤
发帖
203
只看该作者 34楼 发表于: 2009-11-28
好贴,顶。1503,07我就用的多。04没用过。不过程序都差不多
离线bg4ifx
发帖
381
只看该作者 35楼 发表于: 2009-11-29
这是个己用到diy小机器上的程序,大家参考一下.交流一下.欢迎指导.




//////////////////////////////////////////////////////////////////////////////////
//
//   mb1504 pll c   at89c2051
//
//////////////////////////////////////////////////////////////////////////////////
#define   pll_data   p1_2
#define   pll_clk   p1_3
#define   pll_en   p1_4

#define   jingzhen   6000


uint rnum;
uint nnum;

unsigned int finit=17050;
unsigned   int zhongpin=10000;
unsigned int step_data;

uchar stepinit=1; //步进khz, ////!!!!!!!!!!


////////////////////////////////////////////////////////////
void sendbit(uchar zn)   //发送一位子程序,
{
  if(zn)
  pll_data=1;     //data口置1;
  else
    pll_data=0;     //data口置0;

  pll_clk=0;       //移位肪冲,
  pll_clk=1;
  pll_clk=0;
            }
//....................................................................//
void sendbety(uchar sc,uchar sm) //发送多位子程序,数据由sc决定
{ uchar sb=0x80;             //,位数由sm决定,
  while(sm--)               //sm决定发送次数,
  { if(sc&sb)               //要发的位与1相与,为真的刚发1
      sendbit(1);
    else
      sendbit(0);           //为假的则发0;
      sb>>=1;}
        }
//.......................................................................//
void sendr(uint r_coun)         //设r分频系数,
{   uchar rcoun_h,rcoun_l;
     
  rcoun_l=r_coun;           //r分频数低8位,
  rcoun_h=(r_coun>>6);         //r分频数高6位,位该字节的高6位,
  sendbety(0x00,1);           //   0   64count
  sendbety(rcoun_h,6);
  sendbety(rcoun_l,8);
  sendbety(0x80,1);           //最后一位为1选r分频器,

  pll_en=0;           // 使能
  pll_en=1;
  pll_en=0;  
                    }
//........................................................................//
void sendan(uint an_count)         //设an分频系数,参数为整型数,
{   uint ncount;
  uchar nh,nl,a_count;
   
    a_count=an_count%64;      
    ncount=(an_count-a_count)/64; //计算分频系数n,
              //
     
    nl=ncount;
    nh=(ncount>>3);             //分离高低字节,
    sendbety(nh,3);             //分别发送高低字节,
    sendbety(nl,8);
    a_count<<=1;            
    sendbety(a_count,7);           //发送7位,      
    sendbety(0,1);               //最后位为0,选a寄数器,
  pll_en=0;
  pll_en=1;
  pll_en=0;

                }
//..........................................................................//
void fcout()
{
  pll_en=0;             //e为低,
  sendr(rnum);
            // r分频为1440.步进为10khz,

  sendan(nnum);
 
        }
//.........................................................................//
void countnum()
{
  step_data=((jingzhen/rnum)*nnum-zhongpin); //步进*分频系数-中频=当前频率khz
    dis_ram[4]=step_data/10000; //最高位,
    dis_ram[3]=(step_data%10000)/1000; //2
    dis_ram[2]=(step_data%1000)/100; //3
    dis_ram[1]=(step_data%100)/10; //4
    dis_ram[0]=(step_data%10); //2


            }
//===================================================================//
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线梭鱼
发帖
589
只看该作者 36楼 发表于: 2009-11-29
买了一堆1507,1504好像已经买不到了!!
离线HJBCHINA
只看该作者 37楼 发表于: 2010-07-09
请教 CCTVCCTV 关于MB1504程序的问题
1楼和15楼的程序编译的时候提示有三个警告,为什么,我还没上机测试看看能正常使用吗
离线HJBCHINA
只看该作者 38楼 发表于: 2010-07-28
非常感谢本版的mb1504程序,我都已经上机测试成功,程序都是可以使用的!!
离线BG6IRQ
发帖
294
只看该作者 39楼 发表于: 2010-08-16
路过学习。