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

📄 main.c

📁 此为dsptms320lf2407的AD采样及产生pWM的程序
💻 C
字号:
#include 	"LF2407REGS.H"

#define 	START_ADC	*T4CON=*T4CON|0X0040;*T4CNT=0X0000//开始ad采样
unsigned int nValue=0;
unsigned int	n=0;

void	SysInitial()//系统初始化配置
{	
	asm("	setc	INTM");//禁止所有中断	
	asm("	clrc	SXM");//抑制符号位扩展	
	asm("	clrc	OVM");//累加器中结果正常溢出	
	asm("	clrc	CNF");//b0被配置为数据空间	
	*SCSR1=0X81FE;//CLKIN=10M,CPU=40M	
	*WDCR=0X00EB;//不使能看门狗	
	*IFR=0xFFFF;//清除所有中断标志位
}

void ShowInitial()//7段数码管控制端口初始化
{	
	*MCRC &=0xF3F0;//数码管数值端口以及两个选通端口设置为基本I/O功能	
	*PEDATDIR |=0x0F00;// 数码管数值端口为输出类型	
	*PEDATDIR &=0xFFF0;//设定数值为0	
	*PFDATDIR |=0x0C0C;// 数码管选通端口为输出类型	
	//PFDATDIR&=0xFFF7;//设置一个数码管亮
}


void AdcInitial()//ADC采样寄存器初始化
{	asm("	setc INTM");	
	*ADCTRL1=*ADCTRL1|0X4000;//复位ADC模块	
	*ADCTRL1=0X0030;//使用级联模式	,低优先级	
	*ADCTRL2=0X8404;//级联模式下利用evb启动ADC,中断标志置位后马上申请中断	
	*MAXCONV=0X0000;//最大转换通道是1
	*ADCTRL2=*ADCTRL2|0X4200;//复位seq,指针指向conv00,intflag 写1清零	
	*CHSELSEQ1=0X1111;		
	//===========利用定时器4启动ADC=============	
	*T4CON=0X120C;//连续增计数模式,4分频:40M/4-->(100ns),定时器没有启动	
	*T4PER=0x0600;	*GPTCONB=0X400;//周期启动ADC	
	*EVBIFRB=0XFFFF;//写1复位	
	*T4CNT=0x0000;//计数器清零	
	*IMR=*IMR|0X0020;	
	*IFR=0xFFFF;//清除所有中断标志位
}
	

void	interrupt	AdcInt()//对应到文件"VECTORS.ASM"的ADC转换中断:_AdcInt
{	asm("	clrc	INTM");
	START_ADC;
	asm("	clrc	SXM");//抑制符号扩展,从而移位时候最高位填写0
	while(1)
	{	if(!(*ADCTRL2	&	0x1000))	break;}
	nValue =(*RESULT0)>>6;//右移6位
	n++;
	*ADCTRL2=*ADCTRL2|0X4200;//复位seq,指针指向conv00,intflag 写1清零
	*EVBIFRB=0XFFFF;//写1复位
}




void	interrupt	nothing()//对应到文件"VECTORS.ASM"的_nothing
{	asm("	clrc	INTM");}


void	Delay(unsigned	int ms) //延时n毫秒,不是很精确
{
while(ms--)
{;}
}


void main()//主程序入口
{	unsigned int pdc,aveVOL,n1,n2,Vh,Vl,i=0,key=0;
	unsigned int high=0,a[3];
	SysInitial();	AdcInitial();	ShowInitial();
	asm("	clrc	INTM");	
	START_ADC;
	
	while(1)
	{
	
	if(0x0008==(*PADATDIR&0x0008)) key=1;		
	if(0x0010==(*PADATDIR&0x0010)) key=2;
	
	if(nValue>500) {high=1;Vh=nValue;}
	if(high&&(nValue<300))	{high=0;a[0]=n;i=1;}
	if((i==1)&&(nValue>500))	{a[1]=n;i=2;}
	if((i==2)&&(nValue<300))	{a[2]=n;i=3;Vl=nValue;}
	
	if(i==3)
		{
			pdc=(a[2]-a[1])*100/(a[2]-a[0]);
			aveVOL=((a[2]-a[1])*Vh+(a[1]-a[0])*Vl)/(a[2]-a[0]);
		}
		if(key==1)
		{
			n1=(int)pdc%10; //提取十位
			Delay(1);		
			*PEDATDIR=0XFF00+n1;	
			*PFDATDIR=0XFF08;		
			n2=(int)(pdc/10)%10;//提取个位		
			Delay(1);		
			*PEDATDIR=0XFF00+n2;	
			*PFDATDIR=0XFF04;
						
		}
	if(key==2)
	{	
	
		n1=(int)(aveVOL/10.24)%10; //提取十位
		Delay(1);		
		*PEDATDIR=0XFF00+n1;	
		*PFDATDIR=0XFF08;		
		n2=(int)(aveVOL/102.4)%10;//提取个位		
		Delay(1);		
		*PEDATDIR=0XFF00+n2;	
		*PFDATDIR=0XFF04;
		}
		}

}

⌨️ 快捷键说明

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