a)主程序流程图

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

a)主程序流程图(b)中断服务程序流程图图3-2数据采集程序流程图SAMP:MOVR0,#30H;数据缓冲区首址MOV#8;8通道计数MOVDPTR,#7FF8H;指向通道0START:SETBF0;置中断发生标志MOVX@DPTR,A;启动A/D(P2.7=0,WR=0)SETBIT0;置外部中断0为边沿触发SETBEX0;允许外部中断0SETBEA;开中断LOOP:JBF0,LOOP;判发生中断标志1?DJNZR2,START;8个通道转换结束RETINTDATA:MOVXA,@DPTR;读数据(P2.7=0,RD=0)硬件撤;销中断MOV@R0,A;存数据INCR0INCDPTR;指向下一通道CLRF0;清中断标志RETI3.3标度变换在计算机控制系统中,生产中的各个参数都有着不同的数值和量纲,所有这些都经过调理电路转换成A/D转换器所能接收的0~5伏同一电压信号,又由A/D转换成00~FFH(8位)的数字量,为进一步显示记录等,必须把这些数字量转换成不同单位,以便操作人员对其进行检测管理,这就是所谓的标度变换。线性参数标度变换:指一次仪表测量值与转换结果具有线性关系或者一次仪表是线性刻度的。其标度变换公式为:00(0)0NxNAxAAmANmN100(50000)19.62550AxmvA0一次测量仪表的下限Am一次测量仪表的上限Ax实际测量值N0仪表下限对应的数字量Nm仪表上限对应的数字量Nx测量值对应的数字量3.4键盘处理程序在本设计中采用软件消除抖动的方法来解决干扰的问题根据按键的功能一般分为两种情况来处理:(a)对于每按键一次视为一次输入的设定来说,在稳定闭合期内,不断检测按键是否已释放,当发现按键被释放后,读出对应按键的编码(或称为键号)(b)对于重要输入功能的键设定来说,每隔一定时间,如500毫秒(即按下某键不动,一秒内重复输入该键两次)对按键进行检测,发现按键依然被按下时,就输入该键,直到按键被释放。键盘中断程序:INT1:CLREX1PUSHPSWPUSHACCMOVA,P1ANLA,#0E7HJNBPSW.0,EXITMOVR0,#0HMOVR5,#1LCALLDELAYMOVA,P1MOVR5,#50JBP1.0,EX1JBP1.1,EX2JBP1.2,EX3EX1:INCR0MOVA,R0ADDA,18HMOVB,#8DIVABMOVR6,BMOV18H,R6LCALLDELAYJNBP1.0,EXITJMPEX1EX2:CLRCINCR0MOVA,18HSUBBA,R0JNCEXITDIVABMOVR6,BMOV18H,R6LCALLDELAYJNBP1.1,EXITJMPEX2延迟消抖完成通道号减1功能,并存入18H完成通道号加1功能,并存入18H恢复现场开中断结束转各功能子程序段初始化键盘完成锁键功能是双键否?YNYN中断服务子程序关中断保护现场是否有键按下?EX3:JBP1.2,EX3CPLP1.3EXIT:CLRIE1MOVP1,#18HPOPACCPOPPSWSETBEX1RETI图3-4键盘中断程序流程图PROCINT13.5双字节二进制整数转换为压缩BCD码整数子程序NIBTD:MOVA,R0MOVR5,AMOVR6,AMOVA,R7INCAMOVA,R3CLRAN*8送入位计数器R3N字节二进制数左移一位,高位送入CY开始0送入结果单0送入结果单元开始元0送入结果单元开始NBD0:MOV@R1,AINCR1DJNZR3,NBD0MOVA,R7MOVB,#08HMULABMOVR3,ANBD4:MOVA,R5MOVR0,AMOVA,R7MOVR2,ACLRCNBD1:MOVA,@R0RLCA图3.5二进制整数转换为压缩BCD码MOV@R0,A整数子程序的程序流程图INCR0DJNZR2,NBD1MOVA,R6MOVR1,AMOVA,R7MOVR2,AINCR2NBD3:MOVA,@R1ADDCA,@R1DAAMOV@R1,AINCR1DJNZR2,NBD3DJNZR3,NBD4RET3.6三字节压缩BCD码转换成ASCII码子程序MOVR2,#N;字节数存R2MOVR0,#50H;ASCII码首地址MOVR2,#60H;BCD码首地址BCDASC:MOVA,@R1;取BCD码MOVR3,A;BCD码暂存R3ANLA,#0F0H;屏蔽低四位保留高四位SWAPA;A中的高低四位交换ADDA,#30H;加30H得高位ASCII码MOVA,R3;保存ASCII码INCR0MOVA,R3;再取BCD码ANLA,#0FH;屏蔽高四位保留低四位ADDA,#30H;加30H得低位ASCII码MOV@R0,AINCR1INCR0DJNZR2,BCDASCRET3.7LCD显示程序LCD:RSEQUP2.0;LCDRS引脚定义ENEQUP2.1;LCDEN引脚定义送所要显示的字符数LCD初始化并做显示测试调用LCD第一行的显示子程序设置第二行所要显示的字符首址设置第一行所要显示的字符及位置开始设置所要显示的位置调用LCD第二行的显示子程序字符地址加1显示位置加1字符显示完否?返回BEGIN:CLREN;LCD被禁用CALLSET_LCD;LCD初始化并做显示测试MOVA,18H;设置所要显示的字符MOVB,#11;设置所要显示LCD的位置CALLLCDP1;在LCD第一行显;示字符MOVR4,#6MOVR1,#39HMOVR2,#8图3-7LCD显示流程图XU:INCR1MOVA,R1;设置所要显示的字符INCR2MOVB,R2;设置所要显示LCD的位置CALLLCDP2;在LCD第二行显示字符DJNZR4,XUSET_LCD:;LCD初始化并做显示测试CLREN;LCD被禁用CALLINIT_LCD;LCD初始化MOVR5,#10;延迟一下CALLDELAYMOVDPTR,#LMESS1;指针指到显示消息1MOVA,#1;显示在第一行CALLLCD_PRINT;显示执行消息1于LCD第一行MOVDPTR,#LMESS2;指针指到显示消息2MOVA,#2;显示在第二行CALLLCD_PRINT;显示执行消息2于LCD第二行RETINIT_LCD1:;4位I/O初始化LCDMOVA,#28HCALLWCOM;双列显示,字型使用5*7点阵MOVA,#0EHCALLWCOM;光标出现不闪烁MOVA,#06HCALLWCOM;每次向右移一位,显示屏不移动MOVA,#01HCALLWCOM;清除LCD显示屏RETCLR_LINE1:;清除LCD第一行字符MOVA,#80H;设置第一行地址CALLWCOMMOVR0,#24;设置计数值CL:MOV#‘’;载入空格符至LCDCALLWDATA;输出字符至LCDDJNAR0,CL;计数结束RET;A=LINE1OR2;在LCD的第一行或第二行印出字符;DPTR=MESSAGEPOINTERLCD_PRINT:CJNEA,#1,LINE2LINE1:MOVA,80H;设置LCD的第一行地址CALLWCOMCALLCLR_LINEMOVA,#80HCALLWCOMJMPFILLLINE2:MOVA,#0C0H;设置LCD的第二行地址CALLWCOMCALLCLR_LINEMOVA,#0C0HCALLWCOMFILL:CLRAMOVCA,@A+DPTRCJNEA,#0,L1RETL1:CALLWDATAINCDPTRJMPFILLRETCLR_LINE:;清除LCD该行字符MOVR0,#24;设置计数值C1:MOVA,#‘’;载入空格符至LCDCALLWDATA;输出字符至LCDDJNZR0,C1;计数结束RETDE:MOVR7,#5;短暂延时DJNZR7,$RETEN1:SETBEN;短脉冲CALLDECLRENCALLDERETINIT_LCD:;LCD4位接口指令重置MOVP0,#30H;RS=0,R/W=0,D7~D4=0011CALLEN1MOVP0,#30HCALLEN1MOVP0,#30HCALLEN1MOVP0,#20H;启动4位接口指令CALLEN1;RS=0,R/W=0,D7~D4=0010CALLINIT_LCD1;LCD指令设置初始化RETWCOM:;WRITEHI4BITMOVP0,A;先写入高4位命令CLRRS;RS=0写入命令CALLEN1;产生高电平启用脉冲RLCA;向左移4位RLCARLCARLCA;WRITELO4BITMOVP0,A;写入低4位命令CLRRS;RS=0写入命令CALLEN1;产生高电平启用脉冲RETWDATA:;WRITEHI4BITMOVP0,A;先写入高4位命令SETBRS;RS=1写入数据CALLEN1;产生高电平启用脉冲RLCA;向左移4位RLCARLCARLCA;WRITELO4BITMOVP0,A;写入低4位命令SETBRS;RS=1写入数据CALLEN1;产生高电平启用脉冲RET;------------------------------------;DELAYR5*10ms;延迟子程序DELAY:MOVR6,#25;总延迟时间R5*10msD1:MOVR7,#99DJNZR7,$DJNZR6,D1DJNZR5,DELAYRET;--------------------------------------LMESS1:DB“CHANNEL:”LMESS1:DB“VOLTAGE:mv”;--------------------------------------;在LCD第一行特定位置显示字符;A=ASCDATA所要显示的字符;B=LINEXPOS所要显示的位置0~15LCDP1:;将A寄存器放入堆栈PUSHACCMOVA,BADDA,#80H;设置LCD的第一行地址CALLWCOMPOPACC;由堆栈取出A寄存器的值CALLWDATA;写入所要显示的字符RET;------------------------------------------;在LCD第二行特定位置显示字符;A=ASCDATA所要显示的字符;B=LINEXPOS所要显示的位置0~15LCDP2:;将A寄存器放入堆栈PUSHACCMOVA,BADDA,#0C0H;设置LCD的第二行地址;CALLWCOMPOPACC;由堆栈取出A寄存器的值CALLWDATA;写入所要显示的字符RETEND3.8串行通信子程序图3-8-1上位机人机交互界面3.8.1上位机人机交互界面图3-8-1为人机交互界面的外观图,用可视化编程语言VB编写的可视化界面,简洁明了,操作方便,串行通信采用了事件驱动行方式,使用Micorsoft公司的控件MicorsoftCommunication实现串行通信。3.8.2上位机通信及显示程序(1)初始化代码PrivateSubForm_Load()MSComm.CommPort=2‘设置串口2MSComm.Settings=2400,n,8,1‘波特率9600,无校验,8位数据,一位停止位MSComm.InputLen=0‘读取接受缓冲区的所有字符MSComm.InBufferSize=1024‘设置接受缓冲区为1024字节MSComm.OutBufferSize=512‘设置发送缓冲区为512字节MSComm.PortOpen=True‘打开串口MSComm.SThreshold=0‘不触发发送事件MSComm.RThreshold=1‘每一个字符到接收缓冲区都触‘发接收事件MSComm.InBufferCount=0‘清除发送缓冲区数据MSComm.OutBufferCount=0‘清除接收缓冲区数据Text_SEND.Text=“”‘清空发送文本框Text_RECV.Text=“”‘清空接收文本框EndSub(2)发送数据PrivateSubButton_SEND_Click()DimxAsStringIfText_SEND.Text=“”Then‘发送数据不能为空X=MsgBox

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功