当前位置:文档之家› 单片机实验报告六(何俊儒)

单片机实验报告六(何俊儒)

一、实验目的和要求:
1、掌握单片机与可编程并行接口芯片8255的接口设计方法。

2、掌握Proteus软件与Keil软件的使用方法。

3、熟悉可编程并行接口芯片8255初始化程序的设计方法。

二、设计要求:
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与8255接口。

2、在8255PA口或PB口的某一口线上产生周期为500μS的连续方波,接示波器观察波形。

3、在8255PC口的PC0-PC3上接4个按键作输入,PC4-PC7上接4个发光二极管作输出,编程实现发光二极管正确指示按键的状态。

三、电路原理图:
四、实验程序流程框图和程序清单:
程序流程图:
开始
初始化延时等待8255复位定时器0中断
返回
送控制字读C口低字节写C口高字节
半字节交换保护现场取反C 将C状态写入PA0
汇编程序: ORG 0000H START: LJMP MAIN ORG 000BH LJMP TTC0
MAIN: MOV SP, #7FH MOV TMOD, #02H MOV TH0, #06H
MOV TL0, #06H
LCALL DELAY SETB
EA
SETB ET0
SETB TR0
MOV DPTR, #0300H ;指向控制寄存器
MOV A, #81H ;PA方式0输出,PB方式0输出,PC高输出,PC低输入
MOVX @DPTR, A
MOV DPTR, #0200H ;指向C口
LOOP: MOVX A, @DPTR ;读C口
SWAP A
MOVX @DPTR, A ;写C口
LJMP LOOP
DELAY: MOV R7, #0A7H
DL1: MOV R6, #0ABH
DL0: MOV R5, #10H
DJNZ R5, $
DJNZ R6, DL0
DJNZ R7, DL1
NOP
RET
ORG 0050H
TTC0: PUSH DPH
PUSH DPL
PUSH ACC
CPL C
MOV ACC.0, C
MOV DPTR, #0000H ;指向A口
MOVX @DPTR, A ;写A口
POP ACC
POP DPL
POP DPH
RETI
END
C语言程序:
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define COM8255 XBYTE [0x0300]
#define PA8255 XBYTE [0x0000]
void main()
{ uchar j;
TMOD=0x02;
TH0=0x06;
TL0=0x06;
COM8255=0x80;
TR0=1;
while(1)
{ do
{
}
while(!TF0);
TF0=0;
PA8255=j;
j=!j;
}
}
end;
#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char #define uint unsigned int #define COM8255 XBYTE [0x0300]
#define PC8255 XBYTE [0x0200] void main()
{ uchar j;
COM8255=0x81;
while(1)
{
j=PC8255;
j=j<<4;
PC8255=j;
}
}
end;
五、实验结果:
PA.0口线上产生周期500us的连续方波,其中高低电平均为25ms,有1um误差。

当按下S1时,D1亮;当按下S2时,D2亮;当按下S3时,D3亮;当按下S4时,D4亮,互不影响。

六、实验总结:
通过本次实验我掌握了8255上电复位时间较单片机长,需要进行等待。

掌握了单片机与可编程并行接口芯片8255的接口设计方法,学会了可编程并行接
口芯片8255初始化程序的设计方法,对C口位置位/复位命令有了初步了解。

掌握了keil软件模拟外部中断的调试方法,掌握了protuse与keil软件的联调,熟练了单片机系统的硬件和软件设计方法。

七、思考题:
1、在8255PC口上外接8个发光二极管,利用8255PC口的置位/复位控制字控制其按某种规律变化。

电路图:
程序流程图:
开始初始化延时等待8255复位送控制字送表格内容到C口
延时1S
送完
N
Y 修改表格地址
结束
定义16进
制数表格
汇编程序:
ORG 0000H
START: LJMP MAIN
MAIN: MOV SP, #7FH
LCALL DELAY
MOV DPTR, #0300H ;指向控制寄存器
MOV A, #80H ;PA方式0输出,PB方式0输出,PC高输出,PC低输出
MOVX @DPTR, A
MOV DPTR, #0200H ;灭灯
CLR A
MOVX @DPTR, A
LOOP: MOV DPTR, #TABLE ;指向表首地址MOV A, R0
MOVC A, @A+DPTR
RL A
SETB ACC.0
MOV DPTR, #0300H ;指向控制口
MOVX @DPTR, A
INC R0
LCALL DELAY
CJNE R0, #0FH, LOOP
MOV R0, #00H
LJMP LOOP
DELAY: MOV R7, #0A7H
DL1: MOV R6, #0ABH
DL0: MOV R5, #10H
DJNZ R5, $
DJNZ R6, DL0
DJNZ R7, DL1
NOP
RET
ORG 0050H
TABLE: DB 00H,01H,02H,03H,04H,05H,06H,07H ;十六进制表格DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
END
C语言程序:
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define COM8255 XBYTE [0x0003]
#define PC8255 XBYTE [0x0002]
void delay1s();
void main()
{ uchar n=8;
uchar h=0x01;
COM8255=0x80;
while(1)
{
PC8255=h;
delay1s();
h=_crol_(h,1);
}
}
void delay1s(void)
{
.....
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_();
}
end;
实验结果:
用C口位置位/复位命令实现依次循环点亮,每个灯亮一秒。

word格式.整理版。

相关主题