
关于单片机课程设计-工业顺序控制的问题
实验目的:1掌握单片机与8255的接口原理,了解单片机控制的动态显示的原理.2掌握单片机输出/输入口.外部中断,定时器与计数器的使用.3掌握工业顺序控制与动态显示的简单编...
实验目的:
1掌握单片机与8255的接口原理,了解单片机控制的动态显示的原理.
2掌握单片机输出/输入口.外部中断,定时器与计数器的使用.
3掌握工业顺序控制与动态显示的简单编程,学会单片机在小系统控制中的使用方法.
一预备知识
在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些断续生产过程,按某种程序有规律地完成预定的动作,对这类断续生产过程的控制称顺序控制,例注塑机工艺过程大致按“合模→注射→延时→开模→产伸→产退”顺序动作,用单片机最易实现
二、内容
89c51的P1.1—P1.6控制注塑机的6道工序,现模拟控制6只发光二极管的点亮(共阳),高电平有效,设定每道工序时间转换为延时1s,P3.4为开工启动开关,高电平启动。P3.3为外故障输入模拟开关,P3.3为0时不断告警,P1.0为报警声音输出.设定6道工序只有一位输出。
求程序
(付:;六位数码管动态显示子程序,对应的段码地址为7F02H,位选择地址为7F01H
ADIR: MOV R0,#39H ;六位数码管的显示暂存地址为:39H~3EH
MOV R2,#01H ;位选择初值01H
MOV A,R2
ALD0: MOV DPTR,#7F01H;设置位选择地址
MOVX @DPTR,A;发送位选择数据
INC DPTR;指向段码地址
MOV A,@R0;取显示内容
ADD A,#14H;修正查段码表值
MOVC A,@A+PC;查段码表,取显示值的段码
ADIR1: MOVX @DPTR,A;发送段码
LCALL ADL1
INC R0;指向下一个显示暂存地址
MOV A,R2
JB ACC.5,ALD1;判断数码管是否显示完一编,“是”:返回,“否”:移位位选择值,指向下一个数码管
RL A
MOV R2,A
LJMP ALD0;转处理下一个地址显示
ALD1: RET
ADSEG: DB 0C0H,0F9H,0A4H,0B0H,099H,092H ;0,1,2,3,4,5 七段数码管对应显示的八段编码列表
ADSEG1: DB 082H,0F8H,80H,90H,88H,83H ;6,7,8,9,A,B
ADSEG2: DB 0C6H,0A1H,86H,8EH,8CH,0C1H ;C,D,E,F,P,|_|,
ADSEG3: DB 0CEH,91H,0E3H,0DCH,0BFH,0FCH ;R-12 Y-13 |_|-14 -15 -|-17
ADSEG4: DB 0E7H,0C7H,0FFH ;|_-18 |_-19 1A
ADL1: MOV R7,#04H ;延时子程序
ADL: MOV R6,#0E7H
ADL6: DJNZ R6,ADL6
DJNZ R7,ADL
RET 展开
1掌握单片机与8255的接口原理,了解单片机控制的动态显示的原理.
2掌握单片机输出/输入口.外部中断,定时器与计数器的使用.
3掌握工业顺序控制与动态显示的简单编程,学会单片机在小系统控制中的使用方法.
一预备知识
在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些断续生产过程,按某种程序有规律地完成预定的动作,对这类断续生产过程的控制称顺序控制,例注塑机工艺过程大致按“合模→注射→延时→开模→产伸→产退”顺序动作,用单片机最易实现
二、内容
89c51的P1.1—P1.6控制注塑机的6道工序,现模拟控制6只发光二极管的点亮(共阳),高电平有效,设定每道工序时间转换为延时1s,P3.4为开工启动开关,高电平启动。P3.3为外故障输入模拟开关,P3.3为0时不断告警,P1.0为报警声音输出.设定6道工序只有一位输出。
求程序
(付:;六位数码管动态显示子程序,对应的段码地址为7F02H,位选择地址为7F01H
ADIR: MOV R0,#39H ;六位数码管的显示暂存地址为:39H~3EH
MOV R2,#01H ;位选择初值01H
MOV A,R2
ALD0: MOV DPTR,#7F01H;设置位选择地址
MOVX @DPTR,A;发送位选择数据
INC DPTR;指向段码地址
MOV A,@R0;取显示内容
ADD A,#14H;修正查段码表值
MOVC A,@A+PC;查段码表,取显示值的段码
ADIR1: MOVX @DPTR,A;发送段码
LCALL ADL1
INC R0;指向下一个显示暂存地址
MOV A,R2
JB ACC.5,ALD1;判断数码管是否显示完一编,“是”:返回,“否”:移位位选择值,指向下一个数码管
RL A
MOV R2,A
LJMP ALD0;转处理下一个地址显示
ALD1: RET
ADSEG: DB 0C0H,0F9H,0A4H,0B0H,099H,092H ;0,1,2,3,4,5 七段数码管对应显示的八段编码列表
ADSEG1: DB 082H,0F8H,80H,90H,88H,83H ;6,7,8,9,A,B
ADSEG2: DB 0C6H,0A1H,86H,8EH,8CH,0C1H ;C,D,E,F,P,|_|,
ADSEG3: DB 0CEH,91H,0E3H,0DCH,0BFH,0FCH ;R-12 Y-13 |_|-14 -15 -|-17
ADSEG4: DB 0E7H,0C7H,0FFH ;|_-18 |_-19 1A
ADL1: MOV R7,#04H ;延时子程序
ADL: MOV R6,#0E7H
ADL6: DJNZ R6,ADL6
DJNZ R7,ADL
RET 展开
2个回答
意法半导体(中国)投资有限公司
2023-06-12
展开全部
我有,不过贴上来你给分吧,想当年可是花了N多时间来编写和调试的。不用给我发E-MAIL,不会在E-MAIL中回复的。
main proc far
PUSH DX
sub AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,0 ;设置显示器模式
MOV al,02h ;40*25,16色文本模式
INT 10h
MOV AH,09h ;显示操作说明字符
MOV DX,seg string
MOV ds,DX
MOV DX,offset string
INT 21h
lea DI,mess ;di指向字符图形表
MOV DH,5 ;从第5行第5列位置开始
MOV DL,0 ;从第五行第五列开始显示名字
call string_display ;调用字体显示程序
RET
main endp
DATE PROC NEAR ;显示日期子程序
MOV AH,2AH ;取系统日期,入口参数:AH=2AH,出口参数:CX=年(1980~2099),
;DH=月(1~12),DL=日(1~31),AL=星期几(0=Sunday,1=Monday,...)
INT 21H
MOV SI,0
MOV AX,CX ;取年份
MOV BX,100
DIV BL
MOV BL,AH
CALL BCDASC1 ;日期数值转换成相应的ASCII码字符
MOV AL,BL
CALL BCDASC1
INC SI
MOV AL,DH
CALL BCDASC1
INC SI
MOV AL,DL
CALL BCDASC1
MOV BP,OFFSET DBUFFER1
MOV DH,23
MOV DL,20
MOV CX,20
MOV BX,000FH
MOV AH,13H ;显示字符串
MOV AL,01H
INT 10H
MOV BX,0018H
REPEA: MOV CX,0FFFFH ;延时
Aa:
LOOP Aa
DEC BX
JNZ REPEA
RET
DATE ENDP
TIME PROC NEAR ;显示时间子程序
MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取系统时间 CH:CL=时:分,DH:DL=秒:1/100秒
INT 21H
MOV AL,CH ;把时转换
CALL BCDASC ;将时间数值转换成ASCII码字符
INC SI
MOV AL,CL ;把分转换
CALL BCDASC
INC SI
MOV AL,DH ;把秒转换
CALL BCDASC
MOV BP,OFFSET DBUFFER
MOV DH,23
mov DL,40
MOV CX,20
MOV BH,00H
MOV BL,0FH
MOV AH,13H ;显示字符串
MOV AL,01H
INT 10H
MOV BX,0018H ;做延时
RE: MOV CX,0FFFFH
REA: LOOP REA ;循环
DEC BX
JNZ RE ;是不是一秒的循环?
RET
TIME ENDP
BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
BCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER1[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER1[SI],AH
INC SI
POP BX
RET
BCDASC1 ENDP
string_display proc near ;字体显示子程序(主要的程序)
PUSH AX
PUSH bx
PUSH CX
PUSH DX
PUSH DI
sub CH,CH ;清除寄存器CX的高字节
MOV CL,[DI] ;CL放循环次数,也就是字符个数
INC DI ;di指向字符表的第一个字符
MOV char_cnt,CX ;保存循环次数
MOV pointer,DI ;保存第一个字符的偏移地址
MOV line_on,DH ;保存显示的起始行5
MOV col_on,DL ;保存显示的起始列0
plot_next:
ADD DH,[DI+2] ;改变相对行指针
ADD DL,[DI+3] ;改变列指针取下一个列数
CMP DL,250 ;出屏否?
jMP con_display ;没有出屏,则继续显示
call re_display ;出了屏幕则调用重新显示程序
POP DI
POP DX
POP CX
POP BX
POP AX
RET
con_display:
MOV AH,2 ;移动光标位置
INT 10h
MOV al,[DI]
MOV BL,[DI+1] ;取字符值及属性
PUSH AX
CMP RED,1
JNZ YELLOW2
XOR BL,23H
YELLOW2:
CMP YELLOW,1
JNZ BLUE2
XOR BL,11H
BLUE2:
CMP BLUE,1
JNZ GOON
XOR BL,6FH
GOON:
POP AX
PUSH CX
MOV CX,1
MOV AH,09 ;显示字符
INT 10h
POP CX
ADD DI,4 ;di指向下一个字符及其属性,行列
LOOP plot_next ;循环显示完所有的字符后
call delay ;调用延时以及按键子程序
Call date
call time ;先在窗口显示时间
CMP flag,1
JNZ KEEP
call music
KEEP:call re_display ;调用重新显示子程序
JMP SHORT plot_next
RET
string_display endp
re_display proc near ;重新显示子程序
MOV CX,char_cnt
MOV DI,pointer
MOV DH,line_on
MOV DL,col_on
re_display_next:
ADD DH,[DI+2] ;取行/列值
ADD DL,[DI+3]
MOV AH,2 ;先确定光标位置
INT 10h
MOV al,[DI]
MOV BL,0
PUSH CX
MOV CX,1
MOV AH,9 ;再在当前光标处显示字符
INT 10h
POP CX
ADD DI,4
loop re_display_next ;把所有字符都显示完毕
MOV CX,char_cnt ;重新保存各项参数
MOV DI,pointer
MOV DH,line_on
INC col_on
MOV DL,col_on
RET
re_display endp
delay proc near ;延时子程序以及键盘扫描
PUSH CX
PUSH DX
MOV DX,DATA2
CMP INCLEASE,1
JNZ DECLE
ADD DX,1000
MOV DATA2,DX ;保存上一次的值
DECLE:
CMP DECLEASE,1
JNZ d11
SUB DX,1000
d11:MOV CX,8000
d12:LOOP d12
DEC DX
JNZ d11
POP DX
POP CX
MOV AH,06H ;读取键盘
XOR AL,AL
CMP MUSIC1,1
JNZ GO2
MOV DL,0
MOV RED,DL ;还原功能,先把所有标志位清零
MOV YELLOW,DL
MOV BLUE,DL
GO2: MOV DL,0FFH
INT 21H
CMP AL,'R' ;变成红色
JNZ A
MOV RED,1
A: CMP AL,'Y' ;改变成黄色
JNZ B
MOV YELLOW,1
B: CMP AL,'B' ;改变成蓝色
JNZ AC
MOV BLUE,1
AC: CMP AL,'A' ;移动加速
JNZ D
MOV INCLEASE,1
D: CMP AL,'D' ;移动减速
JNZ M
MOV DECLEASE,1
M: CMP AL,'M' ;播放音乐,还原颜色按键
JNZ Q
PUSH AX
INC MUSIC1
MOV BH,2
MOV AX,MUSIC1
DIV BH
CMP AH,0
JZ flag_value ;整除就跳转
MOV flag,0
flag_value:
MOV flag,1
POP AX
Q: CMP AL,'Q'
JNZ go
MOV AH,4CH
INT 21H
go: RET
delay ENDP
GENSOUND PROC near
PUSH AX ;先保存各个寄存器
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL, 0B6H ;8253通道地址
OUT 43H, AL
MOV DX, 12H
MOV AX, 533H*896
DIV DI
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
IN AL, 61H
OR AL, 3
OUT 61H, AL
WAIT1: MOV CX, 700
DE: LOOP DE
DEC BX
JNZ WAIT1
MOV AL, AH
OUT 61H, AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
MUSIC PROC NEAR
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
CMP flag,1
JZ KEEP_ON
RET
KEEP_ON: MOV AX, DATA
MOV DS, AX
LEA SI, MUS_FREQ
LEA BP, DS: MUS_TIME
FREQ: MOV DI, [SI]
CMP DI, -1
JE END_MUS
MOV BX, DS: [BP]
CALL GENSOUND
ADD SI, 2
ADD BP, 2
JMP FREQ
END_MUS:
POP AX
POP BX
POP CX
POP DX
POP DS
RET
MUSIC ENDP
code ENDS
END main
main proc far
PUSH DX
sub AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,0 ;设置显示器模式
MOV al,02h ;40*25,16色文本模式
INT 10h
MOV AH,09h ;显示操作说明字符
MOV DX,seg string
MOV ds,DX
MOV DX,offset string
INT 21h
lea DI,mess ;di指向字符图形表
MOV DH,5 ;从第5行第5列位置开始
MOV DL,0 ;从第五行第五列开始显示名字
call string_display ;调用字体显示程序
RET
main endp
DATE PROC NEAR ;显示日期子程序
MOV AH,2AH ;取系统日期,入口参数:AH=2AH,出口参数:CX=年(1980~2099),
;DH=月(1~12),DL=日(1~31),AL=星期几(0=Sunday,1=Monday,...)
INT 21H
MOV SI,0
MOV AX,CX ;取年份
MOV BX,100
DIV BL
MOV BL,AH
CALL BCDASC1 ;日期数值转换成相应的ASCII码字符
MOV AL,BL
CALL BCDASC1
INC SI
MOV AL,DH
CALL BCDASC1
INC SI
MOV AL,DL
CALL BCDASC1
MOV BP,OFFSET DBUFFER1
MOV DH,23
MOV DL,20
MOV CX,20
MOV BX,000FH
MOV AH,13H ;显示字符串
MOV AL,01H
INT 10H
MOV BX,0018H
REPEA: MOV CX,0FFFFH ;延时
Aa:
LOOP Aa
DEC BX
JNZ REPEA
RET
DATE ENDP
TIME PROC NEAR ;显示时间子程序
MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取系统时间 CH:CL=时:分,DH:DL=秒:1/100秒
INT 21H
MOV AL,CH ;把时转换
CALL BCDASC ;将时间数值转换成ASCII码字符
INC SI
MOV AL,CL ;把分转换
CALL BCDASC
INC SI
MOV AL,DH ;把秒转换
CALL BCDASC
MOV BP,OFFSET DBUFFER
MOV DH,23
mov DL,40
MOV CX,20
MOV BH,00H
MOV BL,0FH
MOV AH,13H ;显示字符串
MOV AL,01H
INT 10H
MOV BX,0018H ;做延时
RE: MOV CX,0FFFFH
REA: LOOP REA ;循环
DEC BX
JNZ RE ;是不是一秒的循环?
RET
TIME ENDP
BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
BCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER1[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER1[SI],AH
INC SI
POP BX
RET
BCDASC1 ENDP
string_display proc near ;字体显示子程序(主要的程序)
PUSH AX
PUSH bx
PUSH CX
PUSH DX
PUSH DI
sub CH,CH ;清除寄存器CX的高字节
MOV CL,[DI] ;CL放循环次数,也就是字符个数
INC DI ;di指向字符表的第一个字符
MOV char_cnt,CX ;保存循环次数
MOV pointer,DI ;保存第一个字符的偏移地址
MOV line_on,DH ;保存显示的起始行5
MOV col_on,DL ;保存显示的起始列0
plot_next:
ADD DH,[DI+2] ;改变相对行指针
ADD DL,[DI+3] ;改变列指针取下一个列数
CMP DL,250 ;出屏否?
jMP con_display ;没有出屏,则继续显示
call re_display ;出了屏幕则调用重新显示程序
POP DI
POP DX
POP CX
POP BX
POP AX
RET
con_display:
MOV AH,2 ;移动光标位置
INT 10h
MOV al,[DI]
MOV BL,[DI+1] ;取字符值及属性
PUSH AX
CMP RED,1
JNZ YELLOW2
XOR BL,23H
YELLOW2:
CMP YELLOW,1
JNZ BLUE2
XOR BL,11H
BLUE2:
CMP BLUE,1
JNZ GOON
XOR BL,6FH
GOON:
POP AX
PUSH CX
MOV CX,1
MOV AH,09 ;显示字符
INT 10h
POP CX
ADD DI,4 ;di指向下一个字符及其属性,行列
LOOP plot_next ;循环显示完所有的字符后
call delay ;调用延时以及按键子程序
Call date
call time ;先在窗口显示时间
CMP flag,1
JNZ KEEP
call music
KEEP:call re_display ;调用重新显示子程序
JMP SHORT plot_next
RET
string_display endp
re_display proc near ;重新显示子程序
MOV CX,char_cnt
MOV DI,pointer
MOV DH,line_on
MOV DL,col_on
re_display_next:
ADD DH,[DI+2] ;取行/列值
ADD DL,[DI+3]
MOV AH,2 ;先确定光标位置
INT 10h
MOV al,[DI]
MOV BL,0
PUSH CX
MOV CX,1
MOV AH,9 ;再在当前光标处显示字符
INT 10h
POP CX
ADD DI,4
loop re_display_next ;把所有字符都显示完毕
MOV CX,char_cnt ;重新保存各项参数
MOV DI,pointer
MOV DH,line_on
INC col_on
MOV DL,col_on
RET
re_display endp
delay proc near ;延时子程序以及键盘扫描
PUSH CX
PUSH DX
MOV DX,DATA2
CMP INCLEASE,1
JNZ DECLE
ADD DX,1000
MOV DATA2,DX ;保存上一次的值
DECLE:
CMP DECLEASE,1
JNZ d11
SUB DX,1000
d11:MOV CX,8000
d12:LOOP d12
DEC DX
JNZ d11
POP DX
POP CX
MOV AH,06H ;读取键盘
XOR AL,AL
CMP MUSIC1,1
JNZ GO2
MOV DL,0
MOV RED,DL ;还原功能,先把所有标志位清零
MOV YELLOW,DL
MOV BLUE,DL
GO2: MOV DL,0FFH
INT 21H
CMP AL,'R' ;变成红色
JNZ A
MOV RED,1
A: CMP AL,'Y' ;改变成黄色
JNZ B
MOV YELLOW,1
B: CMP AL,'B' ;改变成蓝色
JNZ AC
MOV BLUE,1
AC: CMP AL,'A' ;移动加速
JNZ D
MOV INCLEASE,1
D: CMP AL,'D' ;移动减速
JNZ M
MOV DECLEASE,1
M: CMP AL,'M' ;播放音乐,还原颜色按键
JNZ Q
PUSH AX
INC MUSIC1
MOV BH,2
MOV AX,MUSIC1
DIV BH
CMP AH,0
JZ flag_value ;整除就跳转
MOV flag,0
flag_value:
MOV flag,1
POP AX
Q: CMP AL,'Q'
JNZ go
MOV AH,4CH
INT 21H
go: RET
delay ENDP
GENSOUND PROC near
PUSH AX ;先保存各个寄存器
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL, 0B6H ;8253通道地址
OUT 43H, AL
MOV DX, 12H
MOV AX, 533H*896
DIV DI
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
IN AL, 61H
OR AL, 3
OUT 61H, AL
WAIT1: MOV CX, 700
DE: LOOP DE
DEC BX
JNZ WAIT1
MOV AL, AH
OUT 61H, AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
MUSIC PROC NEAR
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
CMP flag,1
JZ KEEP_ON
RET
KEEP_ON: MOV AX, DATA
MOV DS, AX
LEA SI, MUS_FREQ
LEA BP, DS: MUS_TIME
FREQ: MOV DI, [SI]
CMP DI, -1
JE END_MUS
MOV BX, DS: [BP]
CALL GENSOUND
ADD SI, 2
ADD BP, 2
JMP FREQ
END_MUS:
POP AX
POP BX
POP CX
POP DX
POP DS
RET
MUSIC ENDP
code ENDS
END main

2023-06-13 广告
PLC自动化控制是指使用可编程逻辑控制器(PLC)对工业生产过程进行自动化控制的技术。PLC通常由以下几个部分组成:1. CPU:PLC的核心部件,负责接收用户程序和数据,执行程序,诊断和处理错误等。2. 存储器:存储系统和用户的程序和数据...
点击进入详情页
本回答由博德可来提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询