《微机原理与接口技术》课程设计实验报告交通灯控制功能设计_第1页
《微机原理与接口技术》课程设计实验报告交通灯控制功能设计_第2页
《微机原理与接口技术》课程设计实验报告交通灯控制功能设计_第3页
《微机原理与接口技术》课程设计实验报告交通灯控制功能设计_第4页
《微机原理与接口技术》课程设计实验报告交通灯控制功能设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理与接口技术课程设计实验报告题目:交通灯控制功能设计指导老师: 专业:信息科学与工程学院班级:自动化0807班 日期:2011-1-5目录一、设计思想和实施方案论述,硬件原理图及分析 1.1、课程设计名称 1.2、课程设计要求1.3、课程设计目的二、设计思想和实施方案论述,硬件原理图及分析 2.1、设计思想和实施方案2.2、硬件原理图三、典型模块以及典型编程技巧分析 3.1、8086典型模块分析3.2、编程技巧分析四、设计中遇到的问题及解决方法五、程序清单和程序注释,相关流程图 5.1程序清单和注释5.2、实验室及流程图六、收获与体会七、参考文献一、 设计课程名称及要求1.1、课程设计名

2、称:交通灯控制功能设计。1.2、课程设计要求:(1)、分别用c语言和汇编语言编程完成硬件接口功能设计;(2)、硬件电路基于80x86微机接口;(3)、程序功能要求:小键盘给定、数码管(屏幕)显示;(4)、同时具备急救车应急响应功能和时间倒计时显示功能。 1.3、课程设计目的:微机应用系统设计与综合实验(实践)课程设计是自动化专业本科生必修的一门技术基础课。通过本课程设计,让学生对微机系统有一个较全面的理解,对典型数字接口电路的应用技术有一个较深入的掌握,并对应用系统进行硬件原理和软件编程进行分析、设计和调试,达到基本掌握简单微型计算机应用系统软硬件的设计方法,提高项目开发能力的目的。要求同学独

3、立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路印制板图, 编写设计程序及程序流程图。二、设计思想和实施方案论述,硬件原理图及分析2.1、设计思想和实施方案: 本设计使用了两种方案,一种是采用8086和8255a可编程并行接口实现了交通灯的设计,分别对主干道和支干道显示红灯和绿灯并且计时,采用8254定时器/计数器产生1hz的脉冲,来控制8259产生中断,从而实现整个电路的设计。交通灯采用红绿两种发光二极管,主干道亮45s,支干道亮30s,计数的最后5s中绿灯闪烁,用数码管倒计时显示时间,在发生紧急情况时,可以认为用开关控制主干道和支干道红灯均亮,禁止任何车通行。另一种方

4、案是采用单片机来实现的,达到的效果和上述方案相同。单片机采用定时器t0和t1来触发中断,根据中断优先级的不同,从而可以处理不同的情况,交通灯也是采用红绿两种发光二极管,主干道亮45s,支干道亮30s,计数的最后5s中绿灯闪烁,用数码管倒计时显示时间,在发生紧急情况时,可以认为用开关控制主干道和支干道红灯均亮,禁止任何车通行,在故障清除后,断开开关可以使红绿灯和数码管回到原来的状态继续正常工作。2.2、硬件原理图:(a)图是基于8086的设计,(b)图是基于单片机的设计。在(a)图中,可编程并行接口芯片8255a用作输出口,控制红绿灯的亮暗和数码管的计时,定时器/计数器8254采用级联的方式产生

5、1hz的脉冲,并将此方波接到中断器8259的ir1上,即每秒钟让中断控制器产生依次中断,从而可以执行中断子程序。在(b)图中,p0口用于接数码管,p1口用于控制红绿灯的亮暗,p2口用于选通数码管,p32为定时器t0的控制端,当p32口为高电平时,定时器t0才会工作,并且t0的中断优先级高于t1,所以可以用于控制紧急情况。p37口接扬声器,在计数器t0工作时扬声器就会响。三、典型模块以及典型编程技巧分析3.1、8086典型模块分析:基于8086的设计主要由3个模块构成,其中8255是作为与外部显示电路的接口单元,8254和8259协同工作产生中断作为控制电路。可编程并行接口芯片8255a通过方式

