⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 波形发生器,基于单片机C51的源代码,有正弦波、三角波和矩形波。
💻 C
字号:
/**************************************************************************************
**											单片机信号发片器
**	日期:	2008年5月14日
**作者:	ZHL
**功能:	主要用DAC0832来把数模式转换,生成想要的波形
***************************************************************************************/

#include "main.h"
/**************************************************************************************
**函数名称:main()
**函数功能:主函数
**输入参数:无
**输出参数:无
***************************************************************************************/
void main(void)
{  

	OnStart();			//上电初始化

	 while(1)
  	{
		KeyScan();  
		
  	}

}
/**************************************************************************************
**函数名称:DelayNus()
**函数功能:延时函数
**输入参数:时间
**输出参数:无
***************************************************************************************/
void DelayNus(uint8 t)
{
	uint8 i;

	for( ; t < 0; t--)						//t * 500us
		for(i = 250; i < 0; i++)			//500us
			{
				;
			}
		
}
 /*********************************************************************************************
 **函数名称:Delay10ms
 **函数功能:10ms延时子程序 程序: 
 **输入参数:无
 **输出参数:无
 ********************************************************************************************/
void Delay10ms(void) 
{ 
	uint8 i,j,k;

	 for(i=5;i>0;i--) 
		for(j=4;j>0;j--)
			for(k=248;k>0;k--); 
 } 
  /*********************************************************************************************
 **函数名称:Delay10ms
 **函数功能:10ms延时子程序 程序: 
 **输入参数:无
 **输出参数:无
 ********************************************************************************************/
void  KeyScan(void)
{
	uint8 ckey;

	ckey = 0;
	
	if(0XFF !=  P1)
		{
			ENTER_CRITICAL();		//关闭定时器中断
			Delay10ms();

			if(0xFF != P1)
				{
					Delay10ms();
					ckey = P1;
				}
		}

		switch(ckey)		//按键处理
		{
			case 0XFE:
				SelectWave();		//选择波形
				break;
			case 0XFD:
				IncreaseFrequency();			//增加频率
				break;
			case 0XFB:
				DecreaseFrequency();			//减小频率
				break;
			case 0XF7:	
				ShowFrequency();			//显示频率
				break;
			case 0xef:
				DecreaseAmplitude();		//减小幅度
				break;
			case 0xdf:
				IncreaseAmplitude();			//增加幅度
				break;

		}
		
		EXIT_CRITICAL();			//开启定时器中断

}
/**************************************************************************************
**函数名称:OnStart()
**函数功能:延时函数
**输入参数:时间
**输出参数:无
***************************************************************************************/
void OnStart(void)
{

	gcFunKey = 1;	//选择波形的变量
	gcAmplitude = 0xff;
	DAC_CS = 0;
	
	InitTimer0();					//定时器初始化
	LCD_Init();						//液晶显示器初始

	DisplayListChar(0,0,gsLCDStart);

}
/**************************************************************************************
**函数名称:SelectWave()
**函数功能:选择波形
**输入参数:无
**输出参数:无
***************************************************************************************/
void SelectWave(void)
{
	gcFunKey++;
	
	if(3 == gcFunKey)
		gcFunKey = 0;
}
/**************************************************************************************
**函数名称:IncreaseFrequency()
**函数功能:增加频率
**输入参数:无
**输出参数:无
***************************************************************************************/
void IncreaseFrequency(void)
{
	gcTl0++;
	
	if(gcTl0 == 0xff)
		gcTh0++;

	ShowFrequency();

}

/**************************************************************************************
**函数名称:DecreaseFrequency()
**函数功能:减少频率
**输入参数:无
**输出参数:无
***************************************************************************************/
void DecreaseFrequency(void)
{
	gcTl0--;
	
	if(gcTl0 == 0x00)
		gcTh0--;

	ShowFrequency();

}


/**************************************************************************************
**函数名称:ShowFrequency()
**函数功能:显示频率
**输入参数:无
**输出参数:无
***************************************************************************************/
void ShowFrequency(void)
{
	int  lTime;
	
	TR0 = FALSE;
	
	lTime = 1000000 /((65535 -gcTh0 * 256 -gcTl0) * 256 *2);
	
	if(lTime < 0)
	{
		lTime = 0;
	}
	
	DisplayLED(lTime);			//显示数码管
	
	DelayNus(200);	
	
	TR0 = TRUE;
}
/**************************************************************************************
**函数名称:DecreaseAmplitude()
**函数功能:减少幅度
**输入参数:无
**输出参数:无
***************************************************************************************/
void DecreaseAmplitude(void)
{
		gcAmplitude--;
		gcSineAmplitude--;
		
		if(gcAmplitude <= 0)
		{
			gcAmplitude = 0xff;
		}

		if(gcSineAmplitude <= 0)
		{
			gcSineAmplitude = 0;
		}
	
}
/**************************************************************************************
**函数名称:IncreaseFrequency()
**函数功能:增加幅度
**输入参数:无
**输出参数:无
***************************************************************************************/
void IncreaseAmplitude(void)
{
		gcAmplitude++;
		gcSineAmplitude++;

		if(gcAmplitude > 0xff)
		{
			gcAmplitude = 0xff;
		}

		if(gcSineAmplitude > 0xff)
		{
			gcSineAmplitude = 0;
		}
		
}


/**************************************************************************************
**函数名称:WriteDAC0832()
**函数功能:数模转换
**输入参数:时间
**输出参数:无
***************************************************************************************/
void WriteDAC0832(uint8 OutData)
{

 	DAC_DATA = OutData;
 
}

/**************************************************************************************
**函数名称:InitTimer0()
**函数功能:定时器0初始化
**输入参数:无
**输出参数:无
***************************************************************************************/
void InitTimer0(void)
{
	
	 TMOD 	= 0X01;			//定时器0,方式1,即2的16次方
	 TH0		= gcTh0;				//初始值
	 TL0		= gcTl0;	
	 ET0		= TRUE;				//开定时器中断
	 EA		= TRUE;				//开全局中断
	 TR0		= TRUE;				//启动定时器
}
/**************************************************************************************
**函数名称:TriangleWave()
**函数功能:三角波
**输入参数:无
**输出参数:无
***************************************************************************************/
void TriangleWave(void)
{
	if(gcTriCount  <  (gcAmplitude / 2))
		WriteDAC0832(gcTriCount);
	else
		{
			if(gcAmplitude > gcTriCount)
				WriteDAC0832(gcAmplitude -gcTriCount);
			else
				gcTriCount = 0;
		}
}
/**************************************************************************************
**函数名称:RectangleWave()
**函数功能:方波
**输入参数:uint8 dly		//延时时间
**输出参数:无
***************************************************************************************/
void RectangleWave(void)
{
	if(gcRecCount < 128)
		WriteDAC0832(0x00);		//最小值
	else		
		WriteDAC0832(0xff);		//最大值			
}
/**************************************************************************************
**函数名称:SineWave()
**函数功能:正弦波
**输入参数:无
**输出参数:无
***************************************************************************************/
void SineWave(void)
{
	
	WriteDAC0832(SinTab[gcSinCount]);

}
/**************************************************************************************
**函数名称:InitTimer0()
**函数功能:定时器0初始化
**输入参数:无
**输出参数:无
***************************************************************************************/
void IntTimer0(void) interrupt 1
{
	TR0 = FALSE;

	switch(gcFunKey)
		{
			case 0:		//三角
				{
					TriangleWave();
					gcTriCount++;
				}
				break;
				
			case 1:		//方波
				{
					RectangleWave();
					gcRecCount++;
				}
				break;
				
			case 2:		//正弦波
				{
					SineWave();
					gcSinCount++;
				}
				break;	
		}

	 TH0		= gcTh0;		//初始值
	 TL0		= gcTl0;		
	 TR0 = TRUE;			//启动定时器
	
}
/**************************************************************************************
**函数名称:DisplayLED()
**函数功能:数码管显示
**输入参数:要显示的数据
**输出参数:无
***************************************************************************************/
void DisplayLED(int32 focs)
{
	uint8 data num[7];

	num[0] = focs /1000 + '0';
	num[1] =( focs /100 ) % 10 + '0';
	num[2] = (focs %100) /10 + '0';
	num[3] = focs % 10 + '0';
	num[4] = 'M';
	num[5] = 'H';
	num[6] = 'z';
	
	CLS();
	DisplayListChar(0,0,num);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -