|
一、本項(xiàng)目意義:實(shí)現(xiàn)通過USART通信,通過幀信息控制通過信號機(jī)狀態(tài),可以設(shè)置燈絲故障,設(shè)置區(qū)間狀態(tài),點(diǎn)燈信息基于Flash內(nèi)的固定信息,與幀序列無直接交互,相當(dāng)于實(shí)現(xiàn)了電子連鎖,可用于教學(xué)實(shí)驗(yàn)。
二、CV表內(nèi)容:應(yīng)該包括信號設(shè)備類型,設(shè)備編號,設(shè)備燈絲狀態(tài)(代替燈絲繼電器),設(shè)備故障設(shè)置位(用于教學(xué)設(shè)置故障),通過信號機(jī)需要保存區(qū)間內(nèi)的占用情況
三、CV表示意圖
3.png (67.48 KB, 下載次數(shù): 69)
下載附件
設(shè)備類型
2020-3-18 12:02 上傳
4.png (50.79 KB, 下載次數(shù): 66)
下載附件
設(shè)備編號
2020-3-18 12:02 上傳
5.png (91.57 KB, 下載次數(shù): 88)
下載附件
燈絲狀態(tài)
2020-3-18 12:02 上傳
6.png (72.33 KB, 下載次數(shù): 74)
下載附件
故障設(shè)置位
2020-3-18 12:02 上傳
7.png (125.69 KB, 下載次數(shù): 72)
下載附件
區(qū)間占用情況
2020-3-18 12:02 上傳
- #define Device_Type_Addr 0X08020000 //設(shè)備類型地址
- #define QJ_Position_Addr 0X08020002 //信號機(jī)區(qū)間位置
- #define DS_State_Addr 0X08020004 //01短路;10斷路
- #define Fault_Setting_Addr 0X08020006 //故障設(shè)置地址:0000 0111(藍(lán)白紅/綠黃紅)
- #define Recerve_Code1_Addr 0x08020008 //保留字節(jié)1~4
- #define Recerve_Code2_Addr 0x0802000a
- #define Recerve_Code3_Addr 0x0802000c
- #define Recerve_Code4_Addr 0x0802000e
- #define FQ_State_1_8_Addr 0x08020010 //區(qū)間1~8占用情況
- #define FQ_State_9_16_Addr 0x08020012
- #define FQ_State_17_24_Addr 0x08020014
- #define FQ_State_25_32_Addr 0x08020016
- #define FQ_State_33_40_Addr 0x08020018
- #define FQ_State_41_48_Addr 0x0802001a
- #define FQ_State_49_56_Addr 0x0802001c
- #define FQ_State_57_64_Addr 0x0802001e
復(fù)制代碼
單片機(jī)源程序如下:- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "stmflash.h"
- #include "assist_function.h"
- #include "adc.h"
- // v1.2.3 改進(jìn)電燈邏輯,實(shí)現(xiàn)參數(shù)化
- //已完全實(shí)現(xiàn)Fault標(biāo)志位的功能,故障自動轉(zhuǎn)移亮燈
- //存在問題:亮燈轉(zhuǎn)移所發(fā)布的廣播信息如何生成
- //解決方法:先打草稿模擬情景,總結(jié)得,轉(zhuǎn)移信息只與最終顯示狀態(tài)相關(guān),即,轉(zhuǎn)黃,轉(zhuǎn)紅,紅轉(zhuǎn)
- //具體思考跨區(qū)情況下,信息幀的生成有何區(qū)別
- int main(void)
- {
-
- //后期添加的變量; PS不能全大寫變量名;
-
- u8 key;
-
- //u16 datatemp[8];//測試用變量
- //datatemp[0] = QJ_Situation();//測試語句
- //printf("\n\rInfo= %08x\n\r",datatemp[0]);//測試語句
- //后期添加的變量
- delay_init(); //延時(shí)函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級分組2
- uart_init(9600); //串口初始化為9600
- LED_Init(); //初始化與LED連接的硬件接口
- Write_CV(0x03,Device_Type_Addr);
- Adc_Init();
- DMA_Init2();
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);//開始采集adc
-
-
- while(1)
- {
- RS485_Receive_Data(rs485buf,&key);
- //取出通信幀內(nèi)容
- GetFrame();
-
- //通信協(xié)議內(nèi)容識別邏輯
-
- //非廣播命令 及 CRC校驗(yàn) 及 設(shè)備類型 及 密鑰檢驗(yàn) 及 是否收到新的幀
- //CRCCHECK = CRCcheck();return true/false;
- CRCcheck();
- if( CRCCHECK && TypeFrame == TongGuoXHJ && AccessFrame == 0xAA && key)
- {
- if(OrderFrame == 0x01)
- {
- //修改flash設(shè)備編號
- //傳回相應(yīng)幀;void SendBackMessage(0x01);根據(jù)參數(shù)判斷需要的返回信息,自動形成格式,提取flash中內(nèi)容填充幀序列;
- Write_CV(SerailFrame,QJ_Position_Addr);
- SendBackFrame[0] = 0x10;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBack();
- }
-
- else if(SerailFrame == STMFLASH_ReadHalfWord(QJ_Position_Addr))
- {
- switch(OrderFrame)
- {
- case 0x02:
- //讀狀態(tài):命令+密鑰(0xAA)+設(shè)備類型+設(shè)備編號+00+00+CRC
- //返回格式:命令+設(shè)備類型+設(shè)備編號+燈絲狀態(tài)+故障信息+00+CRC
- //參數(shù):cv位置
- SendBackFrame[0] = 0x20;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBackFrame[3] = STMFLASH_ReadHalfWord(DS_State_Addr);
- SendBackFrame[4] = STMFLASH_ReadHalfWord(Fault_Setting_Addr);
- SendBack();
- break;
- case 0x03:
- //寫狀態(tài):命令+密鑰(0xAA)+設(shè)備類型+設(shè)備編號+故障信息+00+CRC
- //返回格式:命令+設(shè)備類型+設(shè)備編號+故障信息+00+00+CRC
- //參數(shù):故障內(nèi)容
-
- Write_CV(Context5Frame,Fault_Setting_Addr);
- SendBackFrame[0] = 0x30;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBackFrame[3] = STMFLASH_ReadHalfWord(Fault_Setting_Addr);
- SendBack();
- break;
- case 0x04:
- //讀區(qū)間狀態(tài):命令+密鑰(0xAA)+設(shè)備類型+設(shè)備編號+00+00+CRC
- //返回格式:命令+設(shè)備類型+設(shè)備編號+最近四個分區(qū)的狀況+00+00+CRC
- //返回此區(qū)間前4個區(qū)間的狀態(tài)
- SendBackFrame[0] = 0x40;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBackFrame[3] = QJ_Situation();
- SendBack();
- break;
-
- default:break;
-
- }
- }
-
- }
-
- //區(qū)間信息廣播幀;不產(chǎn)生返回幀
- if(OrderFrame == 0x05 && CRCCHECK && TypeFrame == TongGuoXHJ && key)
- {
- //第一組數(shù)據(jù)區(qū)間1~8;9~16;17~24
- if(AccessFrame == 0x01)
- {
- Write_CV(rs485buf[3],FQ_State_1_8_Addr);
- Write_CV(rs485buf[4],FQ_State_9_16_Addr);
- Write_CV(rs485buf[5],FQ_State_17_24_Addr);
- }
- //第二組數(shù)據(jù)區(qū)間25~32;33~40;41~48
- if(AccessFrame == 0x02)
- {
- Write_CV(rs485buf[3],FQ_State_25_32_Addr);
- Write_CV(rs485buf[4],FQ_State_33_40_Addr);
- Write_CV(rs485buf[5],FQ_State_41_48_Addr);
- }
- //第三組數(shù)據(jù)區(qū)間49~56;57~64
- if(AccessFrame == 0x03)
- {
- Write_CV(rs485buf[3],FQ_State_49_56_Addr);
- Write_CV(rs485buf[4],FQ_State_57_64_Addr);
- }
- //單幀區(qū)域廣播;命令+密鑰(幀類型)+設(shè)備類型+區(qū)間Sector(0~7;可擴(kuò)展)+區(qū)間信息+00+CRC
- if(AccessFrame == 0x10)
- {
- Write_CV(Context5Frame,FQ_State_1_8_Addr * 2 * (int)SerailFrame);//待測試(int)SerailFrame
- }
- printf("\n\rCopy\n\r");//TEST
- }
- //讀取電燈信息;判斷并點(diǎn)燈
- if( key ) LightLogic();
-
-
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
v1.2.4點(diǎn)燈轉(zhuǎn)移需要斷線情況下自動實(shí)現(xiàn).7z
(206.73 KB, 下載次數(shù): 10)
2020-3-18 12:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|