📄 main.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 + -