【声明】此程序仅用于学习与参考!
*********************************************************************/
#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();
}
/********************************************************************
结束
*********************************************************************/
|