上位機界面:
51單片機源碼:
- #include<reg52.h>
- #include <intrins.h>
- #include "STC89C51RC_EEPROM.h" //調用STC89C51RC的EEPROM讀寫頭文件
- /************* 本地常量聲明 **************/
- #define uchar unsigned char
- #define uint unsigned int
- //------------------------------------------------------------------
- unsigned char code OnOffTab[10] = {0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0xFF, 0x00};
- //------------------------------------------------------------------
- unsigned char HDAddr = 0x01;//模塊地址 默認01
- unsigned char HdSerID[7];//模塊ID
- //------------------------------------------------------------------
- void SendtoCom(unsigned char CCode, Data1, Data2, Data3, Data4); //向串口發送數據
- //------------------------------------------------------------------
- void ProcessData( void );//處理來自串口接收到的數據
- //------------------------------------------------------------------
- void SaveEEProm( void );//保存系統變量
- //------------------------------------------------------------------
- void ReadEEProm( void );//讀取系統變量
- //------------------------------------------------------------------
- //
- uchar tClock = 3;//默認3秒關閉
- uchar vTotal = 0;
- /*********************串口數據通訊 開始******************************/
- #define INBUF_LEN 8 //8位數據長度
- //字節1 字節2 字節3 字節4 字節5 字節6 字節7
- //同步字節 地址碼 指令碼1 數據碼2 數據碼3 數據碼4 校驗碼
- //通信協議: 第1字節,恒為AF,為協議同步字標志,第2字節,為地址碼00-FF, 第3-6字節為數據碼,字節7為校驗碼,即1-6個字節后7位的異或校驗和。
- unsigned char inBuf[INBUF_LEN], outBuf[INBUF_LEN];
- //
- unsigned char Cnum;
- //
- //
- bit B_TX1_Busy = 0; //發送忙標志
- #define BAUD_1200 0xD0 // 波特率為1200
- #define BAUD_2400 0xE8 // 波特率為2400
- #define BAUD_4800 0xF4 // 波特率為4800
- #define BAUD_7200 0xF8 // 波特率為7200
- #define BAUD_9600 0xFA // 波特率為9600
- #define BAUD_14400 0xFC // 波特率為14400
- #define BAUD_19200 0xFD // 波特率為19200
- //11.0592最高所支持的波特率為19200
- //------------------------------------------------------------------
- //串口初始化
- //------------------------------------------------------------------
- //------------------------------------------------------------------
- //向串口發送數據(帶校驗)
- //------------------------------------------------------------------
- void SendtoCom(unsigned char CCode, Data1, Data2, Data3, Data4)
- {
- unsigned char i = 0;
- {
- //--------------------------------------------
- outBuf[0] = 0xFE; //同步字 恒為FE
- outBuf[1] = HDAddr; //地址碼01-FF
- outBuf[2] = CCode; //指令碼
- outBuf[3] = Data1; //數據碼1
- outBuf[4] = Data2; //數據碼2
- outBuf[5] = Data3; //數據碼3
- outBuf[6] = Data4; //數據碼4
- outBuf[7] = 0x80; //校驗碼
- //--------------------------------------------
- for (i == 0; i < 7; i++)
- {
- outBuf[7] ^= outBuf[i]; //校驗
- }
- //
- if(!B_TX1_Busy) //發送空閑
- {
- i = 0;
- B_TX1_Busy = 1; //標志發送忙
- do
- {
- SBUF = outBuf[i]; //發一個字節
- i++;
- Delay_ms(20); //延時
- }
- while (i < 8);
- }
- B_TX1_Busy = 0; //清除發送忙標志
- //--------------------------------------------
- }
- }
- sbit JDQ00 = P0 ^ 0;
- sbit JDQ01 = P0 ^ 1;
- sbit JDQ02 = P0 ^ 2;
- [b]。。。發貼長度受限,詳見附件代碼。sbit JDQ26 = P3 ^ 2;[/b]
- sbit JDQ27 = P3 ^ 3;
- sbit JDQ28 = P3 ^ 4;
- sbit JDQ29 = P3 ^ 5;
- sbit JDQ30 = P3 ^ 6;
- sbit JDQ31 = P3 ^ 7;
- //------------------------------------------------------------------
- //串口接收中斷函數
- //------------------------------------------------------------------
- void serial () interrupt 4 using 3
- /*********************串口數據通訊 結束******************************/
- //------------------------------------------------------------------
- //定時器中斷,用于自動校準稱重數據
- //------------------------------------------------------------------
- void DingShi() interrupt 1 using 1 //聲明定時器中斷處理函數,所以X的值為1
- {
- uchar i; //定義一個臨時變量
- //
- if (i >= 20) //因為是50ms發生一次中斷,每次中斷i的值就加1,當i=20時,50ms*20=1秒時間到了
- {
- i = 0; //i的值清零
- vTotal++;//累加1秒
- if (vTotal >= tClock - 1)
- {
- vTotal = 0;
- P0 = 0xFF;
- P2 = 0xFF;
- P1 = 0xFF;
- P3 = 0xFF | 0x03;
- SendtoCom(0xB0, P0, P2, P1, P3); //返回信息
- TR0 = 0; //TR=1是定時器工作,0是停止工作
- }
- }
- i++; //每發生一次中斷,i的值就加1
- TH0 = (65536 - 50000) / 256; //重新給定時器TH0裝初始值 50000微秒=50ms
- TL0 = (65536 - 50000) % 256; //重新給定時器TL0裝初始值 50000微秒=50ms
- }
- /[b]。。。發貼長度受限,詳見附件代碼。sbit JDQ26 = P3 ^ 2;[/b]
- /*****************main主函數*****************/
- void main()
- {
- P0 = 0xFF;
- P1 = 0xFF;
- P2 = 0xFF;
- P3 = 0xFF;
- //
- tClock = STC89CXX_EEPROM_Char_Read(0x20, 0x00);
- /*
- uint temp = -100;
- unsigned char i = 0;
- Cnum = 0;
- AutoTrans = 0;*/
- //-----------------------------------------------------------
- //看門狗定時器溢出時間計算公式: (12 * 32768 * PS) / FOSC (秒)
- //設置看門狗定時器分頻數為32,溢出時間如下:
- //11.0592M : 1.14s
- //18.432M : 0.68s
- //20M : 0.63s
- //啟動看門狗
- //WDT_reset(D_WDT_SCALE_64);//初始化WDT,喂狗1.25s喂一次
- //-----------------------------------------------------------
- Timer0Init();
- Delay_ms(1000);
- init_serialCom(); //初始化串口
- Delay_ms(1000);
- //-----------------------------------------------------------
- //
- while(1)//主函數大循環
- {
- }
- }
復制代碼
上位機源碼: 無
上位機exe文件和51的Keil工程下載:
STC8952通過串口控制30個繼電器模組(帶上位機).rar
(242.54 KB, 下載次數: 0)
2025-10-15 10:35 上傳
點擊文件名下載附件
|