a主程序流程图参考模板.docx

上传人:b****4 文档编号:4863562 上传时间:2022-12-10 格式:DOCX 页数:19 大小:153.66KB
下载 相关 举报
a主程序流程图参考模板.docx_第1页
第1页 / 共19页
a主程序流程图参考模板.docx_第2页
第2页 / 共19页
a主程序流程图参考模板.docx_第3页
第3页 / 共19页
a主程序流程图参考模板.docx_第4页
第4页 / 共19页
a主程序流程图参考模板.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

a主程序流程图参考模板.docx

《a主程序流程图参考模板.docx》由会员分享,可在线阅读,更多相关《a主程序流程图参考模板.docx(19页珍藏版)》请在冰豆网上搜索。

a主程序流程图参考模板.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1