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

📄 main.c

📁 语音电压表。 // 文件来源:《SPCE061A单片机实验指导书》,"实验三十八 0~3V电压测量表"
💻 C
字号:
//===============================================================
//
//        The information contained herein is the exclusive property of
//      Sunplus Technology Co. And shall not be distributed, reproduced,
//      or disclosed in whole in part without prior written permission.
//
//            (C) COPYRIGHT 2001   SUNPLUS TECHNOLOGY CO.
//                           ALL RIGHTS RESERVED
//
//    The entire notice above must be reproduced on all authorized copies.
//
//==============================================================
//============================================================
//  工程名称: VoltageMeasureFrom0To3.spj
//  功能描述:  语音电压表。
//  文件来源:《SPCE061A单片机实验指导书》,"实验三十八	0~3V电压测量表"  第134页
//  IDE环境:   SUNPLUS u'nSPTM  IDE 1.8.4
//
//  涉及的库:
//  组成文件:
//    	main.c hardware.asm isr.asm setiobit.asm SPLC501DisplayTAB.asm SPLC501Hardware.asm
//      Splc501var.asm sacmv26e.lib
//===============================================
//============================================================
// 文件名称:main.c 
// 实现功能: 语音电压表
//============================================================

#include "VolMeasure.h"                             //定义了一个结构体
#include "lab_parameter.h"
#define P_ADC_MUX_Ctrl			(volatile unsigned int *)0x702B   
#define P_ADC_LINEIN_Data		(volatile unsigned int *)0x702C
#define P_ADC_Ctrl				(volatile unsigned int *)0x7015
#define P_Watchdog_Clear		(volatile unsigned int *)0x7012  
#define		C_WDTCLR				0x0001			 //看门狗清除服务常量
#define		C_ADC_CH1				0x0001 			 //ADC通道IOA0


#define		C_ADCE					0x0001 			//B1	//Enable ADC
#define		C_ADCN					0x0000			//B1	//Disable ADC&MIC
#define 	C_MIC_DIS				0x0002 			//B2	//No Mic
#define 	C_MIC_ENB				0x0000 			//B2	//Have MIC
#define 	C_AGCE					0x0004 			//B3	//Have AGC
#define 	C_AGCN					0x0000 			//B3	//No AGC
#define 	C_DAC_OUT2mA			0x0040 			//B6	//DAC current 2mA
#define 	C_DAC_OUT3mA			0x0000 			//B6	//DAC currect 3mA
#define 	C_VEXTREF_ENB			0x0080 			//B7	//Have Ext REF Voltage
#define 	C_VEXTREF_DIS			0x0000 			//B7	//No Ext REF Voltag
#define 	C_V2VREFB_DIS			0x0100 			//B8	//No 2V Voltag2
#define 	C_V2VREFB_ENB			0x0000 			//B8	//Have 2V Voltag2
#define 	C_ADC_READY 			0x8000 			//B15	//Check ADC if Ready
#define     P_DAC_Ctrl				(volatile unsigned int *)0x702A


