论坛风格切换切换到宽版
  • 2256阅读
  • 1回复

MC145162的例程(C语言,所有程序未经验证!) [复制链接]

上一主题 下一主题
离线wb4916
 
发帖
213
只看楼主 倒序阅读 0楼 发表于: 2009-12-03
看代码是asm版本的,大家/自己理解起来诸多不便,于是转换成c语言版本之后再理解了,利己达人!
注意:为了便于大家查看。所有的空格就转给不可见字符了。20 20 20 20 转 a1 a1 a1 a1
请大家下载附件中的代码编译,请勿直接复制!



// http://hi.baidu.com/crsaw/blog/item/54c8cc01e51cb68fe850cd8f.html
//
// mc145162控制代码汇编源程序
// 2009年04月28日 04:13

// 一中频: 10.7mhz,超外差式接收,参考晶体:10.240mhz,步距:5khz
// tx参考频率=10.240mhz÷(512×4),rx参考频率=10.240mhz÷2048
// 控制字传输方式:串行输入,高位在前(adin=vss),mcu时钟:12mhz
// ----------------------------------------------------------------


#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char  // one byte


uchar tx_byth = 0;
uchar tx_bytl = 0;
uchar rx_byth = 0;
uchar rx_bytl = 0;

uchar i = 0;

sbit clk = p1^0;
sbit din = p1^1;
sbit enb = p1^2;


// 2009-12-2 14:07 函数声明
void initial(void);
void mcsend(uchar temp);
void mc5162(void);
void set_rtx(void);


// ----------------------------------------------------------------
void main(void)
{
  sp = 0x5f;  // 设置堆栈指针
  
  initial();  // 系统初始化
  
  mc5162();  // 初始化mc145162
  
  set_rtx ();  // 发送频率控制字
  enb = 0;  // 锁存
  
  while(1)
  {
    ;
  }
}


// ----------------------------------------------------------------
// 收/发频率控制字发送子程序
void set_rtx(void)
{
  mcsend(tx_byth);  // 先发送tx控制字
  mcsend(tx_bytl);
  
  mcsend(rx_byth);  // 再发送rx控制字
  mcsend(rx_bytl);
  
  enb = 1;  // enb置1
  _nop_();_nop_();  // 到延时并返回
}


// ---------------------------------
// 初始化mc145162控制寄存器子程序
void mc5162(void)
{
  enb = 1;  // 状态控制寄存器(8bit)
  mcsend(0x80);  // 调用串行发送子程序
  enb = 0;  // 锁存
  
  _nop_();_nop_();  // 稍延时
  
  enb = 1;  // 参考频率控制寄存器(32bit)
  mcsend(0x62);  // tx=fr2→d,tx0=1,rx0=0
  mcsend(0x00);  // tx参考频率z
  mcsend(0x88);  // rx=fr1→b
  mcsend(0x00);  // 本振参考
  enb = 0;  // 锁存
  
  _nop_();_nop_();
}

// ---------------------------------
// 向mc145162发送控制字子程序
void mcsend(uchar temp)
{
  // 发送8bit 已发送8bit?否,继续
  for(i=0;i<8;i++)
  {
    // 高位在前,输出1bit
    if(temp&0x80)
    {
      // c→din
      din = 1;
    }
    else
    {
      din = 0;
    }
    
    _nop_();
    
    clk = 1;
    _nop_();_nop_();
    
    clk = 0;
    
    temp <<= 1;
  }
  
  _nop_();_nop_();
  
  // 是,返回
}


// ----------------------------------------------------------------
// 系统初始化子程序
void initial(void)
{
  p1 = 0xf8;  // 初始化p1端口
  
  tx_byth = 0x17;  // 发射29.600mhz(5920×5)
  tx_bytl = 0x20;
  
  rx_byth = 0x1f;  // 本振40.300mhz(8060×5)
  rx_bytl = 0x7c;
}

// ----------------------------------------------------------------
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线wb4916
发帖
213
只看该作者 1楼 发表于: 2009-12-03
看代码是asm版本的,大家/自己理解起来诸多不便,于是转换成c语言版本之后再理解了,利己达人!
注意:为了便于大家查看。所有的空格就转给不可见字符了。20 20 20 20 转 a1 a1 a1 a1
请大家下载附件中的代码编译,请勿直接复制!



// http://www.hellocq.net/forum/showthread-t-203346.%b0%ef%c3%a6%bd%e2%be%f6mc145162%bb%e3%b1%e0%d6%d0%b4%e6%d4%da%b5%c4%ce%ca%cc%e2.html

// ********************************
// mc145162
// ********************************


#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char  // one byte

sbit clk = p1^0;
sbit dn = p1^1;
sbit enb = p1^2;


uchar i = 0;


// 2009-12-2 14:59 函数声明
void up8data(uchar temp);


void main(void)
{
  enb = 0;
  clk = 0;  // 时钟置0
  dn = 0;  // 数据口清零
  
  enb = 1;
  _nop_();_nop_();_nop_();
  
  // 发送定义功能数据
  up8data(0x80);  // #10000000b
  
  _nop_();_nop_();
  
  enb = 0;
  _nop_();_nop_();_nop_();
  
  enb = 1;
  
  // 发送参考频率数据(运行到此,锁定灯就熄灭)
  up8data(0x63);  // #01100011b
  up8data(0xe8);  // #11101000b
  up8data(0x67);  // #01100111b
  up8data(0x10);  // #00010000b
  
  _nop_();_nop_();_nop_();
  enb = 0;
  
  _nop_();_nop_();_nop_();
  
  // 发送分频数据
  up8data(0x00);  // #00000000b
  up8data(0xdc);  // #11011100b
  up8data(0x03);  // #00000011b
  up8data(0xe8);  // #11101000b
  
  enb = 1;
  _nop_();_nop_();_nop_();
  enb = 0;
  
  while(1)
  {
    ;
  }
}


void up8data(uchar temp)
{
  // 送8次子程序
  for(i=0;i<8;i++)
  {
    // 左移一位
    if(temp&0x80)
    {
      dn = 1;
    }
    else
    {
      dn = 0;
    }
    
    _nop_();_nop_();_nop_();_nop_();
    
    clk = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    
    clk = 0;
    _nop_();_nop_();_nop_();_nop_();
    
    temp <<= 1;
  }
}

// end