简要说明: 一、 尺寸:长150mmX宽96mmX高25mm 二、 主要芯片:STC89C52单片机(支持AT89S52) 三、 工作电压:直流24伏
四、 通过串口下载程序
五、 特点: 1、具有电源指示。 2、采用LM2576-5稳压器使输入工作电压范围6~40V可以正常工作。
3、八路输出光电隔离输出控制继电器。
4、标准的11.0592M晶振。(便于设置串口波特率)
5、具有上电复位和手动复位。
6、支持STC89C5X系列单片机以及AT89S5X单片机。
7、带有掉电存储功能,芯片24C08。
8、输出八路具有LED指示。
9、八路5V继电器控制,控制设备。
10、可控制8路交流220V/10A一下设备。 11、可控制8路直流30V/10A一下设备。
12、具有串口通信功能(可以上位机控制)。
13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。
使用说明: 【输入部分标注说明】 【输出部分标注说明】
【上位机界面】(提供源代码) 【测试程序】 实现功能: - 实现上位机(计算机)对继电器控制,发送不同的代码,控制对应的继电器(详细内容看程序)。
- 具有掉电存储功能,即,断电后,再恢复通电,继电器输出断电前状态。
/******************************************************************** 单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600. 单片机接收PC机发送的十六进制码表如下: 01、全开:PC发送0xFF; 单片机返回0XFF; 02、全关:PC发送0X00;单片机返回0X00; 03、第一路开:PC发送0x01;单片机返回0X01; 04、第二路开:PC发送0x02;单片机返回0X02; 05、第三路开:PC发送0x03;单片机返回0X03; 06、第四路开:PC发送0x04;单片机返回0X04; 07、第五路开:PC发送0x05;单片机返回0X05; 08、第六路开:PC发送0x06;单片机返回0X06; 09、第七路开:PC发送0x07;单片机返回0X07; 10、第八路开:PC发送0x08;单片机返回0X08; 11、第一路关:PC发送0xFE;单片机返回0XFE; 12、第二路关:PC发送0xFD;单片机返回0XFD; 13、第三路关:PC发送0xFC;单片机返回0XFC; 14、第四路关:PC发送0xFB;单片机返回0XFB; 15、第五路关:PC发送0xFA;单片机返回0XFA; 16、第六路关:PC发送0xF9;单片机返回0XF9; 17、第七路关:PC发送0xF8;单片机返回0XF8; 18、第八路关:PC发送0xF7;单片机返回0XF7; 19、输入状态查询:PC发送0x55;单片机返回输出状态(返回值十六进制); 20、输出状态查询:PC发送0xAA;单片机返回输出状态(返回值十六进制); 21、输出取反指令:PC发送0X11;单片机返回0x11;
*********************************************************************/ #include<reg52.h> #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 /******************************************************************** 初始定义 *********************************************************************/ uchar sj; //存储数据值 bit write=0; //写24C08的标志; uchar dat=0xee; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容 /*定义八位出为单片机P2口*/ sbit K1=P2^0; sbit K2=P2^1; sbit K3=P2^2; sbit K4=P2^3; sbit K5=P2^4; sbit K6=P2^5; sbit K7=P2^6; sbit K8=P2^7; /*定义八位入为单片机P1口*/ sbit IN0=P1^0; sbit IN1=P1^1; sbit IN2=P1^2; sbit IN3=P1^3; sbit IN4=P1^4; sbit IN5=P1^5; sbit IN6=P1^6; sbit IN7=P1^7; /******************************************************************** 24C08读写驱动程序 *********************************************************************/ sbit scl=P3^6; // 24c08 SCL sbit sda=P3^7; // 24c08 SDA
void delay1(uchar x) { uint i; for(i=0;i<x;i++); ; } void flash(){ ; ; } void x24c08_init() //24c08初始化子程序 { scl=1; flash(); sda=1; flash(); } void start() //启动(I方C)总线 { sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash(); } void stop() //停止(I方C)总线 { sda=0; flash(); scl=1; flash(); sda=1; flash(); } void writex(uchar j) //写一个字节 { uchar 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(); } uchar readx() //读一个字节 { uchar 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); } void clock() //(I方C)线时钟 { 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 delay(uchar t) { uchar i,j; for(i=0;i<t;i++) { for(j=13;j>0;j--); { ; } } }
/******************************************************************** 功能:串口初始化,波特率9600,方式1 *********************************************************************/ void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; } /******************************************************************** 接收数据判断函数 *********************************************************************/ chuankou() { switch(dat) //接收数据判断 { uchar k; k=10; case 0xff: P2=0X00;delay(k);SBUF = dat;dat=0xee;write=1;break; // 全开 case 0x00: P2=0XFF;delay(k);SBUF = dat;dat=0xee;write=1;break; // 全关 case 0x01: K1=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第一路开 case 0x02: K2=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第二路开 case 0x03: K3=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第三路开 case 0x04: K4=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第四路开 case 0x05: K5=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第五路开 case 0x06: K6=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第六路开 case 0x07: K7=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第七路开 case 0x08: K8=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第八路开 case 0xFE: K1=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第一路关 case 0xFD: K2=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第二路关 case 0xFC: K3=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第三路关 case 0xFB: K4=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第四路关 case 0xFA: K5=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第五路关 case 0xF9: K6=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第六路关 case 0xF8: K7=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第七路关 case 0xF7: K8=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第八路关 case 0x55: SBUF = P1;delay(k);dat=0xee;break; // 读输入口状态 case 0xAA: SBUF = P2;delay(k);dat=0xee;write=1;break; // 读输出口状态 case 0x11: P2=~P2;delay(k);SBUF = dat;dat=0xee;write=1;break; // 输出口取反 default:break; // 跳出 } } /******************************************************************** 主函数 *********************************************************************/ void main() { Init_Com();//串口初始化 x24c08_init(); //初始化24C08 sj=x24c08_read(2);//读出保存的数据赋于dat P2=sj;//将存储的数据赋予P2口 while(1) { chuankou(); //接收数据判断函数 if ( RI ) //扫描判断是否接收到数据, { dat = SBUF; //接收数据SBUF赋与dat RI=0; //RI清零。 } if(write==1) //判断计时器是否计时一秒 { write=0; //清零 sj=P2; //将P2口的值赋予dat x24c08_write(2,sj); //在24c08的地址2中写入数据dat } } } /******************************************************************** 结束 *********************************************************************/ 【图片展示】
|