嵌入式軟件設(shè)計及編程思想2_1_第1頁
嵌入式軟件設(shè)計及編程思想2_1_第2頁
嵌入式軟件設(shè)計及編程思想2_1_第3頁
嵌入式軟件設(shè)計及編程思想2_1_第4頁
嵌入式軟件設(shè)計及編程思想2_1_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、單片機軟件設(shè)計及編程思想李海全一個嵌入式設(shè)計系統(tǒng)一般包含一個嵌入式設(shè)計系統(tǒng)一般包含對外對外顯示、指示燈、按鍵顯示、指示燈、按鍵模擬量輸入(高低壓、交直流、多回路)模擬量輸入(高低壓、交直流、多回路)開關(guān)量輸入開關(guān)量輸入開關(guān)量輸出開關(guān)量輸出變送輸出變送輸出通信(通信(RS485DLT645ProfibusRS485DLT645Profibus)一個嵌入式設(shè)計系統(tǒng)一般包含一個嵌入式設(shè)計系統(tǒng)一般包含對內(nèi)對內(nèi)顯示驅(qū)動顯示驅(qū)動LED 595/IO/TM1629LED 595/IO/TM1629LCD 1621/1622LCD 1621/1622等等點陣、段式點陣、段式存儲驅(qū)動存儲驅(qū)動EEPROM/EEP

2、ROM/鐵電鐵電/FLASH/FLASH采樣采樣CPUCPU內(nèi)部內(nèi)部ADAD、ADAD芯片、測量芯片、測量SOCSOC控制控制+ +算法算法設(shè)計原則v1.可靠性v2.維護性(可讀性)v3.移植性功能模塊分類功能模塊分類編程時分文件處理,一般一個驅(qū)動、一個功編程時分文件處理,一般一個驅(qū)動、一個功能模塊一個文件能模塊一個文件原則:原則:1.1.一個驅(qū)動芯片相應(yīng)的操作封裝到一個文件一個驅(qū)動芯片相應(yīng)的操作封裝到一個文件中中2.2.一個算法,詳細(xì)描述計算公式,涉及優(yōu)化一個算法,詳細(xì)描述計算公式,涉及優(yōu)化后的公式,標(biāo)明原始和推導(dǎo)公式,做一個文件后的公式,標(biāo)明原始和推導(dǎo)公式,做一個文件3.3.文件不適合過多

3、,文件名應(yīng)一目了然,根文件不適合過多,文件名應(yīng)一目了然,根據(jù)文件名知其內(nèi)容據(jù)文件名知其內(nèi)容設(shè)計分類文件結(jié)構(gòu)v遵循一模塊一文件格式v注釋 特別是設(shè)計更改需注明 更改日期、更改人、更改記錄(頭、行) 文件頭加注釋說明功能文件結(jié)構(gòu)程序版式(易讀性)v以布局清晰為原則v不同函數(shù)體v不同功能(同一函數(shù)中、定義變量)v縮進縮進 (不要使用空格、使用TAB(4格)程序版式(易讀性)v推薦寫法vif (condition)vv / program codevvelsevv / program codevv不推薦寫法vif (condition)v / program codevvelse v / progra

4、m codev v少用if (width 15)keyDownDLy=0;KEY_DATA=KEY_OLD;SAM+; elseif(keyDownDLy99)keyDownDLy=0;KEY_DATA=KEY_OLD;SAM+ ;else KEY_OLD=keypress;SAM=0;keypress=9;菜單設(shè)計菜單層數(shù)菜單設(shè)計菜單層數(shù)不得超過4 層(原則上采用4 層結(jié)構(gòu)需要有4 行顯示),宜采用3 層結(jié)構(gòu),不可采用一層(一層但多排顯示)翻到底結(jié)構(gòu)。第一層為系統(tǒng)(SYS)、輸入(In)、通信(bUS)、報警(do)、變送(tr)、版本(Ver)等設(shè)置;第二層為第1 層下的子類細(xì)分,以報警為

5、例,第2層可以是報警閾值、死區(qū)、延時、報警功能選擇等;第三層為第2 層顯示的具體數(shù)據(jù)。注:選擇太多時可選擇數(shù)字加字母組合到方式,例:報警信號選擇0.UA 1.UB等菜單設(shè)計方法:1。函數(shù)指針,網(wǎng)上例程很多2。狀態(tài)機菜單設(shè)計switch(Setup_Data)case 0: if(KEY_DATA=KEY_Menu)Setup_Data=1;DS_SETUP(0);break; else if(KEY_DATA=KEY_Left)Display_Page=Get_Display_Page(Display_Page,0);else if(KEY_DATA=KEY_Right)Display_Pag

6、e=Get_Display_Page(Display_Page,1);else if(KEY_DATA=KEY_Enter)Display_Page=Get_Display_Page(Display_Page,2);elsebreak;Display_All_Page();return;菜單設(shè)計switch(Setup_Data)case 1: if(KEY_DATA=KEY_Menu)Setup_Data=0;Display_All_Page(); else if(KEY_DATA=KEY_Enter)Setup_Data=2;tmp_PASSWORD=9999;DS_INT_DATA(2,

7、0,tmp_PASSWORD);break;菜單設(shè)計switch(Setup_Data)case 2:if(KEY_DATA=KEY_Menu)Setup_Data=1;DS_SETUP(0);/PASSelse if(KEY_DATA=KEY_Enter)if(tmp_PASSWORD=PASSWORD.UWD |tmp_PASSWORD=8)Setup_Data=9;DS_SETUP(2);m1Keytmp=0;tmp_PASSWORD=PASSWORD.UWD;tmp_PT=PT.UWD;tmp_CT=CT.UWD;elsetmp_PASSWORD=Data_4IWD_Key_Do(tm

8、p_PASSWORD,1,9999);DS_INT_DATA(2,0,tmp_PASSWORD);break;菜單設(shè)計switch(Setup_Data)case Setup_DO1:case Setup_DO2:case Setup_DO3:case Setup_DO4:if(KEY_DATA=KEY_Menu)Setup_Data=9;DS_SETUP(2+m1Keytmp);else if(KEY_DATA=KEY_Enter)cnt=Setup_Data-Setup_DO1;Setup_Data=cnt*SetupD_NN;Setup_Data+=SetupD_DO1+m2Keytmp

9、;if(m2Keytmp=0)DS_SET_DAT(60+tmp_DOSelcnt);else if(m2Keytmp=1)DS_INT_DATA(2,0,tmp_DODlycnt);elseif(m2Keytmp=2)DS_INT_DATA(2,0,tmp_DOBandcnt);DsKeyDOSetPoint(tmp_DOSelcnt);else if(m2Keytmp=3)DS_INT_DATA(2,0,tmp_DOHDatcnt);DsKeyDOSetPoint(tmp_DOSelcnt);else if(m2Keytmp=4)DS_INT_DATA(2,0,tmp_DOLDatcnt)

10、;DsKeyDOSetPoint(tmp_DOSelcnt);elseDS_SET_DAT(50+tmp_DOZerocnt);elsem2Keytmp=Data_4IWD_Key_Do(m2Keytmp,0,5);DS_LINE(40+m2Keytmp); break;顯示小數(shù)點菜單設(shè)計switch(Setup_Data)case SetupD_DO1:case SetupD_DO2:case SetupD_DO3:case SetupD_DO4:cnt=Setup_Data-SetupD_DO1;cnt/=SetupD_NN;tmp_DOSelcnt=Data_4IWD_Key_Do(tm

11、p_DOSelcnt,0,31);DS_SET_DAT(60+tmp_DOSelcnt);break;case SetupD_DO1+1:case SetupD_DO2+1:case SetupD_DO3+1:case SetupD_DO4+1:cnt=Setup_Data-SetupD_DO1;cnt/=SetupD_NN;tmp_DODlycnt=Data_4IWD_Key_Do(tmp_DODlycnt,0,9999);DS_INT_DATA(2,0,tmp_DODlycnt);break;存儲設(shè)計按操作方式IIC(FM24C04)SPI(X5045) 地址數(shù)據(jù)總線總線(FLASH)中斷

12、中和主程序中不能均控制外設(shè),尤其注意定時器和通信的處理存儲設(shè)計按存儲介質(zhì) 我司常用的EEPROM鐵電(存儲電能)不推薦設(shè)計時使用芯片內(nèi)部FLASH做存儲存儲設(shè)計IIC 外部有上拉電阻,需考慮CPU的IO口屬性開漏輸入輸出普通IO做普通IO時,在時序不對時易產(chǎn)生大電流鎖死CPU,程序應(yīng)和常規(guī)不一樣存儲設(shè)計一存儲設(shè)計二存儲設(shè)計三注意事項:1.上電后,CPU開始運行后,不能立即讀寫外設(shè)2.一般延時3秒后操作,此時電源穩(wěn)定3.一般上電操作 滅-顯示版本-全亮-(讀數(shù)據(jù))-正常運行4.上電后推薦不進行寫操作5.推薦存儲數(shù)據(jù)分區(qū)間校驗,可以做累加和,如設(shè)置數(shù)據(jù)一組、校準(zhǔn)數(shù)據(jù)一組、電能數(shù)據(jù)一組等6.EEPR

13、OM上電默認(rèn)一般為FFFF,鐵電上電一般默認(rèn)為07.有條件做雙備份DI讀取注意,設(shè)計時最好IO默認(rèn)上拉(可以外部),考慮未安裝時設(shè)計為斷開狀態(tài),不能為不確定狀態(tài)1.常開常閉點IO狀態(tài)要么斷開、要么閉合中斷中讀取,延時消抖2.有源濕節(jié)點無信號時才完全斷開,有信號時時斷時續(xù)DI讀取1.常開常閉點if(READ2_DI1()if(DIDLY_On0DI_Read_TotalCnt)DIDLY_On0+;elseDI_DO_Status.DIDO.DI1=0;DIDLY_Of0=0;elseif(DIDLY_Of0800)if(DI_ON_DLY0400)Meas.T.DIStatus.Bits.Bi

14、t0=1;else Meas.T.DIStatus.Bits.Bit0=0;DI_OFF_DLY0=0; DI_ON_DLY0=0;DI讀取3.注意事項通信和DI和DO排在一起時操作DO時,DI不應(yīng)被更改MODBUS協(xié)議需要做02命令DO設(shè)置1.總線控制電平方式脈沖方式2.報警控制取各信號輸入延時死區(qū),不動作帶高報警、低報警為零時是否報警DO設(shè)置1.電平方式中斷中操作IOif(DI_DO_Status.DIDO.DO1)RELAY_SET_TDO1(); elseRELAY_CLR_TDO1();2.脈沖方式毫秒級需要要中斷中做,秒級主程序中做即可DO動作后,判斷延時到了修改相應(yīng)變量皆可 DI

15、_DO_Status.DIDO.DO1通信v通信編程需采用收數(shù)據(jù)幀方式處理,不同波特率延時不同,收幀最短幀間隔時間應(yīng)大于1.5個字符時間v以9600波特率為例,如果接收的2個字符間隔時間超過1.5毫秒則認(rèn)為是2幀。發(fā)送數(shù)據(jù)幀時應(yīng)有延時,從收到幀結(jié)束到發(fā)送幀開始最短間隔應(yīng)大于3.5個字符時間。波特率超過9600可以以9600的時間為準(zhǔn)。通信通信v設(shè)計時應(yīng)按幀接收v例:可用1毫秒定時器做,檢測是否有數(shù)據(jù)接收structunsigned short int INNUM,START;unsigned char R_ALL,S_Dly,S_Flag,R_Dly,R_Flag;unsigned char

16、inbuff100;unsigned char outbuff270;unsigned short int OUTNUM;unsigned char *sbuff;UartUD1;通信v設(shè)計時應(yīng)按幀接收v例:可用1毫秒定時器做,檢測是否有數(shù)據(jù)接收void USART1_SendRec_Dly(void)if(UartUD1.S_Flag)if(UartUD1.S_Dly=0)UartUD1.S_Flag=0;USART_ITConfig(USART1, USART_IT_TXE, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);if

17、(UartUD1.OUTNUM!=0)UartUD1.OUTNUM-;USART_SendData(USART1,*UartUD1.sbuff);UartUD1.sbuff+;elseUartUD1.S_Dly-;else if(UartUD1.OUTNUM=0)USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);。通信v設(shè)計時應(yīng)按幀接收v例:可用1毫秒定時器做,檢測是否有數(shù)據(jù)接收void USART1_SendRec_Dly(void)。switch(Comm_Baud)case 3: if(UartUD1.R_Dly=4) UartUD1.R_Fla

18、g=1; if(UartUD1.START2)UartUD1.R_ALL=1; else UartUD1.R_Dly+; UartUD1.R_Flag=0; break;case 4:if(UartUD1.R_Dly=7) UartUD1.R_Flag=1; if(UartUD1.START2)UartUD1.R_ALL=1; else UartUD1.R_Dly+; UartUD1.R_Flag=0; break;case 5:if(UartUD1.R_Dly=14) UartUD1.R_Flag=1; if(UartUD1.START2)UartUD1.R_ALL=1; else Uart

19、UD1.R_Dly+; UartUD1.R_Flag=0; break;default:if(UartUD1.R_Dly=2) UartUD1.R_Flag=1; if(UartUD1.START2)UartUD1.R_ALL=1; else UartUD1.R_Dly+; UartUD1.R_Flag=0; break;通信v發(fā)送時設(shè)置延時v例:void USART1_Send_Ready(void)switch(Comm_Baud)case 5: UartUD1.S_Dly=19;break;case 4: UartUD1.S_Dly=8;break;case 3: UartUD1.S_D

20、ly=4;break;default:UartUD1.S_Dly=1; break;UartUD1.S_Flag=1;UartUD1.INNUM=0;UartUD1.START=0;UartUD1.R_ALL=0;UartUD1.sbuff=UartUD1.outbuff;通信MODBUS通信v按GBZ19582.1-2004標(biāo)準(zhǔn)執(zhí)行,以下需特別注意v地址范圍1-247,波特率推薦1200-38400,奇偶校驗位v 03H 命令讀功能默認(rèn)最少允許用戶從地址0開始讀125個數(shù)據(jù),如只用到20個地址,其他地址宜默認(rèn)填0。地址125以上超過設(shè)定的地址如果未默認(rèn)為0,則需返回異常碼,不推薦無通信。v10H 命令寫功能寫寄存器時對數(shù)據(jù)需要有范圍判斷,如超過范圍需返回異常碼,如設(shè)備地址范圍為1-247,寫248應(yīng)為超范圍,返回異常碼,不存儲。寫多個寄存器時,如其中一個地址的數(shù)據(jù)超范圍需認(rèn)定整個命令幀無效,同時需給出異常碼,禁止給其他符合范圍的地址進行存儲數(shù)據(jù)。已經(jīng)遇到多個客戶需要、645協(xié)議需要MODBUS通信vDI 通信讀取v除設(shè)計任務(wù)書明確指定部分命令不做外(需返回異常碼),帶DI功能需02H和03H命令均可讀開關(guān)量輸入狀態(tài),未安裝或選配功能的開關(guān)量輸入對應(yīng)的通信和顯示應(yīng)顯示為0,斷開狀態(tài)。超過總個數(shù)可回復(fù)異常碼(推薦保留一定的開關(guān)量數(shù)目)。v例如:儀表只有5個開關(guān)量輸入,設(shè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論