微机原理实验参考程序.docx
- 文档编号:6353842
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:53
- 大小:41.30KB
微机原理实验参考程序.docx
《微机原理实验参考程序.docx》由会员分享,可在线阅读,更多相关《微机原理实验参考程序.docx(53页珍藏版)》请在冰豆网上搜索。
微机原理实验参考程序
T1a.asm
;4000H起256个字节清0
Blockequ4000h
movdptr,#Block;起始地址
movr0,#0;清256字节
clra
Loop:
movx@dptr,a
incdptr;指向下一个地址
djnzr0,Loop;记数减一
ljmp$
end
T1a.c
;4000H起256个字节清0
xdataunsignedcharBuffer[256]_at_0x4000;
voidmain()
{
unsignedintindex;
unsignedcharxdata*ptr;
ptr=&Buffer;//起始地址
for(index=0;index<=255;index++)
{
*ptr++=0;//清0,地址加一
}
}
T1b.asm
;3000H起长度256字节的存储块移到4000H
movr0,#30h
movr1,#00h
movr2,#40h
movr3,#00h
movr7,#0
Loop:
movdph,r0
movdpl,r1
movxa,@dptr
movdph,r2
movdpl,r3
movx@dptr,a
cjner1,#0ffh,Goon1
incr0
Goon1:
incr1
cjner3,#0ffh,Goon2
incr2
Goon2:
incr3
djnzr7,Loop
ljmp$
end
T1b.c
;3000H起长度256字节的存储块移到4000H
xdataunsignedcharBuffer1[256]_at_0x3000;
xdataunsignedcharBuffer2[256]_at_0x4000;
voidmain()
{
unsignedintindex;
unsignedcharxdata*ptr1;
unsignedcharxdata*ptr2;
ptr1=&Buffer1;
ptr2=&Buffer2;
for(index=0;index<=255;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:
movx@dptr,a;输出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;延时时间与r5成正比
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--);
}
voidmain()
{
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输入
PortA=dd;//再输出到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$;等待中断
end
T3.c外部中断实验
;用单次脉冲申请中断,在中断处理程序中对输出信号进行反转
#include
sbitLED=P1^0;
bitLEDBuf;
voidExtInt0()interrupt0
{
LEDBuf=!
LEDBuf;
LED=LEDBuf;
}
voidmain()
{
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;可寻址位00h作显示缓冲区
LEDequP1.0
ljmpStart
;中断服务程序
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
reti
;主程序
Start:
movTMOD,#02h;方式2,定时器
movTH0,#t100us
movTL0,#t100us
movIE,#10000010b;EA=1,IT0=1
setbTR0;开始定时
clrLEDBuf
clrLED
movC100us,#high(Tick);100us记数单元初值=10000的高8位
movC100us+1,#low(Tick);100us记数单元初值=10000的低8位
Loop:
movc,LEDBuf;显示输出
movLED,c
ljmpLoop
end
T4.c计数器/定时器实验
;用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转
#include
#defineTick10000//10000x100us=1s
#defineT100us(256-50)//100us时间常数(6M)
unsignedintC100us;//100us记数单元
bitLEDBuf;
sbitLED=P1^0;
voidT0Int()interrupt1
{
C100us--;
if(C100us==0){
C100us=Tick;//100us记数器为0,重置记数器
LEDBuf=!
LEDBuf;//取反LED
}
}
voidmain()
{
TMOD=0x02;//方式2,定时器
TH0=T100us;
TL0=T100us;
IE=0x82;//EA=1,IT0=1
LEDBuf=0;
LED=0;
C100us=Tick;
TR0=1;//开始定时
while
(1){
LED=LEDBuf;
}
}
T5a.ASM
;利用实验仪提供的显示电路,动态显示一行数据
OUTBITequ08002h;位控制口
OUTSEGequ08004h;段控制口
INequ08001h;键盘读入口
LEDBufequ60h;显示缓冲
Numequ70h;显示的数据
DelayTequ75h;
ljmpStart
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
Delay:
;延时子程序
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
DisplayLED:
;显示子程序
movr0,#LEDBuf
movr1,#6;共6个八段管
movr2,#00100000b;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
movdptr,#OUTBIT
mova,r2
movx@dptr,a;显示一位八段管
movr6,#01
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关所有八段管
ret
Start:
;主程序
movsp,#40h
movNum,#0
MLoop:
incNum
mova,Num
movb,a
movr0,#LEDBuf
FillBuf:
mova,b
anla,#0fh
movdptr,#LEDMap
movca,@a+dptr;数字转换成显示码
mov@r0,a;显示在码填入显示缓冲
incr0
incb
cjner0,#LEDBuf+6,FillBuf
movDelayT,#30
DispAgain:
callDisplayLED;显示
djnzDelayT,DispAgain
ljmpMLoop
end
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;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;//从左边开始显示
for(i=0;i OUTBIT=0;//关所有八段管 LED=LEDBuf[i]; OUTSEG=LED; OUTBIT=Pos;//显示一位八段管 Delay (1); Pos>>=1;//显示下一位 } OUTBIT=0;//关所有八段管 } voidmain() { unsignedchari=0; unsignedcharj; while (1){ LEDBuf[0]=LEDMAP[i&0x0f]; LEDBuf[1]=LEDMAP[(i+1)&0x0f]; LEDBuf[2]=LEDMAP[(i+2)&0x0f]; LEDBuf[3]=LEDMAP[(i+3)&0x0f]; LEDBuf[4]=LEDMAP[(i+4)&0x0f]; LEDBuf[5]=LEDMAP[(i+5)&0x0f]; i++; for(j=0;j<30;j++) DisplayLED();//延时 } } T5b.ASM ;把按键输入的键码在六位数码管上显示出来 OUTBITequ08002h;位控制口 OUTSEGequ08004h;段控制口 INequ08001h;键盘读入口 LEDBufequ60h;显示缓冲 ljmpStart LEDMAP: ;八段管显示码 db3fh,06h,5bh,4fh,66h,6dh,7dh,07h db7fh,6fh,77h,7ch,39h,5eh,79h,71h Delay: ;延时子程序 movr7,#0 DelayLoop: djnzr7,DelayLoop djnzr6,DelayLoop ret DisplayLED: ;显示子程序 movr0,#LEDBuf movr1,#6;共6个八段管 movr2,#00100000b;从左边开始显示 Loop: movdptr,#OUTBIT mova,#0 movx@dptr,a;关所有八段管 mova,@r0 movdptr,#OUTSEG movx@dptr,a movdptr,#OUTBIT mova,r2 movx@dptr,a;显示一位八段管 movr6,#1 callDelay mova,r2;显示下一位 rra movr2,a incr0 djnzr1,Loop ret TestKey: ;检测是否有按键 movdptr,#OUTBIT mova,#0 movx@dptr,a;输出线置为0 movdptr,#IN movxa,@dptr;读入键状态 cpla anla,#0fh;高四位不用 ret 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: movdptr,#OUTBIT movP2,dph movr0,#Low(IN) movr1,#00100000b movr2,#6 KLoop: mova,r1;找出键所在列 cpla movx@dptr,a cpla rra movr1,a;下一列 movxa,@r0 cpla anla,#0fh jnzGoon1;该列有键入 djnzr2,KLoop movr2,#0ffh;没有键按下,返回0ffh sjmpExit Goon1: movr1,a;键值=列X4+行 mova,r2 deca rla rla movr2,a;r2=(r2-1)*4 mova,r1;r1中为读入的行值 movr1,#4 LoopC: rrca;移位找出所在行 jcExit incr2;r2=r2+行值 djnzr1,LoopC Exit: mova,r2;取出键码 movdptr,#KeyTable movca,@a+dptr movr2,a WaitRelease: movdptr,#OUTBIT;等键释放 clra movx@dptr,a movr6,#10 callDelay callTestKey jnzWaitRelease mova,r2 ret Start: ;主程序 movsp,#40h movLEDBuf+0,#0ffh;显示8.8.8.8. movLEDBuf+1,#0ffh movLEDBuf+2,#0ffh movLEDBuf+3,#0ffh movLEDBuf+4,#0 movLEDBuf+5,#0 MLoop: callDisplayLED;显示 callTestKey;有键入? jzMLoop;无键入,继续显示 callGetKey;读入键码 anla,#0fh;显示键码 movdptr,#LEDMap movca,@a+dptr movLEDBuf+5,a ljmpMLoop end T5b.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; while(CNT--! =0) for(i=100;i! =0;i--); } voidDisplayLED() { unsignedchari; unsignedcharPos; unsignedcharLED; Pos=0x20;//从左边开始显示 for(i=0;i OUTBIT=0;//关所有八段管 LED=LEDBuf[i]; OUTSEG=LED; OUTBIT=Pos;//显示一位八段管 Delay (1); Pos>>=1;//显示下一位 } } 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() { OUTBIT=0;//输出线置为0 return(~IN&0x0f);//读入键状态(高四位不用) } unsignedcharG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 实验 参考 程序