📄 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);
}
else if(key_decode[keycode]==4) //按4键选择ASK调制功能
{
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 + -