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

📄 main.c

📁 凌阳SPMC75F2413A的AD功能实现电压表的例子。这个是我自己编写的
💻 C
字号:
//=========================================================================================
//Project Name:FourSource_Ctrl
//Description:使用75的AD转换制作数字电压表
//HardWare:   SPMC75F2413A EVM V1.2板
//HardWare Resource:IOB 11-13
//I/O LED Status:
//Attention:  该程序是使用IOB11-13来模拟SPI总线时序。通过74ls595来实现数码管显示数字。
//            建议在做此实验之前,找相关的74LS595的资料看看。
//=========================================================================================
//=========================================================================================
//作者:陈元虎
//Email:chenyuanhu2@163.com
//日期:2007年12月27日
//=========================================================================================

#include "spmc75_regs.h"

#include "unspmacro.h"

#define SER P_IOB_Buffer->B.bit13
#define SRCLK P_IOB_Buffer->B.bit11
#define RCLK P_IOB_Buffer->B.bit12

//=========================================================================================
//全局变量
//=========================================================================================
const unsigned int LED_TAB[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int FILTER_TAB[5];
unsigned int ADC_Buffer;

//=========================================================================================
//函数声明
//=========================================================================================
int main()
{
	unsigned int ui_ADData,ui_Code,ui_Site,ui_DAData1,AD_Ture_H;
    double 	AD_Ture,AD_Ture_T,AD_Buffer_double,AD_Ture_1;
	
	Disable_FIQ_IRQ();
	System_Init();//初始化
	IRQ_ON();
	
	while(1)
	{
		
        ADC_Conversion();
        AD_Buffer_double = (double)ADC_Buffer;
        AD_Ture_1 = AD_Buffer_double*5;
        AD_Ture = AD_Ture_1/1023;
        //取千分位的值
        AD_Ture_H = (int)(AD_Ture*100);
        AD_Ture_T = AD_Ture*100 - AD_Ture_H;
		
		
		if(AD_Ture_T >= 0.5)
		{
			AD_Ture_H += 1;
		}
		if(AD_Ture >= 1)
		{
			ui_Site =AD_Ture_H/100;
			ui_Code = LED_TAB[ui_Site];
            LED_Display(ui_Code,1,2);
			AD_Ture_H -= ui_Site*100;
		
		}
		else
		{
			LED_Display(LED_TAB[0],1,2);
		
		}
		if(AD_Ture >= 0.1)
		{
			ui_Site = AD_Ture_H/10;
			ui_Code =LED_TAB[ui_Site];
            LED_Display(ui_Code,0,3);
			AD_Ture_H -= ui_Site*10;
		
		}
		else
		{
			LED_Display(LED_TAB[0],0,3);
		
		}
		if(AD_Ture >= 0)
		{
			ui_Site = AD_Ture_H;
			ui_Code = LED_TAB[ui_Site];
            LED_Display(ui_Code,0,4);
         
		}
		
	}
}
//=========================================================================================
//子函数
//=========================================================================================
//=========================================================================================
//Name: void System_Init()
//=========================================================================================
void System_Init()
{
  P_IOB_Dir->W |= 0x3800;
  P_IOB_Attrib->W |= 0x3800;
  P_IOB_Data->W = 0x0000;
  
  P_IOD_Dir->W = 0x00ff;
  P_IOD_Attrib->W = 0x00ff;
  P_IOD_Data->W = 0x0000;
  
  ADC_Init();//AD转换初始化
}
//=========================================================================================
//Name: void LED_Display(unsigned int code)
//=========================================================================================
void LED_Display(unsigned int code,unsigned int point_IE,unsigned int Choice)
{
	//code位数码管显示的数字,point_IE位小数点使能位,Choice是选择哪位数码管的选择位
   unsigned int i;
   unsigned int k;
   unsigned int SEG;//位码
   unsigned int Number;//Number是合成好后应发送的数据
   switch(Choice)
   {
   	//Choice的含义:1表示选择低位的数码管,及最左边的此时位码应该是1110
   	 case 1: SEG = 0x0e00;
   	         break;
   	 case 2: SEG = 0x0d00;
   	         break;
   	 case 3: SEG = 0x0b00;
   	         break;
   	 case 4:  SEG = 0x0700;
   	         break;
   	 default: break;                                
   }
   if(point_IE == 1)
   {
   	Number = (SEG + code)& 0xff7f;  
   }
   else Number = SEG + code;
   
   k = 0x0800;
   for(i = 0;i < 12 ;i++)
   {
   	if((Number&k) == 0)
   	{
   		SER = 0;
   		SRCLK = 1;
   		SRCLK = 0;
   	}
   	else
   	{
   		SER = 1;
   		SRCLK = 1;
   		SRCLK = 0;
   	}
   	k >>= 1;
   }
   RCLK = 1;
   RCLK = 0;
}
//=========================================================================================
//Name: unsigned int FILTER(unsigned int a[5])
//=========================================================================================
unsigned int FILTER(unsigned int a[5])
{
	unsigned int i,j,m=0;
	for(i = 0;i < 4;i++)
	{
		for(j = i+1;j < 5;j++)
		{
			if(a[i] > a[j])
			{
				m = a[j];
				a[j] = a[i];
				a[i] = m;
			}
		}
	}
	return (a[2]);
}
//=========================================================================================
//Name: void ADC_Init()
//=========================================================================================
void ADC_Init()
{
	//初始化IOA口位下拉输入
    P_IOA_Dir->W &= 0xff00; //从IOA0开始AD转换
    P_IOA_Attrib->W |= 0x00ff;
    P_IOA_Buffer->W |= 0x00ff;
    P_ADC_Channel->W = 0x0001;
    P_ADC_Setup->B.ADCCS = CB_ADC_ADCCS_Select;
    P_ADC_Setup->B.ADCEN = CB_ADC_ADCEN;
    P_ADC_Setup->B.ADCFS = CB_ADC_ADCFS_CPUCLKdiv64;
    //P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch0;
    P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch1;
    P_ADC_Ctrl->B.ADCSTR = 1;
}
//================================================================================================
//Name:unsigned int ADC_Conversion()
//================================================================================================
unsigned int ADC_Conversion()
{
	//AD转换函数,这个地方使用电位器的输入模拟DETA
    P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch0;
    //P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch;
    P_ADC_Ctrl->B.ADCSTR = 1;
    while((P_ADC_Ctrl->W & 0x0080) == 0);
    ADC_Buffer = P_ADC_Data->W >> 6;
    return ADC_Buffer;
}
//================================================================================================
//Name:void Delay(unsigned int Time)
//================================================================================================
void Delay(unsigned int Time)
{
	int i,j;
	for(i = 0;i<= Time;i++)
	{
		for(j = 0;j<=0x120; j++)
		{
			
		}
	}

}
//===============================================================================================
//ISR
//===============================================================================================

⌨️ 快捷键说明

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