📄 main.c
字号:
//=====================================================================================================
// 工程名: 光电池LED自动照明控制系统主控制器程序
// 涉及的库: CMacro1016.lib
// SacmV26e.lib
// 组成文件: main.c /1602.h/bit.h
// 480.h/480.inc/hardware.h/hardware.inc
// SPCE061A.h/SPCE061A.inc
// 功能实现: 实现对LED太阳能系统的智能控制,识别环境光度,PWM控制LED照明灯亮度,控制充电,灯的开关等。
// 作者: 赖玉平 -- 桂林电子科技大学
// 完成日期: 2008年6月5日
//====================================================================================================
#include "VolMeasure.h" //定义了一个结构体
#include "1602.h"
#include "bit.h"
#include "SPCE061A.h"
#define charge_control P0_11 //低电平有效 ----充电控制
#define Light_control P0_12 //低电平有效 ----照明灯控制
float fVolVal;
struct ST_VolValude VolValude; //0-3。3V电压表服务结构
int uiVolFlag=0,uiVolFlagOne=0;
long int uiVolFlagHow=0;
unsigned int uiData;
long int liDataVol;
unsigned int Second=0;
unsigned char keycount;
int Control_bit=0; //控制标置位 0是自动,1是手动
unsigned char Show_Test [16]= {"Fir: "};//第1行
unsigned char Show_model [16]= {"Model: "};
int TeleNum_ID=0; //拨号选择0是不拨,1拨数组Telephone1,2 拨数组Telephone2,3拨数组Telephone3
char tep=0; //当模式为5是,此时按S2键,就能逐个翻看以前的记录
unsigned int AD_Read(void);
void PlayS480(int Result);
void Scan_sensor(void);//扫描传感
void Control(void); //分析环境光,控制充电与灯开关
void Scan_key(void);
//========================================================================
// 语法格式: int main(void)
// 实现功能: 主程序
// 参数: 无
// 返回值: int 无
//========================================================================
int main(void)
{
int i=0,j=0,k=0,m;
unsigned int temp;
unsigned char keycount;
//================================================================================
*P_SystemClock = 0xff18; //初始化,调整系统时钟24.576MHz/1,强振模式
*P_IOA_Dir = 0xff3f;
*P_IOA_Attrib = 0xff3f; //初始化IOB同相低电平输出口
*P_IOA_Data = 0xff3f;
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff; //初始化IOB同相低电平输出口 0111 0011
*P_IOB_Data = 0xffFf;
//====================================================================================
VolValude.VolTureValudeB=7; //初始化电压采集值
init_LCD();
fVolVal=0.0;
//====================================================================================
T0_Unit = 0x34; //定时器选择时钟源为:4096Hz
T0 = 0xFFFE; //T0频率设置为:2048Hz
while(1) //主循环
{
*P_Watchdog_Clear=C_WDTCLR;
Scan_sensor();
display_1602(0x80,Show_Test,16);
display_1602(0xc0,Show_model,16);
Control();
Scan_key();
}
}
//=============================================================
// 语法格式: 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);
SACM_S480_Play(Result, 3, 3);
while((SACM_S480_Status()&0x0001) != 0)
{
SACM_S480_ServiceLoop();
*P_Watchdog_Clear=C_WDTCLR;
}
SACM_S480_Stop();
T0_Unit = 0x34; //定时器选择时钟源为:4096Hz
T0 = 0xFFFE; //T0频率设置为:2048Hz
}
void Scan_sensor(void)//巡查各个传感器状态
{
int i=0,j=0,temp,m;
//AD相关--------------要采集电压时,就打开
*P_DAC_Ctrl = 0;
*P_ADC_Ctrl = C_ADCE+C_MIC_DIS+C_AGCN+C_DAC_OUT3mA+C_VEXTREF_DIS+C_V2VREFB_DIS;
//---------------------
while((*P_ADC_MUX_Ctrl&0x8000)!= 0x8000);
*P_ADC_MUX_Ctrl=C_ADC_CH7; //火灾
// 从IOA6口输入模拟电压 //这是决定采哪一路电压的关键
//播放语音后会改变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;
//得到电压值
//取得要在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;
Show_Test[3]='0'+VolValude.LCD[0] ;
Show_Test[4]='.' ; // "."
Show_Test[5]='0'+VolValude.LCD[1]; //十位
Show_Test[6]='0'+VolValude.LCD[2] ; //个位
Show_Test[7]='0'+VolValude.LCD[3] ; //十分位
Show_Test[8]='0'+VolValude.LCD[4] ; //百分位
}
void Control(void) //分析环境光,控制充电与灯开关
{
//--------------分析光线情况,当测量的电压于3.0V,表示升压电路已工作,可以充电,
// 闭合充电继电器,
if(VolValude.LCD[0]==3) //个位为3
{
if(charge_control!=1)
{
charge_control=1;
PlayS480(2); //发音提示-充电
}
}
else//----------断开-----------------------
{
if(charge_control!=0)
{
charge_control=0;
PlayS480(3); //发音提示-充满
}
}
//-------------------------------------------
//照明灯开关控制
if(Control_bit==0) //自动模式
{
if(VolValude.LCD[0]==0) //个位为0,十分位小于9 ,小于0.9V
{
if(Light_control!=0)
{
Light_control=0; //开灯
PlayS480(5); //发音提示-开灯
}
}
else
{
if(Light_control!=1)
{
Light_control=1; //关灯
PlayS480(4); //发音提示-关灯
}
}
// -------------------------------------------
//PWM调光
if(Light_control==0)
{
switch(VolValude.LCD[1])
{
case 0: PWM0=14;
break;
case 1: PWM0=13;
break;
case 2: PWM0=11;
break;
case 3: PWM0=10;
break;
case 4: PWM0=8;
break;
case 5: PWM0=7;
break;
case 6: PWM0=5;
break;
case 7: PWM0=4;
break;
case 8: PWM0=3;
break;
case 9: PWM0=2;
break;
default:break;
}
}
}
}
void Scan_key(void)
{
unsigned int i;
static int pwmCONT=0;
i=*P_IOA_Data;//**
*P_IOA_Data=i&0xfff8;
i=*P_IOA_Data;//**
i=i&0x0007;//**
if(i!=0x0000)
{
switch(i)
{
case 0x0001:
if(Control_bit==1)
{
Control_bit=0; //自动模式
Show_model[7]= 'A';
Show_model[8]= 'u';
Show_model[9]= 't';
Show_model[10]= 'o';
Show_model[11]= ' ';
Show_model[12]= ' ';
PlayS480(0); //发音提示---自动
}
else
{
Control_bit=1; //手动调光模式
Light_control=0; //开灯
Show_model[7]= 'M';
Show_model[8]= 'a';
Show_model[9]= 'n';
Show_model[10]= 'u';
Show_model[11]= 'a';
Show_model[12]= 'l';
PlayS480(1); //发音提示-
}
while(i==0x0001)
{
i=*P_IOA_Data;//**
*P_IOA_Data=i&0xfff8;
i=*P_IOA_Data;//**
i=i&0x0007;//**
*P_Watchdog_Clear=C_WDTCLR;
}
break;
case 0x0002:
pwmCONT++;
if(pwmCONT>14)
{
pwmCONT=0;
P1_8=0;
}
PWM0= pwmCONT;
Show_Test[13]='0'+pwmCONT/10 ; //十位
Show_Test[14]='0'+pwmCONT%10 ; // 个位
while(i==0x0002)
{
i=*P_IOA_Data;//**
*P_IOA_Data=i&0xfff8;
i=*P_IOA_Data;//**
i=i&0x0007;//**
*P_Watchdog_Clear=C_WDTCLR;
}
break;
case 0x0004:
pwmCONT--;
if(pwmCONT<0)
{
pwmCONT=14;
P1_8=0;
}
PWM0= pwmCONT;
Show_Test[13]='0'+pwmCONT/10 ; //十位
Show_Test[14]='0'+pwmCONT%10 ; // 个位
while(i==0x0004)
{
i=*P_IOA_Data;//**
*P_IOA_Data=i&0xfff8;
i=*P_IOA_Data;//**
i=i&0x0007;//**
*P_Watchdog_Clear=C_WDTCLR;
}
break;
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -