|
51hei圖片_20220819170208.jpg (2.29 MB, 下載次數(shù): 53)
下載附件
2023-7-17 10:26 上傳
【聲明】此程序僅用于學(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é)束
*********************************************************************/
|
|