#include <iot26v.h>
#include <macros.h>
//变量的定义
unsigned char temp; //PORTB口状态?
unsigned int AD_data; //AD采样值
unsigned int temp1,CP_time;
unsigned char Key_num=0; //
//标志的定义
unsigned char open_status=0x00;//开窗标志定义:0x01-窗正在开启;0x00-窗正没有在开启;;
unsigned char close_status=0x00;//关窗标志定义:0x01-窗正在关闭;0x00-窗正没有在关闭;;
unsigned char stop_status=0x00;//
unsigned char open_close=0x00;//0x01:开窗;0x11:关窗
//函数的定义
unsigned int get_ad(void); /*AD采样函数*/
unsigned char Scan_Key(void);//判断按键并且返回状态值
void set_value(void); //动作判断函数
void open_window(void); //开窗函数
void close_window(void); //关窗函数
void stop_window(void); //开窗函数
void Test_current(void); //检测电流
/*********************************************************************************************
延时函数
函数说明:软件延时函数,此函数延时单位约为1mS。
晶振频率:CPU内部1M晶振。
带入参数:i无符号整型,变量范围:0-65535。
返回参数:无
*********************************************************************************************/
void delay_ms(unsigned int i) {
unsigned int a;
unsigned char b;
for (a = 0; a < i; a++) {
for (b = 1; b; b++) {;
}}}
void t1_init(void) {
OCR1A=250; //设定计数次数
TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
TCCR1B|=(1<<CS13); //256分频
TCCR1B|=(1<<CS10);
}
/*********************************************************************************************
主函数
*********************************************************************************************/
void main(void) {
unsigned int i,b;
DDRA = 0x7F; /*方向输出*/
PORTA = 0x73; /*高电平*/
DDRB = 0x00; /*方向输入*/
PORTB = 0x77; /*打开上拉*/
SEI(); /*开总中断*/
MCUCR|=(1<<SE); //睡眠使能
MCUCR|=(1<<SM1); //掉电模式
t1_init(); /*定时器T1初始化*/
while(1)
{
for(b=0;b<10;b++){
for(i=0;i<60000;i++){
if(open_close==0x01)//执行开窗
{open_close=0x00;
open_window();}
if(open_close==0x11)//执行关窗
{open_close=0x00;
close_window();}
}}
PORTA&=0xBF;
GIMSK |= (1 << PCIE0); /*外部电平变化中断允许*/
asm("sleep"); //进入睡眠模式
GIMSK &= ~(1 << PCIE0); /*外部电平变化中断禁止?*/
}
}
#pragma interrupt_handler EXT1: iv_PIN_CHANGE
//外部中断引脚电平变化中断-PB0
void EXT1(void) {
delay_ms(20); }
#pragma interrupt_handler TIME0: iv_TIMER1_COMPA
void TIME0(void) {
temp1++;
//Test_current();//电流检测函数
set_value(); //获取按键值
if(temp1%2==0)
{PORTA&=0xBF;}
if(temp1%2!=0)
{PORTA|=~(0xBF);}
}
/*********************************************************************************************
ADC采样函数
函数说明:采样ADC通道0。
晶振频率:CPU内部1M晶振。
带入参数:无
返回参数:16位AD值
*********************************************************************************************/
unsigned int get_ad(void) {
ADCMUX=(1 << REFS1); /*基准2.56V,P*/
ADCMUX |= (1 << MUX2) | (1 << MUX1); /*通道6*/
ADCSR = (1 << ADEN) | (1 << ADSC) /*使能、开启*/
| (1 << ADPS1) | (1 << ADPS0); /*8分频*/
while(!(ADCSR & (1 << ADIF))); /*等待采样结束*/
AD_data = ADC; /*读取AD结果*/
ADCSR &= ~(1 << ADIF); /*清标志*/
ADCSR &= ~(1 << ADEN); /*关闭转换*/
return AD_data; /*返回结果*/
}
void Test_current(void) //检测电流值
{unsigned char i;
i=get_ad();
i=get_ad();
if(i>290){stop_window();}
}
unsigned char Scan_Key(void)
{//按键扫描函数,只扫描0 1 2前三挝?
unsigned char Key_num1;
Key_num1=PINB; //取得当前PB口的值
if((Key_num1&0x07)!=0x07)//判断是否有键按下
{ delay_ms(10); //延时20MS
Key_num1=PINB; //再次取得值
if((Key_num1&0x07)!=0x07)//再次判断是否按键有效
{Key_num1=Key_num1&0x07;//
do{;}while((PINB&0x07)!=0x07);
return Key_num1;} //返回当前按键值
}
}
void set_value(void)//动作判断函数
{
Key_num=Scan_Key();
if(Key_num==0x06) //判断是否按下了开窗按钮
{ //开窗动作标志 关窗动作标志
if((open_status==0x00)&&(close_status==0x00))//如果开与关窗标志都为0,表示窗处于
{open_close=0x01;} //停止状态,那么置开窗执行标志为0x01,开窗
if((open_status==0x00)&&(close_status==0x01))//如果窗正处于关闭过程,则停止动作
{stop_window();}
}
//判断是否按下了关窗按钮
if(Key_num==0x05)
{ if((open_status==0x00)&&(close_status==0x00))
{open_close=0x11;} //置关窗标志有效
if((open_status==0x01)&&(close_status==0x00))
{stop_window();}
}
//判断是否按下了停止按钮
if(Key_num==0x03){stop_window();}
}
//开窗函数
void open_window(void){
PORTA&=0xFE; //开窗指示灯
PORTA|=(1<<PA2); //开窗:置PA2开窗
open_status=0x01;//开窗标志置1,正在开窗
for(CP_time=0;(open_status==0x01)&&(CP_time<60);CP_time++)
{delay_ms(1000);} //延时
open_close=0x00; //开窗执行标志清0
open_status=0x00;//开窗标志清0,
PORTA|=~0xFE; //结束开窗
PORTA&=~(1<<PA2);
}
//关窗函数
void close_window(void){
PORTA&=0xFD; //关窗指示灯
PORTA|=(1<<PA3); //关窗
close_status=0x01;//关窗标志置1,正在关窗
for(CP_time=0;(close_status==0x01)&&(CP_time<60);CP_time++)
{delay_ms(1000);} //
open_close=0x00; //关窗执行标志清0
close_status=0x00;//关窗标志清0,
PORTA|=~0xFD ; //结束关窗
PORTA&=~(1<<PA3);
}
//停止函数
void stop_window(void){
PORTA|=~0xFE; //结束开窗
PORTA|=~0xFD ; //结束关窗
PORTA&=~(1<<PA2);
PORTA&=~(1<<PA3);
open_close=0x00;
close_status=0x00;//开窗标志清0,
open_status=0x00; //关窗标志清0,
} |