嵌入式软件设计及编程思想2-1...ppt

上传人:得****1 文档编号:76352594 上传时间:2023-03-09 格式:PPT 页数:62 大小:584.50KB
返回 下载 相关 举报
嵌入式软件设计及编程思想2-1...ppt_第1页
第1页 / 共62页
嵌入式软件设计及编程思想2-1...ppt_第2页
第2页 / 共62页
点击查看更多>>
资源描述

《嵌入式软件设计及编程思想2-1...ppt》由会员分享,可在线阅读,更多相关《嵌入式软件设计及编程思想2-1...ppt(62页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、单片机软件设计及编程思想李海全一个嵌入式设计系统一般包含一个嵌入式设计系统一般包含对外对外显示、指示灯、按键显示、指示灯、按键模拟量输入(高低压、交直流、多回路)模拟量输入(高低压、交直流、多回路)开关量输入开关量输入开关量输出开关量输出变送输出变送输出通信(通信(RS485DLT645ProfibusRS485DLT645Profibus)一个嵌入式设计系统一般包含一个嵌入式设计系统一般包含对内对内显示驱动显示驱动LED 595/IO/TM1629LED 595/IO/TM1629LCD 1621/1622LCD 1621/1622等等点阵、段式点阵、段式存储驱动存储驱动EEPROM/EEP

2、ROM/铁电铁电/FLASH/FLASH采样采样CPUCPU内部内部ADAD、ADAD芯片、测量芯片、测量SOCSOC控制控制+算法算法设计原则v1.可靠性v2.维护性(可读性)v3.移植性功能模块分类功能模块分类编程时分文件处理,一般一个驱动、一个功编程时分文件处理,一般一个驱动、一个功能模块一个文件能模块一个文件原则:原则:1.1.一个驱动芯片相应的操作封装到一个文件一个驱动芯片相应的操作封装到一个文件中中2.2.一个算法,详细描述计算公式,涉及优化一个算法,详细描述计算公式,涉及优化后的公式,标明原始和推导公式,做一个文件后的公式,标明原始和推导公式,做一个文件3.3.文件不适合过多,文

3、件名应一目了然,根文件不适合过多,文件名应一目了然,根据文件名知其内容据文件名知其内容设计分类文件结构v遵循一模块一文件格式v注释 特别是设计更改需注明 更改日期、更改人、更改记录(头、行)文件头加注释说明功能文件结构程序版式(易读性)v以布局清晰为原则v不同函数体v不同功能(同一函数中、定义变量)v缩进缩进(不要使用空格、使用TAB(4格)程序版式(易读性)v推荐写法vif(condition)vv/program codevvelsevv/program codevv不推荐写法vif(condition)v/program codevvelse v/program codev v少用if(

4、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;菜单设计菜单层数菜单设计菜单层数不得超过4 层(原则上采用4 层结构需要有4 行显示),宜采用3 层结构,不可采用一层(一层但多排显示)翻到底结构。第一层为系统(SYS)、输入(In)、通信(bUS)、报警(do)、变送(tr)、版本(Ver)等设置;第二层为第1 层下的子类细分,以报警为例,第2层可以是报警阈值、死区、延

5、时、报警功能选择等;第三层为第2 层显示的具体数据。注:选择太多时可选择数字加字母组合到方式,例:报警信号选择0.UA 1.UB等菜单设计方法:1。函数指针,网上例程很多2。状态机菜单设计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_Page=Get_Display_Page(

6、Display_Page,1);else if(KEY_DATA=KEY_Enter)Display_Page=Get_Display_Page(Display_Page,2);elsebreak;Display_All_Page();return;菜单设计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,0,tmp_PASSWORD);break

7、;菜单设计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(tmp_PASSWORD,1,9999);DS_

8、INT_DATA(2,0,tmp_PASSWORD);break;菜单设计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;if(m2Keytmp=0)DS_SET_

9、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);DsKeyDOSetPoint(tmp_D

10、OSelcnt);elseDS_SET_DAT(50+tmp_DOZerocnt);elsem2Keytmp=Data_4IWD_Key_Do(m2Keytmp,0,5);DS_LINE(40+m2Keytmp);break;显示小数点菜单设计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(tmp_DOSelcnt,0,31);DS_SET

11、_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;存储设计按操作方式IIC(FM24C04)SPI(X5045)地址数据总线总线(FLASH)中断中和主程序中不能均控制外设,尤其注意定时器和通信

12、的处理存储设计按存储介质 我司常用的EEPROM铁电(存储电能)不推荐设计时使用芯片内部FLASH做存储存储设计IIC 外部有上拉电阻,需考虑CPU的IO口属性开漏输入输出普通IO做普通IO时,在时序不对时易产生大电流锁死CPU,程序应和常规不一样存储设计一存储设计二存储设计三注意事项:1.上电后,CPU开始运行后,不能立即读写外设2.一般延时3秒后操作,此时电源稳定3.一般上电操作 灭-显示版本-全亮-(读数据)-正常运行4.上电后推荐不进行写操作5.推荐存储数据分区间校验,可以做累加和,如设置数据一组、校准数据一组、电能数据一组等6.EEPROM上电默认一般为FFFF,铁电上电一般默认为0

13、7.有条件做双备份DI读取注意,设计时最好IO默认上拉(可以外部),考虑未安装时设计为断开状态,不能为不确定状态1.常开常闭点IO状态要么断开、要么闭合中断中读取,延时消抖2.有源湿节点无信号时才完全断开,有信号时时断时续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.Bit0=1;else Meas.T.DIStatu

14、s.Bits.Bit0=0;DI_OFF_DLY0=0;DI_ON_DLY0=0;DI读取3.注意事项通信和DI和DO排在一起时操作DO时,DI不应被更改MODBUS协议需要做02命令DO设置1.总线控制电平方式脉冲方式2.报警控制取各信号输入延时死区,不动作带高报警、低报警为零时是否报警DO设置1.电平方式中断中操作IOif(DI_DO_Status.DIDO.DO1)RELAY_SET_TDO1();elseRELAY_CLR_TDO1();2.脉冲方式毫秒级需要要中断中做,秒级主程序中做即可DO动作后,判断延时到了修改相应变量皆可 DI_DO_Status.DIDO.DO1通信v通信编程

15、需采用收数据帧方式处理,不同波特率延时不同,收帧最短帧间隔时间应大于1.5个字符时间v以9600波特率为例,如果接收的2个字符间隔时间超过1.5毫秒则认为是2帧。发送数据帧时应有延时,从收到帧结束到发送帧开始最短间隔应大于3.5个字符时间。波特率超过9600可以以9600的时间为准。通信通信v设计时应按帧接收v例:可用1毫秒定时器做,检测是否有数据接收structunsigned short int INNUM,START;unsigned char R_ALL,S_Dly,S_Flag,R_Dly,R_Flag;unsigned char inbuff100;unsigned char ou

16、tbuff270;unsigned short int OUTNUM;unsigned char*sbuff;UartUD1;通信v设计时应按帧接收v例:可用1毫秒定时器做,检测是否有数据接收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(UartUD1.OUTNUM!=0)UartUD1.OUTN

17、UM-;USART_SendData(USART1,*UartUD1.sbuff);UartUD1.sbuff+;elseUartUD1.S_Dly-;else if(UartUD1.OUTNUM=0)USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);。通信v设计时应按帧接收v例:可用1毫秒定时器做,检测是否有数据接收void USART1_SendRec_Dly(void)。switch(Comm_Baud)case 3:if(UartUD1.R_Dly=4)UartUD1.R_Flag=1;if(UartUD1.START2)UartUD1.R_ALL

18、=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 UartUD1.R_Dly+;UartUD1.R_Flag=0;break;default:if(Ua

19、rtUD1.R_Dly=2)UartUD1.R_Flag=1;if(UartUD1.START2)UartUD1.R_ALL=1;else UartUD1.R_Dly+;UartUD1.R_Flag=0;break;通信v发送时设置延时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_Dly=4;break;default:UartUD1.S_Dly=1;break;UartUD1.S_Flag=1

20、;UartUD1.INNUM=0;UartUD1.START=0;UartUD1.R_ALL=0;UartUD1.sbuff=UartUD1.outbuff;通信MODBUS通信v按GBZ19582.1-2004标准执行,以下需特别注意v地址范围1-247,波特率推荐1200-38400,奇偶校验位v 03H 命令读功能默认最少允许用户从地址0开始读125个数据,如只用到20个地址,其他地址宜默认填0。地址125以上超过设定的地址如果未默认为0,则需返回异常码,不推荐无通信。v10H 命令写功能写寄存器时对数据需要有范围判断,如超过范围需返回异常码,如设备地址范围为1-247,写248应为超范

21、围,返回异常码,不存储。写多个寄存器时,如其中一个地址的数据超范围需认定整个命令帧无效,同时需给出异常码,禁止给其他符合范围的地址进行存储数据。已经遇到多个客户需要、645协议需要MODBUS通信vDI 通信读取v除设计任务书明确指定部分命令不做外(需返回异常码),带DI功能需02H和03H命令均可读开关量输入状态,未安装或选配功能的开关量输入对应的通信和显示应显示为0,断开状态。超过总个数可回复异常码(推荐保留一定的开关量数目)。v例如:仪表只有5个开关量输入,设计时可默认保留为8个,02H命令读第9个开关量输入应返回异常码。MODBUS通信vD0 通信控制v除设计任务书明确指定部分命令不做

22、外(需返回异常码),带DO功能需01H、03H命令均可读,05H、10H命令均可写。未安装或选配功能的DO对应的通信和显示应显示为0,断开状态。超过总个数可回复异常码(可保留一定的开关量数目)。写操作时应注意,如果DO被设置为报警功能时,使用05命令操作DO需返回异常码,且DO不应变位,使用10H命令操作DO只能非报警功能的DO允许变位,设置为报警功能的DO不应变位,全为报警功能宜回复异常码。645通信vDLT-645 规约分97和07两个版本,编写时应按标准协议执行,以下需特别注意。前导字节在协议中规定了在发送数据帧时有时会先发送1-4个字节FEH,东软默认为FCH,因此程序设计时需考虑前导

23、符,宜设计F8H以上均可作前导符一次量二次量带PC、CT变比的仪表,宜传输二次量已保证和标准协议的一致性,注意小数点、单位和符号。数据块应支持数据块和单个数据均可读取,例可同时读取三相电压,也可分别读取每相电压。变送输出1.DA输出2-3光耦隔离外加DA控制芯片2.PWM输出1光耦隔离外加RC电路根据公司目前硬件,宜采用100HZ。设计时软件分辨率不得小于千分之一,公司目前硬件有点非线性,宜作分段补偿或非线性补偿信号测量1.宜采用真有效值方式测量,扫描频率宜以50Hz的信号做设计,例测量某直流电平反映时间1秒,可以以3.2K的频率采集,采集1600个点后做运算2.有参考抬高,宜将参考接入AD通道,采样参考,扣除参考(N次累加后点均值)和校准的偏移后再做有效值

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com