標(biāo)題:
單片機(jī)信號發(fā)生器程序 主函數(shù)文件有幾個疑問,求大佬看看
[打印本頁]
作者:
XIAOWEN123
時間:
2022-5-7 16:11
標(biāo)題:
單片機(jī)信號發(fā)生器程序 主函數(shù)文件有幾個疑問,求大佬看看
以上是主程序,問題放在了程序中,還請大家?guī)兔纯?br />
單片機(jī)源程序如下:
#include "reg51.H"
#include "ad9834.h"
#include "LCD1602.h"
#include "keyScan.h"
#define MAX_VOLT 47 //
為啥47代表4.7V
//sbit LED = P0^0;
//sbit key1 = P1^2;
//sbit key2 = P1^3;
//sbit key3 = P1^4;
//sbit key4 = P1^5;
//sbit key5 = P1^6;
//sbit FSK = P3^6;
/*
*********************************************************************************************************
* 函 數(shù) 名: DelayMs
* 功能說明: 時鐘延時
* 形 參: ms 以毫秒為單位.
* 返 回 值: 無
*********************************************************************************************************
*/
void DelayMs( unsigned int ms)
{
unsigned int i,j;
for (i = 0; i < ms; i++)
for(j=0;j<1000;j++); //
單片機(jī)晶振12MHZ,j是隨便取嗎
}
void main()
{
unsigned long FreqData=20000;
unsigned int volt=MAX_VOLT;
unsigned int ratio;
unsigned char AmpData=255; //
不懂這兩行,255是啥
unsigned char WaveModle=0;
unsigned char keyNum = 16;
unsigned char SetFreq_flag=0;//設(shè)置頻率的標(biāo)志
ratio=2550/MAX_VOLT;// 5.7= 255/47; ratio放大10倍了取整數(shù), 44最高輸出4.7V
InitLCD();
DelayMs( 100);
DispStrAt("AD9834", 0, 0);
DispStrAt("sinWave", 8, 0);
DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1); //
0,1,7的0是啥
AD9834_WaveSeting(FreqData,0,SIN_WAVE,0 );//2KHz, 頻率寄存器0,正弦波輸出 ,初相位0
AD9834_AmpSet(AmpData); //設(shè)置幅值,幅值最大 255
DispStrAt("am V", 10, 1);
DispDecShiftAt(volt, 12, 1, 1);
while(1)
{
keyNum = keyScan();
if(keyNum!=16)
{
if(SetFreq_flag==0) //不是鍵盤輸入設(shè)置頻率狀態(tài), 步進(jìn)設(shè)置狀態(tài)
{
if(keyNum==10 && SetFreq_flag==0)
{
SetFreq_flag=1;
FreqData=0;
DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt(" ", 7, 1);
//AD9833_WaveSeting(FreqData,0,SIN_WAVE,0 );
}
if(keyNum==12)
{
FreqData=FreqData+1000;
AD9834_WaveSeting(FreqData,0,WaveModle,0 );
DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);
//while(key1==0);
}
else if(keyNum==13)
{
if(FreqData>=1000)
FreqData=FreqData-1000;
AD9834_WaveSeting(FreqData,0,WaveModle,0 );
DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);
//while(key2==0);
}
else if(keyNum==14)
{
if(volt<MAX_VOLT)
volt=volt+1;
AmpData=volt*ratio/10;
AD9834_AmpSet(AmpData);
//DispDecSpaceAt(AmpData, 13, 1, 3);
DispDecShiftAt(volt, 12, 1, 1);
//while(key3==0);
}
else if(keyNum==15)
{
if(volt>0)
volt=volt-1;
AmpData=volt*ratio/10;
AD9834_AmpSet(AmpData);
//DispDecSpaceAt(AmpData, 13, 1, 3);
DispDecShiftAt(volt, 12, 1, 1);
//while(key4==0);
}
else if(keyNum==11)
{
WaveModle=WaveModle+1;
if(WaveModle==3)WaveModle=0;
if(WaveModle==0){AD9834_WaveSeting(FreqData,0,SIN_WAVE,0 );DispStrAt("sinWave", 8, 0);}
else if(WaveModle==1){AD9834_WaveSeting(FreqData,0,TRI_WAVE,0 );DispStrAt("TriWave", 8, 0);}
else if(WaveModle==2){AD9834_WaveSeting(FreqData,0,SQU_WAVE,0 );DispStrAt("SquWave", 8, 0);}
//else if(WaveModle==3){AD9834_SetFSK(1000,5000);DispStrAt("FSKWave", 8, 0);}
//else if(WaveModle==4){AD9834_SetPSK(0,180,5000);DispStrAt("PSKWave", 8, 0);}
//while(key5==0);
}
}
else if(SetFreq_flag==1) //是矩陣鍵盤輸入設(shè)置頻率狀態(tài)
{
if(keyNum<10)//輸入頻率
{
FreqData=FreqData*10+keyNum;
DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt(" ", 7, 1);
}
else if(keyNum==15)//輸錯倒退
{
FreqData=FreqData/10;
DispDecSpaceAt(FreqData, 0, 1,7);
}
else if(keyNum==10)//HZ確定輸出
{
DispDecSpaceAt(FreqData, 0, 1, 7);DispStrAt("HZ", 7, 1);
AD9834_WaveSeting(FreqData,0,WaveModle,0 );
SetFreq_flag=0;
}
else if(keyNum==11)////KHZ確定輸出
{
DispDecSpaceAt(FreqData, 0, 1, 6);DispStrAt("KHZ", 6, 1);
FreqData=FreqData*1000;
AD9834_WaveSeting(FreqData,0,WaveModle,0 );
SetFreq_flag=0;
}
else if(keyNum==12)////MHZ確定輸出
{
DispDecSpaceAt(FreqData, 0, 1, 6);DispStrAt("MHZ", 6, 1);
FreqData=FreqData*1000000;
AD9834_WaveSeting(FreqData,0,WaveModle,0 );
SetFreq_flag=0;
}
}
}
}
}
作者:
zhxiufan
時間:
2022-5-7 17:27
那個255,就是最大幅值呀,后面0,1,7的0應(yīng)該是X坐標(biāo)。
作者:
dazhige
時間:
2022-5-7 18:36
MAX_VOLT是后面計算擴(kuò)大了10倍
j的取值其實是個估算的,這個延時不夠準(zhǔn)確,能用
作者:
wulin
時間:
2022-5-7 21:17
能用整數(shù)盡量不用小數(shù)。如ADC轉(zhuǎn)換計算電壓時VCC采用5000mV,顯示時在千位加小數(shù)點(diǎn)即可,既方便又精確。
作者:
yzwzfyz
時間:
2022-5-9 14:58
遇到此類問題的處理方式:
1、粗略讀通邏輯關(guān)系。
2、弄清程序的輸入是什么,程序的目的是什么?
3、如果自己去設(shè)計程序,如何架構(gòu)。
4、試作寫一寫。
估計你會遇到同樣的問題需要解決,這時再回頭看他人的程序,或許理解就深刻了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1