程序如下:
#include "reg51.h"
#include "intrins.h" //_nop_()延时函数用
#define uchar unsigned char
#define uint unsigned int
sbit S_CLOCK=P3^0;
//mc12429串行数据输入时钟控制端
sbit S_DATA=P3^1;
//mc12429串行数据输入端
sbit S_LOAD=P3^2; //mc12429移位寄存器控制端,串行输入时,为低电平;输入完成后,有点变高,再变低
/*******************11us延时函数************************************/
void delay(uint t)
{ for(;t>0;t--); }
/***************************mc12429写数据程序***********************/
void write_mc12429(uint f_val)
{
uint i;
S_CLOCK=0;
for(i=0;i<14;i++)
{
S_DATA=(bit)(f_val&0x8001);
S_CLOCK=0;
delay(1);
S_CLOCK=1;
f_val=f_val>>1;//右移一位
}
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
S_CLOCK=0;
delay(1);
S_LOAD=1;
delay(1);
S_LOAD=0;
}
/************************************************************/
/*Fout=28MHz(TESTout=7MHz)时,N=8(1,1),M=224(0xe0),此时T0~T2全为1.
故,f_val=0x80ff;
当Fout=48MHz,N=4(1,0),M=192,f_val=0x80cf;
/************************************************************/
void main()
{
write_mc12429(0x80ff);//f_val是配置M、N的值,进而来控制mc12429输出频率uint f_val
while(1);
}
说明:MC12429控制字写入方式有两种:一种是并行写入(通过S_DATA、S_CLOCK、S_LOAD三个端口),另一种是串行写入(通过P_LOAD、M[0...8]、N[0,1]).另:mc12429芯片带有个3位TEST寄存器,通过并行输入方式可以设置MC_TEST的输出类型,程序中向三个寄存器中都写了1,这样MC_TEST输出时钟的频率就为FOUT端输出频率的1/4(我用的示波器带宽是100M的,MC12429输出的时钟频率为25M~400MHz)。
问题:我用的是并行写入,用示波器检测MC_TEST端时,有时候能检测到方波(方波的波形间隔不一样,不具备规律性),有时候什么也检测不到。望高手指点!! |