📄 temp.c
字号:
#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 + -