本30路晶體管可編程模塊的modbus上位機(jī)運行界面如圖(附件中有vb.net源碼下載)支持rs485與rs232通訊. 可做快遞柜 電磁閥的控制
0.jpg (86.57 KB, 下載次數(shù): 51)
下載附件
2018-2-25 03:09 上傳
0.png (47.5 KB, 下載次數(shù): 60)
下載附件
2018-2-25 03:10 上傳
完整版modbus30路完善版本(看門狗)232+485單片機(jī)源程序如下:
- /******************************
- 程序功能: modbus RTU 模式設(shè)置讀取十六個繼電器狀態(tài),以及內(nèi)部保持寄存器的設(shè)置讀取
- 硬件測試環(huán)境:單片機(jī)stc89C52RC十六繼電器485接口控制板
- 通信協(xié)議: 晶振:11.0592 波特率:9600 8位數(shù)據(jù) 1位停止位 偶校驗 485通位接口P3.7控制方向端
- 控制板地址: 修改localAddr(變量)
- 線圈個數(shù):16個 線圈地址范圍:0x0000~0x000F
- 保持寄存器個數(shù):16個(字節(jié)型) 寄存器地址:0x0000~0x000F
- \\******************************\\
- 功能碼簡介:
- 02:讀取單個線圈狀態(tài)
- 03:讀取多個保持寄存器
- 05:設(shè)置單個線圈狀態(tài)
- 06:設(shè)置單個寄存器值
- 0F:設(shè)置多個線圈
- 10:設(shè)置多個保持寄存器
- *******************************/
- #include "hader\\main.h"
- uint32 dwTickCount,dwIntTick; //時鐘
- uint8 idata sendBuf[32],receBuf[16]; //發(fā)送接收緩沖區(qū)
- uint8 idata checkoutError; // ==2 偶校驗錯
- uint8 idata receTimeOut; //接收超時
- uint8 idata c10ms; //10ms 計時
- uint8 idata c200ms;
- bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定時標(biāo)志位
- //定時處理
- void timeProc(void)
- {
- b1ms = 0;
- if(bt1ms) //如果1ms到
- {
- bt1ms = 0;
- b1ms = 1;
- if(receTimeOut>0) //如果接收超時值>0
- {
- receTimeOut--; //接收超時-1(1ms減1次)
- if(receTimeOut==0 && receCount>0) //判斷通訊接收是否超時
- {
- // b485Send = 0; //將485置為接收狀態(tài)
- receCount = 0; //將接收地址偏移寄存器清零
- checkoutError = 0;
- }
- }
- }
- } // void TimerProc(void)
- //初始化
- void initInt(void)
- {
- SCON = 0xd0;
- TMOD = 0x21;
- PCON = 0;
- TH0 = TIMER_HIGHT;
- TL0 = TIMER_LOW;
- TH1= 0xfd;
- TL1 = 0xfd; //波特率 9600
-
- TR0 = 1;
- TR1=1;
- ET0 = 1;
- ES = 1;
- EA = 1;
- //串口2設(shè)置
- S2CON = 0xd0; //方式1,9位數(shù)據(jù),波特率不可變 S2TB8 偶校驗位
- BRT=0XFD; //設(shè)置波特率9600
- AUXR=0x10; //啟動串口1波特率發(fā)生器
- IP=0x00; //優(yōu)先級默認(rèn) //開串口1中斷
- IE2=0x01; //開串口2中斷
- }
- //初始化
- void initProg(void)
- {
- P4SW|=0x20; //配置P4.5為IO口
- P4M0|=0x10; //配置P4.4為IO口
- P4M1|=0x10;
- P0=P1=P2=P3=0xff;
- P4|=0x30;
- initInt(); //初始化定時器
- // b485Send = 0;
- }
- //上電時讀取上次線圈狀態(tài),并設(shè)置
- void forceMultipleCoils1()
- {
- uint8 tempAddr;
- uint8 i,k;
- uint8 Data;
- uint8 exit = 0;
- for(k=0;k<4;k++)
- {
- switch(k)
- {
- case 0:Data=coilreg1; break;
- case 1:Data=coilreg2; break;
- case 2:Data=coilreg3; break;
- case 3:Data=coilreg4; break;
- }
- for(i=0;i<8;i++)
- {
- if( Data &0x01==1)
- setCoilVal(tempAddr,0);
- else
- setCoilVal(tempAddr,1);
- Data=Data>>1;
- tempAddr++;
- if(tempAddr >=32)
- {
- exit = 1;
- break;
- }
- }
- if(exit==1)
- break;
- }
- }
- void main(void)
- {
-
- initProg();
- localAddr=EEPROMReadByte(0); //從EERPOM的相對0地址讀取數(shù)據(jù)
- coilreg1=EEPROMReadByte(1);
- coilreg2=EEPROMReadByte(2);
- coilreg3=EEPROMReadByte(3);
- coilreg4=EEPROMReadByte(4);
- forceMultipleCoils1();
- if(localAddr>=10)
- {
- localAddr=1;
- EEPROMSectorErase(0); //從EEPROM的相對0地址扇區(qū)擦除
- EEPROMWriteByte(0,localAddr);
- EEPROMWriteByte(1,coilreg1);
- EEPROMWriteByte(2,coilreg2);
- EEPROMWriteByte(3,coilreg1);
- EEPROMWriteByte(4,coilreg2);
-
- }
- WDT_CONTR =0x32; //大概284.4ms
- while(1)
- {
- timeProc();
- checkComm0Modbus();
- }
- }
- //定時器0 1ms 中斷
- void timer0IntProc() interrupt 1
- {
- TL0 = TIMER_LOW;
- TH0 = TIMER_HIGHT;
- dwIntTick++;
- bt1ms = 1;
- c10ms++;
- c200ms++;
- if(c10ms >= 10)
- {
- c10ms = 0; //20ms計時器清零
- bt10ms = 1;
- WDT_CONTR =0x32; //
- }
- } // void Timer0IntProc()
- // 串行中斷1程序
- void commIntProc() interrupt 4
- {
- if(TI)
- {
- TI = 0;
- if(sendPosi < sendCount) //如果發(fā)送位置小于發(fā)送計數(shù),那么繼續(xù)發(fā)送
- {
- sendPosi++;
- ACC = sendBuf[sendPosi];
- TB8 = P; //加上校驗位
- SBUF = sendBuf[sendPosi];
- }
- else //否則發(fā)送完畢,置接收狀態(tài)
- {
- // b485Send = 0; //發(fā)送完后將485置于接收狀態(tài)
- 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個字節(jié)
- }
- } // void CommIntProc()
- //串口2中斷
- void uart2_isr() interrupt 8
- {
-
- if( S2CON & 0x02 )
- {
- S2CON &= ~0x02;
- if(sendPosi<receCount) //如果發(fā)送位置小于發(fā)送計數(shù),那么繼續(xù)發(fā)送
- {
- sendPosi++;
- ACC = receBuf[sendPosi];
- if(P)
- S2CON|=0x08; // 7 6 5 4 3 2 1 0 Reset Value
- //sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
- else
- S2CON&=0xf7;
- S2BUF =receBuf[sendPosi];
- }
- else //否則發(fā)送完畢,置接收狀態(tài)
- {
- // b485Send = 0; //發(fā)送完后將485置于接收狀態(tài)
- receCount = 0; //清接收地址偏移寄存器
- checkoutError = 0;
- }
- }
- else if( S2CON & 0x01)//接收
- {
- S2CON &= ~0x01;
- receTimeOut = 10; //通訊超時值
- receBuf[receCount] =S2BUF;
- ACC = receBuf[receCount];
- // if(P != RB8)
- // checkoutError = 2; //偶校驗出錯
- receCount++; //接收地址偏移寄存器加1
- receCount &= 0x0f; //最多一次只能接收16個字節(jié)
- }
- }
復(fù)制代碼
簡要說明: 一、 尺寸:長180mmX寬110mmX高22mm 二、 主要芯片:STC12C60S2支持雙串口(支持51系列DIP40封裝單片機(jī)) 三、 工作電壓:直流6~24伏供電可控制負(fù)載6~24V 四、 串口1(COM1)下載程序,(RS485口使用單機(jī)機(jī)內(nèi)部串口2均可與上位機(jī)通訊) 五、輸入輸出采用獨立供電,也可以公用一個電源,獨立供電可減少負(fù)載對單片機(jī)電路的影響 六、 特點: 1、具有電源指示。 2、三十路帶光電隔離輸出控制場效應(yīng)管。
3、標(biāo)準(zhǔn)的11.0592M晶振。(便于設(shè)置串口波特率)
4、具有上電復(fù)位和手動復(fù)位。
5、支持51系列DIP40封裝單片機(jī)。 5、輸出三十路場效應(yīng)管的供電采用獨立供電 (可避免主控電路與被控電路干擾) 6、輸出三十路具有LED指示。
7、三十路IRF1205場效應(yīng)管。
8、可控制直流36V以內(nèi) 50W負(fù)載設(shè)備。最大輸出電流6A
9、具有RS232和RS485通信功能(可以同時和上位機(jī)通信)。 10、單片機(jī)無加密,可插拔更換,可隨意更改程序。 使用說明: 【標(biāo)注說明】
1.jpg (131.18 KB, 下載次數(shù): 30)
下載附件
2018-2-25 03:05 上傳
【接線圖】
2.jpg (298.98 KB, 下載次數(shù): 54)
下載附件
2018-2-25 03:05 上傳
【應(yīng)用舉例接線圖】
3.jpg (287.63 KB, 下載次數(shù): 35)
下載附件
2018-2-25 03:05 上傳
0.png (54.07 KB, 下載次數(shù): 46)
下載附件
2018-2-25 03:15 上傳
全部資料51hei下載地址(vb.net上位機(jī)與單片機(jī)下位機(jī)源程序與電路原理圖等全套開發(fā)資料):
|