1、接口与通信目 录1.8259外部中断控制11 1.1 课程设计要求11.2 课程设计目的11.3 实验电路11.4 程序框图11.5 程序代码21.6 心得体会42.计时器的模拟实现42 2.1 课程设计要求42.2 课程设计目的42.3 电路原理图42.4 程序框图52.5 代码设计及接线分析.52.6 程序代码52.7 心得体会.103.温度采集及模拟控制.101 2 3 3.1 课程设计要求.103.2 课程设计目的.113.3 程序框图.113.4 题目分析.113.5 程序代码.123.6 心得体会.17B.1 8259外部中断控制 (参考Lab8000.pdf中的 :硬件实验35)
2、1、课程设计要求用8088/86 控制8259 可编程中断控制器,实现对外部中断的响应和处理。要求程序中对每次中断进行计数,并将计数结果用8255 的PA 口输出到LED。2、课程设计目的 (1) 8088/86 与8259 的连接方法 (2) 学习8088/86 对8259 的控制方法3、实验电路: 4、程序框图:5、代码如下:mode equ 82h ; 8255 工作方式 PA,PC输出,PB输入PA8255 equ 8000h ; 8255 PA口输出地址CTL8255 equ 8003h ; 控制口端口ICW1 equ 00010011b ; 单片8259, 边缘触发,上升沿中断,
3、单片,要写ICW4ICW2 equ 00100000b ; 中断号为20HICW4 equ 00000001b ; 工作在8086/88 方式,非特殊全嵌套,非缓冲方式OCW1 equ 11111110b ; 只响应INT0 中断CS8259A equ 09000h ; 8259偶地址CS8259B equ 09001h ; 8259奇地址data segmentCNT db 0data endscode segment assume cs:code, ds: dataIEnter proc near ; 中断子程序 push ax push dx mov dx, PA8255 inc CNT
4、 ; 计数值加1 mov al, CNT out dx, al ; 在8255的PA口输出计数值 mov dx, CS8259A mov al, 20h ; 中断服务程序结束指令 out dx, al pop dx pop ax iret ; 中断返回,恢复断点IEnter endpIInit proc ; 8259初始化子程序 mov dx, CS8259A ; 设置初始化命令ICW1,写入偶地址端口 mov al, ICW1 out dx, al mov dx, CS8259B ; 设置初始化命令ICW2,写入奇地址端口 mov al, ICW2 out dx, al mov al, IC
5、W4 ; 设置初始化命令ICW4,写入奇地址端口 out dx, al mov al, OCW1 ; 设置操作命令OCW1,写入奇地址端口 out dx, al ret ; 返回IInit endpstart proc near ; 主程序 mov dx, CTL8255 mov al, mode out dx, al ; 在8255的控制口端口写入控制方式字 cli ; 中断标志IF置0,禁止中断 mov ax, 0 mov ds, ax mov bx, 4*ICW2 ; 中断号 mov ax, code shl ax, 4 ; x 16 add ax, offset IEnter ; 中断
6、入口地址(段地址为0) mov bx, ax mov ax, 0 inc bx inc bx mov bx, ax ; 代码段地址为0 call IInit ; 调用子程序对8259进行初始化设置 mov ax, data mov ds, ax mov CNT, 0 ; 计数值初始为0 mov al, CNT mov dx, PA8255 out dx, al sti ; 中断标志IF置1,允许中断LP: ; 等待中断,并计数。 nop jmp LPstart endpcode ends end start6、心得体会:这个实验比较简单,也不是第一次做了,通过书本及实验,对8259也的原理也相
7、对了解,知道如何运用了,根据程序框图,代码很容易就明白了。做起来还是很简单的。B.2 计时器的模拟实现(参考Lab8000.pdf中的 :硬件实验18)1、课程设计要求利用电子时钟的原理,设计实现一个计时器(倒计时),时间精度是0.1秒,即每计数10次就等于1秒在最右边的数码管上显示0.1秒的计数值,在最左边的数码管上显示1秒的计数值,从9秒开始计数,到0.0秒就结束程序通过总线方式控制八段LED数码管控制计数值的显示(使用总线方式驱动LED不需要8255的参与)2、课程设计目的 (1)熟练掌握定时器8253/8254的定时计数功能 (2)熟练掌握8259A外部中断及中断服务程序的设计 (3)
8、熟练掌握总线方式驱动八段LED数码管 (4)熟练掌握汇编子程序的编写方法 (5)熟练掌握八段LED数码管的控制方式3、电路原理图4、程序框图5、代码设计及接线分析:由于题目要求该计时器的精度为0.1,而我选择接入的时钟脉冲为1MHz,它是精度为10-6,所要要将其扩大105倍,而一个计数器计数的最大次数为216=65535CS(0C000H)8259_CS-CS(0D000H)KEY/LED_CS-CS(8000H)GATE0、GATE1-VCCCLK0-1MHzOUT0-CLK1、OUT1-INT05、代码如下:CONTROL equ 0c003h ; 计数器的控制端口COUNT0 equ
9、0c000h ; 计数器0的入口地址COUNT1 equ 0c001h ; 计数器1的入口地址COUNT2 equ 0c002h ; 计数器2的入口地址OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口ICW1 equ 00010011b ; 单片8259, 上升沿中断, 要写ICW4ICW2 equ 00100000b ; 中断号为20HICW4 equ 00000001b ; 工作在8086/88 方式OCW1 equ 11111110b ; 只响应INT0 中断CS8259A equ 0d000h ; 8259地址CS8259B equ 0d
10、001hdata segmentLEDBuf db 2 dup(?) ; 显示缓冲DelayT db 1 dup(?)left db 0 ; 左边的值right db 0 ; 右边的值LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hdata endscode segment assume cs:code, ds: dataDelay proc near push ax ; 延时子程序 push cx mov al, 0 mov cx,ax lo
11、op $ pop cx pop ax retDelay endpDisplayLED proc near mov bx, offset LEDBuf mov cl, 2 ; 共2个八段管 ;cl的值由6改成2 mov ah, 00100000b ; 从左边开始显示 ;把原本的00100000改成00000010DLoop: mov dx, OUTBIT mov al, 0 out dx,al ; 关所有八段管 mov al, bx mov dx, OUTSEG out dx,al mov dx, OUTBIT mov al, ah out dx, al ; 显示一位八段管 push ax mo
12、v ah, 1 ; 用来觉得延时程序调用的次数 call Delay pop ax shr ah, 5 ; 因为要实现一个在最右端,一个在最左端,所以右移5位 inc bx dec cl jnz DLoop mov dx, OUTBIT mov al, 0 out dx,al ; 关所有八段管 retDisplayLED endpIEnter proc near push ax push dx dec right mov al, right cmp al, 0ffh ;由于是从9.0开始倒数,0自减1后变为0ffh,所以要与0ffh比较 jne Exit mov right, 9 dec le
13、ft mov al, left cmp al, 0ffh jne Exit mov left, 9Exit: mov dx, CS8259A mov al, 20h ; 中断服务程序结束指令 out dx, al pop dx pop ax iretIEnter endpIInit proc mov dx, CS8259A mov al, ICW1 out dx, al mov dx, CS8259B mov al, ICW2 out dx, al mov al, ICW4 out dx, al mov al, OCW1 out dx, al retIInit endpstart proc n
14、ear mov ax, data mov ds, ax mov left, 9 mov right, 0 cli mov ax, 0 mov ds, ax mov al, 36h; 00110110B ; 计数器0,16位,方式3,二进制 mov dx, CONTROL out dx, al mov ax, 1000 mov dx, COUNT0 out dx, al ; 计数器低字节 mov al, ah out dx, al ; 计数器高字节 mov al, 76h; 01110110B ; 计数器1,16位,方式3,二进制 mov dx, CONTROL out dx, al mov a
15、x, 100 mov dx, COUNT1 out dx, al ; 计数器低字节 mov al, ah out dx, al ; 计数器高字节 mov bx, 4*ICW2 ; 中断号 mov ax, code shl ax, 4 ; x 16 add ax, offset IEnter ; 中断入口地址(段地址为0) mov bx, ax mov ax, 0 inc bx inc bx mov bx, ax ; 代码段地址为0 call IInit mov ax, data mov ds, ax stiLP: ; 等待中断 mov al, left mov ah, 0 mov bx, of
16、fset LEDMAP add bx, ax mov al, bx or al, 80h ; 使小数点能显示出来 mov LEDBuf, al mov al, right mov ah, 0 mov bx, offset LEDMAP add bx, ax mov al, bx mov LEDBuf+1, al call DisplayLED mov al,left ;用于判断是否倒数到0,先判断左边的一位 cmp al,0 ;若左边为0,则再判断右边 jnz LP ;当两位数都为零,则关中断 mov al,right ;不必继续循环倒数 cmp al,0 jnz LP cli jmp LPs
17、tart endpcode ends end start心得体会:这个题目相对于第一个来说,难度有所提高,设计代码时主要是精度为0.1的设计会比较困难,要用到两级计数器级联;另外就是中断的判断是0ffh而不是0这里一不留神就很容易出错;接着就是设置什么时候停止倒数。解决以上问题,整份代码就基本出来了。完成得还不错。B.3温度采集及模拟控制(参考Lab8000.pdf中的 :硬件实验14、23、26)1、课程设计要求利用实验板上的ADC0809 做A/D 转换器,实验板上的电位器提供模拟温度输入,编制程序,将模拟量转换成二进制数字量,采用中断方式下,A/D 转换结束后会自动产生EOC 信号,将其
18、与CPU 的外部中断相接, 编程用中断方式读回A/D 结果。同时,通过8255A控制八段LED数码管控制计数值的显示温度注意:1) 参考电压 2) 将电位器的最大值和最小值对应的模拟量测量出来2、课程设计目的 (1)熟练掌握ADC 0809的功能 (2)熟练掌握8259A外部中断及中断服务程序的设计 (3)熟练掌握8255A方式驱动八段LED数码管 (4)熟练掌握汇编子程序的编写方法 (5)熟练掌握八段LED数码管的控制方式 3、程序框图4、题目分析 该题目主要是通过电位器产生模拟温度输出,用0809进行转换,并自动产生EOC信号,与8259相接;8259收到信号后,产生中断,通过8255的P
19、A、PB端口作为段和位,输出当前温度。主要设计:因为电位器输出不是很稳定,则采用平均采样,每次输出当前温度,先进行16次采样,求出平均值,再输出;为了使显示的温度停留时间加长,采用循环显示1次;由于每次采集温度,都需要启动0809,则在主程序中加了0809的循环启动;因为温度的取值范围为:028-1,则,设置显示结果的时候用3个数码管显示,还要对没一位值对应输出等。5、代码如下:MD8255 equ 080h ; 方式0,PA,PC输出,PB输入PA8255 equ 8000h ; Port APB8255 equ 8001h ; Port BCTL8255 equ 8003h ; 8255控
20、制端口AS0809 equ 0c000h ; AD采样输入片选ICW1 equ 00010011b ; 单片8259, 上升沿中断, 要写ICW4ICW2 equ 00100000b ; 中断号为20HICW4 equ 00000001b ; 工作在8086/88 方式OCW1 equ 11111110b ; 只响应INT0 中断CS8259A equ 0d000h ; 8259地址CS8259B equ 0d001hLowTemp equ 0 ; A/D 0HighTemp equ 255 ; A/D 255data segmentLEDBuf db 3 dup(?) ; 显示缓冲Delay
21、T db 1 dup(?)CurTemp db 1 dup(?) ; 当前的温度LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hdata endscode segment assume cs:code, ds: dataDelay proc near push ax ; 延时子程序 push cx mov al, 0 mov cx,ax loop $ pop cx pop ax retDelay endpDisplayLED proc near
22、 ; 数码管显示子程序 mov bx, offset LEDBuf mov cl, 3 ; 共6个八段管 mov ah, 00000100b ; 从左边开始显示DLoop: mov dx, PB8255 ;位 mov al, 0 out dx,al ; 关所有八段管 mov al, bx mov dx, PA8255 ;段 out dx,al mov dx, PB8255 mov al, ah out dx, al ; 显示一位八段管 push ax mov ah, 1 call Delay pop ax shr ah, 1 inc bx dec cl jnz DLoop mov dx, PB
23、8255 mov al, 0 out dx,al ; 关所有八段管 retDisplayLED endpDisplayResult proc near ; 结果显示子程序 mov al, CurTemp mov ah, 0 mov cl, 100 ; 先除以100,商存al,为百位的值 div cl mov ch, ah ;余数放ch保存起来 mov ah, 0 mov bx, offset LEDMAP add bx, ax mov al, bx mov LEDBuf, al ; 显示百位值 mov al,ch ; 把余数取出来放al再除以10 mov ah,0 mov cl,10 div
24、cl mov ch,ah mov ah,0 mov bx, offset LEDMAP add bx, ax mov al, bx mov LEDBuf+1, al ; 输出十位值 mov bx, offset LEDMAP mov al, ch mov ah, 0 add bx, ax mov al, bx mov LEDBuf+2, al ; 输出个位值 retDisplayResult endpIInit proc ; 8259初始化子程序 mov dx, CS8259A mov al, ICW1 out dx, al mov dx, CS8259B mov al, ICW2 out d
25、x, al mov al, ICW4 out dx, al mov al, OCW1 out dx, al retIInit endpIEnter proc near push ax push dx call ReadTEMP ; 调用ReadTemp得到平均温度 mov dx, PB8255 mov al, CurTemp out dx, al ; 输出当前温度值 call DisplayResult ; 显示结果 mov DelayT,1DispAgain1: ; 显示 call DisplayLED dec DelayT jnz DispAgain1 mov dx, CS8259A mo
26、v al, 20h ; 中断服务程序结束指令 out dx, al pop dx pop ax iretIEnter endpReadAD proc near mov dx, AS0809 mov al, 0 out dx, al mov al, 60rr: dec al ; delay 延时 jnz rr mov dx, AS0809 in al, dx ;读出AD采样的二进制数据 retReadAD endpReadTemp proc near ;求平均温度子程序 mov bx, 0 mov cl, 16 ;设置采样的次数RLoop: call ReadAD ;调用ReadAD子程序 mo
27、v ah, 0 add bx, ax ;把采样的16次数据全部加起来 dec cl jnz RLoop shr bx, 4 ;除以16求平均值 mov ax, bx ;ax存放的是AD的平均采样数据 mov cl, HighTemp - LowTemp mul cl mov al, ah ; /256 add al, LowTemp mov CurTemp, al ;得到当前温度 retReadTemp endpstart proc near mov ax, data mov ds, ax mov CurTemp, 0 cli mov ax, 0 mov ds, ax mov al, MD82
28、55 ; 写8255控制字 mov dx, CTL8255 out dx, al mov bx, 4*ICW2 ; 中断号 mov ax, code shl ax, 4 ; x 16 add ax, offset IEnter ; 中断入口地址(段地址为0) mov bx, ax mov ax, 0 inc bx inc bx mov bx, ax ; 代码段地址为0 call IInit mov ax, data mov ds, ax mov dx, PA8255 out dx, al stiagain: ; 等待中断 mov al, 0 mov dx, AS0809 out dx, al ; 起动 A/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1