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

📄 main.c

📁 电压控制程序,符合各种设备需要,核心程序,IBm专属
💻 C
字号:
//========================================================================
//	The information contained herein is the exclusive property of
//	Sunnnorth Technology Co. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//========================================================================

//=====================================================================================================
//  工程名称:	ex7_VoltageMeasureFrom0To3
//  功能描述:   《实验仪指导书》综合实验
//              0~3V电压测量表
//              采集电压经LCD显示出来,并语音提示电压值   
//  涉及的库:	CMacro1016.lib
//            	SacmV26e.lib
//  组成文件:	main.c/SPLC501User.c
//				ISR.asm/hardware.asm/SPLC501Driver_IO.asm/DataOSforLCD.asm
//     			480.h/480.inc/hardware.h/hardware.inc
//				SPLC501Driver_IO.inc/SPLC501User.h/SPCE061A.h/SPCE061A.inc
//	硬件连接:	IOA0连接0-3.3V接口的任一引脚
//              LCD数据IOA8-IOA15,AOP:IOB3,R/W:IOB4,EP:IOB5,片选由IOB2提供
// 	维护记录:	2005-10-17
//====================================================================================================
//========================================================================
//	文件名称:	main.c
//	功能描述:	采集电压经LCD显示出来,并语音提示电压值  
//	维护记录:	2005-10-17	v1.0
//========================================================================
#include "VolMeasure.h"                             //定义了一个结构体
#include "MM.h"
#include "SPLC501User.h"
#include "SPCE061A.h"

unsigned int AD_Read(void);
void PlayS480(int Result);
//========================================================================
//	语法格式:	int main(void)
//	实现功能:	主程序
//	参数:		无
//	返回值:	int 无意义
//========================================================================
int main(void)
{
    int i=0,j=0,k=0,m;
    float fVolVal;
	int uiVolFlag=0,uiVolFlagOne=0;
	long int uiVolFlagHow=0;
    unsigned int uiData;
    long int liDataVol;
   	struct ST_VolValude VolValude;                       //0-3。3V电压表服务结构
   
   	VolValude.VolTureValudeB=7;                       //初始化电压采集值
	LCD501_Init(0x00);                                //初始化LCD
	LCD501_SetPaintMode(4);                           //设置LCD显示图象模式为取反叠加模式
	LCD501_ClrScreen(0);                              //清屏
    LCD501_Bitmap(0,0,(unsigned int *)encoding_00);   //显示开机图片
   	fVolVal=0.0;

	while(1)                                              //主循环
	{
    	*P_DAC_Ctrl = 0;
    	*P_ADC_Ctrl = C_ADCE+C_MIC_DIS+C_AGCN+C_DAC_OUT3mA+C_VEXTREF_DIS+C_V2VREFB_DIS;  
    	uiData = *P_ADC_LINEIN_Data;	                      		
		while((*P_ADC_MUX_Ctrl&0x8000)!= 0x8000);  
		*P_ADC_MUX_Ctrl=C_ADC_CH1;			
                                                      	  //播放语音后会改变P_ADC_Ctrl的设置
		uiData=AD_Read();                                 //丢掉第一个数
	 	j=0;
		for(i=0;i<20;i++)                                 //采20个数据到VolValude.VolValudeA[j]						
		{
			*P_Watchdog_Clear=C_WDTCLR;
			uiData=AD_Read();
			VolValude.VolValudeA[j]= uiData;
			j++;
		}

	    uiVolFlagOne=0xff;
	   	uiVolFlag=0;
		j=0;
		uiData=0;
		liDataVol=0;
	    for(i=0;i<20;i++)
	    {
	    	liDataVol=liDataVol+VolValude.VolValudeA[j];
	    	j++;
	   	}
	    uiData=liDataVol/20;                            //取20个数据的平均值,以减少误差
       	VolValude.VolTureValudeA=(float)uiData*3.3/0xffc0;
       	                                               //得到电压值
        fVolVal=VolValude.VolTureValudeB-VolValude.VolTureValudeA;
   		if(fVolVal<0.1&&fVolVal>(-0.1))                 //和前一次数据比较,有变化更新显示和语音提示
   		{
   			if(k==0) 
   			{
   				k++;
   			}
   			else k++;
		} 
		else
		{     
	       	k=0;                                             //取得要在LCD上显示的数据,存入VolValude.LCD[j]
  		   	VolValude.VolTureValudeB=VolValude.VolTureValudeA;
       	 	uiVolFlagHow=VolValude.VolTureValudeA*10000;
        	VolValude.LCD[0]=uiVolFlagHow/10000%10;
        	VolValude.LCD[1]=uiVolFlagHow/1000%10;
        	VolValude.LCD[2]=uiVolFlagHow/100%10;
        	VolValude.LCD[3]=uiVolFlagHow/10%10;
        	VolValude.LCD[4]=uiVolFlagHow%10;
          	                                               //LCD数据更新
 			m = LCD501_GetPaintMode();						//获取当前图象叠加模式
			LCD501_SetPaintMode(2);							//设置为清除模式
			LCD501_Rectangle(68,40,127,56,PAINT_SOLID);		//清除数据显示区
			LCD501_SetPaintMode(m);							//图象叠加模式恢复
			//////////////////////////////////////////////////显示AD转换数值以及语音播报结果
    		LCD501_PutChar(68,40,('0'+VolValude.LCD[0]));                         
   			LCD501_PutChar(76,40,'.'); 	 
   			PlayS480(VolValude.LCD[0]);
   			PlayS480(10);
			LCD501_PutChar(78,40,('0'+VolValude.LCD[1]));	
			PlayS480(VolValude.LCD[1]);
			LCD501_PutChar(88,40,('0'+VolValude.LCD[2]));	
			PlayS480(VolValude.LCD[2]);	
			LCD501_PutChar(98,40,('0'+VolValude.LCD[3]));	
			PlayS480(VolValude.LCD[3]);	
			LCD501_PutChar(108,40,('0'+VolValude.LCD[4]));
			PlayS480(VolValude.LCD[4]);
			LCD501_PutChar(116,40,'V');
		}
	}
}
//============================================================= 
// 语法格式:    void AD();
// 实现功能:	数据采集
// 参数:        无
// 返回值:      bData-采得的数据
//=============================================================
unsigned int AD_Read(void)
{
	unsigned int bData;
	while(!(*P_ADC_MUX_Ctrl&0x8000));		//等待采样完成
    bData=*P_ADC_LINEIN_Data; 
    bData = bData&0xffc0;
	return bData;
}
//============================================================= 
// 语法格式:    void PlayS480(int Result);
// 实现功能:	语音播放
// 参数:        int Result-要播放的段
// 返回值:      无
//=============================================================
void PlayS480(int Result)
{
	SACM_S480_Initial(1);                     //播放初始化,来自于SacmV26e.lib
	SACM_S480_InitQueue();
	SACM_S480_Play(Result, 3, 3);
	while((SACM_S480_Status()&0x0001) != 0)   //填充队列播放,来自于SacmV26e.lib
	{
		SACM_S480_ServiceLoop();
		*P_Watchdog_Clear=C_WDTCLR;
	}
	SACM_S480_Stop();                          //停止播放,来自于SacmV26e.lib
	__asm("FIQ OFF");    
}

⌨️ 快捷键说明

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