找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 611|回复: 0
打印 上一主题 下一主题
收起左侧

ZXC-0008消防喷水器 51单片机设计控制程序

[复制链接]
跳转到指定楼层
楼主



【声明】此程序仅用于学习与参考!
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h>                  //计算小数点的头文件
#include <intrins.h>          //用nop函数延时的头文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型
/*数据类型定义*/
typedef signed char        int8;
typedef signed int        int16;
typedef signed long        int32;
typedef unsigned char        uint8;
typedef unsigned int        uint16;
typedef unsigned long        uint32;



#define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0x83//SYSCLK<12MH
#define IAP_ADDRESS 0x0000        //存储地址
#define FOSC 11059200L  
#define BAUD 9600   


sbit IN1 = P1^6;                        /*单片机1.6引脚检测传感器信号输入端*/
sbit IN2 = P1^7;                        /*单片机1.7引脚检测选择工作模式是否加入自动*/

sbit LED4 = P5^5;                        /*运行指示灯*/

sbit P_LED = P5^4;                        /*转态指示灯*/

sbit MA1 = P1^1;                  /*消防泵上升*/
sbit MB1 = P1^0;                  /*消防泵下降*/
sbit MA2 = P3^5;                  /*消防泵左移*/
sbit MB2 = P3^4;                  /*消防泵右移*/
sbit MA3 = P3^3;                  /*消防泵直喷*/
sbit MB3 = P3^2;                  /*消防泵雾喷*/

/*定义遥控引脚*/

sbit YK0=P1^5;
sbit YK1=P1^4;
sbit YK2=P1^3;
sbit YK3=P1^2;

bit  BA=0;
uchar dat=0x00;
bit  BB=0;
bit  BC=0;
bit  BD=0;
bit  BE=0;
bit  BF=0;

uchar add;    //掉电保持 的地址
uchar t,r,ii;
bit write=0;
bit flag_zx=0;
uchar sendBuf[10];          //发送缓冲区
uchar receBuf[10];    //接收缓冲区
uchar sj1;
uchar sj2;

uchar k=10;
uint sec=0;
uint sec1=0;
uint sec2=0;
uint secc=0;
uint tcnt=0;
bit jsbz=0;//计时标志
bit jsbz1=0;//计时标志
bit hsbz=0;//点动与自锁标志
bit zzbz=0;//正转标志
bit fzbz=0;//反转标志
bit bz1=0;//标志
bit bz2=0;//标志
bit ddbz=0;

bit zi_bai=0;//自摆标志
uint zi_bai_sj1=0;//自摆时间
bit zi_bai_bz=0;//自摆标志

/********************************************************************
                            定义 ISP/IAP/EEPROM 命令
*********************************************************************/

void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
uint8 IapReadByte(uint16 addr);//读数据
void IapProgramByte(uint16 addr, uint8 dat);//写数据
void IapEraseSector(uint16 addr);//擦除数据
void KEY();//遥控函数
void delay(uchar t);//擦除数据
void clear_receBuf();//清空发送缓冲区
void senduart1();//发送函数
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
         { ;
         }
   }
}
/****************发送函数*********************/
void senduart1()
{           
SBUF=sendBuf[0];while(!TI);TI=0;
SBUF=sendBuf[1];while(!TI);TI=0;
SBUF=sendBuf[2];while(!TI);TI=0;
SBUF=sendBuf[3];while(!TI);TI=0;
SBUF=sendBuf[4];while(!TI);TI=0;
}

/********************************************************************
                            遥控函数
*********************************************************************/
void KEY()
{

if((YK0==0)&&(YK1==1)&&(YK2==0)&&(YK3==0)){delay(k);ddbz=1;sec=0;tcnt=0;zi_bai=0;MA2=1;MB2=1;MA1=0;MB1=1;jsbz=0;delay(k);}//上
if((YK0==1)&&(YK1==0)&&(YK2==0)&&(YK3==0)){delay(k);ddbz=1;sec=0;tcnt=0;zi_bai=0;MA2=1;MB2=1;MA1=1;MB1=0;jsbz=0;delay(k);}//下

if((YK0==0)&&(YK1==0)&&(YK2==0)&&(YK3==1)){delay(k);ddbz=1;sec=0;tcnt=0;zi_bai=0;MA2=1;MB2=0;jsbz=0;delay(k);}//左
if((YK0==0)&&(YK1==0)&&(YK2==1)&&(YK3==0)){delay(k);ddbz=1;sec=0;tcnt=0;zi_bai=0;MA2=0;MB2=1;jsbz=0;delay(k);}//右

if((YK0==0)&&(YK1==1)&&(YK2==1)&&(YK3==0)){delay(k);ddbz=1;sec=0;tcnt=0;zi_bai=0;MA2=1;MB2=1;MA3=1;MB3=0;jsbz=0;delay(k);}//直喷
if((YK0==1)&&(YK1==0)&&(YK2==0)&&(YK3==1)){delay(k);ddbz=1;sec=0;tcnt=0;zi_bai=0;MA2=1;MB2=1;MA3=0;MB3=1;jsbz=0;delay(k);}//雾喷

if((YK0==0)&&(YK1==0)&&(YK2==1)&&(YK3==1)){delay(k);zi_bai=1;sec2=0;MA2=1;MB2=0;zi_bai_bz=0;zi_bai_sj1=1200;jsbz=0;delay(k);}//自由摆3秒
if((YK0==1)&&(YK1==1)&&(YK2==0)&&(YK3==0)){delay(k);zi_bai=1;sec2=0;MA2=1;MB2=0;zi_bai_bz=0;zi_bai_sj1=2400;jsbz=0;delay(k);}//自由摆6秒

        
if((YK0==0)&&(YK1==0)&&(YK2==0)&&(YK3==0)&&(zi_bai==0))
{
delay(k);
if((YK0==0)&&(YK1==0)&&(YK2==0)&&(YK3==0)){if(ddbz==1){jsbz=1;ddbz=0;}jsbz1=1;}//按键谈起
}
}
/********************************************************************
                            定时中断服务函数
*********************************************************************/
void t0(void) interrupt 1 using 0 //定时中断服务函数

