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

📄 main.c

📁 光电池LED自动照明控制系统的设计与实现
💻 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 + -