找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4839|回复: 0
收起左侧

自动门控制程序共享

[复制链接]
ID:159277 发表于 2017-1-3 21:09 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define  uchar unsigned char
#define  uint unsigned int

#define TIME_COUNT 11//22.1184MHz晶振10us定时中断
#define FOSC 11059200L//22118400L

sfr P2M1=0x95;
sfr P2M0=0x96;

sbit sb=P3^2;//开门信号
sbit sq1=P3^3;//开门限位
sbit sq2=P3^4;//关门限位
sbit s4=P3^5;//关门防夹

sbit x0=P1^0; //延时关门时间选择
sbit x1=P1^1;
sbit x2=P1^2;
sbit x3=P1^3;
sbit x4=P1^4;
sbit x5=P1^5;
sbit x6=P1^6;
sbit x7=P1^7;//延时关门时间选择

sbit kai=P2^1;//开门(正转)
sbit guan=P2^0;//关门(反转)

uchar aa[3],bb; //串口收到数据寄存器
uchar z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10; //时间继电器
uint t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;        //时间继电器
uint num1,n,n1,n2,n3,n4,n5,n6,n7,n8;//延时关门设置
uchar a=0,m;//门当前状态

void delayms(uint xms);
void kaimen();
void guanmen();

void delayms(uint xms)            //延时函数
{
   uint i,j;
   for(i=xms;i>0;i--)
       for(j=330;j>0;j--);
}
void init()
{

        P2=0; P2M0=0xff;P2M1=0;       
        TMOD=0x01;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;                                                                                                                                          
        EA=1;ET0=1;TR0=1;
        if(x0==0){delayms(5);if(x0==0)n1=20;}        if(x0==1){delayms(5);if(x0==1)n1=0;}
        if(x1==0){delayms(5);if(x1==0)n2=40;}        if(x1==1){delayms(5);if(x1==1)n2=0;}
        if(x2==0){delayms(5);if(x2==0)n3=60;}        if(x2==1){delayms(5);if(x2==1)n3=0;}
        if(x3==0){delayms(5);if(x3==0)n4=100;}        if(x3==1){delayms(5);if(x3==1)n4=0;}
        if(x4==0){delayms(5);if(x4==0)n5=160;}        if(x4==1){delayms(5);if(x4==1)n5=0;}
        if(x5==0){delayms(5);if(x5==0)n6=200;}if(x5==1){delayms(5);if(x5==1)n6=0;}
        if(x6==0){delayms(5);if(x6==0)n7=300;}if(x6==1){delayms(5);if(x6==1)n7=0;}
        if(x7==0){delayms(5);if(x7==0)n8=400;}if(x7==1){delayms(5);if(x7==1)n8=0;}
        n=n1+n2+n3+n4+n5+n6+n7+n8+1;
//        while(!sb||!s4);guanmen();
}


void USART_Init(uint BAUD)//初始化串行口和波特率发生器
{                    
        SCON =0x50;           //选择串口工作方式1,打开接收允许
        TMOD=0x21;           //定时器1工作在方式2,定时器0工作在方式1
    TH1 =TL1 = (256 - (FOSC/12/32/BAUD));   //设置波特率重装值
        TR1 =1;               //启动定时器T1
        ES=1;                 //允许串行口中断
        EA=1;
}
void kaimen()                                                //开门函数
{
        t0=0;  //计时器清零
        z0=1;        //打开计时器
        kai=1;        //开门
        while(1)
        {
                if(a==3&&z4==0){SBUF=0x3b;while(!TI);SBUF=P0;while(!TI);SBUF=0xe7;while(!TI);a=3;z4=1;}        //正在开门信号发出
                if(sq1==0){delayms(5);if(sq1==0){kai=z0=t0=0;m=1;break;}}         //开门到位
                if(t0>=300)     //计时保护30秒
                {
                        kai=0;guan=0;while(!sq2);while(1)
                        {
                                if(sq1==0||sq2==0||t0>3000){delayms(5);if(sq1==0||sq2==0||t0>3000){z0=t0=0;break;}}
                        }break;
                }
        }
        z2=1;
        while(!sb||z2||!s4)
                {
                        if(a==3&&z3==0){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);z3=1;}           //开门完成信号发出
                        if(a==1){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);a=0;}        //门开到位信号发出
                        if(a==2){z3=t3=0;}         //AGV收到开门完成信号
                        if(t3>50)t3=z3=0;//AGV没有收到开门完成信号 重复发送开门信号
                        if(t2>=n)z2=t2=0;//延时关门       
                }
        if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出
        m=a=0;
        guanmen();
}
void guanmen()                                                //关门函数
{
        t0=0;z0=1;guan=1;
        while(1)
        {
                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出
                if(sq2==0){delayms(5);if(sq2==0){guan=t0=z0=0;break;}}        //关门到位
                if(t0==300)     //计时保护
                {
                        kai=0;guan=0;while(!sq1);while(1)
                        {
                                if(t0>=3000){num1++;if(num1==4){while(sq2);num1=0;}t0=z0=0;break;}
                                if(sq1==0||sq2==0){delayms(5);if(sq1==0||sq2==0){t0=z0=0;break;}}
                        }break;
                }
                if(sb==0||s4==0){delayms(5);if(sb==0||s4==0){guan=0;delayms(2000);kaimen();}}//开门信号
        }
}                                                               
void main()
{
        init();
        USART_Init(9600);
        while(1)
        {       
                if(sb==0){delayms(5);if(sb==0)kaimen();}//感应有人
                if(sq2==1){delayms(5);if(sq2==1)guanmen(); }//没关好门
                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出       
        }         
}

void T0_time() interrupt 1
{
        TH0=(65536-45872)/256;                   //
        TL0=(65536-45872)%256;
        if(z0==1) t0++;   //时间继电器0        开关门卡死保护          
        if(z1==1) t1++;   //时间继电器1  收信号间隔清零时间          
        if(z2==1) t2++;   //时间继电器2        延时关门          
        if(z3==1) t3++;   //时间继电器3  发出信号没回应延时再次发送            
        if(z4==1) t4++;   //时间继电器4              
        if(z5==1) t5++;   //时间继电器5              
        if(z6==1) t6++;   //时间继电器6           
        if(z7==1) t7++;   //时间继电器7           
        if(z8==1) t8++;   //时间继电器8               
        if(z9==1) t9++;   //时间继电器9               
        if(z10==1) t10++; //时间继电器10
       
        if(t1>=2)z1=t1=bb=0;//间隔超时清零
//        if(t10==0)guan=0;if(t10==5)guan=1;if(t10>10)t10=guan=0;       
}

void USART(void) interrupt 4
{

        if(RI)
        {       
                aa[bb]=SBUF;
                RI=0;
                bb++;
                z1=1;
                t1=0;
                if(bb>=3)
                {
                        bb=z1=t1=0;
                        if(aa[0]==0x1e&&aa[1]==P0&&aa[2]==0x37)        //开门信号
                        {
                                sb=0;
                                if(m==0){z4=0;a=3;}        //正在开门信号发出
                                if(m==1){a=1;}        //门开到位信号发出
                        }
                        if(aa[0]==0x37&&aa[1]==P0&&aa[2]==0x6e)          //AGV收到开门信号
                        {
                                sb=0;a=2;
                        }
                        if(aa[0]==0x69&&aa[1]==P0&&aa[2]==0x17)         //关门信号
                        {
                           a=4;//关门信号发出
                           sb=1;
                        }
                }       
        }
        if(TI)
                TI=0;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表