加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于51單片機的四種波形信號發(fā)生器仿真設(shè)計(仿真+程序源碼+設(shè)計說明書+講解視頻)

09/29 10:10
3355
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關(guān)方案
  • 方案介紹
    • 1 設(shè)計說明:
    • 2 講解視頻:
    • 3 仿真電路:
    • 設(shè)計說明書
    • 資料清單
    • 資料下載鏈接
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

仿真原版本: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 仿真電路:

imgimgimgimg

程序

image-20220903210034666

程序設(shè)計流程圖

img

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ù)目越多,單片機輸出的波形也就越接近正弦波。

img

圖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)生的流程圖。

img

圖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)矩形波頻率的改變。

img

圖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所示。

img

? 圖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ā)生流程圖。

img

圖21 鋸齒波發(fā)生流程圖

設(shè)計說明書

image-20231026123744873

信號發(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

image-20231026123822944

資料下載鏈接

  • 設(shè)計資料獲取聯(lián)系方式.doc

相關(guān)推薦

電子產(chǎn)業(yè)圖譜