?? 9850 step+wave+ask+psk ok.c
字號:
//*********************************************************
//File Name :AD9850.c
//Author :GHL
//Date :2007/8/16
//Desciption :AD9850的控制字串行加載程序
// 加入鍵盤實現步進
// 方波序列10kpbs
// 加入ASK
// 加入液晶顯示方波序列的輸出
// 加入鍵盤選擇ASK,PSK
//*********************************************************
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define key_bus P1
#define lcd_bus P2
//與9850有關的定義
sbit sclk=P0^0; //W_CLK
sbit load=P0^1; //FQUD
sbit sdata=P0^2; //DATA
sbit sqwave=P3^0; //輸出方波
//與1602有關的定義
sbit rs=P0^5;
sbit rw=P0^6;
sbit e=P0^7;
sbit busy=lcd_bus^7;
uchar aorp=0;
unsigned char code key_decode[]={'*',0,'#','D',7,8,9,'C',4,5,6,'B',1,2,3,'A'};
unsigned char code wave1[]={0,0,1,0,0,0,1,1,0,1,1,1,0,0,0,1};
uchar code str1[]="START F:1000HZ STEP 100HZ";
uchar code str2[]="ASK MODULE:";
uchar code str3[]="PSK MODULE:";
unsigned char m=0;
uchar k;
/*************************延時子程序********************************/
delay(uchar d)
{
while(--d);
}
/**********判斷忙標志,返回的是一個位BF**********/
bit lcd_busy(void)
{
uchar bflag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
bflag=lcd_bus;
e=0;
return(bit)(bflag&0x80);
}
void lcd_wrcmd(uchar cmd)
{
while(lcd_busy());
lcd_bus=cmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/************向液晶片寫數據***************/
void lcd_wrdata( uchar lcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/*************************液晶初始化程序********************************/
void lcd_ini(void)
{
lcd_wrcmd(0x38);
delay(100);
lcd_wrcmd(0x0f);
delay(100);
lcd_wrcmd(0x06);
delay(100);
lcd_wrcmd(0x01);
delay(100);
}
//////////////////////////////////////////////
//
// 生成漢字子模函數
// 當lcd_wrdata(0);顯示第一個漢字
// 當lcd_wrdata(1);顯示第二個漢字
//
//////////////////////////////////////////////
/*lcd_h()
{
uchar i;
lcd_wrcmd(0x40);
for(i=0;i<24;i++) lcd_wrdata(hanzi[i]);
}
/*************************AD9850產生相位為0正弦波********************************/
AD9850_0(float freq)
{
float fw;
uchar i,j,temp;
uchar d[5];
fw=freq*34.359738368;
d[4]=0;
d[0]=(unsigned long)fw;
d[1]=(unsigned long)fw>>8;
d[2]=(unsigned long)fw>>16;
d[3]=(unsigned long)fw>>24;
load=0;
sclk=0;
sclk=1;
sclk=0;
load=1;
load=0;
for(i=0;i<5;i++)
{
temp=d[i];
for(j=0;j<8;j++)
{
sclk=0;
if(temp&1) sdata=1;
else sdata=0;
sclk=1;
temp=temp>>1;
}
}
load=1;
load=0;
}
/*************************AD9850產生相位為180正弦波********************************/
AD9850_180(float freq)
{
float fw;
uchar i,j,temp;
uchar d[5];
fw=freq*34.359738368;
d[4]=0X80;
d[0]=(unsigned long)fw;
d[1]=(unsigned long)fw>>8;
d[2]=(unsigned long)fw>>16;
d[3]=(unsigned long)fw>>24;
load=0;
sclk=0;
sclk=1;
sclk=0;
load=1;
load=0;
for(i=0;i<5;i++)
{
temp=d[i];
for(j=0;j<8;j++)
{
sclk=0;
if(temp&1) sdata=1;
else sdata=0;
sclk=1;
temp=temp>>1;
}
}
load=1;
load=0;
}
/************矩陣鍵盤讀鍵程序*******************/
unsigned char keytest()
{
unsigned char keycode=0xff,temp,i;
key_bus=0x0f;
temp=key_bus&0x0f;
if(temp!=0x0f) //有鍵按下
{
key_bus=0x7f;
for(i=0;i<4;i++)
{
temp=key_bus&0x0f;
if(temp==0x07) //輸出端口示數
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
key_bus=(key_bus>>1)|0x80;
}
while((key_bus&0x0f)!=0x0f) //等待釋放
{
key_bus=0x0f;
}
}
return keycode;
}
/*********定時器初始化程序******/
void Init_Timer ()
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=~(100/256);
TL0=~(100%256);
TR0=0;
/************T0中斷服務程序*****************/
void timer0 (void) interrupt 1 using 1
{
uchar flag;
//EA=0;
TH0=~(100/256);
TL0=~(100%256);
flag=wave1[k];
// sqwave=wave1[k];
k=(k+1)%15;
if(aorp==0)
{
if(flag==1)
{
AD9850_0(100000);
}
else if(flag==0)
{
AD9850_0(0);
}
}
else if(aorp==1)
{
if(flag==1)
{
AD9850_0(100000);
}
else if(flag==0)
{
AD9850_180(100000);
}
}
//EA=1;
}
main()
{
long freq=1000;
unsigned char keycode;
uchar *p,count,lcd[15];
uchar i;
lcd_ini();
Init_Timer();
while(1)
{
keycode=keytest();
if(keycode==0xff)
{
delay(10000);
continue;
}
if(key_decode[keycode]==1)
{
TR0=0;
AD9850_180(1000);
lcd_wrcmd(0x01);
delay(100);
lcd_wrcmd(0x80);
for(i=0;i<15;i++)
{
lcd_wrdata(str1[i]);
}
lcd_wrcmd(0xc0);
for(i=15;i<25;i++) lcd_wrdata(str1[i]);
}
else if(key_decode[keycode]==2)
{
TR0=0;
freq=freq+100;
AD9850_0(freq);
}
else if(key_decode[keycode]==3)
{
TR0=0;
freq=freq-100;
AD9850_0(freq);
}
{
TR0=0;
aorp=0;
m=0;
lcd_wrcmd(0x01);
delay(100);
lcd_wrcmd(0x80);
for(i=0;i<11;i++)
{
lcd_wrdata(str2[i]);
}
while(m<15)
{
if(wave1[m]==1)lcd[m]='1'; //在液晶上顯示方波序列
else if(wave1[m]==0)lcd[m]='0';
m++;
}
p=lcd;
lcd_wrcmd(0xc0); //從第2行第0個位置開始寫
for(count=0;count<15;count++)
{
lcd_wrdata(*p++);
delay(100);
}
TR0=1;
}
else if(key_decode[keycode]==5) //按5鍵選擇PSK調制功能
{
TR0=0;
aorp=1;
m=0;
lcd_wrcmd(0x01);
delay(100);
lcd_wrcmd(0x80);
for(i=0;i<11;i++)
{
lcd_wrdata(str3[i]);
}
while(m<15)
{
if(wave1[m]==1)lcd[m]='1';
else if(wave1[m]==0)lcd[m]='0';
m++;
}
p=lcd;
lcd_wrcmd(0xc0);
for(count=0;count<15;count++)
{
lcd_wrdata(*p++);
delay(100);
}
TR0=1;//Init_Timer();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -