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

📄 main.c

📁 AD转换的另外一个例子,对初学者很有帮助的一个例子
💻 C
字号:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:简易函数发生器															 		 **
//**<功能>:根据键盘控制产生10~500Hz的正弦信号。			 									 **
//**<版本说明>:这是第1.3版,LCD显示的是采点变化时计时器溢出的次数。 	 						 **
//**<作者>:程沛																				 **
//**<完成时间>:2007年8月8日																	 **
//**<联系方式>:superyongzhe@163.com															 **
//*************************************************************************************************
//*************************************************************************************************


//*************************************************************************************************
//*																								  *
//*			 ******************************头文件及宏定义**************************				  *
//*																								  *
//*************************************************************************************************
#include "includes.h"

#define START P3_4		//0--开启DA转换;1--关闭DA转换。

#define TIME0H 0xFF		//定时器0溢出时间:0.001ms

#define TIME1H 0x3C
#define TIME1L 0xB0		//定时器1溢出时间:50ms



//*************************************************************************************************
//*																								  *
//*			  ********************************全局变量******************************			  *
//*																								  *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DA转换>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uca_SinaCode[]={0x7F,0xA6,0xCA,0xE6,0xF8,0xFE,0xF8,0xE6,0xCA,0xA6,
							  0x7F,0x58,0x34,0x18,0x06,0x00,0x06,0x18,0x34,0x58};
							  //正弦函数采点。

unsigned char uc_DACount=0;	  	//DA转换采点选择计数。

unsigned long ul_TimeCount=0;	//DA转换定时器0计数。

unsigned long ul_TimeMax=50;		//DA转换定时器0计数最大值,调整此值可以调整输出频率。



//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0;	  				//键盘防抖动标志位。
									//当按键中断产生时,首先判断此位。
									//0--执行键盘扫描及键码处理程序;1--不执行。

bit b_KillShock=0;					//防抖标志清除位:0--不清除;1--清除。

unsigned char uc_KillCount=1;		//抖动标志清除计数,使用定时器1。


//*************************************************************************************************
//*																								  *
//*		*****************************************主函数*************************************	  *
//*																								  *
//*************************************************************************************************
void main()
{
	vdInitialize();							 //初始化LCD。
	vWriteCMD(0x83);						 //输出提示信息。
	vShowChar("Frequency:");
//	vShowFrequency(ul_TimeMax);
	vWriteCMD(0xC9);
	vShowChar("Count");

	P1=0x0F;								 //初始化键盘。

	START=0;								 //开启AD转换。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	IT0=1;			 //	中断方式:下降沿。
	EX0=1;			 //	开启外部中断。
	PX0=1;


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<初始化定时器>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	TMOD=0x02;		 //定时器0:模式2;定时器1:模式0。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0,定时改变DA输出>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	TH0=TIME0H;
	TR0=1;
	ET0=1;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	TH1=TIME1H;
	TL1=TIME1L;
	TR1=1;			 //开启定时器1。
	ET1=1;			 //开定时器1中断。

	EA=1;			 //开启总中断。

	while(1);
}

//*************************************************************************************************
//*																								  *
//*		****************************外部中断0,用于开启键盘扫描及键码处理********************	  *
//*																								  *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
	if(b_KeyShock==0)
		{
			vKeyProcess(ucKeyScan());			//开启键盘扫描标志。
			b_KeyShock=1;						//设置防抖动标志。
		}
	else b_KeyShock=0;							//如果有抖动则不执行键扫描,恢复防抖动标志。

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>	
	if(b_KeyShock==1)
		b_KillShock=1;				//如果防抖动标志位开启则开启防抖动标志清除位,
									//300ms后清除防抖动标志。

}


//*************************************************************************************************
//*																								  *
//*		**************************定时器0中断,定时改变DA输出*****************************	  *
//*																								  *
//*************************************************************************************************
void vTimer0() interrupt 1
{
	if(ul_TimeCount==ul_TimeMax)			   //此句,ul_TimeCount++;和ul_TimeCount=0;用于控制频率。
		{
		P0=uca_SinaCode[uc_DACount];

		if(uc_DACount==19)					   //此句用于采点选择循环。
			uc_DACount=0;
		else
			uc_DACount++;

		ul_TimeCount=0;
		}
	else
		ul_TimeCount++;
} 


//*************************************************************************************************
//*																								  *
//*		***************************定时器1中断,用于防抖动标志清除***************************	  *
//*																								  *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
	if(b_KillShock==1)
		{
		if(uc_KillCount==5)			 //当防抖动标志位为1时,计时300ms后清除抖动标志位。
			{
			b_KeyShock=0;
			b_KillShock=0;
			uc_KillCount=1;
			}
		else uc_KillCount++;
		}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	TH1=TIME1H;
	TL1=TIME1L;
}

⌨️ 快捷键说明

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