红外感应自动门程序
#define PWMOUT_1 (PORTD=PORTD&0x7f)//PWM端输出1
#define SACE_0 (PORTD=PORTD|0x40)//SACE端输出0
#define SACE_1 (PORTD=PORTD&0xbf)//SACE端输出1
#define FANXIANG_L (PORTD=PORTD|0x20)//方向向左
void timer0(void)
{SREG|=0x80;
round_cnt++;
dis_bit++;
if(dis_bit>2)dis_bit=0;
if(fst==1)cnt_500++;
if(cnt_500>500){fst=2;round_cnt=0;cnt_500=0;}
switch(dis_bit)
#include<iom16v.h>//文件包含
#include<eeprom.h>
#define uchar unsigned char //变量类型的宏定义
#define uint unsigned int
uchar const seg[10]={0x3f,0x06,0x5b,0x4f,0x66, //数码管段码设定
{EEPROM_READ(open_min_address,open_min_temp);}
//*************************************
eep_temp=0;
EEPROM_READ(close_max_address+1,eep_temp);
if(eep_temp==55)
0x6d,0x7d,0x07,0x7f,0x6f};
uchar const act[4]={0xdf,0xbf,0x7f,0xef}; //数码管位码设定
/***********************输入量设定*************************/
uchar stoptime=3;//靠墙停顿时间设定
/******************函数声明***********************/
void start(void);
//void fai_zhan(void);
/****************延时子函数*******************/
void delay(uint k)
{
uint i,j;
round_cnt=0;
changdu=0;
sp_pl=0;
allchangdu=0;
changdu=0;
st_changdu=0;
status=0;
inc_dec_flag=0;
//***********************************
eep_temp=0;
EEPROM_READ(stoptime_address+1,eep_temp);
{EEPROM_READ(close_min_address,open_min_temp);}
//*************************************
eep_temp=0;
EEPROM_READ(study_speed_address+1,eep_temp);
if(eep_temp==55)
uchar const round_cnt_tab[10]={5,6,7,8,9,10,15,20,25,30};
uchar const study_speed_tab[10]={5,7,9,11,13,15,
20,25,30,35};
uchar const open_max_tab[10]={100,120,140,150,155,
}
TCNT0=0xd9;
switch (status)
{//门全开后转状态10
case 0:if(round_cnt>200){status=10;}break;
//门全关后转状态30停止
case 20:if(round_cnt>200){status=30;}break;
uchar const close_min_tab[10]={5,7,8,9,10,
15,20,25,30,35};
uint round_cnt; //直流电机旋转的圈数
int changdu; //实际门扇移动的长度
uint st_changdu;//设定门扇移动的长度
uint allchangdu_x; //总长度(中间变量)
#define LOCK_OFF (PORTD=PORTD|0x10)//锁停门扇关闭
#define CON_SMAIL (PORTC&0x01)//门扇打开微小的距离运行
#define TANTE1 (PINC&0x40)//门外侧的红外感应探测器1
#define TANTE2 (PINC&0x02)//门内侧的红外感应探测器2
uchar openflag;
uchar dis_bit,ddata=0;
/***********************************************/
uchar inc_dec_flag;//加减速的标志
uchar wide=0;//加减速的脉冲宽度变量
/****************常量定义***************/
#define close_max_address 30
#define close_min_address 35
/***********************************************************/
uchar openstop;//门全开后停止不动的标志
uchar tante_flag;//门外侧的红外感应探测器1允许使用的标志
uchar close_max_temp=1,close_min_temp=4;
/*****************输入量的列表****************/
uint const stoptime_tab[10]={500,1000,2000,3000,4000,5000,
6000,7000,8000,9000};
{EEPROM_READ(open_max_address,open_max_temp);}
//*************************************
eep_temp=0;
EEPROM_READ(open_min_address+1,eep_temp);
if(eep_temp==55)
for(i=0;i<k;i++){
for(j=0;j<1500;j++)
{;}}
}
/*==========初始化单片机I/O口子函数==========*/
void init_IO(void)
{DDRA=0x7f;
PORTA=0x00;
DDRB=0xe0;
PORTB=0xff;
DDRC=0x01;
PORTC=0xff;
#define OFF_TANTE1 (PINB&0x10)//关闭门外侧的红外感应探测器1
#define HALF_RUN (PIND&0x01)//门扇半开运行
#define ALLOPEN_STOP (PIND&0x02)//门扇全开后锁停
#define STOP (PINC&0x10)//门扇锁停
{EEPROM_READ(close_max_address,open_max_temp);}
//*************************************
eep_temp=0;
EEPROM_READ(close_min_address+1,eep_temp);
if(eep_temp==55)
{EEPROM_READ(study_speed_address,study_speed_temp);}
}
/*===================================================*/
/***定时器T0的1ms中断,用于数码管显示及检测运行状态的马达堵转情况***/
#pragma interrupt_handler timer0:10
uchar eep_temp;
uchar open_inc_tab[16];//开门加速函数的计算表
uchar open_dec_tab[16];//开门减速函数的计算表
uchar close_inc_tab[16];//关门加速函数的计算表
uchar close_dec_tab[16];//关门减速函数的计算表
#define KEY_SET (PINB&0x01)//按键输入SET
#define KEY_ADD (PINB&0x02)//按键输入ADD
#define KEY_OK (PINB&0x04)//按键输入OK
#define OFF_ALLTANTE (PINB&0x08)//关闭全部的红外感应探测器
#define FANXIANG_R (PORTD=PORTD&0xdf)//方向向右
#define RELAY_ON (PORTD=PORTD&0xf7)//继电器吸合
#define RELAY_OFF (PORTD=PORTD|0x08)//继电器断开
#define LOCK_ON (PORTD=PORTD&0xef)//锁停门扇打开