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

📄 adc.c

📁 2407的代码程序
💻 C
字号:
#include "DSP2407A.h"

#define uint unsigned int
#define uchar unsigned char
volatile static uint a=0,b=0,c=0,mid1=0,mid2=0,max=0;
volatile static uint interrupt_count=0;
volatile static uchar direction=1;
volatile static uint adc_result;

void inline disable() 
 {
    asm(" setc INTM");
 }
void inline enable()
 {
    asm(" clrc INTM");
 }
// 系统初始化子程序
void  initial()
 {
   asm(" setc     SXM");	// 符号位扩展有效
   asm(" clrc     OVM");	// 累加器中结果正常溢出
   asm(" clrc     CNF");	// B0被配置为数据存储空间
   *SCSR1=0x81FE;	// CLKIN=6M,CLKOUT=4*CLKIN=24M
   *WDCR=0x0E8;	// 不使能看门狗,因为SCSR2中的WDOVERRIDE
			// 即WD保护位复位后的缺省值为1,故可以用软件禁止看门狗
   *IMR=0x0001;	//  允许INT1中断
   *IFR=0x0FFFF;	//  清除全部中断标志,"写1清0"
 }
//时间中断程序
void interrupt T1INT()
{
  ++interrupt_count;
  enable();
}
//AD中断程序
void interrupt adint()
{
  asm("clrc SXM")
  adc_result=RESULT0;
 if(max<11)
    {
		a=b;
		b=c;
		c=*adc_result>>6;
		mid1=mid2;
		mid2=a>b?(b>c?b:(a>c?c:a)):(a>c?a:(b>c?c:b));//选择3个采样数值的中间值
		if(direction)                       //上升状态处理
		{
			if(mid2>=mid1)   
			{
			  *ADCTRL2=*ADCTRL2|0X2000;
			  enable();
			}
			else
			{
				if(max==0) *T1CON=*0X0040;   //启动计数器
				++max;        
				direction=0;
			    *ADCTRL2=*ADCTRL2|0X2000;
				enable();
			}
		}
		else                                //下降状态处理
		{  
			if(mid2<=mid1)
		    {
			*ADCTRL2=*ADCTRL2|0X2000;
			enable();
			}
			else
			{
			direction=1;
			*ADCTRL2=*ADCTRL2|0X2000;
			enable();
			}
		}
	}
    else
	{
    *T1CON=*T1CON&0XFFBF  //停止计数
	if(interrupt_count > 375)
	{
     *PADATDIR=*PADATDIR|0X0600; //小于1K,IOPA2输出低,IOPA1输出低
	}
	else if  (interrupt_count >= 187)
	{
	*PADATDIR=*PADATDIR|0X0601//1K-2K,IOPA2输出低.IOPA1输出高
	}
	else if (interrupt_count >= 125)
	{ 
	*PADATDIR=*PADATDIR|0X0602;//2K-3K,IOPA2输出高.IOPA1输出低
	}
	else
	{
	*PADATDIR=*PADATDIR|0X0603;//>3K,IOPA2输出高.IOPA1输出高
	}
	interrupt_count = 0;             
	max = 0;       
	*ADCTRL2=*ADCTRL2|0X2000;
	enable();
	}
}
void interrupt nothing()
{ 
 return;
}
main()
{
disable();
initial();
*MCRA&=*MCRA&0XFF00;  //IOPA为一般I/O功能
*PADATDIR=*PADATDIR|0X0600; //IOPA1,IOPA2为输出
*EVAIFA=*EVAIFA|FFFF; //定时器1中断标志清除
*EVAIMRA=*EVAIMRA|0X0400; //定时器1上溢使能
*T1CON=0X160C; //定时器1为连续增,预分频64
*T1CNT=OX0000;//计数器清零
*ADCTRL1=0X0050;//连续转换模式,级连形式
*ADCTRL2=0X0400; //SEQ1中断模式1
*MAXCONV=0X0000; //转换个数1个
*CHSELSEQ1=0X0000;//转换通道选择1通道
*CHSELSEQ2=0X0000;
*CHSELSEQ3=0X0000;
*CHSELSEQ4=0X0000;
enable();
while(1);
 {
 }
}

⌨️ 快捷键说明

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