微机原理三级项目(共19页).doc
精选优质文档-倾情为你奉上瓶装饮品灌装的计算机控制技术的实现班 级:机制2班学 号:姓 名:课 程 名 称:微机原理、汇编语言及接口技术指 导 教 师: 2016年5月摘要 本次三级项目的题目是瓶装饮品生产线的自动控制,通过分析题目给定的要求确定了5个主要的步骤,分别是空瓶检测、自动灌装、质量检测、不合格处理、记录不合格数。选择使用的芯片有8255、8155、8253,外接设备有步进电机、数码管、LED灯、液晶屏、逻辑笔。其中8255C端口控制步进电机模拟的是灌装过程,A口和B口控制数码管显示不合格数。LED的闪烁表示检测到质量不合格瓶子。逻辑笔检测8253输出口的状态,便于观察。液晶屏用于显示程序运行的状态。通过调试和接线,实现了预定的功能和要求。 关键字:自动控制、8255、8253、8155、步进电机、数码管、液晶屏。目录前言 本次三级项目的题目是瓶装饮品的生产线自动控制,工程实际要求实现自动检测空瓶到位、自动开启灌装、自动检测质量是否合格、不合格处理、记录不合格件数。这些功能的实现需要用到不同的芯片的外接设备。结合实际情况和所学的知识编写了程序,通过外接设备的功能来模拟工程实际现象,做到了理论与实际相结合。在实际生产中,遇到的情况比较多,由于无法一一地模拟,所以设计的结果还有很大改善的空间。程序的设计过程需要反复的调试,才能顺利的出现现象和结果。项目报告的内容主要包括了题目的分析,程序流程图和详细程序,系统接线图,结果分析以及对程序的改进。最后是感言和参考文献,详细地介绍了项目的实施过程和结果。专心-专注-专业1.项目的描述及要求项目描述:某厂生产瓶装保健饮品,要求设计自动化控制装置,检测每个空瓶到位后,启动灌装,装满600克,停止该瓶的灌装。为保证顾客利益,每瓶不得少于595克,少于595克的,通过另一传送带再处理,并记录而且显示少于595克的瓶数。要求分析:根据给定的题目,按实际情况进行分析后确定了项目实施方案。第一步:检测空瓶是否到位;第二步:空瓶到位后模拟灌装过程;第三步:质量检测,判断是否合格;第四步:进行不合格处理。第五步:显示不合格件数。根据实验箱的硬件设备进行选择,编写程序实现预定的功能和要求。2.项目的模拟方案2.1硬件设备及功能8086芯片:中央处理器。8255芯片:PA、PB、PC三个端口均作为输出口,用于连接处理器和外接设备。 其中PA口用于输出数码管的位码,PB口用于输出数码管的段码。PC口低四位连接步进电机的接口,用于控制电机转动;8155芯片:PA口作为输出端口,PB口作为输入端口。PA口用于控制LED灯,PB口接8253输出口,根据输入高低电平判断空瓶是否到位。8253芯片:其输出信号输入给8155的PB口。通过输入三次方式控制字,将1M的输入频率三次变频,前两次使用方式3产生方波,第三次使用方式0,计数初值为20,计数结束后输出变为高电平表示20个空瓶到位。步进电机:连接8255的PC口低四位,通过输出信号正转或者反转。启动灌装用步进电机正转模拟,不合格处理用步进电机反转模拟。LED灯:当质量不合格时通过8155的PA口输出信号控制三个红灯闪烁三次。数码管:通过8255的PA和PB口输出信号显示不合格的瓶数。液晶屏:在程序运行中相应地显示“灌装开始”、“灌装结束”、“不合格数为六”。逻辑笔:实时地显示8253输出信号是高电平还是低电平。2.2系统接线图图1:8255接线图 图2:8155和8253接线图3.控制程序3.1详细程序.model smallwr_com_ad_l equ 0d004h ;写左半屏指令地址wr_com_ad_r equ 0d000h ;写右半屏指令地址wr_data_ad_l equ 0d006h ;写左半屏数据地址wr_data_ad_r equ 0d002h ;写右半屏数据地址rd_busy_ad equ 0d001h ;查忙地址rd_data_ad equ 0d003h ;读数据地址x equ 0b8h ;起始显示行基址y equ 040h ;起始显示列基址firstline equ0c0h ;起始显示行.stack.data;- 文字: 灌 -Line1_1 db 50h, 48h, 47h,0fch, 44h, 44h, 42h, 3ah db0efh,0bah, 82h,0fah,0afh,0bah, 02h, 00h db 00h, 7fh, 20h, 3fh, 20h, 7fh, 02h, 01h db0ffh, 4ah, 4ah, 7fh, 4ah, 6ah, 40h, 00h;- 文字: 装 -Line1_2 db 00h, 42h, 24h, 10h,0ffh, 00h, 44h,0a4h db 24h, 3fh, 24h, 34h, 26h, 84h, 00h, 00h db 01h, 21h, 21h, 11h, 09h,0fdh, 43h, 21h db 0dh, 11h, 29h, 25h, 43h,0c1h, 41h, 00h;- 文字: 开 -Line1_3 db 80h, 82h, 82h, 82h,0feh, 82h, 82h, 82h db 82h, 82h,0feh, 82h, 83h,0c2h, 80h, 00h db 00h, 80h, 40h, 30h, 0fh, 00h, 00h, 00h db 00h, 00h,0ffh, 00h, 00h, 00h, 00h, 00h;- 文字: 始 -Line1_4 db 10h, 10h,0f0h, 1fh, 10h,0f0h, 40h, 60h db 58h, 47h, 40h, 40h, 50h, 60h,0c0h, 00h db 40h, 22h, 15h, 08h, 16h, 61h, 00h,0feh db 42h, 42h, 42h, 42h, 42h,0ffh, 02h, 00h;- 文字: 灌 -Line2_1 db 50h, 48h, 47h,0fch, 44h, 44h, 42h, 3ah db0efh,0bah, 82h,0fah,0afh,0bah, 02h, 00h db 00h, 7fh, 20h, 3fh, 20h, 7fh, 02h, 01h db0ffh, 4ah, 4ah, 7fh, 4ah, 6ah, 40h, 00h;- 文字: 装 -Line2_2 db 00h, 42h, 24h, 10h,0ffh, 00h, 44h,0a4h db 24h, 3fh, 24h, 34h, 26h, 84h, 00h, 00h db 01h, 21h, 21h, 11h, 09h,0fdh, 43h, 21h db 0dh, 11h, 29h, 25h, 43h,0c1h, 41h, 00h;- 文字: 结 -Line2_3 db 00h, 30h, 28h,0a4h, 63h, 10h, 08h, 48h db 48h, 48h, 7fh, 48h, 48h, 4ch, 08h, 00h db 00h, 22h, 63h, 22h, 12h, 12h, 00h,0feh db 42h, 42h, 42h, 42h, 42h,0ffh, 02h, 00h;- 文字: 束 -Line2_4 db 04h, 04h,0e4h, 24h, 24h, 24h, 24h,0ffh db 24h, 24h, 24h, 24h,0f4h, 26h, 04h, 00h db 40h, 40h, 27h, 22h, 12h, 0ah, 06h,0ffh db 06h, 0ah, 12h, 12h, 27h, 60h, 20h, 00h;- 文字: 不 -Line3_1 db 02h, 02h, 02h, 02h, 02h, 82h, 42h,0f2h db 0eh, 42h, 82h, 02h, 02h, 03h, 02h, 00h db 00h, 08h, 04h, 02h, 01h, 00h, 00h,0ffh db 00h, 00h, 00h, 01h, 03h, 06h, 00h, 00h;- 文字: 合 -Line3_2 db 80h, 80h, 40h, 20h, 50h, 48h, 44h, 43h db 44h, 48h, 50h, 20h, 40h,0c0h, 40h, 00h db 00h, 00h, 00h,0feh, 42h, 42h, 42h, 42h db 42h, 42h, 42h,0ffh, 02h, 00h, 00h, 00h;- 文字: 格 -Line3_3 db 10h, 10h,0d0h,0ffh, 50h,0b0h, 18h, 17h db0a4h, 44h,0a4h, 14h, 0ch, 00h, 00h, 00h db 04h, 03h, 00h,0ffh, 08h, 04h,0feh, 45h db 44h, 44h, 44h, 45h,0feh, 06h, 02h, 00h;- 文字: 数 -Line3_4 db 10h, 92h, 54h, 30h,0ffh, 50h, 94h, 32h db 0d8h, 17h, 10h, 10h,0f0h, 18h, 10h, 00h db 02h, 82h, 4eh, 33h, 22h, 52h, 8eh, 40h db 23h, 14h, 08h, 16h, 61h,0C0h, 40h, 00h;- 文字: 六 -Line3_5 db 20h, 20h, 20h, 20h, 20h, 22h, 2ch, 38h db 20h, 20h, 20h, 20h, 20h, 30h, 20h, 00h db 00h, 40h, 20h, 18h, 06h, 03h, 00h, 00h db 00h, 01h, 02h, 0ch, 38h, 70h, 00h, 00hled db 3fh,06h,5bh,4fh,66h,db 6dh,7dh,07h,7fh,6fh ;定义LED变量数码管显示0-9的数字qua db 1,1,0,1,1,1,0,1,0,1,db 1,1,0,1,0,1,1,1,0,1 ;定义qua变量存放20个质量数据.codestart:nopcall lcd_init ;调用清屏子程序mov dx,0f003h ;dx指向8255控制端口地址mov al,80h ;al存放方式控制字,A、B、C全为输出口out dx,al ;将方式控制字存入控制端口mov dx,0e100h ;dx指向8155控制端口地址mov al,01h ;al存放方式控制字,A口输出B口输入out dx,al ;将方式控制字存入控制端口mov dx,0b003h ;dx指向8253控制端口地址mov al,b ;第一次写入方式控制字out dx,almov dx,0b000h ;8253A口方式3工作,计数初值为1000mov al,10hout dx,almov dx,0b003h ;第二次写入方式控制字mov al,bout dx,almov dx,0b001h ;8253B口方式3工作,计数初值为200mov al,02hout dx,almov dx,0b003h ;第三次写入方式控制字mov al,bout dx,almov dx,0b002h ;8253C口方式1工作计数初值20用于计数20个空瓶mov al,20hout dx,all1:mov dx,0e102h ;检测8155B端口状态in al,dxand al,80h ;判断最高位是否为1jz l1 ;不为1,说明空瓶未到位继续检测call disline1 ;最高位是1,液晶屏第1行显示"灌装开始"字样call delaytime ;调用显示延时子程序call bujin1 ;调用步进电机子程序,模拟灌装过程call lcd_init ;调用液晶屏清屏子程序call disline2 ;液晶屏第2行显示"灌装结束"call delaytime ;调用显示延时子程序mov bx,0 ;bx存放qua地址,先清零mov cl,0 ;cl记录不合格数,先清零mov ah,0 ;作为指针取出qua变量存放的数据l3:lea bx,qua ;bx取得qua的初始地址mov al,ah ;al取出qua中的数值xlatcmp al,0 ;判断质量是否合格 jnz l5 ;质量合格,判断下一个mov cx,3 ;质量不合格,通过8155A口控制红灯闪3次l4:mov dx,0e101h mov al,b out dx,alcall delay1mov al,0ffhout dx,alcall delay1loop l4call bujin2 ;质量不合格的转到另外一条处理线上,用步进电机模拟inc cl ;取下一个质量进行检测,记录不合格数l5:inc ah cmp ah,20 ;依次对20个质量检测jb l3call lcd_init ;调用清屏子程序call disline3 ;检测完成,液晶屏第3行显示"不合格数为6"call delaytime ;调用延时子程序l6:mov dx,0f000h ;8255A端口控制数码管的位码,让最低位的数码管显示mov al,bout dx,almov dx,0f001h ;8255B端口控制数码管的段码,显示数字"6"lea bx,ledmov al,clxlatout dx,alcall delay1jmp l6delay1 proc ;延时子程序delay1的定义push cx ;将cx.dx.bx.ax压入堆栈push dxpush bxpush axmov cx,8000h ;循环次数8000hagain:noploop againpop ax ;将ax.bx.dx.cx取出堆栈pop bxpop dxpop cxret ;返回主程序,定义结束 endp delay1delay2 proc ;延时子程序delay2的定义push cx ;将cx.dx.bx.ax压入堆栈push dxpush bxpush axmov cx,4000h ;循环次数4000hl9:noploop l9pop ax ;将ax.bx.dx.cx取出堆栈pop bxpop dxpop cxret ;返回主程序,定义结束endp delay2 bujin1 proc ;定义步进电机1的程序push bx ;将bx.dx.cx.ax压入堆栈push dxpush cxpush axmov cx,10 ;循环10次l7:mov dx,0f002h ;8255C端口控制步进电机的运转mov al,01h ;依次给步进电机A-B-C-D高电平,并调用延迟子程序delay1 out dx,al call delay1mov al,02hout dx,alcall delay1mov al,04hout dx,alcall delay1mov al,08hout dx,alcall delay1loop l7pop ax ;将ax.cx.dx.bx取出堆栈pop cxpop dxpop bxret ;返回主程序endp bujin1 ;步进电机1定义结束bujin2 proc ;定义步进电机2子程序push bx ;将bx.cx.dx.ax压入堆栈push cxpush dxpush axmov cx,10 ;循环10次l8:mov dx,0f002h ;8255C端口控制步进电机的运转mov al,08h ;依次给步进电机D-C-B-A高电平,调用延时子程序delay2out dx,alcall delay2mov al,04hout dx,alcall delay2 mov al,02hout dx,alcall delay2mov al,01hout dx,alcall delay2loop l8pop ax ;将ax.dx.cx.bx取出堆栈pop dxpop cxpop bxret ;返回主程序endp bujin2 ;步进电机2子程序结束delaytime proc ;定义液晶屏显示延时子程序mov cx, 0loop $retdelaytime endp ;子程序结束disline1 proc ;液晶屏第一行显示字样子程序lea si,line1_1mov al,2mov ah,32call worddisllea si,line1_2mov al,2mov ah,48call worddisllea si,line1_3mov al,2mov ah,0call worddisrlea si,line1_4mov al,2mov ah,16call worddisrretdisline1 endp ;子程序结束disline2 proc ;液晶屏显示第二行字样子程序lea si,line2_1mov al,4mov ah,32call worddisllea si,line2_2mov al,4mov ah,48call worddisllea si,line2_3mov al,4mov ah,0call worddisrlea si,line2_4mov al,4mov ah,16call worddisrretdisline2 endp ;子程序结束disline3 proc ;液晶屏显示第三行字样子程序lea si,line3_1 mov al, 6mov ah, 32call worddisllea si,line3_2mov al,6mov ah,48call worddisllea si,line3_3mov al,6mov ah,0call worddisrlea si,line3_4mov al,6mov ah,16call worddisrlea si,line3_5mov al,6mov ah,32call worddisrretdisline3 endp ;子程序结束lcd_init proc ;液晶初始化mov al,3eh ;初始化左半屏,关显示 call wrcoml ;写指令子程序 mov al,firstline ;设置起始显示行,第0行 call wrcoml mov al,3eh ;初始化右半屏,关显示 call wrcomr ;写指令子程序 mov al,firstline ;设置起始显示行,第0行 call wrcomr call lcdclear ;清屏 mov al,3fh ;开显示 call wrcoml mov al,3fh ;开显示call wrcomr ret lcd_init endplcdclear proc ;清屏,清左半屏mov al,0 ;起始行,第0行 mov ah,0 ;起始列,第0列 lcdclearl1: push ax mov cx,64call setxyl ;设置起始显示行列地址 lcdclearl2: mov al,0 call wrdatal loop lcdclearl2 pop ax inc ax cmp al,8 ;共8行 jnz lcdclearl1 ;清右半屏 mov al,0 ;起始行,第0行 mov ah,0 ;起始列,第0列 lcdclearr1: push ax mov cx,64 call setxyr ;设置起始显示行列地址 lcdclearr2: xor al,al call wrdatar loop lcdclearr2 pop ax inc al cmp al,8 ;共8行 jnz lcdclearr1 ret lcdclear endpworddisl proc mov cx,16 ;显示16字节数据,用于显示一个汉字 call displ ret worddisl endp displ proc push ax push cx call setxyl ;设置起始显示行列地址 call displayl ;显示上半行数据 pop cx pop ax inc al call setxyl ;设置起始显示行列地址 call displayl ;显示下半行数据 ret displ endp worddisr proc mov cx,16 ;显示16字节数据,用于显示一个汉字 call dispr ret worddisr endp dispr proc push ax push cx call setxyr ;设置起始显示行列地址 call displayr ;显示上半行数据 pop cxpop ax inc al call setxyr ;设置起始显示行列地址 call displayr ;显示下半行数据 ret dispr endp ;显示图形 linedisl proc ;显示左半屏一行图形,AL-X起始行序数(0-7),AH-Y起始列地址序数(0-63)mov cx,64 call setxyl ;设置起始显示行列 call displayl ;显示数据 ret linedisl endplinedisr proc ;显示右半屏一行图形,AL-X起始行地址序数(0-7),AH-Y起始列地址序数(0-63)mov cx,64 call setxyr ;设置起始显示行列 call displayr ;显示数据 ret linedisr endp displayl proc ;显示左半屏数据,R7-显示数据个数lodsb call wrdatal ;写左半屏数据loop displayl ret displayl endpdisplayr proc ;显示右半屏数据,R7-显示数据个数lodsb call wrdatar ;写左半屏数据 loop displayr ret displayr endp setxyl proc ;设置左半屏起始显示行列地址,AL-X起始行序数(0-7),AH-Y起始列序数(0-63)or al,x ;行地址=行序数+行基址call wrcoml mov al,ah or al,y ;列地址=列序数+列基址 call wrcoml ret setxyl endp ;设置右半屏起始显示行列地址,AL-X起始行序数(0-7),AH-Y起始列序数(0-63) setxyr proc or al,x ;行地址=行序数+行基址call wrcomr mov al,ah or al,y ;列地址=列序数+列基址 call wrcomr ret setxyr endp ;写左半屏控制指令,A-写入指令wrcoml proc mov dx,wr_com_ad_l out dx,al wrcoml1: mov dx,rd_busy_ad in al,dx test al,80h ;检查液晶显示是否处于忙状态 jnz wrcoml1 ret wrcoml endp ;写右半屏控制指令,A-写入指令 wrcomr proc mov dx,wr_com_ad_r out dx,al wrcomr1: mov dx,rd_busy_ad in al,dx test al,80h ;检查液晶显示是否处于忙状态 jnz wrcomr1 ret wrcomr endp ;写左半屏数据,A-写入数据 wrdatal proc mov dx,wr_data_ad_l out dx,al wrdatal1: mov dx,rd_busy_ad in al,dx test al,80h ;检查液晶显示是否处于忙状态 jnz wrdatal1 ret wrdatal endp ;写右半屏数据,A-写入数据 wrdatar proc mov dx,wr_data_ad_r out dx,al wrdatar1: mov dx,rd_busy_ad in al,dx test al,80h ;检查液晶显示是否处于忙状态 jnz wrdatar1 ret wrdatar endp end start3.2程序流程图4.模拟的实验结果4.1程序调试的情况 根据预定的步骤和要实现功能编写了所需的程序,连接好线路进入调试状态,在运行过程中出现了几个问题,一是步进电机的转速比较慢,通过调节延时程序的循环次数,最后使电机的转数适中,方便观察和节约程序的运行时间;二是数码管显示的数字与要求的不符合,首先判断是否是接线的问题,经过检查排除接线错误,然后检查程序,发现取得的数码管的段码有误,经过改正最终显示正确的结果。三是程序运行到某处时无法往下进行,原因是未对寄存器的值进行保护,导致数值混乱。4.2程序运行的结果的分析 经过对程序的调试,运行之后得到了预期的结果。检测到空瓶到位启动灌装,电机正转模拟该过程,液晶屏相应显示“灌装开始”和“灌装结束”。对灌装后的质量进行检测,当遇到不合格品时LED灯的闪烁三次,之后步进电机反转,表示送到另一条线上处理,依次检测20个质量,一共出现不合格品为6个,所以红灯和电机分别动作了6次。最后数码管最低一位显示数字6,液晶屏也显示相应的字样。5.项目的结论5.1结论描述及分析 通过对该工程实际问题的分析,编写程序模拟运行之后,大致符合了工程上的要求,主要的工步有空瓶到位检测、灌装、质量检测、不合格处理、记录不合格数。通过正确接线和设计程序得到了预期的实验现象,运行结果的准确依赖于程序的准确性。这些动作和要求都通过程序的运行得到了较为理想的结果。实现了瓶装饮品生产的计算机控制。5.2程序设计改进 虽然通过程序实现了既定的功能和要求,但是与工程实际应用还有一定的偏差。例如在实际生产中如果发生故障应该停止生产线的工作。在本次项目的设计中给定了20个瓶装饮品的质量,没有外界输入这个环节,所以还有改进的空间。数码管显示的数字也是个位数,要显示更多的位数还应修改程序。步进电机的运转时间没有严格的控制,与实际情况不符,可以调整延时程序使得运行时间更为准确。由于实验设备有限,有些动作的模拟效果不是很好。6.感言这次三级项目经过6次课的调试和接线顺利的完成了预期设定的要求和目标,在这个过程中我学到了许多东西。前几次上机调试,面对给定的题目有点没有头绪,经过认真的分析和与同组同学之间的探讨,确定了需要实现的功能