这是个己用到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
}
//===================================================================//