6、控制字设置成方式0工作模式,a、b、c口均为输出,可编程计数器/定时器8254通过控制字寄存器设置ou0和ou1均为方式3工作模式,通过级联产生1hz的方波,中断控制器通过初始化命令字设置成边缘触发,8254的ou1口接到8259的ir1端,每秒钟就可以产生一次中断,每次执行中断子程序时使计数减1,从而可以实现倒计时功能,当计数到0时,重新给计数初值赋给,改变灯的状态。外部开关接8259的ir0端,它的中断优先级别高,设置成边缘触发,当按下开关,产生一个高电平的脉冲,就可以停止原来的状态来执行更高级别的中断子程序,这就可以处理紧急情况,让主干道和支干道都变成红灯。单片机典型模块分析:基于单片机

7、的设计主要是以51单片机为核心,通过变成开放t0和t1的中断,但t0要在int0为高电平时计数器t0才会工作。计数器t1每50ms产生一次中断,每产生20次中断就令数码管的计数减1,当计数减到0时,重新设置数码管的计数初值,这样就可以依次循环工作了。当p32接高电平时,计数器t0开始工作,此时红灯都亮,扬声器发音,中断结束后还原原来的状态。3.2、编程技巧分析:基于8086的设计编程语言是汇编语言,这里的几个编程模块就是方波产生模块,数码管显示模块和中断子程序模块。方波是通过8254级联产生的,设置8254的计时器0和计数器1工作在方式3,设置适当计数初值n即可,这个模块的程序如下所示:loo

8、p2: mov dx,my8254_mode mov al,0 out dx,al ;计数器0,读写16位低高字节,工作方式3,bcd计数 mov al,00h mov dx,my8254_0 out dx,al mov al,50 out dx,al mov dx,my8254_mode mov al,77h out dx,al ;计数器1,读写16位低高字节,工作方式3,bcd计数 mov al,8 mov dx,my8254_1 out dx,al mov al,2 out dx,al ;1.041667mhz/2000/1000=1hz,即计数器输出1hz的方波数码管的显示是通过调用显

9、示函数实现的,通过设置8255的工作模式,选择数码管的高位工作,然后将计数的高位送到数码管,再选择数码管的低位工作,然后将计数的低位送到数码管,在1s钟内多次扫描就可以消除闪烁,从而达到理想的计数效果,它的程序如下所示:disp proc nearc1:mov dx,my8255_cmov al,0feh;选通高位数码管out dx,alsub ah,ahmov al,countmov bl,0ahdiv bl;商寄存在al中,余数在ah中mov bx,offset tabxlat;通过查表找到对应的7段显示字符mov dx,my8255_bout dx,alcall delay1msmov

10、al,0out dx,almov al,0fdh;选通低位数码管mov dx,my8255_cout dx,almov al,ahmov bx,offset tabxlat;通过查表找到对应的7段显示字符mov dx,my8255_bout dx,alcall delay1msmov al,0 out dx,almov ah,1int 16h;有键按下则跳出jnz quitdisp endp中断子程序模块是通过扩充中断源实现的,主要是通过设置8259的工作模式,开放tr1和tr0的中断,按上开关k后,tr0就发生中断,在tr0中断没有触发的情况下,从ou1口输出一个上升沿脉冲,tr1就中断一次

11、,程序如下所示:query: mov dx,my8259_ocw3 ;向8259的ocw3发送查询命令 mov al,0ch out dx,al in al,dx ;读出查询字 test al,80h ;判断中断是否已响应 jz query ;没有响应则继续查询 and al,03h cmp al,00h je ir0isr ;若为ir0请求,跳到ir0处理程序 jne ir1isr ;若为ir1请求,跳到ir1处理程序 jmp eoi基于单片机的编程语言是c语言,它主要有数码管显示程序和中断服务子程序。数码管的显示和上面汇编语言的原理一样,它的程序如下:void display(unsign

12、ed char t)/显示数码管函数 p2=0xf5;选通两个高位数码管 p0=tabt/10;取t的十位送到p0口显示 delay(); p2=0xf0;开通所有的数码管,避免闪烁 p2=0xfa;选通低位两个数码管 p0=tabt%10;取t的个位送到p0口显示 delay(); p2=0xf0;中断服务子程序有计数器t0和计数器t1的子程序。t1的优先级低,它主要用于控制正常工作状态的红绿灯和数码管计数,而t0的优先级高,可以处理紧急情况,并且在处理紧急情况以后能返回原正常运行状态,这在汇编里面用的是栈保护,而在c语言中可以设置一个变量也存储原来的数据,可以达到同样保护数据的效果,这一点

