?? pll.c
字號:
/*
好利來音響部設計
未經同意不得散布于網絡
2005年2月15日
*/
/*
本項目專門為宣傳本站的51 PIC AVR 多功能學習開發板而奉獻,僅供參考,請勿做商業用途,歡迎轉載但要保留本站信息
志博電子專注于8位單片機開發板設計和教學
讓人耳目一心的經濟又豪華型開發板
性價比最高
僅售378!
歡迎訪問我們的網站 www.elecmcu.com
*/
#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=P2^2;
sbit clk=P2^1;
sbit dou=P2^0;
sbit cen=P2^3;
extern uchar band;
union
{
ulong all;
struct
{
uchar addr :8; //8位輸入輸出模式選擇地址
uint frq :16; //16位電臺頻率數值
uchar cankao :4; //4位參考頻率選擇
uchar xs :1; //晶振選擇 0:4.5m 1:7.2mhz
uchar cte :1; //中頻計數控制 1:START 0:REST
uchar inp :2; //輸入頻率范圍選擇
}in0;
}in0;
union
{
ulong da;
struct
{
uchar addr :8; //8位輸入輸出模式選擇地址
uchar bnc :1; //空輸出B01-B04四個輸出口,可以控制外圍的電路,常用來做波段切換。
uchar stmo :1; //立體單聲道強制轉換 設置為1可以選擇單聲道輸出
uchar ifen :1; //中頻緩沖輸出使能 設置為0選擇中頻輸出同時凈音
uchar band :1; //波段選擇 設置為0選擇調頻
uchar io :2; //兩個可以定義的端口,可以做輸入也可做輸出。再此程序中IO1空,IO2為立體聲檢測腳
uchar ioc :2; //設置IO口的工作模式,為0時設置為輸入模式,反之。
uchar dz :2; //鎖相環死區控制,不是很重要。
uchar ul :2; //鎖相環控制電壓輸出驅動模式設01時為直接輸出模式(一般采用此種模式)
uchar doc :3; //設置輸出數據端DO腳的輔助功能設置010時將指示中頻測量的完成狀況
uchar dnc :1; //空數據位,不用。
uchar test :3; //測試模式一般全部設置為0
uchar ifs :1; //中頻計數器控制,一般設置為1,主要設置中頻場強(1:40毫伏0:70毫伏)
uchar dlc :1; //電荷泵輸出,正常狀態為0,設置為1時拉低電位。
uchar tbc :1; //設置為1時使B01口輸出8HZ的基準脈沖,此時B01口將不能作為通用輸出口。
uchar gt :2; //中頻測量時間設置最大64MS最小4MS當GT=00時,前兩中等待時間3-4MS后兩中等待時間為7-8MS,中頻信號必須在等待時間結束之前輸入!!
}in1;
}in1;
void iniband()
{
input0.addr=0x14; //輸入模式1的地址
input0.xs =0x00; //選擇0為4.5MHZ晶體
input0.cte =0x00; //鎖相環內部使能位設置0復位設置為1開始計數。
input1.addr=0x94; //輸入模式2的地址
input1.bnc =0x00; //B04本設計未用
input1.stmo=0x00; //默認為立體聲輸出
input1.ifen=0x01; //中頻輸出緩沖暫時關閉
input1.io =0x00; //沒有用到,但是可以做為立體聲單聲道信號檢測
input1.ioc =0x00; //將上兩個腳全部設置為輸出
input1.dz =0x00; //此設置效果不是很明顯可以設置捕捉范圍
input1.ul =0x01; //將鎖相環的誤差電壓直接輸出可以設置捕捉靈敏度
input1.doc =0x00; //將DOUT腳的輔助功能設置為中頻計數狀態檢測
input1.dnc =0x00; //空的數據位
input1.test=0x00; //全部設置為0設置為正常狀態
input1.ifs =0x01; //中頻輸入信號強度控制設置此狀態,最大限度的減少誤臺
input1.dlc =0x00; //設置電荷泵正常輸出
input1.tbc =0x00; //設置為1時B01將輸出8HZ的基準信號但是BO1本收音電路設置為FM/AM轉換,應設置為零
input1.gt =0x01; //將中頻測量時間設置為32MS設置太高自動搜索整個頻段將會很長
}
void iniband1(uchar band)//設置調頻調幅的不同部分
{
if(band==fm)
{
input0.cankao=0x0c; //FM步進頻率50KHZ
input0.inp=0x01; //輸入頻率范圍10-160MHZ
input1.band=fm;
input1.ifs=0x00;
}
else
{
input0.cankao=0x05; //AM步進頻率10KHZ
input0.inp=0x00; //輸入頻率范圍0.5-10MHZ
input1.band=am;
input1.ifs=0x01;
}
}
ulong stepserch(bit direction,uint freq)//單步搜索形參:步進方向,和基頻率
{
uchar c;
uint a; //根據
c=(input1.band)?0x10:0x01; //根據波段選擇步進數據AM每次加0X10 FM每次加0X01,具體原因參照數據手冊上他們加載頻率時的不同點。
a=direction?(swdata(freq)+c):(swdata(freq)-c);//根據步進方向決定是加還是減。由于頻率數據是反向加載的,如頻率計算出是:0101 而加載時卻是1010 一定注意!!!!!!!!!!!!!!!!
input0.frq=swdata(a); //再將已經加減后的頻率數據反向存儲
input0.cte=0;
wrdata(in0.all); //復位鎖相環IC72131內部的中頻記數控制位
input0.cte=1;
wrdata(in0.all); //打開鎖相環IC72131內部的中頻記數控制位 ,單應該注意的是即使打開記數功能位內部電路不會立刻記數,而是延時一段時間(3-7MS,內部自動延時)
input1.ifen=0;
wrdata(in1.da); //在上一語句的3-7MS延時之內應打開外部的中頻緩沖,開始記數!
delaytime(5000); //一般中頻記數時間在64MS之內,本程序選擇32MS,所以延時50MS已經足夠了
while(!dou);
input1.ifen=1;
wrdata(in1.da); //記數結束后關閉中頻緩沖,并取消靜音狀態!
return(rddata()); //讀出中頻記數的值,看是否為AM-450KHZ FM-10。7MHZ,如果是說明已經準確搜到臺。
}
uint swdata(uint x) //將2個字節的數值反向。
{
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) //寫四個字節的功能和數據給72131,72131有3個象這樣的數據,并且每次4個字節一個數據,分別對應數據手冊上的IN0,IN1,和DOUT,控制段!
{ //IN0數據段主要發送頻率數據和參考頻率,其他請參考數據手冊!
uchar count;
cen=0;
for(count=0;count<32;count++)
{
_nop_();
clk=1;
if(dat&0x80000000)
din=1;
else
din=0;
dat=dat<<1;
clk=0;
_nop_();
clk=1;
if(count==7)
cen=1;
_nop_();
}
cen=0; //可以參考發送時序圖
}
ulong rddata(void)//讀出中頻記數值和收音的各個狀態:如是否鎖定,單聲道立體聲等!!
{
uchar count;
ulong ifcount;
uchar addr=0x54;
cen=0;
for(count=0;count<32;count++)
{
if(count<8)
{
_nop_();
clk=1;
if(addr&0x80)
din=1;
else
din=0;
addr=addr<<1;
clk=0;
_nop_();
clk=1;
if(count==7)
cen=1;
_nop_();
}
else
{
_nop_();
clk=1;
_nop_();
clk=0;
_nop_();
clk=1;
dou=1;
ifcount=(dou)?((ifcount<<1)+1):(ifcount<<1);
}
}
cen=0;
return(ifcount&0x000fffff);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -