找回密码
 立即注册
查看: 480|回复: 1

GYJ-0243使用STC15W408AS单片机设计的2.4G及433可编程无线通讯控制模块配套测试程序

[复制链接]

该用户从未签到

42

主题

7

回帖

246

积分

中级会员

积分
246
发表于 2023-7-7 14:03:23 | 显示全部楼层 |阅读模式
DSC_0012.JPG

DSC_0015.JPG

DSC_0019.JPG

DSC_0021.JPG

DSC_0024.JPG



/********************************************************************
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();
}


回复 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 07:53
  • 签到天数: 153 天

    [LV.7]常住居民III

    67

    主题

    831

    回帖

    2750

    积分

    金牌会员

    积分
    2750
    发表于 2024-3-11 14:35:20 | 显示全部楼层
    有电路图参考就比较好理解。
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 05:31 , Processed in 0.056104 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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