仿真原版本:proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計編號:S0015
1 設(shè)計說明:
1、本設(shè)計采用AT89C51單片機作為控制核心,外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運放電路(LM324)、按鍵和LCD1602液晶顯示電路。
2、電路采用單片機和一片DAC0832數(shù)模轉(zhuǎn)換器組成數(shù)字式低頻信號發(fā)生器,可產(chǎn)生正弦波、矩形波、鋸齒波和三角波四種波形。
3、通過鍵盤來控制四種波形的類型選擇、頻率變化,并通過液晶1602顯示其各自的波形類型以及頻率數(shù)值。
本設(shè)計硬件電路簡單,軟件功能完善,控制系統(tǒng)可靠,性價比較高,具有一定的實用價值和參考價值
2 講解視頻:
包含程序講解和代碼講解
51單片機數(shù)字多種波形信號發(fā)生器仿真設(shè)計(程序+仿真+報告+代碼講解)
3 仿真電路:
程序
程序設(shè)計流程圖
LCD1602顯示
//----------------------------
//寫LCD命令
//---------------------------------
void Write_LCD_Command(uchar cmd)
{
while((Busy_Check()&0x80)==0x80); //忙等待
RS=0; //選擇命令寄存器
RW=0; //寫
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); //字符進入模式:屏幕不動,字符后移
DelayMS(1);
Write_LCD_Command(0x0C); //顯示開、關(guān)光標
DelayMS(1);
}
//--向LCD寫頻率值
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上寫波形類型
void Write_wave(uchar t )
{
switch(t)
{
case 0:
//-- 無輸出
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)采用編程的方法,來輸出四種不同的波形即正弦波、矩形波、三角波、鋸齒波。各種波形的產(chǎn)生方法如下。
正弦波發(fā)生子程序
正弦波的產(chǎn)生比較特殊,它不能由單片機直接產(chǎn)生,只能由如圖17所示的階梯波來向正弦波逼近。很顯然,在一個周期內(nèi)階梯波的階梯數(shù)目越多,單片機輸出的波形也就越接近正弦波。
圖17 正弦波信號的產(chǎn)生
先假定正弦波的振幅是2.56 V,則波谷對應(yīng)的數(shù)字量為最小值00H,波峰對應(yīng)的數(shù)字量為最大值FFH。將正弦波的第一個周期的波形按角度均分為若干等份,并計算出各點對應(yīng)的電壓值,電壓值計算方法:Vx=2.5·(1+sinθ),因為00H~FFH對應(yīng)的數(shù)字量為0~255,所以根據(jù)算出的電壓就可直接寫出各點所對應(yīng)的數(shù)字量。單片機將一個周期的數(shù)字量存入一定的存儲區(qū)域中,然后依次循環(huán)取出這些數(shù)字量,并送D/A電路轉(zhuǎn)換成階梯波,即近似的正弦波輸出。圖18為正弦波產(chǎn)生的流程圖。
圖18 正弦波產(chǎn)生的流程圖
矩形波發(fā)生子程序
如圖19所示,矩形波的實現(xiàn)比較簡單。首先定義一個無符號字符型變量i=0,使自變量i不斷的自動加1,若i的值小于squa_num,將P0口賦值為0xFF;若i的值大于squa_num,則將P0口賦值為0x00。當i自加到256后又自動變?yōu)?,以此循環(huán),即可得到矩形波。當squa_num=128時,此時輸出的為方波。調(diào)節(jié)squa_num的大小,即可實現(xiàn)矩形波占空比的調(diào)節(jié);調(diào)節(jié)延時時間的大小,即可實現(xiàn)矩形波頻率的改變。
圖19 矩形波產(chǎn)生流程圖
三角波發(fā)生子程序
三角波中的斜線用一個個小臺階來逼近,當臺階間隔很小時,波形基本上近似一直線。首先定義一個無符號字符型變量i=0,使自變量i不斷的自動加1,若i的值小于128,將P0口賦值為i;若i的值大于128,則將P0口賦值為256-i。當i自加到256后又自動變?yōu)?,以此循環(huán),從而P0口實現(xiàn)了周期性的數(shù)字量變換,在經(jīng)過數(shù)模轉(zhuǎn)換后轉(zhuǎn)變成模擬信號,經(jīng)運算放大電路后就得到了周期性的三角波。三角波產(chǎn)生流程圖如圖20所示。
? 圖20 三角波發(fā)生流程圖
鋸齒波發(fā)生子程序
鋸齒波的實現(xiàn)過程與三角波類似,也是定義一個變量i=0,并使P0=i,自變量i不斷的自動加1,直到加到255,然后i又可以自動歸為0,再不斷的重復上過程。在此過程中,P0口的值也隨著i一樣變化,經(jīng)數(shù)模轉(zhuǎn)換DAC0832后,周期性逐一變化的數(shù)字量就轉(zhuǎn)換為鋸齒波輸出了。通過調(diào)節(jié)P0口每相鄰兩個值之間的延遲時間,就可以改變鋸齒波的頻率。圖21為鋸齒波發(fā)生流程圖。
圖21 鋸齒波發(fā)生流程圖
設(shè)計說明書
摘 要
信號發(fā)生器是一種常用的信號源,廣泛地應(yīng)用于電子電路、自動控制系統(tǒng)和教學實驗等領(lǐng)域。 本設(shè)計采用AT89C51單片機作為控制核心,外圍采用數(shù)字/模擬轉(zhuǎn)換電路(DAC0832)、運放電路(LM324)、按鍵和LCD液晶顯示電路。電路采用單片機和一片DAC0832數(shù)模轉(zhuǎn)換器組成數(shù)字式低頻信號發(fā)生器,可產(chǎn)生正弦波、矩形波、鋸齒波和三角波四種波形。系統(tǒng)通過單片機產(chǎn)生數(shù)字信號,通過DAC0832轉(zhuǎn)換為模擬信號,再通過放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來。通過鍵盤來控制四種波形的類型選擇、頻率變化,并通過液晶1602顯示其各自的波形類型以及頻率數(shù)值。
本設(shè)計硬件電路簡單,軟件功能完善,控制系統(tǒng)可靠,性價比較高,具有一定的實用價值和參考價值。
關(guān)鍵詞: AT89C51 單片機; 函數(shù)信號發(fā)生器;DAC0832;LCD液晶顯示
資料清單
0、常見問題 必讀?。。?!
1、源程序
2、proteus仿真
3、開題報告
4、論文報告
5、講解視頻
Altium Designer 安裝破解
filename.bat
KEIL+proteus 單片機仿真設(shè)計教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡易使用教程
單片機學習資料
相關(guān)數(shù)據(jù)手冊
答辯技巧
設(shè)計報告常用描述
鼠標雙擊打開查找嘉盛單片機51 STM32單片機課程畢業(yè)設(shè)計.url