找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1467|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ZXC-0008消防噴水器 51單片機(jī)設(shè)計(jì)控制程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主



【聲明】此程序僅用于學(xué)習(xí)與參考!
*********************************************************************/
#include<STC15W408AS.h>
#include<math.h>                  //計(jì)算小數(shù)點(diǎn)的頭文件
#include <intrins.h>          //用nop函數(shù)延時(shí)的頭文件
#define uchar unsigned char//宏定義無符號(hào)字符型
#define uint unsigned int  //宏定義無符號(hào)整型
/*數(shù)據(jù)類型定義*/
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 //系統(tǒng)工作時(shí)鐘<12MHz 時(shí),對(duì)IAP_CONTR 寄存器設(shè)置此值
#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        //存儲(chǔ)地址
#define FOSC 11059200L  
#define BAUD 9600   


sbit IN1 = P1^6;                        /*單片機(jī)1.6引腳檢測(cè)傳感器信號(hào)輸入端*/
sbit IN2 = P1^7;                        /*單片機(jī)1.7引腳檢測(cè)選擇工作模式是否加入自動(dòng)*/

sbit LED4 = P5^5;                        /*運(yùn)行指示燈*/

sbit P_LED = P5^4;                        /*轉(zhuǎn)態(tài)指示燈*/

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];          //發(fā)送緩沖區(qū)
uchar receBuf[10];    //接收緩沖區(qū)
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;//計(jì)時(shí)標(biāo)志
bit jsbz1=0;//計(jì)時(shí)標(biāo)志
bit hsbz=0;//點(diǎn)動(dòng)與自鎖標(biāo)志
bit zzbz=0;//正轉(zhuǎn)標(biāo)志
bit fzbz=0;//反轉(zhuǎn)標(biāo)志
bit bz1=0;//標(biāo)志
bit bz2=0;//標(biāo)志
bit ddbz=0;

bit zi_bai=0;//自擺標(biāo)志
uint zi_bai_sj1=0;//自擺時(shí)間
bit zi_bai_bz=0;//自擺標(biāo)志

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

void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 單片機(jī) 在 一 安全 狀態(tài)
uint8 IapReadByte(uint16 addr);//讀數(shù)據(jù)
void IapProgramByte(uint16 addr, uint8 dat);//寫數(shù)據(jù)
void IapEraseSector(uint16 addr);//擦除數(shù)據(jù)
void KEY();//遙控函數(shù)
void delay(uchar t);//擦除數(shù)據(jù)
void clear_receBuf();//清空發(fā)送緩沖區(qū)
void senduart1();//發(fā)送函數(shù)
/********************************************************************
                            延時(shí)函數(shù)
*********************************************************************/
void delay(uchar t)
{
  uchar i,j;
   for(i=0;i<t;i++)
   {
            for(j=13;j>0;j--);
         { ;
         }
   }
}
/****************發(fā)送函數(shù)*********************/
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;
}

/********************************************************************
                            遙控函數(shù)
*********************************************************************/
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;}//按鍵談起
}
}
/********************************************************************
                            定時(shí)中斷服務(wù)函數(shù)
*********************************************************************/
void t0(void) interrupt 1 using 0 //定時(shí)中斷服務(wù)函數(shù)

{
tcnt++; //每過250ust tcnt 加一
if(tcnt==10) //計(jì)滿400 次(1/10 秒)時(shí)
{
tcnt=0; //重新再計(jì)
        
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;}//自擺循環(huán)
if(sec2==(zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+50)){MA2=1;MB2=1;;}//自擺循環(huán)
if(sec2==(zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+zi_bai_sj1+100)){MA2=0;MB2=1;sec2=0;}//自擺循環(huán)


}
}

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;

}
}
}
}
/*****************清空發(fā)送緩沖區(qū)*************************/
void clear_receBuf()
{
    uchar i;
        for(i=0;i<5;i++)
        {
            receBuf[ i]=0;
        }
}
/********************************************************************
                            主函數(shù)
*********************************************************************/
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);//讀取存儲(chǔ)的值
//sj2= IapReadByte(0x02);//讀取存儲(chǔ)的值
TMOD=0x02; //定時(shí)器工作在方式2
TH0=0x06; //對(duì)TH0 TL0 賦值
TL0=0x06;
TR0=1; //開始定時(shí)
ET0=1;
EA=1;
sec=0;
MA1 = 1;                  /*消防泵上升*/
MB1 = 1;                  /*消防泵下降*/
MA2 = 1;                  /*消防泵左移*/
MB2 = 1;                  /*消防泵右移*/
MA3 = 1;                  /*消防泵直噴*/
MB3 = 1;                  /*消防泵霧噴*/
while(1)
{         
//if(add==1)
//{        
KEY();//按鍵函數(shù)
//}
if(write==1)  //修改板子地址
{
write=0;
add=1;
IapEraseSector(0);  //擦除扇區(qū)
IapProgramByte(0x01,add);//寫入新的地址                           
//IapProgramByte(0x02,sj2);//寫入新的地址        
}
}               
}
void Uart() interrupt 4 using 1
{
if (RI)
{
RI=0; //接收標(biāo)志清零
receBuf[r++&0x0F]=SBUF;     //把接受的數(shù)據(jù)存儲(chǔ)到BUT數(shù)組中
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();
}
}


/********************************************************************
                              結(jié)束
*********************************************************************/
void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 單片機(jī) 在 一 安全 狀態(tài)
    IAP_CONTR = 0;           //
        IAP_CMD = 0;           //
        IAP_TRIG = 0;           //
        IAP_ADDRH = 0x80;  //
        IAP_ADDRL = 0;           //
}
uint8 IapReadByte(uint16 addr){//讀數(shù)據(jù)
   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){//寫數(shù)據(jù)
   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){//擦除數(shù)據(jù)
   IAP_CONTR = ENABLE_IAP;
   IAP_CMD = CMD_ERASE;
   IAP_ADDRL = addr;
   IAP_ADDRH = addr >> 8;
   IAP_TRIG = 0x5A;
   IAP_TRIG = 0xA5;
   _nop_();
   IapIdle();
}
/********************************************************************
                              結(jié)束
*********************************************************************/
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表