微机原理实验参考程序Word下载.docx
- 文档编号:19364304
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:53
- 大小:41.30KB
微机原理实验参考程序Word下载.docx
《微机原理实验参考程序Word下载.docx》由会员分享,可在线阅读,更多相关《微机原理实验参考程序Word下载.docx(53页珍藏版)》请在冰豆网上搜索。
incr0
Goon1:
incr1
cjner3,#0ffh,Goon2
incr2
Goon2:
incr3
djnzr7,Loop
T1b.c
xdataunsignedcharBuffer1[256]_at_0x3000;
xdataunsignedcharBuffer2[256]_at_0x4000;
unsignedcharxdata*ptr1;
unsignedcharxdata*ptr2;
ptr1=&
Buffer1;
ptr2=&
Buffer2;
for(index=0;
index++){
*ptr2++=*ptr1++;
T2.ASM8255输入输出实验
modeequ082h;
方式0,PA,PC输出,PB输入1000,0010
PortAequ8000h;
PortA
PortBequ8001h;
PortB
PortCequ8002h;
PortC
CAddrequ8003h;
控制字地址
org0h
mova,#mode
movdptr,#CAddr
movx@dptr,a;
输出控制字
;
实验1:
PA口作输出,驱动LED,实现单个LED循环点亮。
EX_A:
mova,#80H;
最左灯先亮
movdptr,#PortA
movb,#8H;
右移位数
OutA:
输出PortA,使相应灯亮
rra;
亮灯右移位
movr5,#1;
延时时间与r5成正比
calldelay;
延时
djnzb,OutA
实验2:
PB口作输入,读入开关量,所得的数据由PA口输出,驱动LED
EX_B:
movdptr,#PortB
movxa,@dptr;
读入开关量
movdptr,#PortA;
开关量输出到PortA驱动LED
movx@dptr,a
movr5,#2;
calldelay;
延时延时
ljmp0
延时子程序
delay:
movr7,#0
movr6,#0
ddd:
djnzr7,ddd
djnzr6,ddd
djnzr5,ddd
ret
end
T2.c8255输入输出实验
#definemode0x82//方式0,PA,PC输出,PB输入
xdataunsignedcharPortA_at_0x8000;
//PortA
xdataunsignedcharPortB_at_0x8001;
//PortB
xdataunsignedcharPortC_at_0x8002;
//PortC
xdataunsignedcharCAddr_at_0x8003;
//控制字地址
voiddelay(unsignedcharCNT)
unsignedinti;
while(CNT--!
=0)
for(i=20000;
i!
=0;
i--);
registerunsignedchari,dd;
CAddr=mode;
//方式0,PA,PC输出,PB输入
while
(1){
dd=0x80;
for(i=0;
i<
8;
i++)
{
PortA=dd;
//输出到PA
dd>
>
=1;
//移位
delay
(1);
//延时
};
dd=PortB;
//PB输入
//再输出到PA
delay
(2);
T3.ASM外部中断实验
用单次脉冲申请中断,在中断处理程序中对输出信号进行反转
LEDequP1.0
LEDBufequ0;
可寻址位00h作显示缓冲区
ljmpStart
org3;
外部中断0服务程序入口地址
Interrupt0:
pushPSW;
保护现场
cplLEDBuf;
取反LED
movc,LEDBuf
movLED,c
popPSW;
恢复现场
reti
Start:
clrLEDBuf;
主程序
clrLED
movTCON,#01h;
外部中断0下降沿触发
movIE,#81h;
打开外部中断允许位(EX0)及总中断允许位(EA)
ljmp$;
等待中断
T3.c外部中断实验
#include<
reg51.h>
sbitLED=P1^0;
bitLEDBuf;
voidExtInt0()interrupt0
LEDBuf=!
LEDBuf;
LED=LEDBuf;
LEDBuf=0;
LED=0;
TCON=0x01;
//外部中断0下降沿触发
IE=0x81;
//打开外部中断允许位(EX0)及总中断允许位(EA)
while
(1);
T4.ASM计数器/定时器实验
用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转
Tickequ10000;
10000×
100us=1s
T100usequ256-50;
100us时间常数(6M)
C100usequ30h;
100us记数单元,初值=10000,高位低地址
LEDBufequ0;
LEDequP1.0
中断服务程序
org000bh;
中断入口
T0Int:
pushPSW
mova,C100us+1;
10000的低8位不为0时,继续-1
jnzGoon
decC100us;
10000的低8位为0时,10000的高8位-1
Goon:
decC100us+1
mova,C100us
orla,C100us+1
jnzExit;
100us记数器不为0,返回
movC100us,#high(Tick);
1秒定时到,重置记数器,取反LED
movC100us+1,#low(Tick)
cplLEDBuf
Exit:
popPSW
movTMOD,#02h;
方式2,定时器
movTH0,#t100us
movTL0,#t100us
movIE,#10000010b;
EA=1,IT0=1
setbTR0;
开始定时
clrLEDBuf
100us记数单元初值=10000的高8位
movC100us+1,#low(Tick);
100us记数单元初值=10000的低8位
movc,LEDBuf;
显示输出
ljmpLoop
T4.c计数器/定时器实验
#defineTick10000//10000x100us=1s
#defineT100us(256-50)//100us时间常数(6M)
unsignedintC100us;
//100us记数单元
voidT0Int()interrupt1
C100us--;
if(C100us==0){
C100us=Tick;
//100us记数器为0,重置记数器
//取反LED
voidmain()
TMOD=0x02;
//方式2,定时器
TH0=T100us;
TL0=T100us;
IE=0x82;
//EA=1,IT0=1
TR0=1;
//开始定时
while
(1){
}
T5a.ASM
利用实验仪提供的显示电路,动态显示一行数据
OUTBITequ08002h;
位控制口
OUTSEGequ08004h;
段控制口
INequ08001h;
键盘读入口
LEDBufequ60h;
显示缓冲
Numequ70h;
显示的数据
DelayTequ75h;
LEDMAP:
;
八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
Delay:
延时子程序
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
DisplayLED:
;
显示子程序
movr0,#LEDBuf
movr1,#6;
共6个八段管
movr2,#00100000b;
从左边开始显示
movdptr,#OUTBIT
mova,#0
movx@dptr,a;
关所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
mova,r2
显示一位八段管
movr6,#01
callDelay
mova,r2;
显示下一位
rra
movr2,a
djnzr1,Loop
;
movsp,#40h
movNum,#0
MLoop:
incNum
mova,Num
movb,a
FillBuf:
mova,b
anla,#0fh
movdptr,#LEDMap
movca,@a+dptr;
数字转换成显示码
mov@r0,a;
显示在码填入显示缓冲
incb
cjner0,#LEDBuf+6,FillBuf
movDelayT,#30
DispAgain:
callDisplayLED;
显示
djnzDelayT,DispAgain
ljmpMLoop
T5a.c
#defineLEDLen6
xdataunsignedcharOUTBIT_at_0x8002;
//位控制口
xdataunsignedcharOUTSEG_at_0x8004;
//段控制口
xdataunsignedcharIN_at_0x8001;
//键盘读入口
unsignedcharLEDBuf[LEDLen];
//显示缓冲
codeunsignedcharLEDMAP[]={//八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay(unsignedcharCNT)
unsignedchari;
for(i=100;
voidDisplayLED()
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;
//从左边开始显示
for(i=0;
i<
LEDLen;
i++){
OUTBIT=0;
//关所有八段管
LED=LEDBuf[i];
OUTSEG=LED;
OUTBIT=Pos;
//显示一位八段管
Delay
(1);
Pos>
//显示下一位
unsignedchari=0;
unsignedcharj;
while
(1){
LEDBuf[0]=LEDMAP[i&
0x0f];
LEDBuf[1]=LEDMAP[(i+1)&
LEDBuf[2]=LEDMAP[(i+2)&
LEDBuf[3]=LEDMAP[(i+3)&
LEDBuf[4]=LEDMAP[(i+4)&
LEDBuf[5]=LEDMAP[(i+5)&
i++;
for(j=0;
j<
30;
j++)
DisplayLED();
T5b.ASM
把按键输入的键码在六位数码管上显示出来
;
movr6,#1
TestKey:
检测是否有按键
输出线置为0
movdptr,#IN
movxa,@dptr;
读入键状态
cpla
anla,#0fh;
高四位不用
KeyTable:
键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
GetKey:
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#6
KLoop:
mova,r1;
找出键所在列
movr1,a;
下一列
movxa,@r0
jnzGoon1;
该列有键入
djnzr2,KLoop
movr2,#0ffh;
没有键按下,返回0ffh
sjmpExit
键值=列X4+行
deca
rla
movr2,a;
r2=(r2-1)*4
r1中为读入的行值
movr1,#4
LoopC:
rrca;
移位找出所在行
jcExit
incr2;
r2=r2+行值
djnzr1,LoopC
取出键码
movdptr,#KeyTable
movca,@a+dptr
WaitRelease:
movdptr,#OUTBIT;
等键释放
movr6,#10
callTestKey
jnzWaitRelease
movLEDBuf+0,#0ffh;
显示8.8.8.8.
movLEDBuf+1,#0ffh
movLEDBuf+2,#0ffh
movLEDBuf+3,#0ffh
movLEDBuf+4,#0
movLEDBuf+5,#0
callTestKey;
有键入?
jzMLoop;
无键入,继续显示
callGetKey;
读入键码
显示键码
movLEDBuf+5,a
T5b.c
codeunsignedcharKeyTable[]={//键码定义
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
unsignedcharTestKey()
//输出线置为0
return(~IN&
0x0f);
//读入键状态(高四位不用)
unsignedcharG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 实验 参考 程序