a主程序流程图参考模板.docx
《a主程序流程图参考模板.docx》由会员分享,可在线阅读,更多相关《a主程序流程图参考模板.docx(19页珍藏版)》请在冰豆网上搜索。
a主程序流程图参考模板
a)主程序流程图(b)中断服务程序流程图
图3-2数据采集程序流程图
SAMP:
MOVR0,#30H;数据缓冲区首址
MOV#8;8通道计数
MOVDPTR,#7FF8H;指向通道0
START:
SETBF0;置中断发生标志
MOVX@DPTR,A;启动A/D(P2.7=0,WR=0)
SETBIT0;置外部中断0为边沿触发SETBEX0;允许外部中断0
SETBEA;开中断
LOOP:
JBF0,LOOP;判发生中断标志1?
DJNZR2,START;8个通道转换结束
RET
INTDATA:
MOVXA,@DPTR;读数据(P2.7=0,RD=0)硬件撤
;销中断
MOV@R0,A;存数据
INCR0
INCDPTR;指向下一通道
CLRF0;清中断标志
RETI
3.3标度变换
在计算机控制系统中,生产中的各个参数都有着不同的数值和量纲,所有这些都经过调理电路转换成A/D转换器所能接收的0~5伏同一电压信号,又由A/D转换成00~FFH(8位)的数字量,为进一步显示记录等,必须把这些数字量转换成不同单位,以便操作人员对其进行检测管理,这就是所谓的标度变换。
线性参数标度变换:
指一次仪表测量值与转换结果具有线性关系或者一次仪表是线性刻度的。
其标度变换公式为:
A0一次测量仪表的下限Am一次测量仪表的上限
Ax实际测量值N0仪表下限对应的数字量
Nm仪表上限对应的数字量Nx测量值对应的数字量
3.4键盘处理程序
在本设计中采用软件消除抖动的方法来解决干扰的问题
根据按键的功能一般分为两种情况来处理:
(a)对于每按键一次视为一次输入的设定来说,在稳定闭合期内,不断检测按键是否已释放,当发现按键被释放后,读出对应按键的编码(或称为键号)
(b)对于重要输入功能的键设定来说,每隔一定时间,如500毫秒(即按下某键不动,一秒内重复输入该键两次)对按键进行检测,发现按键依然被按下时,就输入该键,直到按键被释放。
键盘中断程序:
INT1:
CLREX1
PUSHPSW
PUSHACC
MOVA,P1
ANLA,#0E7H
JNBPSW.0,EXIT
MOVR0,#0H
MOVR5,#1
LCALLDELAY
MOVA,P1
MOVR5,#50
JBP1.0,EX1
JBP1.1,EX2
JBP1.2,EX3
EX1:
INCR0
MOVA,R0
ADDA,18H
MOVB,#8
DIVAB
MOVR6,B
MOV18H,R6
LCALLDELAY
JNBP1.0,EXIT
JMPEX1
EX2:
CLRC
INCR0
MOVA,18H
SUBBA,R0
JNCEXIT
DIVAB
MOVR6,B
MOV18H,R6
LCALLDELAY
JNBP1.1,EXIT
JMPEX2
EX3:
JBP1.2,EX3
CPLP1.3
EXIT:
CLRIE1
MOVP1,#18H
POPACC
POPPSW
SETBEX1
RETI
图3-4键盘中断程序流程图PROCINT1
3.5双字节二进制整数转换为压缩BCD码整数子程序
NIBTD:
MOVA,R0
MOVR5,A
MOVR6,A
MOVA,R7
INCA
MOVA,R3
CLRA
NBD0:
MOV@R1,A
INCR1
DJNZR3,NBD0
MOVA,R7
MOVB,#08H
MULAB
MOVR3,A
NBD4:
MOVA,R5
MOVR0,A
MOVA,R7
MOVR2,A
CLRC
NBD1:
MOVA,@R0
RLCA图3.5二进制整数转换为压缩BCD码
MOV@R0,A整数子程序的程序流程图
INCR0
DJNZR2,NBD1
MOVA,R6
MOVR1,A
MOVA,R7
MOVR2,A
INCR2
NBD3:
MOVA,@R1
ADDCA,@R1
DAA
MOV@R1,A
INCR1
DJNZR2,NBD3
DJNZR3,NBD4
RET
3.6三字节压缩BCD码转换成ASCII码子程序
MOVR2,#N;字节数存R2
MOVR0,#50H;ASCII码首地址
MOVR2,#60H;BCD码首地址
BCDASC:
MOVA,@R1;取BCD码
MOVR3,A;BCD码暂存R3
ANLA,#0F0H;屏蔽低四位保留高四位
SWAPA;A中的高低四位交换
ADDA,#30H;加30H得高位ASCII码
MOVA,R3;保存ASCII码
INCR0
MOVA,R3;再取BCD码
ANLA,#0FH;屏蔽高四位保留低四位
ADDA,#30H;加30H得低位ASCII码
MOV@R0,A
INCR1
INCR0
DJNZR2,BCDASC
RET
3.7LCD显示程序
LCD:
RSEQUP2.0;LCDRS引脚定义
ENEQUP2.1;LCDEN引脚定义
BEGIN:
CLREN;LCD被禁用
CALLSET_LCD;LCD初始化并做显示测试
MOVA,18H;设置所要显示的字符
MOVB,#11;设置所要显示LCD的位置
CALLLCDP1;在LCD第一行显
;示字符
MOVR4,#6
MOVR1,#39H
MOVR2,#8图3-7LCD显示流程图
XU:
INCR1
MOVA,R1;设置所要显示的字符
INCR2
MOVB,R2;设置所要显示LCD的位置
CALLLCDP2;在LCD第二行显示字符
DJNZR4,XU
SET_LCD:
;LCD初始化并做显示测试
CLREN;LCD被禁用
CALLINIT_LCD;LCD初始化
MOVR5,#10;延迟一下
CALLDELAY
MOVDPTR,#LMESS1;指针指到显示消息1
MOVA,#1;显示在第一行
CALLLCD_PRINT;显示执行消息1于LCD第一行
MOVDPTR,#LMESS2;指针指到显示消息2
MOVA,#2;显示在第二行
CALLLCD_PRINT;显示执行消息2于LCD第二行
RET
INIT_LCD1:
;4位I/O初始化LCD
MOVA,#28H
CALLWCOM;双列显示,字型使用5*7点阵
MOVA,#0EH
CALLWCOM;光标出现不闪烁
MOVA,#06H
CALLWCOM;每次向右移一位,显示屏不移动
MOVA,#01H
CALLWCOM;清除LCD显示屏
RET
CLR_LINE1:
;清除LCD第一行字符
MOVA,#80H;设置第一行地址
CALLWCOM
MOVR0,#24;设置计数值
CL:
MOV#‘’;载入空格符至LCD
CALLWDATA;输出字符至LCD
DJNAR0,CL;计数结束
RET
;A=LINE1OR2;在LCD的第一行或第二行印出字符
;DPTR=MESSAGEPOINTER
LCD_PRINT:
CJNEA,#1,LINE2
LINE1:
MOVA,80H;设置LCD的第一行地址
CALLWCOM
CALLCLR_LINE
MOVA,#80H
CALLWCOM
JMPFILL
LINE2:
MOVA,#0C0H;设置LCD的第二行地址
CALLWCOM
CALLCLR_LINE
MOVA,#0C0H
CALLWCOM
FILL:
CLRA
MOVCA,@A+DPTR
CJNEA,#0,L1
RET
L1:
CALLWDATA
INCDPTR
JMPFILL
RET
CLR_LINE:
;清除LCD该行字符
MOVR0,#24;设置计数值
C1:
MOVA,#‘’;载入空格符至LCD
CALLWDATA;输出字符至LCD
DJNZR0,C1;计数结束
RET
DE:
MOVR7,#5;短暂延时
DJNZR7,$
RET
EN1:
SETBEN;短脉冲
CALLDE
CLREN
CALLDE
RET
INIT_LCD:
;LCD4位接口指令重置
MOVP0,#30H;RS=0,R/W=0,D7~D4=0011
CALLEN1
MOVP0,#30H
CALLEN1
MOVP0,#30H
CALLEN1
MOVP0,#20H;启动4位接口指令
CALLEN1;RS=0,R/W=0,D7~D4=0010
CALLINIT_LCD1;LCD指令设置初始化
RET
WCOM:
;WRITEHI4BIT
MOVP0,A;先写入高4位命令
CLRRS;RS=0写入命令
CALLEN1;产生高电平启用脉冲
RLCA;向左移4位
RLCA
RLCA
RLCA
;WRITELO4BIT
MOVP0,A;写入低4位命令
CLRRS;RS=0写入命令
CALLEN1;产生高电平启用脉冲
RET
WDATA:
;WRITEHI4BIT
MOVP0,A;先写入高4位命令
SETBRS;RS=1写入数据
CALLEN1;产生高电平启用脉冲
RLCA;向左移4位
RLCA
RLCA
RLCA
;WRITELO4BIT
MOVP0,A;写入低4位命令
SETBRS;RS=1写入数据
CALLEN1;产生高电平启用脉冲
RET
;------------------------------------
;DELAYR5*10ms;延迟子程序
DELAY:
MOVR6,#25;总延迟时间R5*10ms
D1:
MOVR7,#99
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
;--------------------------------------
LMESS1:
DB“CHANNEL:
”
LMESS1:
DB“VOLTAGE:
mv”
;--------------------------------------
;在LCD第一行特定位置显示字符
;A=ASCDATA所要显示的字符
;B=LINEXPOS所要显示的位置0~15
LCDP1:
;将A寄存器放入堆栈
PUSHACC
MOVA,B
ADDA,#80H;设置LCD的第一行地址
CALLWCOM
POPACC;由堆栈取出A寄存器的值
CALLWDATA;写入所要显示的字符
RET
;------------------------------------------
;在LCD第二行特定位置显示字符
;A=ASCDATA所要显示的字符
;B=LINEXPOS所要显示的位置0~15
LCDP2:
;将A寄存器放入堆栈
PUSHACC
MOVA,B
ADDA,#0C0H;设置LCD的第二行地址;
CALLWCOM
POPACC;由堆栈取出A寄存器的值
CALLWDATA;写入所要显示的字符
RET
END
3.8串行通信子程序
图3-8-1上位机人机交互界面
3.8.1上位机人机交互界面
图3-8-1为人机交互界面的外观图,用可视化编程语言VB编写的可视化界面,简洁明了,操作方便,串行通信采用了事件驱动行方式,使用Micorsoft公司的控件MicorsoftCommunication实现串行通信。
3.8.2上位机通信及显示程序
(1)初始化代码
PrivateSubForm_Load()
MSComm.CommPort=2‘设置串口2
MSComm.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()
DimxAsString
IfText_SEND.Text=“”Then‘发送数据不能为空
X=MsgBox(“发送数据不能为空”,16)
ExitSub
EndIf
IfNotMSComm.PortOpenThen‘保证串口打开
MSComm.PortOpen=True
EndIf
MSComm.OutPut=Text_SEND.Tex+Chr$(13)‘发送数据
Fori=1To20000000‘延时
Next
EndSub
(3)接收数据
PrivateSubMSComm_OnComm.()
SlectCaseMSComm.CommEvent‘.检验串口事件错误处理
CasecomEventOverrun‘数据丢失
Text_SEND.Text=“”‘清空发送缓冲区
Text_RECV.Text=“”‘清接收缓冲区
Text_SEND.SetFous=“”
ExitSub
CasecomEventRxOver‘接收缓冲区溢出
Text_SEND.Text=“”‘清空发送缓冲区
Text_RECV.Text=“”‘清空接收缓冲区
Text_SEND.SetFous=“”
ExitSub
CasecomEventOver‘发送缓冲区已满
Text_SEND.Text=“”‘清空发送缓冲区
Text_RECV.Text=“”‘清空接收缓冲区
Text_SEND.SetFous=“”
ExitSub
‘事件处理
CasecomEvReceive‘接收缓冲区内有数据
DimstrAsString
str=MSComm.InPut‘从接收队列中读入字符串
Text_RECV.Text=Text_RECV.Text+str‘读出字符串送显
EndSelect
EndSub
(4)清空接收文本框
PrivateSubButton_RECV_C_Click()
Text_RECV.Text=“”‘清空接收文本框
Text_SEND_SetFocus
EndSub
‘清空发送文本框
PrivateSubButton_SEND_C_Click()
Text_RECV.Text=“”‘清空发送文本框
Text_SEND_SetFocus
EndSub
3.8.3单片机终端串行通信程序
COMMUNICATION:
MOVR3,#7;要发送的字节数
MOVR0,#40H;待发送数据的起始地址
SENDBACK:
MOVA,@R0;向PC机发送数据
MOVSBUF,A
WAIT:
JNBTI,WAIT
CLRTI
INCR0;移动地址指针
DJNZR3,SENDBACK;发送完否
RETI
3.9主程序
ORG0000H
SJMPMAIN
ORG0003H;外部0中断入口地址
LJMPINTDATA
ORG0013H;外部1中断入口地址
LJMPPROCINT1
ORG0023H;串行中断入口地址
LJMPSERVE
ORG0100H;主程序开始
MAIN:
MOVSP,#60H
MOVP1,18H;键盘初始化
MOVTMOD,#20H;定时器T1初始化
MOVTH1,#0F3H
MOVTL1,#0F3H
MOVSCON,#50H;串行口初始化
MOVPCON,#80H;SMOD=1
SETBTR1;启动定时器T1
SETBEA;开中断
SETBES;允许串口中断
SETBEX1;允许外部中断T1
NEXT:
LCALLSAMP;调用数据采集程序,结果存于30H
MOVA,#30H
ADDA,18H
DECA
MOVB,#196
MULAB
MOV39H,A;39H、3AH分别存储二进制数的地位和
MOV3AH,B;高位
MOVR0,#39H
MOVR1,3BH
LCALLNIBTB;双字节二进制整数转换为压缩BCD码
;存于起始地址为3BH的单元
LCALLBCDA;压缩BCD转换成ASCII码
MOVA,18H
ADDA,#30H
MOV40H,A
MOV46H,45H
MOV45H,#2EH
LCALLLCD;调用显示子程序
LCALLCOMMUNICATION;调用串行通信子程序
JMPNEXT