13、的实现代码如下:void time0(void) interrupt 1 using 0 t=0;count1=count;/寄存中断前count的值,以便中断结束后恢复 while(t!=125) t+; sound=sound; p10=0;/紧急情况绿灯全熄 p12=0; p11=1;/紧急情况红灯全亮 p13=1; p2=0xf0;/点亮两个数码管 count=88; display(count); th0=(65535-921)/256; tl0=(65535-921)%256; count=count1;/恢复原来count的值 if(a%2=0) p10=1; p11=0; p1

14、2=0; p13=1;/返回主干道通行 else p10=0; p11=1; p12=1; p13=0;/返回主干道通行 四、设计中遇到的问题及解决方法 1.数码管的计数每秒钟减1,当时不熟练8254的应用,就想用软件延时来实现这个功能,最后查资料的时候知道了计时器的级联应用,很容易的就解决了这个问题。 2.对于数码管的显示,最开始感觉很模糊,查阅资料的时候找到了xlat表转换指令的应用,首先定义十进制的七段显示码,将表格首地址送入bx,数字的七段码在表格中的偏移量送入,然后执行xlat就可以实现这个功能了。 3.对于要求中的紧急响应功能,开始时只想利用8254来实现,结果失败了,所以我就想到

15、了用两级中断,产生高级中断时就开启紧急响应功能,触发蜂鸣器,点亮红灯。 4.在执行中断程序的过程中,寄存器中的变量好多都改变了,开始时束手无策,最后查资料时想到了栈的运用,利用入栈和出栈来保护寄存器中的初值。 5.在用c语言编程时,用protues软件进行仿真时,数码管显示错误,一会显示一会停止,闪烁感太明显了。想想后,我就把显示函数从中断子程序中改放到主函数中,放在while(1)无限循环语句中,最后很好的解决了这个问题。查阅资料后才明白,执行中断子程序是很快的事,执行完了后就会返回到主函数中继续执行,所以显示函数放在中断子程序中只有在产生中断的时候才会工作,所以数码管很多时候就处于熄灭的状

16、态,而显示函数放在主函数中就放好解决了这个问题。 6.要做到可以人为设置通行时间,在单片机中,我不熟练键盘扫描,所以就想到了另外一个办法,给p1的高四位赋不同的初值,这样可以得到16种组合,故可以设置16中初值,为了简化程序,我只设置了4种初值,不过同样可以达到设置初值的效果。 7.用单片机产生两级中断的时候,我不知道该选定时器中断还是外部中断,查资料后知道定时器0和定时器1的中断优先级不一样,定时器t0的优先级高,所以可以让定时器t1控制正常工作状态的灯显示和数码管计数,而定时器t0则控制突发情况。 五、程序清单和程序注释,相关流程图 5.1程序清单和注释: 基于8086汇编语言的程序清单及

17、注释如下所示: my8255_a equ ioy0+00h*4 ; 8255a口的地址 my8255_b equ ioy0+01h*4 ; 8255b口的地址 my8255_c equ ioy0+02h*4 ; 8255c口的地址 my8255_mode equ ioy0+03h*4 ; 8255控制寄存器的地址 my8254_0 equ ioy1+00h*4 ; 8254计数器0端口的地址 my8254_1 equ ioy1+01h*4 ; 8254计数器0端口的地址 my8254_mode equ ioy1+02h*4 ; 8254计数器0端口的地址;*根据check配置信息修改下列符号值

18、* intr_ivadd equ 01cch ;intr对应的中断矢量地址 intr_ocw1 equ 0a1h ;intr对应pc机内部8259的ocw1地址 intr_ocw2 equ 0a0h ;intr对应pc机内部8259的ocw2地址 intr_im equ 0f7h ;intr对应的中断屏蔽字 pci_intcsr equ 9438h ;pci卡中断控制寄存器地址 ioy0 equ 0c400h ;片选ioy0对应的端口始地址 ioy1 equ 0c440h ;片选ioy0对应的端口始地址 ioy2 equ 0c480h ;片选ioy0对应的端口始地址;* my8259_icw1

19、 equ ioy2+00h ;实验系统中8259的icw1端口地址 my8259_icw2 equ ioy2+04h ;实验系统中8259的icw2端口地址 my8259_icw3 equ ioy2+04h ;实验系统中8259的icw3端口地址 my8259_icw4 equ ioy2+04h ;实验系统中8259的icw4端口地址 my8259_ocw1 equ ioy2+04h ;实验系统中8259的ocw1端口地址 my8259_ocw2 equ ioy2+00h ;实验系统中8259的ocw2端口地址 my8259_ocw3 equ ioy2+00h ;实验系统中8259的ocw3端

