?? pll.c
字號(hào):
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <absacc.h>
#include "mylib.h"
#include "intrins.h"
#define input0 in0.in0
#define input1 in1.in1
#define fm 0
#define am 1
#define up 1
#define down 0
sbit din=P1^5;
sbit clk=P1^6;
sbit dou=P3^7;
sbit cen=P1^4;
extern bit band;
union
{
ulong all;
struct
{
uchar addr :8; //8位輸入輸出模式選擇地址
uint frq :16; //16位電臺(tái)頻率數(shù)值
uchar cankao :4; //4位參考頻率選擇
uchar xs :1; //晶振選擇 0:4.5m 1:7.2mhz
uchar cte :1; //中頻計(jì)數(shù)控制 1:START 0:REST
uchar inp :2; //輸入頻率范圍選擇
}in0;
}in0;
union
{
ulong da;
struct
{
uchar addr :8; //8位輸入輸出模式選擇地址
uchar bnc :1; //空輸出B01-B04四個(gè)輸出口,可以控制外圍的電路,常用來做波段切換。
uchar stmo :1; //立體單聲道強(qiáng)制轉(zhuǎn)換 設(shè)置為1可以選擇單聲道輸出
uchar ifen :1; //中頻緩沖輸出使能 設(shè)置為0選擇中頻輸出同時(shí)凈音
uchar band :1; //波段選擇 設(shè)置為0選擇調(diào)頻
uchar io :2; //兩個(gè)可以定義的端口,可以做輸入也可做輸出。再此程序中IO1空,IO2為立體聲檢測(cè)腳
uchar ioc :2; //設(shè)置IO口的工作模式,為0時(shí)設(shè)置為輸入模式,反之。
uchar dz :2; //鎖相環(huán)死區(qū)控制,不是很重要。
uchar ul :2; //鎖相環(huán)控制電壓輸出驅(qū)動(dòng)模式設(shè)01時(shí)為直接輸出模式(一般采用此種模式)
uchar doc :3; //設(shè)置輸出數(shù)據(jù)端DO腳的輔助功能設(shè)置010時(shí)將指示中頻測(cè)量的完成狀況
uchar dnc :1; //空數(shù)據(jù)位,不用。
uchar test :3; //測(cè)試模式一般全部設(shè)置為0
uchar ifs :1; //中頻計(jì)數(shù)器控制,一般設(shè)置為1,主要設(shè)置中頻場(chǎng)強(qiáng)(1:40毫伏0:70毫伏)
uchar dlc :1; //電荷泵輸出,正常狀態(tài)為0,設(shè)置為1時(shí)拉低電位。
uchar tbc :1; //設(shè)置為1時(shí)使B01口輸出8HZ的基準(zhǔn)脈沖,此時(shí)B01口將不能作為通用輸出口。
uchar gt :2; //中頻測(cè)量時(shí)間設(shè)置最大64MS最小4MS當(dāng)GT=00時(shí),前兩中等待時(shí)間3-4MS后兩中等待時(shí)間為7-8MS,中頻信號(hào)必須在等待時(shí)間結(jié)束之前輸入!!
}in1;
}in1;
void iniband()
{
input0.addr=0x14; //輸入模式1的地址
input0.xs =0x00; //選擇0為4.5MHZ晶體
input0.cte =0x00; //鎖相環(huán)內(nèi)部使能位設(shè)置0復(fù)位設(shè)置為1開始計(jì)數(shù)。
input1.addr=0x94; //輸入模式2的地址
input1.bnc =0x00; //B04本設(shè)計(jì)未用
input1.stmo=0x00; //默認(rèn)為立體聲輸出
input1.ifen=0x01; //中頻輸出緩沖暫時(shí)關(guān)閉
input1.io =0x00; //沒有用到,但是可以做為立體聲單聲道信號(hào)檢測(cè)
input1.ioc =0x00; //將上兩個(gè)腳全部設(shè)置為輸出
input1.dz =0x00; //此設(shè)置效果不是很明顯可以設(shè)置捕捉范圍
input1.ul =0x01; //將鎖相環(huán)的誤差電壓直接輸出可以設(shè)置捕捉靈敏度
input1.doc =0x00; //將DOUT腳的輔助功能設(shè)置為中頻計(jì)數(shù)狀態(tài)檢測(cè)
input1.dnc =0x00; //空的數(shù)據(jù)位
input1.test=0x00; //全部設(shè)置為0設(shè)置為正常狀態(tài)
input1.ifs =0x00; //中頻輸入信號(hào)強(qiáng)度控制設(shè)置此狀態(tài),最大限度的減少誤臺(tái)
input1.dlc =0x00; //設(shè)置電荷泵正常輸出
input1.tbc =0x00; //設(shè)置為1時(shí)B01將輸出8HZ的基準(zhǔn)信號(hào)但是BO1本收音電路設(shè)置為FM/AM轉(zhuǎn)換,應(yīng)設(shè)置為零
input1.gt =0x01; //將中頻測(cè)量時(shí)間設(shè)置為4MS設(shè)置太高自動(dòng)搜索整個(gè)頻段將會(huì)很長(zhǎng)
}
void iniband1(bit band)//設(shè)置調(diào)頻調(diào)幅的不同部分
{
if(band==fm)
{
input0.cankao=0x0c; //FM步進(jìn)頻率50KHZ
input0.inp=0x01; //輸入頻率范圍10-160MHZ
input1.band=fm;
}
else
{
input0.cankao=0x05; //AM步進(jìn)頻率10KHZ
input0.inp=0x00; //輸入頻率范圍0.5-10MHZ
input1.band=am;
}
}
ulong stepserch(bit direction,uint freq)//單步搜索形參:步進(jìn)方向,和基頻率
{
uchar c;
uint a; //根據(jù)
c=(input1.band)?0x10:0x01; //根據(jù)波段選擇步進(jìn)數(shù)據(jù)AM每次加0X10 FM每次加0X01,具體原因參照數(shù)據(jù)手冊(cè)上他們加載頻率時(shí)的不同點(diǎn)。
a=direction?(swdata(freq)+c):(swdata(freq)-c);//根據(jù)步進(jìn)方向決定是加還是減。由于頻率數(shù)據(jù)是反向加載的,如頻率計(jì)算出是:0101 而加載時(shí)卻是1010 一定注意?。。。。。。。。。。。。。。?!
input0.frq=swdata(a); //再將已經(jīng)加減后的頻率數(shù)據(jù)反向存儲(chǔ)
input0.cte=0;
wrdata(in0.all); //復(fù)位鎖相環(huán)IC72131內(nèi)部的中頻記數(shù)控制位
input0.cte=1;
wrdata(in0.all); //打開鎖相環(huán)IC72131內(nèi)部的中頻記數(shù)控制位 ,單應(yīng)該注意的是即使打開記數(shù)功能位內(nèi)部電路不會(huì)立刻記數(shù),而是延時(shí)一段時(shí)間(3-7MS,內(nèi)部自動(dòng)延時(shí))
input1.ifen=0;
wrdata(in1.da); //在上一語句的3-7MS延時(shí)之內(nèi)應(yīng)打開外部的中頻緩沖,開始記數(shù)!
delay50(); //一般中頻記數(shù)時(shí)間在64MS之內(nèi),本程序選擇32MS,所以延時(shí)50MS已經(jīng)足夠了
delay50();
input1.ifen=1;
wrdata(in1.da); //記數(shù)結(jié)束后關(guān)閉中頻緩沖,并取消靜音狀態(tài)!
return(rddata()); //讀出中頻記數(shù)的值,看是否為AM-450KHZ FM-10。7MHZ,如果是說明已經(jīng)準(zhǔn)確搜到臺(tái)。
}
uint swdata(uint x) //將2個(gè)字節(jié)的數(shù)值反向。
{
uint b;
uchar a;
for(a=0;a<16;a++)
{
b=(x&0x0001)?((b<<1)+1):(b<<1);
x=x>>1;
}
return(b);
}
wrdata(ulong dat) //寫四個(gè)字節(jié)的功能和數(shù)據(jù)給72131,72131有3個(gè)象這樣的數(shù)據(jù),并且每次4個(gè)字節(jié)一個(gè)數(shù)據(jù),分別對(duì)應(yīng)數(shù)據(jù)手冊(cè)上的IN0,IN1,和DOUT,控制段!
{ //IN0數(shù)據(jù)段主要發(fā)送頻率數(shù)據(jù)和參考頻率,其他請(qǐng)參考數(shù)據(jù)手冊(cè)!
uchar count;
cen=0;
for(count=0;count<32;count++)
{
_nop_();
_nop_();
_nop_();
clk=1;
if(dat&0x80000000)
din=1;
else
din=0;
dat=dat<<1;
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
if(count==7)
cen=1;
_nop_();
_nop_();
_nop_();
}
cen=0; //可以參考發(fā)送時(shí)序圖
}
ulong rddata(void)//讀出中頻記數(shù)值和收音的各個(gè)狀態(tài):如是否鎖定,單聲道立體聲等??!
{
uchar count;
ulong ifcount;
uchar addr=0x54;
cen=0;
for(count=0;count<32;count++)
{
if(count<8)
{
_nop_();
_nop_();
_nop_();
clk=1;
if(addr&0x80)
din=1;
else
din=0;
addr=addr<<1;
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
if(count==7)
cen=1;
_nop_();
_nop_();
_nop_();
}
else
{
_nop_();
_nop_();
_nop_();
clk=1;
_nop_();
_nop_();
_nop_();
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
dou=1;
ifcount=(dou)?((ifcount<<1)+1):(ifcount<<1);
}
}
cen=0;
return(ifcount&0x000fffff);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -