- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-03-17 16:39:04
中级会员
- 积分
- 253
|
/********************************************************************
001_配套程序无线发送
【声明】此程序仅用于学习与参考!
*********************************************************************/
#include "main.h"
#include "init.h"
#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 //存储地址
bit bz1=0;
bit bz2=0;
bit bz3=0;
bit bz4=0;
bit bz5=0;
bit bz6=0;
bit bz7=0;
bit bz8=0;
uint8 add; //掉电保持485的地址
uint8 j=0;
uint8 dat=0X00;
bit flag_zx=0;
uint8 sendPosi=0; //发送缓冲区指针
uint8 receCount=0; //接收缓冲区指针
uint8 sendCount=0; //需要发送数据个数
uint8 receTimeOut=0; //通讯超时值
uint8 byteCount=5; //发送个数
uint8 sendBuf[10]; //发送缓冲区
uint8 receBuf[10]; //接收缓冲区
/********************************************************************
定义数据类型
*********************************************************************/
uint8 TBUF,RBUF;
uint8 TDAT,RDAT;
uint8 TCNT,RCNT;
uint8 TBIT,RBIT;
bit TING,RING;
bit TEND,REND;
uint8 t,r,ii; //定义数据类型
uint8 but[16]; //数据存储数组
void delay()//延时程序
{
uint8 m,n,s;
for(m=10;m>0;m--)
for(n=100;n>0;n--)
for(s=248;s>0;s--);
}
/****************发送函数*********************/
void senduart2()
{
for(ii=0;ii<5;ii++)
{
if(TEND) //允许发送
{
TEND=0;
TBUF=sendBuf[t++&0x0F];
TING=1;
}
while(!TEND);
}
t=0;
}
/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
uint8 i;
for(i=0;i<5;i++)
{
receBuf=0;
}
}
void main()
{
delay();
clear_receBuf();
ConfigUART1();
TR0=1;
EA=1;
while(1)
{
if((IN1==0)&&(bz1==0)){delay();if(IN1==0)
{
bz1=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x01;
sendBuf[4]=0xbb;
senduart2();
}} if((IN1==1)&&(bz1==1)){bz1=0;LED =1;}
if((IN2==0)&&(bz2==0)){delay();if(IN2==0)
{
bz2=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x02;
sendBuf[4]=0xbb;
senduart2();
}} if((IN2==1)&&(bz2==1)){bz2=0;LED =1;}
if((IN3==0)&&(bz3==0)){delay();if(IN3==0)
{
bz3=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x03;
sendBuf[4]=0xbb;
senduart2();
}} if((IN3==1)&&(bz3==1)){bz3=0;LED =1;}
if((IN4==0)&&(bz4==0)){delay();if(IN4==0)
{
bz4=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x04;
sendBuf[4]=0xbb;
senduart2();
}} if((IN4==1)&&(bz4==1)){bz4=0;LED =1;}
if((IN5==0)&&(bz5==0)){delay();if(IN5==0)
{
bz5=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x05;
sendBuf[4]=0xbb;
senduart2();
}} if((IN5==1)&&(bz5==1)){bz5=0;LED =1;}
if((IN6==0)&&(bz6==0)){delay();if(IN6==0)
{
bz6=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x06;
sendBuf[4]=0xbb;
senduart2();
}} if((IN6==1)&&(bz6==1)){bz6=0;LED =1;}
if((IN7==0)&&(bz7==0)){delay();if(IN7==0)
{
bz7=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x07;
sendBuf[4]=0xbb;
senduart2();
}} if((IN7==1)&&(bz7==1)){bz7=0;LED =1;}
if((IN8==0)&&(bz8==0)){delay();if(IN8==0)
{
bz8=1;LED =0;
sendBuf[0]=0xaa;
sendBuf[1]=(P3&0XFF);
sendBuf[2]=0x01;
sendBuf[3]=0x08;
sendBuf[4]=0xbb;
senduart2();
}} if((IN8==1)&&(bz8==1)){bz8=0;LED =1;}
}
}
// /**********************************************************
//放在主函数,定时0溢出中断函数,
//*********************/
void tm0()interrupt 1 using 1
{
if(RING)
{
if(--RCNT==0)
{
RCNT=3;
if(--RBIT==0)
{
RBUF=RDAT;
RING=0;
REND=1;
}
else
{
RDAT>>=1;
if(RXB)RDAT|=0X80;
}
}
}
else if(!RXB)
{
RING=1;
RCNT=4;
RBIT=9;
}
if(--TCNT==0)
{
TCNT=3;
if(TING)
{
if(TBIT==0)
{
TXB=0;
TDAT=TBUF;
TBIT=9;
}
else
{
TDAT>>=1;
if(--TBIT==0)
{
TXB=1;
TING=0;
TEND=1;
}
else
{
TXB=CY;
}
}
}
}
}
/********************************************************************
002_配套程序无线接收
【声明】此程序仅用于学习与参考!
*********************************************************************/
#include "main.h"
#include "init.h"
#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 //存储地址
uint8 add; //掉电保持485的地址
uint8 j=0;
uint8 dat=0X00;
bit flag_zx=0;
uint8 sendPosi=0; //发送缓冲区指针
uint8 receCount=0; //接收缓冲区指针
uint8 sendCount=0; //需要发送数据个数
uint8 receTimeOut=0; //通讯超时值
uint8 byteCount=5; //发送个数
uint8 sendBuf[10]; //发送缓冲区
uint8 receBuf[10]; //接收缓冲区
/********************************************************************
定义数据类型
*********************************************************************/
uint8 TBUF,RBUF;
uint8 TDAT,RDAT;
uint8 TCNT,RCNT;
uint8 TBIT,RBIT;
bit TING,RING;
bit TEND,REND;
uint8 t,r,ii; //定义数据类型
uint8 but[16]; //数据存储数组
/********************************************************************
定义 ISP/IAP/EEPROM 命令
*********************************************************************/
void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
uint8 IapReadByte(uint16 addr);//读数据
void IapProgramByte(uint16 addr, uint8 dat);//写数据
void IapEraseSector(uint16 addr);//擦除数据
void delay()//延时程序
{
uint8 m,n,s;
for(m=10;m>0;m--)
for(n=200;n>0;n--)
for(s=248;s>0;s--);
}
/****************发送函数*********************/
void senduart2()
{ RS485_DIR=1;
for(ii=0;ii<5;ii++)
{
if(TEND) //允许发送
{
TEND=0;
TBUF=sendBuf[t++&0x0F];
TING=1;
}
while(!TEND);
}
t=0;
RS485_DIR=0;
}
/*****************清空发送缓冲区*************************/
void clear_receBuf()
{
uint8 i;
for(i=0;i<5;i++)
{
receBuf=0;
}
}
void main()
{
delay();
clear_receBuf();
//add= IapReadByte(0x01);//读取存储的值
//if(add==0xff)
//add=0x00;
add=(P3&0XFF);
ConfigUART1();
TR0=1;
EA=1;
while(1)
{
if(REND) //如果有接收
{
REND=0; //接收标志清零
receBuf[r++&0x0F]=RBUF; //把接受的数据存储到BUT数组中
if(receBuf[0]!=0xaa){r=0;}
if(r>=5)
{ r=0;
flag_zx=1;
}
}
if(flag_zx==1)
{
flag_zx=0;
//0 1 2 3 4
//起始位 地址位 功能位 数据位 结束位
if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add)) //如果开始位和结束位,还有地址都正确,进行下一步判断
{
if(receBuf[2]==0x01) //打开单路继电器
{
switch(receBuf[3])
{
case 0x01: IN1=0;LED=0;delay();LED=1;IN1=1; break;
case 0x02: IN2=0;LED=0;delay();LED=1;IN2=1; break;
case 0x03: IN3=0;LED=0;delay();LED=1;IN3=1; break;
case 0x04: IN4=0;LED=0;delay();LED=1;IN4=1; break;
case 0x05: IN5=0;LED=0;delay();LED=1;IN5=1; break;
case 0x06: IN6=0;LED=0;delay();LED=1;IN6=1; break;
case 0x07: IN7=0;LED=0;delay();LED=1;IN7=1; break;
case 0x08: IN8=0;LED=0;delay();LED=1;IN8=1; break;
default:break;
}
}
}
clear_receBuf();
}
}
}
// /**********************************************************
//放在主函数,定时0溢出中断函数,
//*********************/
void tm0()interrupt 1 using 1
{
if(RING)
{
if(--RCNT==0)
{
RCNT=3;
if(--RBIT==0)
{
RBUF=RDAT;
RING=0;
REND=1;
}
else
{
RDAT>>=1;
if(RXB)RDAT|=0X80;
}
}
}
else if(!RXB)
{
RING=1;
RCNT=4;
RBIT=9;
}
if(--TCNT==0)
{
TCNT=3;
if(TING)
{
if(TBIT==0)
{
TXB=0;
TDAT=TBUF;
TBIT=9;
}
else
{
TDAT>>=1;
if(--TBIT==0)
{
TXB=1;
TING=0;
TEND=1;
}
else
{
TXB=CY;
}
}
}
}
}
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();
}
|
|