20、口地址 red equ 0fah ;紧急时刻,主支干道全部亮红灯 zhu equ 0f5h ;主干道灯的状态 zhi equ 0f9h ;支干道灯的状态 flicker equ 0f0h ;控制灯闪烁 close equ 00h ;关闭所有的灯 time1 equ 20 ;主干道通行时间 time2 equ 10 ;支干道通行时间 data segment cs_bak dw ? ip_bak dw ? im_bak dw ? tab db 40h,79h,24h,30h,19h,12h,02h,78h,00h,18h ;十进制数的七段显示码 count dw ? ;存储计数的变量 flag

21、dw ? ;flag为偶数时表明主干道通行 data ends stack1 segment stack dw 256 dup(?) stack1 ends code segment assume cs:code,ds:data,ss:stack1 start: mov ax,data mov ds,ax cli mov dx,my8255_mode mov al,80h out dx,al ;初始化8255的工作模式a、b、c工作在方式0,均为输出 loop1: mov dx,my8255_a mov cx,3 a1: mov al,red out dx,al call delay1 ;延时

22、0.5s mov al,close out dx,al call delay1 loop a1 ;初始状态主支干道红灯均闪烁,3s后进入正常工作状态 loop2: mov dx,my8254_mode mov al,0 out dx,al ;计数器0,读写16位低高字节,工作方式3,bcd计数 mov al,00h mov dx,my8254_0 out dx,al mov al,50 out dx,al mov dx,my8254_mode mov al,77h out dx,al ;计数器1,读写16位低高字节,工作方式3,bcd计数 mov al,8 mov dx,my8254_1 ou

23、t dx,al mov al,2 out dx,al ;1.041667mhz/2000/1000=1hz,即计数器输出1hz的方波 mov count,time1 mov flag,0 ;初始化主干道通行 mov cl,zhu mov al,cl mov dx,my8255_a out dx,al mov dx,pci_intcsr sub dx,19h in al,dx mov dx,pci_intcsr ;初始化pci卡中断控制寄存器 mov ax,1f00h ;向pci_intcsr中写入003f1f00h out dx,ax add dx,2 mov ax,003fh out dx,

24、ax mov ax,0000h ;替换intr的中断矢量 mov es,ax mov di,intr_ivadd mov ax,es:di mov ip_bak,ax ;保存intr原中断处理程序入口偏移地址 mov ax,offset myisr mov es:di,ax ;设置当前中断处理程序入口偏移地址 add di,2 mov ax,es:di mov cs_bak,ax ;保存intr原中断处理程序入口段地址 mov ax,seg myisr mov es:di,ax ;设置当前中断处理程序入口段地址 mov dx,intr_ocw1 ;设置中断屏蔽寄存器,打开intr的屏蔽位 in

25、 al,dx xor ax,ax mov im_bak, ax ;保存intr原中断屏蔽字 and al,intr_im out dx,al mov dx,my8259_icw1 ;初始化实验系统中8259的icw1 mov al,13h ;边沿触发、单片8259、需要icw4 out dx,al mov dx,my8259_icw2 ;初始化实验系统中8259的icw2 mov al,08h out dx,al mov dx,my8259_icw4 ;初始化实验系统中8259的icw4 mov al,01h ;非自动结束eoi out dx,al mov dx,my8259_ocw1 ;初始

26、化实验系统中8259的ocw1 mov al,0fch ;打开ir0和ir1的屏蔽位 out dx,al sti wait1: call disp ;数码管显示 mov ah,1 ;判断是否有按键按下 int 16h jz wait1 ;无按键则跳回继续等待,有则退出 quit: cli mov dx,pci_intcsr ;恢复pci卡中断控制寄存器 mov ax,0000h out dx,ax mov ax,0000h ;恢复intr原中断矢量 mov es,ax mov di,intr_ivadd mov ax,ip_bak ;恢复intr原中断处理程序入口偏移地址 mov es:di,

27、ax add di,2 mov ax,cs_bak ;恢复intr原中断处理程序入口段地址 mov es:di,ax mov dx,intr_ocw1 xor ax,ax ;恢复intr原中断屏蔽寄存器的屏蔽字 mov ax,im_bak out dx,al sti mov ax,4c00h ;返回到dos int 21h myisr proc near ;中断处理程序myisr query: mov dx,my8259_ocw3 ;向8259的ocw3发送查询命令 mov al,0ch out dx,al in al,dx ;读出查询字 test al,80h ;判断中断是否已响应 jz q

28、uery ;没有响应则继续查询 and al,03h cmp al,00h je iro0 ;若为ir0请求,跳到ir0处理程序 jne iro1 ;若为ir1请求,跳到ir1处理程序 jmp eoi iro0: mov al,flag ;iro为高级中断,处理紧急情况 cbw mov bx,ax ;把count变成双字节存入ax,这样就可以存入栈中 mov al,count ;把count变成双字节存入ax,这样就可以存入栈中 cbw push ax push bx mov cx,0ffffh ;中断程序执行时间为65536*256/f=3s loop0: mov bl,0ffh loop1

29、: mov dx,my8255_a mov ax,0fah ;主干道支干道红灯均亮 mov dx,my8255_c mov al,80h ;pc7为高电平,接扬声器 out dx,al dec bl cmp bl,0 jne loop1 loop loop0 pop bx pop ax mov count,al ;还原中断前的变量值 mov flag,bl mov ah,0 mov al,flag mov bl,2 div bl ;ah=1,flag为奇数 ,支干道通行 cmp ah,1 je p3 mov dx,my8255_a mov al,zhu ;主干道通行灯的状态 out dx,al

30、 p3: mov dx,my8255_a mov al,zhi ;支干道通行灯的状态 out dx,al iret iro1: mov al,count sub al,01h das mov count,al ;计数初值自减1 cmp al,0 je l2 mov al,flag mov bl,2 div bl ;ah=1,flag为奇数 ,支干道通行 cmp ah,1 je p1 mov dx,my8255_a mov al,zhu ;主干道通行灯的状态 out dx,al p1: mov dx,my8255_a mov al,zhi ;支干道通行灯的状态 out dx,al l2: mov

31、 al,flag add al,01h ;状态显示数加1 daa mov ah,0 mov bl,2 div bl ;ah=1,flag为奇数 ,支干道通行 cmp ah,1 je p2 mov count,time1 ;支干道工作完后设置主干道的通行时间time1 p2: mov count,time2 ;主干道工作完后设置支干道的通行时间time2 iret eoi: mov dx,my8259_ocw2 ;向实验系统中8259发送中断结束命令 mov al,20h out dx,al over: mov dx,pci_intcsr sub dx,19h in al,dx mov dx,p

32、ci_intcsr ;清pci卡中断控制寄存器标志位 add dx,2 mov ax,003fh out dx,ax mov dx,intr_ocw2 ;向pc机内部8259发送中断结束命令 mov al,20h out dx,al mov al,20h out 20h,al iret myisr endp disp proc mov dx,my8255_c mov al,0ah ;选通高位数码管 out dx,al mov al,count mov bl,0ah div bl ;十位存在al中,个位存在ah中 mov bx,offset tab xlat ;找到十位对应的七段显示码 mov

33、dx,my8255_b out dx,al call delay1ms mov dx,my8255_c mov al,05h out dx,al mov al,ah mov bx,offset tab xlat ;找到个位对应的七段显示码 mov dx,my8255_b out dx,al ret ;过程返回指令 disp endp delay1 proc near ;延时0.5s push ax push cx mov ax,05fffh d1: mov cx,64ffh d2: loop d2 dec ax jnz d1 pop cx pop ax ret delay1 endp dela

34、y1ms proc near ;延时1ms push cx mov cx,50h next: nop nop loop next pop cx ret delay1ms endp code ends end start 基于单片机的c语言程序清单及注释如下所示: #include unsigned char tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char time;unsigned char t;unsigned char count;/储存通行时间unsigned char main1;/主干道通行时间u

35、nsigned char cross;/支干道通行时间unsigned char count1;unsigned char a;/测试主干道工作还是支干道工作 sbit p10=p10;/控制主干道绿灯 sbit p11=p11;/主干道红灯sbit p12=p12;/控制支干道绿灯sbit p13=p13;/支干道红灯sbit p14=p14;/以下端口辅助拨码开关设置时间sbit p15=p15;sbit p16=p16;sbit p17=p17;sbit sound=p37;/发声音void delay()/延时20ms unsigned char i; for(i=0;i200;i+) ;void display(unsigned char t)/显示数码管函数 p2=0xf5; p0=tabt/10; delay(); p2=0xf0; p2=0xfa; p0=tabt%10; delay(); p2=0xf0;void main() ea=1; /开总中断 et0=1; /开定时器0的中断 et1=1; /开定时器1的中断 tmod=0x19;/计数器1工作于方式1,计数器0工作于方式1,tr0为1且int0为高电平启动工作 th0=(65535-921)/256; tl0=(65535-921)%256; /定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论