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

📄 temp.c

📁 该程序是pic单片机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include 	    <pic.h>
#include 		<math.h>
#include 		"iic.h"
#include 		"initial.h"
#include 		"tsl2561.h"
#include 		"initialcd.h"
#include        "slaveWR.h"


bank1 unsigned	char	COMMAND0,COMMAND1,COMMAND2,InEEPromData,delayforstop;  //

bank1 unsigned   int	j,kk,pwmnew,setdataB,setdataB1,setdataB2,setdataB3,setdataB4,setdataB5,setdataB0,setdataB10,settemp1; 
bank1 unsigned   int  TSL2561result,DS1631result;
bank1 bit  Receive_Over,ADCconvert_over,TSL2561_Finished,Start;
bank1 unsigned char AD_Result_low,AD_Result_high;
bank1 unsigned  char CCPXYOLDE,setdata0,slavedata0,TV_number;

union	adres
{
	int	y1;
	unsigned 	char	adre[2];
}adresult;					   //定义一个共用体`



// 修改脉宽子函数
void  PWMadjust2(pwmnew)
{
   if(pwmnew != pwmold)
   {
      pwmlow=pwmnew&0X0003;    //提取pwm的低两位。
      
      pwmhigh=pwmnew>>2;       //右移2位,提取pwm高8位。
      CCPR1L=pwmhigh;  ///重装CCPR1L的值。

      pwmlow=pwmlow<<4;        //新的CCP1X:CCP1Y
      CCPXYNEW=CCP1CON&0XCF;   //清CCP1X:CCO1Y
      CCPXYNEW=CCPXYNEW|pwmlow;//获取新的CCP1CON,存储于CCPXYNEW中。
   
      CCP1CON=CCPXYNEW;  
     
      
      pwmold=pwmnew;   // 将新的pwm值传给老的pwm值,便于存储。
     }

}
//发送子程序
void  TR_Senddata(unsigned char data)
{
   	TXREG=data;		            //发出一个字符
   	while(1){
		if(TXIF==1) break;
	        }					//等待写入完成
  
}

void TR_Send_Word(unsigned int DataWord)
{
  unsigned char Data_temp;
    Data_temp=DataWord;

  	TXREG=DataWord>>8;		            //发出高位
   	while(1){
		if(TXIF==1) break;
	        }				  	        //等待写入完成
    nop();nop();nop();nop();            //等一下
    TXREG=Data_temp;		            //发出低位
   	while(1){
		if(TXIF==1) break;
	        }					        //等待写入完成

}
////

//延时子程序
void	delay()
{
	for(j=755;--j;)	continue;
}

//延时子程序2
void  delaytimes(unsigned  int delay_time)
 { unsigned  int  k;
    for(k=delay_time;--k;) continue;
 }
//开机曲线子程序
void  power_on(void)
{
  CCPR1L=0xFF;        //先给灯管加高电压,使其迅速发热。
  delaytimes(65535);  //延时等待一段时间,大约0.5秒。
  delaytimes(65535);
   asm("clrwdt");
 // delaytimes(65535);
  CCPR1L=pwmold>>2;        //恢复上一次的亮度值。
  delaytimes(65535);
   asm("clrwdt");
}
//AD转换结果运算子程序
void  ADConvert(void)      //AD转换子程序
{
   asm("clrwdt");
   while(1)
     {if(ADIF==1)  break;}

        ADIF=0;				        //清除中断标志
	    adresult.adre[0]=ADRESL;
	    adresult.adre[1]=ADRESH;	//读取并存储A/D转换结果,A/D转换的结果通过共用体的形式放入了变量y1中 
		
      //ADresult=adresult.y1;				        //  
	    
	  	ADCconvert_over=1;          //AD转换完成标志。

}
//数字滤波程序
void  Filter()
{   
     ADGO=1;
     ADConvert();
   
     setdataB1=adresult.y1;                         //获取采样值
     delaytimes(106);
     ADGO=1;
     ADConvert();  
       
     setdataB2=adresult.y1;   
     delaytimes(106);
     ADGO=1;
     ADConvert();  
       
     setdataB3=adresult.y1;  
     delaytimes(106);
     ADGO=1;
     ADConvert();  
       
     setdataB4=adresult.y1;
     delaytimes(106);
     ADGO=1;
     ADConvert();  
       
     setdataB5=adresult.y1;  
    
     setdataB=(setdataB1+setdataB2+setdataB3+setdataB4+setdataB5)/5; 

     AD_Result_low=setdataB;
     AD_Result_high=setdataB>>8;    

}
//动态调整PWM子程序
void  DynamicAdjust()
{ 
 do
   { RB6=0; //亮灯表示正在调整
    
    Filter();
    setdataB0=setdataB;

    Filter();
    setdataB10=setdataB; 

     //settemp=setdataA;                              //暂存上一次的PWM值
    if(setdataB0==setdataB10)  
     {  if(setdataB0 > setdataC)                      //如果采样值大于设定值
          { settemp1=setdataB-setdataC;
              if(settemp1>0X10)
                 { setdataA=setdataA-0X05;
                   PWMadjust2(setdataA);
                   delaytimes(65535);
                   asm("clrwdt");
                  }
              if(settemp1<=0X10)
                 { setdataA=setdataA - 1;
                   PWMadjust2(setdataA);
                   delaytimes(9999);
                   asm("clrwdt");
                  }
           }
        if(setdataB0 < setdataC)                        //如果采样值小于设定值
           { settemp1=setdataC-setdataB;
             if(settemp1>0X10)
                 { setdataA=setdataA+0X05;
                   PWMadjust2(setdataA);
                   delaytimes(65535);
                   asm("clrwdt");
                  }
             if(settemp1<=0X10)
                 { setdataA=setdataA + 1;
                   PWMadjust2(setdataA);
                   delaytimes(9999);
                   asm("clrwdt");
                  }
            }
       }
    } while(setdataB0 != setdataC);

    RB6=1; //关灯表示调整完成。
  
}


//中断服务程序
void interrupt INTSERVERCE(void) 
{
    if(SSPIE && SSPIF)
     {
      SSPIF=0;
     // if(Scommand2==0xF0)  //if IIc Command is Write Command then delay 150  for waite IIC stop bit
     //   {Scommand=0x0F;  
      //   for(delayforstop=0;delayforstop<200;delayforstop++) {};
        // }
      SSP_Handle();   /////////////////////////////////
      }
    if (INTE && INTF)       //外部中断RB0服务子程序
     { 
       INTF=0;
       TSL2561_Finished=1; //
      }
  
    if (RCIE && RCIF)       //接收中断服务程序
     {   
        COMMAND0=RCREG;		
          delay();          //延时等待第二次接收
          //delay();
        if(OERR==0)
	  	 {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -