找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3322|回复: 0
收起左侧

GYJ-0106 STC单片机四路输入输出可编程工控PCB+原理图 串口控制 modbus程序

  [复制链接]
ID:284341 发表于 2020-10-14 23:17 | 显示全部楼层 |阅读模式
【简要说明】
一、 尺寸:长93mmX宽87mmX高28mm
二、 主要芯片:STC12C2052AD(兼容51程序)
三、 工作电压:12V(工作电压等于继电器额定工作电压)
四、 串口下载程序
五、 特点:1、具有电源指示。
             2、输入输出具有信号指示灯。
             3、光隔离输出控制继电器
              4、标准的11.0592M晶振。
             5、具有上电复位和手动复位。
             6、主芯片完全兼容51程序。
             7、有内部看门狗,EEPROM
             8、高效率电源稳压芯片给单片机供电,工作更稳定。。
             9、可控制交流220V/10A一下设备。
             10、具有串口通信功能(可以上位机控制)。
六、有详细使用说明书
七、提供相关软件

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png

image002.jpg image006.jpg image004.jpg

八、提供单片机例程及其学习资料
#include "hader\\main.h"
//#include"hader\\STC12C5A60S2.H"
/******************************
modbus RTU 的C51程序
单片机89S52  晶振:11.0592
通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口
单片机控制板地址 localAddr(变量)
通信可设置数据的地址:
字地址 0 - 255 (只取16位的低8位)
位地址 0 - 255 (只取16位的低8位)
P3^4;        //运行指示灯
P1^7;        //看门狗复位
P1^4;        //75LBC184 发送接收控制
*******************************/


uint32        dwTickCount,dwIntTick;        //时钟
uint8        idata sendBuf[16],receBuf[16]; //发送接收缓冲区
uint8        idata checkoutError;        // ==2 偶校验错  
uint8        idata receTimeOut;                //接收超时
uint8        idata c10ms;                        //10ms 计时
bit                b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;        //定时标志位
uint8 dat;
bit write=0; //写24C08 的标志
sfr WDT_CONTR=0XE1;
// 串行中断程序
void commIntProc() interrupt 4
{
        if(TI)
        {
                TI = 0;
                if(sendPosi < sendCount) //如果发送位置小于发送计数,那么继续发送
                {
                        sendPosi++;
                        ACC = sendBuf[sendPosi];
                        TB8 = P;        //加上校验位
                        SBUF = sendBuf[sendPosi];
                }
                else //否则发送完毕,置接收状态
                {
                        b485Send = 0;    //发送完后将485置于接收状态
                        receCount = 0;   //清接收地址偏移寄存器
                        checkoutError = 0;
                }
        }
        else if(RI)
        {
                RI = 0;
                receTimeOut = 10;    //通讯超时值
                receBuf[receCount] = SBUF;
                ACC = receBuf[receCount];
                if(P != RB8)
                        checkoutError = 2;        //偶校验出错
                receCount++;          //接收地址偏移寄存器加1
                receCount &= 0x0f;    //最多一次只能接收16个字节
        }


}   // void CommIntProc()


//定时器0 1ms 中断
void timer0IntProc() interrupt 1
{
        TL0 = TIMER_LOW;
    TH0 = TIMER_HIGHT;
    dwIntTick++;
        bt1ms = 1;
    c10ms++;
    if(c10ms >= 10)
    {
        c10ms = 0;      //10ms计时器清零
        bt10ms = 1;
    }
}   // void Timer0IntProc()


//定时处理
void timeProc(void)
{
        static uint8 c200ms;


  //  bWatchDog = ~ bWatchDog;    //看门狗取反
        b1ms = 0;
        b10ms = 0;
        b100ms = 0;
      
//        ET0 = 0;        //禁用定时器0
//        dwTickCount = dwIntTick;        //
        ET0 = 1;


        if(bt1ms)        //如果1ms到
        {
                bt1ms = 0;
                b1ms = 1;


        if(receTimeOut>0)        //如果接收超时值>0
        {
            receTimeOut--;        //接收超时-1(1ms减1次)
            if(receTimeOut==0 && receCount>0)   //判断通讯接收是否超时
            {
                b485Send = 0;       //将485置为接收状态
                receCount = 0;      //将接收地址偏移寄存器清零
                                checkoutError = 0;
            }
        }
        }
      
        if(bt100ms)
        {
                bt100ms = 0;
                b100ms = 1;
        }
    if(bt10ms)      //判断中断10ms标志位是否1
    {
        bt10ms = 0;     //清中断10ms标志位
                b10ms = 1;


        c200ms++;                   //200ms计时器加1
        if(c200ms >= 20)            //判断是否计时到200ms
        {
            c200ms = 0;             //清200ms计时器
      //      bRunLED = ~bRunLED;     //取反运行指示灯         
        }
    }
}   // void TimerProc(void)


