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

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

基于51單片機(jī)信號(hào)發(fā)生器仿真設(shè)計(jì)

08/12 09:26
3300
服務(wù)支持:
技術(shù)交流群

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

虛擬商品不可退

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

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
    • 講解視頻
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

仿真原版本:proteus 7.8

程序編譯器:keil 4/keil 5

編程語言:C語言

設(shè)計(jì)編號(hào):S0015

設(shè)計(jì)說明:

本設(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)通過單片機(jī)產(chǎn)生數(shù)字信號(hào),通過DAC0832轉(zhuǎn)換為模擬信號(hào),再通過放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來。通過鍵盤來控制四種波形的類型選擇、頻率變化,并通過液晶1602顯示其各自的波形類型以及頻率數(shù)值。

本設(shè)計(jì)硬件電路簡(jiǎn)單,軟件功能完善,控制系統(tǒng)可靠,性價(jià)比較高,具有一定的實(shí)用價(jià)值和參考價(jià)值

講解視頻


51單片機(jī)數(shù)字多種波形信號(hào)發(fā)生器仿真設(shè)計(jì)(程序+仿真+報(bào)告+代碼講解)

仿真電路

矩形波

img

程序

img

程序設(shè)計(jì)流程圖

img

imgimgimgimg

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); //字符進(jìn)入模式:屏幕不動(dòng),字符后移
	DelayMS(1);
	Write_LCD_Command(0x0C); //顯示開、關(guān)光標(biāo)
	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)生比較特殊,它不能由單片機(jī)直接產(chǎn)生,只能由如圖17所示的階梯波來向正弦波逼近。很顯然,在一個(gè)周期內(nèi)階梯波的階梯數(shù)目越多,單片機(jī)輸出的波形也就越接近正弦波。

img

圖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ù)算出的電壓就可直接寫出各點(diǎn)所對(duì)應(yīng)的數(shù)字量。單片機(jī)將一個(gè)周期的數(shù)字量存入一定的存儲(chǔ)區(qū)域中,然后依次循環(huán)取出這些數(shù)字量,并送D/A電路轉(zhuǎn)換成階梯波,即近似的正弦波輸出。圖18為正弦波產(chǎn)生的流程圖。

img

圖18 正弦波產(chǎn)生的流程圖

矩形波發(fā)生子程序

如圖19所示,矩形波的實(shí)現(xiàn)比較簡(jiǎn)單。首先定義一個(gè)無符號(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)矩形波頻率的改變。

img

圖19 矩形波產(chǎn)生流程圖

三角波發(fā)生子程序

三角波中的斜線用一個(gè)個(gè)小臺(tái)階來逼近,當(dāng)臺(tái)階間隔很小時(shí),波形基本上近似一直線。首先定義一個(gè)無符號(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)過數(shù)模轉(zhuǎn)換后轉(zhuǎn)變成模擬信號(hào),經(jīng)運(yùn)算放大電路后就得到了周期性的三角波。三角波產(chǎn)生流程圖如圖20所示。

img

? 圖20 三角波發(fā)生流程圖

鋸齒波發(fā)生子程序

鋸齒波的實(shí)現(xiàn)過程與三角波類似,也是定義一個(gè)變量i=0,并使P0=i,自變量i不斷的自動(dòng)加1,直到加到255,然后i又可以自動(dòng)歸為0,再不斷的重復(fù)上過程。在此過程中,P0口的值也隨著i一樣變化,經(jīng)數(shù)模轉(zhuǎn)換DAC0832后,周期性逐一變化的數(shù)字量就轉(zhuǎn)換為鋸齒波輸出了。通過調(diào)節(jié)P0口每相鄰兩個(gè)值之間的延遲時(shí)間,就可以改變鋸齒波的頻率。圖21為鋸齒波發(fā)生流程圖。

img

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

設(shè)計(jì)說明書

在這里插入圖片描述

信號(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)通過單片機(jī)產(chǎn)生數(shù)字信號(hào),通過DAC0832轉(zhuǎn)換為模擬信號(hào),再通過放大器LM324就可以得到雙極性的各種波形,最終由示波器顯示出來。通過鍵盤來控制四種波形的類型選擇、頻率變化,并通過液晶1602顯示其各自的波形類型以及頻率數(shù)值。

本設(shè)計(jì)硬件電路簡(jiǎn)單,軟件功能完善,控制系統(tǒng)可靠,性價(jià)比較高,具有一定的實(shí)用價(jià)值和參考價(jià)值。

關(guān)鍵詞: AT89C51 單片機(jī); 函數(shù)信號(hào)發(fā)生器;DAC0832;LCD液晶顯示

設(shè)計(jì)清單

下載鏈接
在這里插入圖片描述

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MK70FN1M0VMJ15 1 Freescale Semiconductor Kinetis K 32-bit MCU, ARM Cortex-M4 core, 1MB Flash, 150MHz, Graphics LCD, MAPBGA 256

ECAD模型

下載ECAD模型
$18.16 查看
STM32H757XIH6TR 1 STMicroelectronics RISC Microcontroller
暫無數(shù)據(jù) 查看
STM32H743XIH6 1 STMicroelectronics High-performance and DSP with DP-FPU, Arm Cortex-M7 MCU with 2MBytes of Flash memory, 1MB RAM, 480 MHz CPU, Art Accelerator, L1 cache, external memory interface, large set of peripherals

ECAD模型

下載ECAD模型
$31.15 查看

相關(guān)推薦

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