extern dance8;                                       // 申明dance8为外部标号       
//============================================================= 
// 函数名称:    int main()   
// 功能描述:    语音电压表
// 语法格式:    int main() 
//入口参数:     无
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
main()
{
    int i=0,j=0,k=0,iRei,iRej,m=0,n=1;
    float fVolVal;
	int uiVolFlag=0,uiVolFlagHow=0,uiVolFlagOne=0;
    unsigned int uiData;
    long int liDataVol;
   	struct VolValude VolValude;                       //0-3。3V电压表服务结构
   
   	Set_IOB_Bit(2,1,1,0,0);                           //开LCD片选
   	VolValude.VolTureValudeB=7;                       //初始化电压采集值
    Init_sys();	                                      //LCD初始化,来自于Splc501sys.asm
	FG_InitGraphic();                                 //初始化端口和splc501c,来自于Splc501sys.asm
	FG_SetLineStyle(0);                               //设定现模式,来自于Splc501sys.asm
	FG_SetBMPMode(DG_BMP_COVER);                      //设定位图模式,来自于Splc501sys.asm
	FG_ClearScreen(0);                                //清屏
	FG_PutBitmap(&dance8,127,64);                     //放置图片
	FG_SetLineStyle(3);                               //还原为字符模型
   	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));  
	*P_ADC_MUX_Ctrl=C_ADC_CH1;			
                 //播放语音后会改变P_ADC_Ctrl的设置
	 uiData=AD();                                     //丢掉第一个数
	 j=0;
	Set_IOA_Bit(0,0,1,1,1);                           //关闭LCD片选
	for(i=0;i<20;i++)                                 //采20个数据到VolValude.VolValudeA[j]						
		{
			*P_Watchdog_Clear=C_WDTCLR;
			uiData=AD();
			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) 
   		   {
   		   
   		   Set_IOB_Bit(2,1,1,1,1);                      //关LCD片选
   		   k++;
   		   }
   		   else k++;
   		   } 
   		else
{     
         if(m<=0xff&&n==0) 
         {
         m+=1;
        // VolValude.VolTureValudeB=7; 
         }
         else
      {
         n=0;
         m=0;
         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;
         Set_IOB_Bit(2,1,1,0,0);                          //打开LCD片选
                      //LCD数据更新
         FG_ClearScreen(0);
         FG_InitGraphic();
	     FG_SetLineStyle(3);
	     FG_SetLineStyle(0);
	     FG_PutPixel(30,29);
	     FG_SetBMPMode(DG_BMP_COVER);
         FG_ClearScreen(0);
	     FG_PutBitmap(&dance8,127,64);
	     FG_SetLineStyle(3);
       
    switch(VolValude.LCD[0])                              //显示和播放第一位数据
    {
    case 0:
    PlayS480(11);
    FG_PutStr("0.",3,60,20);
    PlayS480(0);
    F_Delay();
    PlayS480(10);
    
    break;
    case 1:
    PlayS480(11);
    FG_PutStr("1.",3,60,20); 
    PlayS480(1);
    F_Delay();
    PlayS480(10);
    break;
    case 2:
    PlayS480(11);
    FG_PutStr("2.",3,60,20);
    PlayS480(2);
    F_Delay();
    PlayS480(10);
    break;
    case 3:
    PlayS480(11);
    FG_PutStr("3.",3,60,20); 
    PlayS480(3);
    F_Delay();
    PlayS480(10);
    break;
    default:
    break;
    }
    switch(VolValude.LCD[1])                              //显示和播放第2位数据
    {
    case 0:
    FG_PutStr("  0",3,60,20);
    PlayS480(0);
    break;
    case 1:
    FG_PutStr("  1",3,60,20); 
    PlayS480(1);
    break;
    case 2:
    FG_PutStr("  2",3,60,20);
    PlayS480(2);
    break;
    case 3:
    FG_PutStr("  3",3,60,20); 
    PlayS480(3);
    break;
    case 4:
    FG_PutStr("  4",3,60,20);
    PlayS480(4);
    break;
    case 5:
    FG_PutStr("  5",3,60,20); 
    PlayS480(5);
    break;
    case 6:
    FG_PutStr("  6",3,60,20);
    PlayS480(6);
    break;
    case 7:
    FG_PutStr("  7",3,60,20);
    PlayS480(7); 
    break;
    case 8:
    FG_PutStr("  8",3,60,20);
    PlayS480(8);
    break;
    case 9:
    FG_PutStr("  9",3,60,20); 
    PlayS480(9);
    break;
    default:
    break;
    }
    switch(VolValude.LCD[2])                              //显示和播放第3位数据
    {
    case 0:
    FG_PutStr("   0",3,60,20);
    PlayS480(0);
    break;
    case 1:
    FG_PutStr("   1",3,60,20); 
    PlayS480(1);
    break;
    case 2:
    FG_PutStr("   2",3,60,20);
    PlayS480(2);
    break;
    case 3:
    FG_PutStr("   3",3,60,20);
    PlayS480(3); 
    break;
    case 4:
    FG_PutStr("   4",3,60,20);
    PlayS480(4);
    break;
    case 5:
    FG_PutStr("   5",3,60,20);
    PlayS480(5); 
    break;
    case 6:
    FG_PutStr("   6",3,60,20);
    PlayS480(6);
    break;
    case 7:
    FG_PutStr("   7",3,60,20); 
    PlayS480(7);
    break;
    case 8:
    FG_PutStr("   8",3,60,20);
    PlayS480(8);
    break;
    case 9:
    FG_PutStr("   9",3,60,20);
    PlayS480(9); 
    break;
    default:
    break;
    }
    switch(VolValude.LCD[3])                              //显示和播放第4位数据
    {
    case 0:
    FG_PutStr("    0",3,60,20);
    PlayS480(0);
    break;
    case 1:
    FG_PutStr("    1",3,60,20);
    PlayS480(1); 
    break;
    case 2:
    FG_PutStr("    2",3,60,20);
    PlayS480(2);
    break;
    case 3:
    FG_PutStr("    3",3,60,20); 
    PlayS480(3);
    break;
    case 4:
    FG_PutStr("    4",3,60,20);
    PlayS480(4);
    break;
    case 5:
    FG_PutStr("    5",3,60,20);
    PlayS480(5); 
    break;
    case 6:
    FG_PutStr("    6",3,60,20);
    PlayS480(6);
    break;
    case 7:
    FG_PutStr("    7",3,60,20); 
    PlayS480(7);
    break;
    case 8:
    FG_PutStr("    8",3,60,20);
    PlayS480(8);
    break;
    case 9:
    FG_PutStr("    9",3,60,20);
    PlayS480(9); 
    break;
    default:
    break;
    }
    switch(VolValude.LCD[4])                              //显示和播放第5位数据
    {
    case 0:
    FG_PutStr("     0V",3,60,20);
    PlayS480(0);
    break;
    case 1:
    FG_PutStr("     1V",3,60,20);
    PlayS480(1); 
    break;
    case 2:
    FG_PutStr("     2V",3,60,20);
    PlayS480(2);
    break;
    case 3:
    FG_PutStr("     3V",3,60,20);
    PlayS480(3); 
    break;
    case 4:
    FG_PutStr("     4V",3,60,20);
    PlayS480(4);
    break;
    case 5:
    FG_PutStr("     5V",3,60,20); 
    PlayS480(5);
    break;
    case 6:
    FG_PutStr("     6V",3,60,20);
    PlayS480(6);
    break;
    case 7:
    FG_PutStr("     7V",3,60,20); 
    PlayS480(7);
    break;
    case 8:
    FG_PutStr("     8V",3,60,20);
    PlayS480(8);
    break;
    case 9:
    FG_PutStr("     9V",3,60,20);
    PlayS480(9); 
    break;
    default:
    break;
    }
    Set_IOA_Bit(0,0,1,1,1);                              //关闭LCD片选
    
}
}
}
   }
   
	
}
//============================================================= 
// 函数名称:    AD(void)
// 功能描述:	数据采集
// 语法格式:    void AD();
// 入口参数:     无
// 出口参数:    采得的数据
// 注意事项:    仅为用户模型
//=============================================================
unsigned int AD(void)
{
	unsigned int uiData;
	while(!(*P_ADC_MUX_Ctrl&0x8000));		//等待采样完成
    uiData=*P_ADC_LINEIN_Data; 
    
  //  while(!(*P_ADC_MUX_Ctrl&0x8000));  
  //  uiData=*P_ADC_LINEIN_Data;         
    
	return(uiData&0xffc0);
}
//============================================================= 
// 函数名称:    PlayS480(int Result)
// 功能描述:	语音播放
// 语法格式:    void PlayS480(int Result);
// 入口参数:    要播放的段
// 出口参数:    无
// 注意事项:    仅为用户模型
//=============================================================
void PlayS480(int Result)
{
    int j,k,i;
	SACM_S480_Initial(1);                     //播放初始化,来自于SacmV26e.lib
	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 + -