仿真原版本:proteus 7.8
程序編譯器:keil 4/keil 5
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):S0015
設(shè)計(jì)說(shuō)明:
本設(shè)計(jì)采用AT89C51單片機(jī)作為控制核心,外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運(yùn)放電路(LM324)、按鍵和LCD液晶顯示電路。電路采用單片機(jī)和一片DAC0832數(shù)模轉(zhuǎn)換器組成數(shù)字式低頻信號(hào)發(fā)生器,可產(chǎn)生正弦波、矩形波、鋸齒波和三角波四種波形。系統(tǒng)通過(guò)單片機(jī)產(chǎn)生數(shù)字信號(hào),通過(guò)DAC0832轉(zhuǎn)換為模擬信號(hào),再通過(guò)放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來(lái)。通過(guò)鍵盤(pán)來(lái)控制四種波形的類型選擇、頻率變化,并通過(guò)液晶1602顯示其各自的波形類型以及頻率數(shù)值。
本設(shè)計(jì)硬件電路簡(jiǎn)單,軟件功能完善,控制系統(tǒng)可靠,性價(jià)比較高,具有一定的實(shí)用價(jià)值和參考價(jià)值
講解視頻
51單片機(jī)數(shù)字多種波形信號(hào)發(fā)生器仿真設(shè)計(jì)(程序+仿真+報(bào)告+代碼講解)
仿真電路
矩形波
程序
程序設(shè)計(jì)流程圖
LCD1602顯示
//----------------------------
//寫(xiě)LCD命令
//---------------------------------
void Write_LCD_Command(uchar cmd)
{
while((Busy_Check()&0x80)==0x80); //忙等待
RS=0; //選擇命令寄存器
RW=0; //寫(xiě)
EN=0;
P1=cmd;EN=1;DelayMS(1);EN=0;
}
//--------------------------------------
//發(fā)送數(shù)據(jù)
//---------------------------------------
void Write_LCD_Data(uchar dat)
{
while((Busy_Check()&0x80)==0x80); //忙等待
RS=1; RW=0; EN=0; P1=dat;EN=1;DelayMS(1);EN=0;
}
//------------------------------------
//LCD初始化
//-----------------------------------------
void Init_LCD()
{
Write_LCD_Command(0x38);
DelayMS(1);
Write_LCD_Command(0x01); //清屏
DelayMS(1);
Write_LCD_Command(0x06); //字符進(jìn)入模式:屏幕不動(dòng),字符后移
DelayMS(1);
Write_LCD_Command(0x0C); //顯示開(kāi)、關(guān)光標(biāo)
DelayMS(1);
}
//--向LCD寫(xiě)頻率值
void Write_freq(uint k)
{
uchar qian,bai,shi,ge;
qian=k/1000;
bai=k/100%10;
shi=k/10%10;
ge=k%10;
Write_LCD_Command(0x86+0x40);
Write_LCD_Data(0x30+qian);
Write_LCD_Data(0x30+bai);
Write_LCD_Data(0x30+shi);
Write_LCD_Data(0x30+ge);
Write_LCD_Data(0x48);
Write_LCD_Data(0x5a);
}
//--LCD上顯示不同波形頻率
void Xianshi_f()
{
if(WaveChoice==1)
{
freq=(10000000/(50000+2860*ys));
Write_freq(freq);
}
if(WaveChoice==2)
{
freq=(10000000/(50000+2300*ys));
Write_freq(freq);
}
if(WaveChoice==3)
{
freq=(10000000/(14000+2300*ys));
Write_freq(freq);
}
if(WaveChoice==4)
{
freq=(10000000/(15000+2300*ys));
Write_freq(freq);
}
}
//--LCD上寫(xiě)波形類型
void Write_wave(uchar t )
{
switch(t)
{
case 0:
//-- 無(wú)輸出
Write_LCD_Command(0x86);
DelayMS(5);
for (i=0;i<sizeof(No)-1;i++)
{
Write_LCD_Data(No[i]);
DelayMS(5);
}
break;
case 1:
//--正弦波
ys=25;
Write_LCD_Command(0x86);
DelayMS(5);
for (i=0;i<sizeof(Sin)-1;i++)
{
Write_LCD_Data(Sin[i]);
DelayMS(5);
}
break;
case 2:
//---矩形波
ys=30;
Write_LCD_Command(0x86);
DelayMS(5);
for (i=0;i<sizeof(Squ)-1;i++)
{
Write_LCD_Data(Squ[i]);
DelayMS(5);
}
break;
case 3:
//---三角波
ys=30;
Write_LCD_Command(0x86);
DelayMS(5);
for (i=0;i<sizeof(Tri)-1;i++)
{
Write_LCD_Data(Tri[i]);
DelayMS(5);
}
break;
case 4:
//----鋸齒波
ys=30;
Write_LCD_Command(0x86);//液晶顯示位置
DelayMS(5);
for (i=0;i<sizeof(Saw)-1;i++)
{
Write_LCD_Data(Saw[i]);
DelayMS(5);
}
break;
}
}
按鍵掃描
//----按鍵掃描
void keyscanf()
{
if(K2==0)
{
DelayMS(5);
if(K2==0)
{
while(!K2);
ys--;
if(ys==0)
ys=20;
}
}
if(K3==0)
{
DelayMS(5);
if(K3==0)
{
while(!K3);
ys++;
if(ys>22)
ys=20;
}
}
if(K4==0)
{
DelayMS(5);
if(K4==0)
{
while(!K4);
if(WaveChoice==2)
sqar_num=sqar_num+2;
if(sqar_num==238)
sqar_num=128;
}
}
if(K5==0)
{
DelayMS(5);
if(K5==0)
{
while(!K5);
if(WaveChoice==2)
sqar_num=sqar_num-2;
if(sqar_num==18)
sqar_num=128;
}
}
}
主函數(shù)
//----主程序---
void main()
{
Init_LCD();
IE=0X81;
IT0=1;
Write_LCD_Command(0x80);//--顯示wave:
DelayMS(5);
for (i=0;i<sizeof(Wave)-1;i++)
{
Write_LCD_Data(Wave[i]);
DelayMS(5);
}
Write_LCD_Command(0x80+0X40);//----顯示freq:
DelayMS(5);
for (i=0;i<sizeof(Fre)-1;i++)
{
Write_LCD_Data(Fre[i]);
DelayMS(5);
}
Write_wave(WaveChoice);
while (1)
{
keyscanf();
Out_Wave(WaveChoice);
if(!(K1&K2&K3))
Xianshi_f();
}
}
本系統(tǒng)采用編程的方法,來(lái)輸出四種不同的波形即正弦波、矩形波、三角波、鋸齒波。各種波形的產(chǎn)生方法如下。
正弦波發(fā)生子程序
正弦波的產(chǎn)生比較特殊,它不能由單片機(jī)直接產(chǎn)生,只能由如圖17所示的階梯波來(lái)向正弦波逼近。很顯然,在一個(gè)周期內(nèi)階梯波的階梯數(shù)目越多,單片機(jī)輸出的波形也就越接近正弦波。
圖17 正弦波信號(hào)的產(chǎn)生
先假定正弦波的振幅是2.56 V,則波谷對(duì)應(yīng)的數(shù)字量為最小值00H,波峰對(duì)應(yīng)的數(shù)字量為最大值FFH。將正弦波的第一個(gè)周期的波形按角度均分為若干等份,并計(jì)算出各點(diǎn)對(duì)應(yīng)的電壓值,電壓值計(jì)算方法:Vx=2.5·(1+sinθ),因?yàn)?0H~FFH對(duì)應(yīng)的數(shù)字量為0~255,所以根據(jù)算出的電壓就可直接寫(xiě)出各點(diǎn)所對(duì)應(yīng)的數(shù)字量。單片機(jī)將一個(gè)周期的數(shù)字量存入一定的存儲(chǔ)區(qū)域中,然后依次循環(huán)取出這些數(shù)字量,并送D/A電路轉(zhuǎn)換成階梯波,即近似的正弦波輸出。圖18為正弦波產(chǎn)生的流程圖。
圖18 正弦波產(chǎn)生的流程圖
矩形波發(fā)生子程序
如圖19所示,矩形波的實(shí)現(xiàn)比較簡(jiǎn)單。首先定義一個(gè)無(wú)符號(hào)字符型變量i=0,使自變量i不斷的自動(dòng)加1,若i的值小于squa_num,將P0口賦值為0xFF;若i的值大于squa_num,則將P0口賦值為0x00。當(dāng)i自加到256后又自動(dòng)變?yōu)?,以此循環(huán),即可得到矩形波。當(dāng)squa_num=128時(shí),此時(shí)輸出的為方波。調(diào)節(jié)squa_num的大小,即可實(shí)現(xiàn)矩形波占空比的調(diào)節(jié);調(diào)節(jié)延時(shí)時(shí)間的大小,即可實(shí)現(xiàn)矩形波頻率的改變。
圖19 矩形波產(chǎn)生流程圖
三角波發(fā)生子程序
三角波中的斜線用一個(gè)個(gè)小臺(tái)階來(lái)逼近,當(dāng)臺(tái)階間隔很小時(shí),波形基本上近似一直線。首先定義一個(gè)無(wú)符號(hào)字符型變量i=0,使自變量i不斷的自動(dòng)加1,若i的值小于128,將P0口賦值為i;若i的值大于128,則將P0口賦值為256-i。當(dāng)i自加到256后又自動(dòng)變?yōu)?,以此循環(huán),從而P0口實(shí)現(xiàn)了周期性的數(shù)字量變換,在經(jīng)過(guò)數(shù)模轉(zhuǎn)換后轉(zhuǎn)變成模擬信號(hào),經(jīng)運(yùn)算放大電路后就得到了周期性的三角波。三角波產(chǎn)生流程圖如圖20所示。
? 圖20 三角波發(fā)生流程圖
鋸齒波發(fā)生子程序
鋸齒波的實(shí)現(xiàn)過(guò)程與三角波類似,也是定義一個(gè)變量i=0,并使P0=i,自變量i不斷的自動(dòng)加1,直到加到255,然后i又可以自動(dòng)歸為0,再不斷的重復(fù)上過(guò)程。在此過(guò)程中,P0口的值也隨著i一樣變化,經(jīng)數(shù)模轉(zhuǎn)換DAC0832后,周期性逐一變化的數(shù)字量就轉(zhuǎn)換為鋸齒波輸出了。通過(guò)調(diào)節(jié)P0口每相鄰兩個(gè)值之間的延遲時(shí)間,就可以改變鋸齒波的頻率。圖21為鋸齒波發(fā)生流程圖。
圖21 鋸齒波發(fā)生流程圖
設(shè)計(jì)說(shuō)明書(shū)
摘 要
信號(hào)發(fā)生器是一種常用的信號(hào)源,廣泛地應(yīng)用于電子電路、自動(dòng)控制系統(tǒng)和教學(xué)實(shí)驗(yàn)等領(lǐng)域。 本設(shè)計(jì)采用AT89C51單片機(jī)作為控制核心,外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運(yùn)放電路(LM324)、按鍵和LCD液晶顯示電路。電路采用單片機(jī)和一片DAC0832數(shù)模轉(zhuǎn)換器組成數(shù)字式低頻信號(hào)發(fā)生器,可產(chǎn)生正弦波、矩形波、鋸齒波和三角波四種波形。系統(tǒng)通過(guò)單片機(jī)產(chǎn)生數(shù)字信號(hào),通過(guò)DAC0832轉(zhuǎn)換為模擬信號(hào),再通過(guò)放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來(lái)。通過(guò)鍵盤(pán)來(lái)控制四種波形的類型選擇、頻率變化,并通過(guò)液晶1602顯示其各自的波形類型以及頻率數(shù)值。
本設(shè)計(jì)硬件電路簡(jiǎn)單,軟件功能完善,控制系統(tǒng)可靠,性價(jià)比較高,具有一定的實(shí)用價(jià)值和參考價(jià)值。
關(guān)鍵詞: AT89C51 單片機(jī); 函數(shù)信號(hào)發(fā)生器;DAC0832;LCD液晶顯示
設(shè)計(jì)清單
下載鏈接