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