{
tcnt++; //每过250ust tcnt 加一
if(tcnt==10) //计满400 次(1/10 秒)时
{
tcnt=0; //重新再计
        
secc++;
if(secc==100){LED4=!LED4;P_LED=!P_LED;secc=0;}//指示灯

if(zi_bai==1)//自摆模式
{
sec2++;
if(zi_bai_bz==0)
{
if(sec2==zi_bai_sj1){MA2=1;MB2=MA2;}
if(sec2>=(zi_bai_sj1+50)){MA2=0;MB2=1;sec2=0;zi_bai_bz=1;}//自摆半周
}

if(zi_bai_bz==1){
if(sec2==(zi_bai_sj1+zi_bai_sj1)){MA2=1;MB2=1;}
if(sec2==(zi_bai_sj1+zi_bai_sj1+50)){MA2=1;MB2=0;}//自摆循环
if(sec2==(zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+50)){MA2=1;MB2=1;;}//自摆循环
if(sec2==(zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+100)){MA2=0;MB2=1;sec2=0;}//自摆循环


}
}

if(jsbz1==1)
{
sec1++;
if(sec1==50){bz1=0;bz2=0;jsbz1=0;}
}
if(jsbz==1)
{
sec++;
if(sec==50)
{
MA1 = 1;                  /*消防泵上升*/
MB1 = 1;                  /*消防泵下降*/
MA2 = 1;                  /*消防泵左移*/
MB2 = 1;                  /*消防泵右移*/
MA3 = 1;                  /*消防泵直喷*/
MB3 = 1;                  /*消防泵雾喷*/
sec=0;
jsbz=0;
ddbz=0;

}
}
}
}
/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
    uchar i;
        for(i=0;i<5;i++)
        {
            receBuf[ i]=0;
        }
}
/********************************************************************
                            主函数
*********************************************************************/
void main()                                   
{
SCON = 0x50;
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14;               
AUXR |= 0x01;              
ES = 1;                  
EA = 1;
add= IapReadByte(0x01);//读取存储的值
//sj2= IapReadByte(0x02);//读取存储的值
TMOD=0x02; //定时器工作在方式2
TH0=0x06; //对TH0 TL0 赋值
TL0=0x06;
TR0=1; //开始定时
ET0=1;
EA=1;
sec=0;
MA1 = 1;                  /*消防泵上升*/
MB1 = 1;                  /*消防泵下降*/
MA2 = 1;                  /*消防泵左移*/
MB2 = 1;                  /*消防泵右移*/
MA3 = 1;                  /*消防泵直喷*/
MB3 = 1;                  /*消防泵雾喷*/
while(1)
{         
//if(add==1)
//{        
KEY();//按键函数
//}
if(write==1)  //修改板子地址
{
write=0;
add=1;
IapEraseSector(0);  //擦除扇区
IapProgramByte(0x01,add);//写入新的地址                           
//IapProgramByte(0x02,sj2);//写入新的地址        
}
}               
}
void Uart() interrupt 4 using 1
{
if (RI)
{
RI=0; //接收标志清零
receBuf[r++&0x0F]=SBUF;     //把接受的数据存储到BUT数组中
if(receBuf[0]!=0xaa){r=0;}
if(r>=5)
{        r=0;

flag_zx=1;
}
}
if(flag_zx==1)
{                     

flag_zx=0;

if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
{
write=1;        
sendBuf[0]=0xaa;
sendBuf[1]=add;
sendBuf[2]=0x00;
sendBuf[3]=0x00;
sendBuf[4]=0xbb;
senduart1();                  
}
if((receBuf[0]==0xaa)&&(receBuf[1]==0xff)&&(receBuf[2]==0xff)&&(receBuf[3]==0xff)&&(receBuf[4]==0xbb))
{
sendBuf[0]=0xaa;
sendBuf[1]=add;
sendBuf[2]=0xff;
sendBuf[3]=0xff;
sendBuf[4]=0xbb;
senduart1();                  
}
clear_receBuf();
}
}


/********************************************************************
                              结束
*********************************************************************/
void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
    IAP_CONTR = 0;           //
        IAP_CMD = 0;           //
        IAP_TRIG = 0;           //
        IAP_ADDRH = 0x80;  //
        IAP_ADDRL = 0;           //
}
uint8 IapReadByte(uint16 addr){//读数据
   uint8 dat;
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_READ;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   dat = IAP_DATA;
   IapIdle();
   return dat;
}
void IapProgramByte(uint16 addr, uint8 dat){//写数据
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_PROGRAM;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_DATA = dat;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   IapIdle();
}
void IapEraseSector(uint16 addr){//擦除数据
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_ERASE;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   IapIdle();
}
/********************************************************************
                              结束
*********************************************************************/
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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