?? shiboqi.c
字號:
//-----------------------------------------
//
//2007年全國電子設(shè)計大賽培訓(xùn)專用
// 基于DDS的信號發(fā)生器
// Design By BoBo&ShuiJian
//------------------------------------------
#include<reg51.h>
#include<absacc.h>
#include<stdio.h>
#include"LCD.h"
//----------每位的控制字-----------------
#define FF7 357913941//858993459 //50M //2147483648 20M //357913941 120M //385136686 111MHz晶振
#define FF6 35791394//85899346 //214748365 //35791394 //38513669
#define FF5 3579139//8589935 //21474836 //3579139 //3851367
#define FF4 357914//858993 //2147484 //357914 //385137
#define FF3 35791//85899 //214748 //35791 //38514
#define FF2 3579//8590 //21475 //3579 //3851
#define FF1 358//859 //2148 //358 //385
#define FF0 36//86 //215 //36
//--------------8279端口定義--------------
#define com XBYTE[0X0001] //命令字地址
#define dat XBYTE[0X0000] //數(shù)據(jù)口地址
//--------------DDS控制--------------------
#define data_OUT XBYTE[0x1C00] //采用總線方式CE7
#define data_OUT1 XBYTE[0x1400] //采用總線方式CE5
//--------------AD7524端口定義-------------
#define AD7524 XBYTE[0x0C00] //程控衰減地址
unsigned long data temp_r ; //頻率值預(yù)存
sfr AUXR = 0x8e;
bit int_flag=0; /*中斷標(biāo)志位*/
sbit clflag=ACC^7;
unsigned char LCD_string[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,'\0'}; //LCD顯示字符串變量
unsigned char LCD_step[]={0x00,'\0'};
unsigned char step_i=0; //ma步進(jìn)值下標(biāo)
unsigned char step[]={0x00,0x19,0x32,0x4B,0x64,0x7D,0x96,0xAF,0xC8,0xE1,0xFA}; //ma步進(jìn)控制值
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管段碼
unsigned char freq[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //8位數(shù)碼管頻率值
unsigned char con_word[5]; //頻率控制字
unsigned char i,temp; //temp用于存放臨時命令狀態(tài)字
unsigned char key_value; //按鍵值
//-----------------------主要函數(shù)--------------------------
void IntToStr(void); //LCD顯示字符轉(zhuǎn)換
void longtoword(unsigned long num); //長整型轉(zhuǎn)頻率控制字
void write_ad9850(void); //控制字寫入ad9850
void write_ad98501(void);
unsigned long jisuan(unsigned char data *fno); //頻率值產(chǎn)生
unsigned char keyin(void); //按鍵函數(shù)
void setup_8279(void); //8279初始化
void display_led(void); //數(shù)碼管顯示
void delay(unsigned char i); //延時
//------------------頻率步進(jìn)設(shè)置----------------------
void f10Mhz(void); //S1
void f1Mhz(void); //S2
void f100Khz(void); //S3
void f10Khz(void); //S4
void f1Khz(void); //S5
void f100Hz(void); //S6
void f10Hz(void); //S7
void f1Hz(void); //S8
//-----------------------------------------------------
void carry_sin(void); //載波正弦波發(fā)生 S9
void mod_sin(void); //調(diào)制信號正弦波發(fā)生S10
void ma_step(void); //調(diào)制度10%步進(jìn)
void mode(void);
unsigned char a,b,k;
//-------------------------主函數(shù)--------------------------------
void main(void)
{
Init_LCD();
Clear_Screen();
Write_Nopara_Command(0x98);
AUXR = 0x02; /*STC單片機(jī)關(guān)內(nèi)部RAM和開ALE*/
EA=1;
EX0=1; //開外部中斷
IT0=1;
//-----------延時(必須加)-------------
for(a=0;a<5;a++)
{
for(b=0;b<50;b++)
{
for(k=0;k<50;k++);
}
}
//------------------------------------
setup_8279(); //初始化8279
delay(1000);
Display_hz(2,0,"信號發(fā)生器");
Display_String(12,0,"(Hz)");
Display_hz(0,1,"載波");
Display_String(4,1,":");
Display_hz(0,2,"調(diào)制波");
Display_String(6,2,":");
Display_hz(0,3,"調(diào)制度");
Display_String(6,3,":");
while(1)
{
mode();
}
}
//------數(shù)碼管顯示----------------
void display_led(void)
{
for(i=0;i<8;i++)
{ com=0x80+i; //寫顯示RAM
dat=dispcode[freq[7-i]]; //顯示段碼
delay(120);
}
}
//-----8279初始化-----------------
void setup_8279(void)
{
com=0x00; //鍵盤,顯示方式
com=0x34; //20分頻
com=0xd1; //1101 0001b 清除所有顯示
temp=com; //讀狀態(tài)字
do{ACC=com;}
while(clflag==1); //清除起來比較慢,所以一條指令執(zhí)行的時間不足以完成所有清除,故需等待
}
//---------頻率值轉(zhuǎn)換控制字----------
void longtoword(unsigned long num)
{
con_word[0]=0x00; //置工作方式選擇位為00
con_word[4]=num&(0xff);
num=num>>8;
con_word[3]=num&(0xff);
num=num>>8;
con_word[2]=num&(0xff);
num=num>>8;
con_word[1]=num&(0xff);
}
/***計算控制字************/
/***入口:頻率數(shù)組指針***出口,控制字*****/
unsigned long jisuan(unsigned char data *fno)
{
unsigned long dds_no ;
dds_no=
(*(fno+7))*FF7+
(*(fno+6))*FF6+
(*(fno+5))*FF5+
(*(fno+4))*FF4+
(*(fno+3))*FF3+
(*(fno+2))*FF2+
(*(fno+1))*FF1+
(*fno)*FF0 ;
return(dds_no);
}
//---------------------進(jìn)位判斷-------------------
unsigned char judge(unsigned char a)
{
unsigned char b=0;
if(a>=10)
{
b=0;
}
else
{
b=a;
}
return b;
}
//-------------------步進(jìn)按鍵or模式選擇---------------
void mode(void)
{
if(int_flag==1)
{
int_flag=0;
switch(key_value)
{
case 0x40:f10Mhz();break;
case 0x41:f1Mhz();break;
case 0x42:f100Khz();break;
case 0x43:f10Khz();break;
case 0x48:f1Khz();break;
case 0x49:f100Hz();break;
case 0x4a:f10Hz();break;
case 0x4b:f1Hz();break;
case 0x50:carry_sin();break;
case 0x51:mod_sin();break;
case 0x52:ma_step();break;
default:break;
}
}
}
/*步進(jìn)按鍵函數(shù)*/
void f10Mhz(void) //10Mhz步進(jìn)
{
freq[7]=freq[7]+1;
freq[7]=judge(freq[7]);
display_led();
}
void f1Mhz(void) //1Mhz步進(jìn)
{
freq[6]=freq[6]+1;
freq[6]=judge(freq[6]);
display_led();
}
void f100Khz(void) //100Khz步進(jìn)
{
freq[5]=freq[5]+1;
freq[5]=judge(freq[5]);
display_led();
}
void f10Khz(void) //10Khz步進(jìn)
{
freq[4]=freq[4]+1;
freq[4]=judge(freq[4]);
display_led();
}
void f1Khz(void) //1Khz步進(jìn)
{
freq[3]=freq[3]+1;
freq[3]=judge(freq[3]);
display_led();
}
void f100Hz(void) //100hz步進(jìn)
{
freq[2]=freq[2]+1;
if(freq[2]>=10)
{
freq[2]=0;
freq[3]=freq[3]+1;
}
display_led();
}
void f10Hz(void) //10hz步進(jìn)
{
freq[1]=freq[1]+1;
freq[1]=judge(freq[1]);
display_led();
}
void f1Hz(void) //1hz步進(jìn)
{
freq[0]=freq[0]+1;
freq[0]=judge(freq[0]);
display_led();
}
//-----------功能模式---------------------------
void carry_sin(void) //產(chǎn)生載波正弦波
{
temp_r=jisuan(freq);
longtoword(temp_r);
write_ad9850(); //發(fā)送頻率控制字
IntToStr();
Display_String(5,1,LCD_string);
}
void mod_sin(void) //產(chǎn)生調(diào)制信號正弦波
{
temp_r=jisuan(freq);
longtoword(temp_r);
write_ad98501();
IntToStr();
Display_String(7,2,LCD_string);
}
void ma_step(void)
{
step_i++;
if(step_i==10)
{
step_i=0;
}
AD7524=step[step_i];
LCD_step[0]=step_i+'0';
Display_String(7,3,LCD_step);
Display_String(8,3,"0");
Display_String(9,3,"%");
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: WRITE_AD9850
// 函數(shù)功能: 將控制字寫入AD9850
//--------------------------------------------------------------------------------------------------
void write_ad98501(void)
{
unsigned char no,temp;
delay(0);
for(no=0;no<5;no++)
{
data_OUT1=con_word[no]; //送控制字
delay(0);
}
temp=data_OUT1; //讀指令產(chǎn)生上升延,要求AD9850改變輸出
}
void write_ad9850(void)
{
unsigned char no,temp;
delay(0);
for(no=0;no<5;no++)
{
data_OUT=con_word[no]; //送控制字
delay(0);
}
temp=data_OUT; //讀指令產(chǎn)生上升延,要求AD9850改變輸出
}
void IntToStr(void)
{
char i,flag_top;
flag_top=1;
for(i=0; i<8; i++) //轉(zhuǎn)成ASCII碼
{
if((freq[7-i]==0)&(flag_top==1))
{
LCD_string[i]=' ';
}
else
{
LCD_string[i]=freq[7-i]+'0';
flag_top=0;
}
}
}
//-----------按鍵讀取------------------------------------------
unsigned char keyin(void)
{
unsigned char value;
com=0x40;
value=dat;value=value&0x7f; //取鍵盤數(shù)據(jù)低7位
return(value);
}
void int_int0() interrupt 0 using 0
{
int_flag=1;
key_value=keyin();
}
//-------------------------延時---------------------------------
void delay(unsigned char i)
{
while(--i);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -