?? mad9850fap_test1.c
字號:
/*
名稱:AD9850測試程序
功能描述:輸出頻率、頻率步進值、幅值均可調
4個按鍵接在 P3.0 -- 調幅
P3.1 -- 調步進值
P3.2 -- 頻率加
P3.3 -- 頻率減
按鍵低電平有效。
程序中的顯示部分 用的是4位數(shù)碼管 顯示步進值,用戶可根據(jù)需要自行改用其他顯示
P0 -- 段碼輸出口
P2 -- 位碼輸出口
P3.5 -- 573使能口
//備注:調試通過
*/
//**********************************************
#include<reg52.h>
#include<intrins.h> //包含右移
#include<math.h>
/*數(shù)碼管送段碼函數(shù)*/
#define Ledbit(temp) P3 &=0XDF; P2 =temp; P3 |=0X20;
/*數(shù)碼管送段位函數(shù)*/
#define Ledseg(temp) P3 &=0XDF;P0 =temp; P3 |=0X20;
sbit UPDCLK = P2^0; //20 更新時鐘,上升沿鎖存數(shù)據(jù)到編程寄存器
sbit MRESET = P2^1; //71 主復位端,高電平有效復位
sbit PMODE = P2^2; //70 串并編程模式選擇 0:串行 1:并行
sbit WRCLK = P2^3; //21 寫端口數(shù)據(jù) 上升沿鎖存數(shù)據(jù)
sbit RDCLK = P2^4; //22 讀端口數(shù)據(jù) 高電平讀
sbit F_B_H = P2^5; //29 低電平
sbit OSK = P2^6; //30
sbit DATACLK= P1^0; //高電平有效,選中數(shù)據(jù)鎖存器,低電平鎖存
sbit ADDRCLK= P1^1; //高電平有效,選中地址鎖存器,低電平鎖存
sbit CONCLK = P1^2; //高電平有效,選中外部控制端驅運器,低電平鎖存
sbit PD = P1^4;
sbit EN = P1^5;
sbit SCLK = P1^6;
sbit SDATA = P1^7;
//unsigned char Address; //寄存器地址
//unsigned char PortReg; //控制端口寄存器
//unsigned char MultReg; //乘法寄存器
//unsigned char ModeReg; //工作模式寄存器
//unsigned char PowerReg; //功率寄存器
unsigned char AH,AL; // 振幅字
unsigned char PH,PL; // 相位字
unsigned char resulth[4],resultm[4],resultl[4];
unsigned long int fwh,fwm,fwl;
unsigned char FWord[6]; // 存放頻率字
unsigned long int fbj; // 頻率步進值
unsigned long int pref; //要輸出的頻率值
unsigned char code led_code[20]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, //數(shù)碼管顯示段碼
0x90,0x88,0x83,0xc6,0xa1,0x86,0x81,0x7f,0xff,0xb7,0xb6};
unsigned char data dis_data[4]={0x00,0x00,0x00,0x00}; //顯示緩沖區(qū)
unsigned char idata dis_bit[4]={0x7f,0xbf,0xdf,0xef};//位碼單元
void WriteData(unsigned char DataByte); //寫字節(jié)數(shù)據(jù)
void WriteADDR(unsigned char DATAAddress); //寫寄存器地址
void UpdataFWord(void); //頻率字更新
void UpdataAWord(void); //振幅字更新
void UpdataPWord(void); //相位字更新
void fck_hz(unsigned long int mf); //頻率計算
void convertdoub_long(void); //長整型轉1字節(jié)
void coutFWord(void); // 頻率字計算
void switchpowrd(void); // 計算 要寫入的預設頻率的頻率字
void Get_key(void); // 按鍵
void switchdata(void); //步進值拆碼
void display(unsigned char *p,unsigned char n); //顯示步進值
delay(unsigned int n);
void Delayms(unsigned int ms);
//*********************************
void main()
{
unsigned char n;//,ku;
P3 = 0XFF;
AH = 0XFF; // 振幅初始值
AL = 0XFF;
// PH = 0XFF; // 相位初始值
// PL = 0XFF;
fbj = 1; // 頻率步進 初始值 1hz
pref = 1; // 頻率初始值 1hz
//MultReg = 0x46; //乘法器
//PortReg = 0x04; //控制端口
P2=0;
DATACLK=0;
ADDRCLK=0;
P2=0x06; //設置成并行模式,并復位
for(n=5;n>0;)
n--;
P2=0x04;
CONCLK =0; //鎖存控制端口狀態(tài)
//*************************
WriteADDR(0x1E); //寫乘法器地址
WriteData(0x46); //初始化乘法器,打開倍速頻器,倍頻6x50=300Mhz
// 4*50=200Mhz
//WriteADDR(0x1f); //工作模式選擇地址
//WriteData(0x03); //模式001,是 Unramped FSK模式 ,Ramped FSK (Mode 010)
WriteADDR(0x20); //反辛格函數(shù)濾波器地址
WriteData(0X60); //0X60 是關閉反辛格函數(shù)濾波,0X20是打開反辛格函數(shù)濾波
UpdataAWord(); // 寫 幅值
switchpowrd(); // 計算 要寫入的預設頻率的頻率字
UpdataFWord(); // 寫頻率字
while(1)
{
// for(ku=0;ku<5;ku++)
// {
// UpdataAWord();
// UpdataPWord();
//switchpowrd();
// UpdataFWord();
// }
while(P3==0xff) //等待按鍵按下
{
switchdata();
display(dis_data,4);
}
Get_key(); //讀鍵并處理
}
}
//*********************************
//***振幅字更新
void UpdataAWord(void)
{
WriteADDR(0x21); //幅度字高字節(jié)地址
WriteData(AH); //幅度字高字節(jié)
WriteADDR(0x22); //幅度字低字節(jié)地址
WriteData(AL);
}
/*
//*********************************
//***相位字更新
void UpdataPWord(void)
{
WriteADDR(0x00); //相位字高字節(jié)地址
WriteData(PH); //幅度字高字節(jié)
WriteADDR(0x01); //幅度字低字節(jié)地址
WriteData(PL);
}
*/
//*********************************
// 入口參數(shù) mf 表示 要輸出的頻率值
// 0x0e,0x51,0x0a 的由來是:2^48/300000000hz=938249.9 = 0x0E510a
void fck_hz(unsigned long int mf)
{
fwh = mf*0x0e;
fwm = mf*0x51;
fwl = mf*0x0a;
}
void convertdoub_long(void) //將長整型數(shù) 轉化成字節(jié)
{
unsigned char c=0;
unsigned char i=0;
for(i=0;i<4;i++)
{
resultl[i]=0;
resultm[i]=0;
resulth[i]=0;
}
i=0;
while(fwl/256)
{
c=fwl%256;
resultl[i++]=c;
fwl=fwl/256;
}
c=fwl%256;
resultl[i++]=c;
i=0;
while(fwm/256)
{
c=fwm%256;
resultm[i++]=c;
fwm=fwm/256;
}
c=fwm%256;
resultm[i++]=c;
i=0;
while(fwh/256)
{
c=fwh%256;
resulth[i++]=c;
fwh=fwh/256;
}
c=fwh%256;
resulth[i++]=c;
}
void coutFWord(void) // 計算頻率字碼
{
unsigned int md1=0,md2=0,md3=0,md4=0;
unsigned char mh=0;
FWord[0]=resultl[0];
md1=resultm[0]+resultl[1];
FWord[1]=md1;
md1=md1&0xff00;
mh=md1>>8;
md2=resulth[0]+resultm[1]+resultl[2]+mh;
FWord[2]=md2;
md2=md2&0xff00;
mh=md2>>8;
md3=resulth[1]+resultm[2]+resultl[3]+mh;
FWord[3]=md3;
md3=md3&0xff00;
mh=md3>>8;
md4=resulth[2]+resultm[3]+mh;
FWord[4]=md4;
md4=md4&0xff00;
mh=md4>>8;
FWord[5]=resulth[3]+mh;
}
void switchpowrd(void) // 寫入目標頻率 并計算頻率字
{
fck_hz(pref);
convertdoub_long();
coutFWord();
}
//***頻率字更新
void UpdataFWord(void)
{
WriteADDR(0x04);
WriteData(FWord[5]); //頻率字最高字節(jié)
WriteADDR(0x05);
WriteData(FWord[4]);
WriteADDR(0x06);
WriteData(FWord[3]);
WriteADDR(0x07);
WriteData(FWord[2]);
WriteADDR(0x08);
WriteData(FWord[1]);
WriteADDR(0x09);
WriteData(FWord[0]); //頻率字最低字節(jié)
}
//*********************************
//***寫入數(shù)據(jù)
void WriteData(unsigned char DataByte)
{
unsigned char bdata x,y;
x =DataByte;
y =0;
if(x&0x01) //數(shù)據(jù)格式旋轉180
y=y|0x80; //由D7 D6 D5 D4 D3 D2 D1 D0
if(x&0x02) // D0 D1 D2 D3 D4 D5 D6 D7
y=y|0x40;
if(x&0x04)
y=y|0x20;
if(x&0x08)
y=y|0x10;
if(x&0x10)
y=y|0x08;
if(x&0x20)
y=y|0x04;
if(x&0x40)
y=y|0x02;
if(x&0x80)
y=y|0x01;
P2=y;
DATACLK=1; //鎖存數(shù)據(jù)
DATACLK=0;
}
//*********************************
//***完整地址
void WriteADDR(unsigned char DATAAddress)
{
P2=DATAAddress;
ADDRCLK=1;
ADDRCLK=0;
P2=0x04;
CONCLK = 1;
WRCLK=1;
WRCLK=0;
CONCLK = 0;
}
//按鍵程序****************************************************************
void Get_key(void)
{
unsigned char temp;
Delayms(50); //延時消抖
if(P3==0xff)return;
temp=P3;
switch(temp)
{
case 0xfe: // 振幅調節(jié) 減 若 0xffff 對應800mv(實際情況并不一定是800mv)
{ // 則此處 的調節(jié) 振幅是
AL=AL-0X33; // 每 按鍵一次 減 10mv
if(AL<0X12)
{
AL = 0XFF;
AH=AH-0X01;
if(AH<0X01)
{AH = 0XFF;
AL = 0XFF;
}
}
UpdataAWord();
}
break;
case 0xfd: //頻率步進 控制鍵
{
if(fbj<=10) // 步進值小于10hz時,每按鍵一次步進值+1hz
{fbj=fbj+1;}
if(fbj>10&&fbj<=100) // 步進值小于100hz,大于10hz時,每按鍵一次步進值+10hz
{fbj=fbj+10;}
if(fbj>100&&fbj<=1000) // 意思 同上
{fbj=fbj+100;}
if(fbj>1000&&fbj<=10000)
{fbj=fbj+1000;}
if(fbj>10000&&fbj<=100000)
{fbj=fbj+10000;}
if(fbj>100000&&fbj<=1000000)
{fbj=fbj+100000;}
if(fbj>999999) // 最大步進值 999999hz
{fbj=1;}
}
break;
case 0xfb: //頻率加調整
{
pref = pref+fbj;
if(pref>200000000) // 200MHZ
{pref=1;}
switchpowrd();
UpdataFWord();
}
break;
case 0xf7: //頻率減調整
{
if(pref>=fbj)
{
pref = pref-fbj;
if(pref<fbj)
{pref = 1;}
}
switchpowrd();
UpdataFWord();
}
/* { // 相移鍵
PL=PL-0X33;
if(PL<0X12)
{
PH=PH-0X01;
if(PH<0X01)
{PH = 0XFF;
PL = 0XFF;
}
}
}*/
break;
default: break;
}
//while(!(P3==0xff)); //等待按鍵釋放
//Delayms(800);
}
void switchdata(void)
{
if(fbj<9999)
{
dis_data[0]=fbj/1000; //gao
dis_data[1]=fbj%1000/100;
dis_data[2]=fbj%100/10;
dis_data[3]=fbj%10; //di
}
if(fbj>9999&&fbj<99999)
{
dis_data[0]=18; //gao // 標志位
dis_data[1]=fbj/10000; // 有效位
dis_data[2]=fbj%10000/1000; // 有效位
dis_data[3]=3; //di //3 表示 有效位后 0 的個數(shù)
}
if(fbj>99999&&fbj<999999)
{
dis_data[0]=19; //gao // 標志位
dis_data[1]=fbj/100000; // 有效位
dis_data[2]=fbj%100000/10000; // 有效位
dis_data[3]=4; //di //4 表示 有效位后 0 的個數(shù)
}
}
void display(unsigned char *p,unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
{
Ledbit(dis_bit[i]); //送段碼
Ledseg(led_code[p[i]]); //送位碼
delay(40); //顯示延時:小于20/i 秒
Ledseg(0Xff); //消隱
}
}
delay(unsigned int n)
{
while(n)
n--;
}
void Delayms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i=126;i>1;i--);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -