#include<htc.h>
__CONFIG(INTIO);
//系统初始化 端口输入输出,定时器等
void init()
{
//关闭中断
GIE=0;
T0IE=0;
//输入端口配置
TRISA2=1; //ON
TRISA5=1;//OFF
TRISC0=1;//AUTO
TRISC1=1;//2H
TRISC2=1;//4H
TRISC3=1;//6H
TRISC4=1;//8H
TRISA4=1;//感光
//输出端口配置
TRISC5=0;//CONTROL 继电器输出;
CMCON0=7;
ANSEL=0x00;
//配置TIMER0;
OPTION=0xc7;//T0位定时器模式,启用预分频器1:256;
TMR0=0;
//开启定时器 开启中断;
T0IE=1;
PEIE=1;
GIE=1;
}
//T0中断服务程序
int tick_count=0;
int light_detect_count=0;
unsigned int delay_countl=0;
unsigned int delay_counth=0;
unsigned char func=0x3; //当前扫描时刻的功能输入 最后两位无效
unsigned char func_pre=0x03;//前一个扫描时刻的功能输入
bit light_status;//光状态
bit light_status_pre;//光的前一状态
bit light_change=0;//光变化标志
bit auto_flag=0;//自动开关标志
int onlight_delay=0;
bit delay_flag=0;
void interrupt tc_int()
{ RC5=1;
if (T0IE && T0IF) //T0中断处理
{
T0IF=0;
//处理旋钮
tick_count++;
if(tick_count==15) //约为1s
{
tick_count=0;
func=RA2<<7 | RA5<<6 | RC0<<5 | RC1<<4 | RC2<<3 | RC3<<2 | RC4<<1;
if(func^func_pre)//当前功能变化
{
switch(func)
{
case 0b01111111 : light_detect_count=0;auto_flag=0;RC5=1; break;//
case 0b10111111 : light_detect_count=0;auto_flag=0;RC5=0;break;//
case 0b11011111 : auto_flag=1;delay_flag=0;break;//
case 0b11101111 : auto_flag=1;delay_flag=1;onlight_delay=2;delay_countl=0;delay_counth=0;break;//
case 0b11110111 : auto_flag=1;delay_flag=1;onlight_delay=4;delay_countl=0;delay_counth=0;break;//
case 0b11111011 : auto_flag=1;delay_flag=1;onlight_delay=6;delay_countl=0;delay_counth=0;break;//
case 0b11111101 : auto_flag=1;delay_flag=1;onlight_delay=8;delay_countl=0;delay_counth=0;break;//
default : break;
}
}//if(func^func_pre)
func_pre=func;
}//if(tick_count==15)
//处理光传感器
if(auto_flag==1)
{
light_detect_count++;
if(light_detect_count==70) //约为15s
{
light_detect_count=0;
light_status=RA5;
if(light_status^light_status_pre)//光发生变化 即当前光状态不等于前15S的光状态
{
light_change=1;
}
else
{
if(light_change==1)//延迟15s后确定光状态产生变化
{
light_change=0;
if(light_status==0)//当前环境黑暗 应打开电源
{
RC5=1;
delay_countl=0;
delay_counth=0;
}
else//当前环境明亮 应切断电源
{
RC5=0;
}
}//if(light_change==1)
}//else//if(light_status^light_status_pre)
}//if(light_detect_count==225) //约为15s
if(delay_flag==1&&light_status==0)//接通延时
{
delay_countl ++;
if(delay_countl==39062)//39062 是10s
{
delay_countl=0;
delay_counth++;
if(delay_counth==360*onlight_delay)//定时时间到
{
delay_counth=0;
RC5=0;//关闭电源
}
}
}
}//if(auto_flag==1)
}//if (T0IE && T0IF)
}
int main()
{
init() ;
func_pre=10111111;//要读取当前的环境 包括旋钮和光
RC5=0;
light_status_pre=0;
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>