簡要說明: 一、 尺寸:長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 } } } /******************************************************************** 結束 *********************************************************************/ 【圖片展示】
|