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

📄 adc.c

📁 在TI的DSP2407基础上编写的
💻 C
字号:
/*;==========================================================================*
* File name : adc.c *
* Author: Davidlee *
* Data: 2007.05.13*
* Version: 2.0 *
* Organization: Tianhuang Technology Co.ltd
* Description : Analog signals change to digital signals (A/D)
*               show by three nixietubes.
;==========================================================================*
*/
#include "F2407_c.H" 	         //;the header file  

#define led_0  port2000          //对应发光二极管外部存储单元地址       
#define led_en port6000          //对应数码管使能脚外部存储单元地址
#define led_da port8000          //对应送数码管数据脚外部存储单元地址

ioport  unsigned   port2000;
ioport  unsigned   port6000;
ioport  unsigned   port8000;

unsigned int temp1,voltage,AD[8];
unsigned long int sum;
unsigned int data1,data2,data3,data4;
unsigned int led_en1,led_en2,led_en3,led_en4;
	    
 	     asm(" .word   #0ffffh ");    //密码位
	     asm(" .word   #0ffffh ");
	     asm(" .word   #0ffffh ");
	     asm(" .word   #0ffffh ");
//=======================================================
//子程序声明
//=======================================================
void interrupt nothing();                            /*空指令,直接返回*/
void Delay();                                        /*延时子程序*/
void KICK_DOG();                                     /*看门狗子程序*/
void system_init();                                  /*系统初始化子程序*/
void ADCinitial();                                   /*A/D转换初始化子程序*/
void conversion();                                   /*A/D转换结果转数码管显示子程序*/ 
void Led_show(unsigned int led_en,unsigned int data);/*数码管显示相应数码值子程序*/
//=======================================================
//定义数组,对应数码管显示数字的代码.代表从0~f共16个数
//=======================================================
  unsigned int data_table[]={0x03F,0x006,0x05B,0x04F,0x066,0x06D,0x07D,0x007,
                             0x07F,0x06F,0x077,0x07C,0x039,0x05E,0x079,0x071};
//=======================================================
main()                                /*主程序*/
{ 
    system_init();                    /*系统初始化*/
    ADCinitial();                     /*A/D转换初始化子程序*/
      sum=0;                          
	  data1=0;                        //显示初始值均为0
	  data2=0;
	  data3=0;
	  data4=0;
	  led_en1=0x0E0;                  //使能LED1
	  led_en2=0x0D0;                  //使能LED2
	  led_en3=0x0B0;                  //使能LED3
	  led_en4=0x0F0;                  //不使能LED4(0x070使能)
   
     while(1)
   {    
        int i,j,k;
        unsigned int m;
        
        ADCTRL2=0x4000;               //软件启动A/D转换
        ADCTRL2=0x2000;
   
   loop: if(k==1)
        {k=ADCTRL2&0x8;               //等待AD转换完成
         goto loop;
        }
        asm(" CLRC  SXM ");
        AD[0]=RESULT0>>6;             //把AD转换的结果右移6位后存入规定的数组
        AD[1]=RESULT1>>6;             
        AD[2]=RESULT2>>6;
        AD[3]=RESULT3>>6;
        AD[4]=RESULT4>>6;
        AD[5]=RESULT5>>6;
        AD[6]=RESULT6>>6;
        AD[7]=RESULT7>>6;
        
        for(i=0;i<8;i++)
        {                       
           sum=sum+AD[i];               
        }
		voltage=sum>>3;                //取8次采样的平均值
		conversion(voltage);           //电压转化子程序
		
		for(m=0;m<1000;m++)            //循环1000次
		{
		    Led_show(led_en1,data_table[data1]|0x80); //每次显示一个数码管值,加小数点
			Led_show(led_en2,data_table[data2]);
			Led_show(led_en3,data_table[data3]);
			Led_show(led_en4,data_table[data4]);
		}
		    data1=0;                   //显示完一次后将相应值清0,
		    data2=0;                   //然后进行下一次转换显示.
		    data3=0;
		    data4=0;
		    sum=0;
	        
	        ADCTRL2=0x4000;            //再次软件启动A/D转换
            ADCTRL2=0x2000;	
		    
		    led_en=0xFFFF;             //关闭数码管显示	
			Delay(5);                  //延时
   }
}

//=======================================================
//该中断服务程序主要是为了防止干扰,不作任何其他操作
//=======================================================
void  interrupt nothing()
{
         asm(" CLRC INTM");
         return;                 /*中断直接返回*/
}

void  Delay(int delay)           /*延时子程序*/
{
   while(delay>0) delay--;
}

void  KICK_DOG()                 /*复位看门狗密钥*/
{ 
     WDKEY=0x5555;
     WDKEY=0xAAAA;
}
//=======================================================
//系统初始化子程序
//=======================================================
void   system_init()
{    
     asm(" SETC INTM " );       //关中断
     asm(" CLRC  SXM " );       //符号位不作扩展    
     asm(" SETC  OVM " );       //遇到溢出,累加器被设置为它的最大正值或负值
     asm(" CLRC  CNF " );       //B0设置为数据存储区
        
     IMR=0;
     IFR=0xFFFF;                //清除全部中断标志,"写1清0"
        
     WDCR=0x6F;
     KICK_DOG();                //看门狗不使能
        
     temp1=0x0;
     asm(" OUT _temp1,0ffffh"); //设置外部等待为0
 
     MCRB=0xFFFD;               //设置仿真端口

     led_0=0xFF;                //关闭发光二极管的显示 led_0为设定的扩充I/O
}
//=======================================================
//ADC初始化子程序
//=======================================================
void   ADCinitial()             /*A/D转换初始化子程序*/
{        
         SCSR1=0x008C;          //仅使能ADC,EVA,EVB模块

         ADCTRL1=0x4000;
         ADCTRL1=0x3000;
         
         MAX_CONV=0x7;
         CHSELSEQ1=0x3333;
         CHSELSEQ2=0x3333;

}

void conversion(int temp)       /*A/D转换结果转数码管显示子程序*/  
{   
	if(temp>1024) return;
	
	while((temp-310)>=0)
	{
		data1=data1+1;
		temp=temp-310;
	}
	while((temp-31)>=0)
	{
		data2=data2+1;
		temp=temp-31;
	}
	while((temp-3)>=0)
	{
		data3=data3+1;
		temp=temp-3;
	}	
}

void Led_show(unsigned int _led_en,unsigned int data)
{
    led_en = _led_en;           //数码管使能(即使数码管有显示输出).led_en为设定的扩充I/O
    led_da = data;              //往数码管送要显示的数据.led_da为设定的扩充I/O
    Delay(100);                 //延时                 
    led_da = 0x0;               //数码管不使能(即使数码管无显示输出)
                                //因为是动态显示,送完数据之后
}                               //要对相应数码管数据清零,准备送下一个数






⌨️ 快捷键说明

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