//初始化串口
void initUart(void)
{
  //串口2波特率
        SCON = 0x50;                                 //方式1,8位数据,波特率可变
        TH1=  0xfd;      
        TL1 = 0xfd;                             //波特率 9600
    TR1=1;               
        SCON = 0xd0;
    PCON = 0;
    ES = 1;
}//void initUart(void)


//初始化中断
void initInt(void)
{

        TMOD = 0x21;
        TH0 = TIMER_HIGHT;
        TL0 = TIMER_LOW;
        TR0 = 1;      
    ET0 = 1;
        initUart();        //串口初始化
        EA = 1;               
}
//初始化
void initProg(void)
{      
        initInt();
        b485Send = 0;          //接收
}


/********************************************************************
                    24C08 读写驱动程序
*********************************************************************/
void delay1(uint16 x)
{
        uint16 i;
        for(i=0;i<x;i++)
        ;
}
void flash(){ ; ; }
//24c08 初始化子程序
void x24c08_init()
{
        scl=1;
        flash();
        sda=1;                     
        flash();
}
//启动(I方C)总线
void start()
{
  sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
}
//停止(I方C)总线
void stop()
{
sda=0; flash(); scl=1; flash(); sda=1; flash();
}
//写一个字节
void writex(uint8 j)
{
        uint8 i,temp;
        temp=j;
        for (i=0;i<8;i++)
        {
          temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
        }
        scl=0; flash(); sda=1; flash();
}
//读一个字节
uint8 readx()
{
        uint8 i,j,k=0;
        scl=0; flash(); sda=1;
        for (i=0;i<8;i++)
        {
        flash(); scl=1; flash();
        if (sda==1) j=1;
        else j=0;
        k=(k<<1)|j;
        scl=0;}
        flash(); return(k);
}
//(I方C)线时钟
void clock()
{
        unsigned char i=0;
        scl=1; flash();
        while ((sda==1)&&(i<255))i++;
        scl=0; flash();
}
/********************************************************************
                从24c08 的地址address 中读取一个字节数据
*********************************************************************/
unsigned char x24c08_read(unsigned char address)
{
        unsigned char i;
        start(); writex(0xa0);
        clock(); writex(address);
        clock(); start();
        writex(0xa1); clock();
        i=readx(); stop();
        delay1(10);
        return(i);
}
/********************************************************************
                向24c08 的address地址中写入一字节数据
*********************************************************************/
void x24c08_write(unsigned char address,unsigned char info)
{
        EA=0;
        start(); writex(0xa0);
        clock(); writex(address);
        clock(); writex(info);
        clock(); stop();
        EA=1;
        delay1(50);
}


void main(void)
{
        initProg();
        x24c08_init(); //初始化24C08
        dat=x24c08_read(2);//读出保存的数据赋于dat
    P2=dat;//将存储的数据赋予P2口
      
        WDT_CONTR=0X38;                 //启动看门狗 ,时间间隔为71.1ms
  
        while(1)
        {
                timeProc();
                checkComm0Modbus();
       if(write==1)
       {
                  write=0; //清零
                  dat=P2;        //将P2口的值赋予dat
                  x24c08_write(2,dat); //在24c08 的地址2 中写入数据dat
        }
                       
           WDT_CONTR=0X38;
        }
}
image008.jpg
image010.jpg
51hei.png

测试程序.zip

18.36 KB, 下载次数: 45, 下载积分: 黑币 -5

该板配套参考程序.zip

210.48 KB, 下载次数: 46, 下载积分: 黑币 -5

继电器控制上位机及其源代码.zip

2.65 MB, 下载次数: 45, 下载积分: 黑币 -5

四路输入输出继电器工控板DXP资料.zip

1.87 MB, 下载次数: 49, 下载积分: 黑币 -5

四入四出485modbus协议.zip

109.73 KB, 下载次数: 60, 下载积分: 黑币 -5

原理图.doc

53 KB, 下载次数: 43, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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