山东大学信息学院单片机实验报告最新.docx
- 文档编号:24142505
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:51
- 大小:958.92KB
山东大学信息学院单片机实验报告最新.docx
《山东大学信息学院单片机实验报告最新.docx》由会员分享,可在线阅读,更多相关《山东大学信息学院单片机实验报告最新.docx(51页珍藏版)》请在冰豆网上搜索。
山东大学信息学院单片机实验报告最新
信息科学与工程学院
2016-2017学年第二学期
实验报告
课程名称:
微处理器原理与应用
实验名称:
单片机软件及硬件实验
软件仿真实验
2.2汇编程序实验2
自我完成实验程序
ORG0000H
AJMPSTART
ORG0030H
START:
MOVDPTR,#TABLE
MOVA,#00H
MOVR7,#20H
MOVR1,#30H
MOVR2,#00H
READ:
MOVCA,@A+DPTR
MOV@R1,A
INCR1
INCR2
MOVA,R2
DJNZR7,READ
MOVR0,#30H
MOVR7,#31
LOOP:
MOVA,R0
MOVR1,A
MOVA,R7
MOVR6,A
MOVA,R0
MOVR2,A
MOVB,@R1
LOOP1:
INCR1
MOVA,@R1
CJNEA,B,L1
L1:
JCL2
MOVB,A
MOVA,R1
MOVR2,A
L2:
DJNZR6,LOOP1
MOVA,B
XCHA,@R1
MOVB,A
MOVA,R2
MOVR1,A
MOV@R1,B
DJNZR7,LOOP
ORG08F0H
TABLE:
DB1,3,9,2,17,4,11,6
DB5,20,100,64,21,14,79,35
DB92,7,91,23,65,16,13,18
DB18,73,65,101,27,19,62,69
END
2.3C语言程序实验
#include
#include
chardataa[32]_at_0x30;
voidmain()
{
charcodeb[32]={1,3,9,2,17,4,11,6,5,20,100,64,21,14,79,35,92,7,91,23,65,16,13,18,18,73,65,101,27,19,62,69};
inti=0;
intt=0;
intj=0;
for(i=0;i<32;i++)
{a[i]=b[j];
j++;}
for(j=0;j<31;j++)
for(i=0;i<31-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
while
(1);
}
3.1基本并行I/O口实验
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVSP,#60H
MOVP2,#0FFH
MOV20H,#0FEH
MOVR7,#8
LOOP:
SETBP1.0
JNBP1.0,LOOP1
AJMPL
LOOP1:
MOVA,20H
MOVP2,A
ACALLDELAY
MOVA,P2
RLA
MOV20H,A
L:
DJNZR7,LOOP
DELAY:
MOVR6,#200
L1:
MOVR5,#250
DJNZR5,$
DJNZR6,L1
RET
SJMP$
END
3.2扩展并行I/O口实验
ORG0000H
AJMPSTART
ORG0003H
START:
MOVSP,#60H
MOVP0,#0FFH
CLRP3.6
STATE1:
MOVDPTR,#0FE00H
MOVA,#0F3H
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#0CH
MOVX@DPTR,A
ACALLDELAY2
STATE2:
MOVDPTR,#0FE00H
MOVA,#0C3H
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#0FH
MOVX@DPTR,A
ACALLDELAY1
STATE3:
MOVDPTR,#0FE00H
MOVA,#0FCH
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#03H
MOVX@DPTR,A
ACALLDELAY2
STATE4:
MOVDPTR,#0FE00H
MOVA,#3CH
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVA,#0FH
MOVX@DPTR,A
ACALLDELAY1
AJMPSTATE1
DELAY1:
MOVR7,#20
DL2:
MOVR6,#200
DL1:
MOVR5,#250
DJNZR5,$
DJNZR6,DL1
DJNZR7,DL2
RET
DELAY2:
MOVR7,#100
L2:
MOVR6,#200
L1:
MOVR5,#250
DJNZR5,$
DJNZR6,L1
DJNZR7,L2
RET
END
3.3静态LED显示实验
ORG0000H
AJMPSTART
ORG0003H
START:
MOVSP,#60H
MOVR4,#0AH
MOVA,R3
CLRA
MOVR3,A
SETBP1.0
SETBP1.1
LOOP1:
JBP1.1,S1
LOOP2:
MOVA,R4
LCALLCLOSE
S1:
JBP1.0,LOOP1
MOVR3,#0AH
MAIN:
MOVDPTR,#0FD00H
MOVA,#0F9H
MOVX@DPTR,A
MOVDPTR,#0FE00H
MOVA,#0C0H
MOVX@DPTR,A
LCALLDELAY1
MOVDPTR,#0FD00H
MOVA,#0C0H
MOVX@DPTR,A
LOOP:
MOVA,R3
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVDPTR,#0FE00H
MOVX@DPTR,A
LCALLDELAY1
DECR3
MOVA,R3
INCA
JNZLOOP
SPARK:
CLRP3.0
LCALLDELAY2
SETBP3.0
LCALLDELAY2
JBP1.1,SPARK
AJMPLOOP2
TABLE:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H
CLOSE:
MOVDPTR,#0FE00H
MOVA,#0FFH
MOVX@DPTR,A
MOVDPTR,#0FD00H
MOVX@DPTR,A
RET
DELAY1:
MOVR7,#10
L2:
MOVR6,#200
L1:
MOVR5,#250
DJNZR5,$
DJNZR6,L1
DJNZR7,L2
RET
DELAY2:
MOVR6,#100
L:
MOVR5,#250
DJNZR5,$
DJNZR6,L
RET
SJMP$
END
3.4矩阵键盘扫描实验
#include"reg52.h"
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitg0=P0^4;
ucharcodeT_TABLE[]={200,160,120,80,40};
ucharcodekey_code[]={0x22,0x12,0x21,0x11};
voiddelay()
{
uchart,ms;
ms=5;
while(ms--)
for(t=0;t<120;t++);
}
voidmain()
{
intaa=0xfe;
uintdir=1;
uintspeed=0;
inttemp,temp2,keycode;
intj,key;
g0=0;
while
(1)
{
P3=0x30;
temp=P3;
if((temp&0x30)!
=0x30)
{
delay();
delay();
P3=0x30;
temp=P3;
if((temp&0x30)!
=0x30)
{
P3=0x03;
temp2=P3;
keycode=temp|temp2;
for(j=0;j<4;j++)
{
if(keycode==key_code[j])
{
key=j;
}
}
if(key==0)dir=1;
if(key==1)dir=0;
if(key==2)
{
speed++;
if(speed==5)speed=4;
}
if(key==3)
{
if(speed==0)speed++;
speed--;
}
switch(speed)
{
case0:
P0=0xef;break;
case1:
P0=0xf7;break;
case2:
P0=0xfb;break;
case3:
P0=0xfd;break;
case4:
P0=0xfe;break;
default:
break;
}
P3=0x03;
while(!
(P3==0x03));
}
}
if(dir==1)
{
P1=aa;
for(j=0;j delay(); aa=_crol_(aa,1);// } if(dir==0) { P1=aa; for(j=0;j delay(); aa=_cror_(aa,1); } } } 3.7LCD1602显示实验 #include #defineuintunsignedint// #defineucharunsignedchar sbitlcden=P1^5;//定义引脚 sbitrs=P1^7; sbitrw=P1^6; sbitbusy=P0^7; chari,j,temp,num; longa,b,c,d;//a,第一个数b,第二个数c,得数d,余数 floata_c,b_c; ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号 ucharcodetable[]={ 0,1,2,3, 4,5,6,7, 8,9,0,0, 0,0,0,0}; ucharcodetable1[]={ 0,1,2,3, 4,5,6,7, 8,9,0x2b-0x30,0x2d-0x30, 0x2a-0x30,0x2f-0x30,0x01-0x30,0x3d-0x30}; ucharcodetable2[]="! rorrE"; voiddelay(ucharz)//延迟函数 { uchary; for(z;z>0;z--) for(y=0;y<110;y++); } voidcheck()//判断忙或空闲 { do { P2=0xFF; rs=0;//指令 rw=1;//读 lcden=0;//禁止读写 delay (1);//等待,液晶显示器处理数据 lcden=1;//允许读写 } while(busy==1);//判断是否为空闲,1为忙,0为空闲 } voidwrite_com(ucharcom)//写指令函数 { P2=com;//com指令付给P0口 rs=0; rw=0; lcden=0; check(); lcden=1; } voidwrite_date(uchardate)//写数据函数 { P2=date; rs=1; rw=0; lcden=0; check(); lcden=1; } voidinit()//初始化 { num=-1; lcden=1;//使能信号为高电平 write_com(0x38);//8位,2行 write_com(0x0c);//显示开,光标关,不闪烁*/ write_com(0x06);//增量方式不移位 write_com(0x80);//检测忙信号 write_com(0x01);//显示开,光标关,不闪烁 i=0; j=0; a=0;//第一个参与运算的数 b=0;//第二个参与运算的数 c=0; d=0; flag=0;//flag表示是否有符号键按下, fuhao=0;//fuhao表征按下的是哪个符号 } voidkeyscan()//键盘扫描程序 { P3=0xfe; if(P3! =0xfe) { delay(20); if(P3! =0xfe) { temp=P3&0xf0; switch(temp) { case0xe0: num=0; break; case0xd0: num=1; break; case0xb0: num=2; break; case0x70: num=3; break; } } while(P3! =0xfe); if(flag==0)//没有按过符号键 { a=a*10+table[num]; } else//如果按过符号键 { b=b*10+table[num]; } i=table1[num]; write_date(0x30+i); } P3=0xfd; if(P3! =0xfd) { delay(5); if(P3! =0xfd) { temp=P3&0xf0; switch(temp) { case0xe0: num=4; break; case0xd0: num=5; break; case0xb0: num=6; break; case0x70: num=7; break; } } while(P3! =0xfd); if(flag==0)//没有按过符号键 { a=a*10+table[num]; } else//如果按过符号键 { b=b*10+table[num]; } i=table1[num]; write_date(0x30+i); } P3=0xfb; if(P3! =0xfb) { delay(5); if(P3! =0xfb) { temp=P3&0xf0; switch(temp) { case0xe0: num=8; break; case0xd0: num=9; break; case0xb0: num=10; break; case0x70: num=11; break; } } while(P3! =0xfb); if(num==8||num==9)//如果按下的是'8','9' { if(flag==0)//没有按过符号键 { a=a*10+table[num]; } else//如果按过符号键 { b=b*10+table[num]; } } elseif(num==10)//如果按下的是'+' { flag=1; fuhao=1;//2表示加号已按 } elseif(num==11)//如果按下的是'-' { flag=1; fuhao=2;//2表示减号已按 } i=table1[num]; write_date(0x30+i); } P3=0xf7; if(P3! =0xf7) { delay(5); if(P3! =0xf7) { temp=P3&0xf0; switch(temp) { case0xe0: num=12; break; case0xd0: num=13; break; case0xb0: num=14; break; case0x70: num=15; break; } } while(P3! =0xf7); switch(num) { case12: {write_date(0x30+table1[num]);flag=1;fuhao=3;} break; case13: {write_date(0x30+table1[num]);flag=1;fuhao=4;} break; case14: {write_com(0x01);i=0;j=0;a=0;b=0;c=0;d=0;flag=0;fuhao=0;}//按下的是"清零" break; case15: { j=1; if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处 write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格 c=a+b; while(c! =0) { write_date(0x30+c%10); c=c/10; } write_date(0x3d);//再写"=" a=0;b=0;flag=0;fuhao=0; } elseif(fuhao==2){write_com(0x80+0x4f);//光标前进至第二行最后一个显示处 write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格) if(a-b>0) c=a-b; else c=b-a; while(c! =0) { write_date(0x30+c%10); c=c/10; } if(a-b<0) write_date(0x2d); write_date(0x3d);//再写"=" a=0;b=0;flag=0;fuhao=0; } elseif(fuhao==3) { write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c! =0) { write_date(0x30+c%10); c=c/10; } write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } elseif(fuhao==4) { write_com(0x80+0x4f); write_com(0x04); if(b==0) { i=0; while(table2[i]! ='\0') { write_date(table2[i]); i++; } a=0;b=0;flag=0;fuhao=0; } elseif((a%b==0)&&(b! =0)) { c=a/b; while(c! =0) { write_date(0x30+c%10); c=c/10; } if(a/b<=0) write_date(0x30); write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } elseif((a%b! =0)&&(b! =0)) { d=a%b; while(d! =0) { write_date(0x30+d%10); d=d/10; } write_date(0x2e); write_date(0x2e); write_date(0x2e); c=a/b; while(c! =0) { write_date(0x30+c%10); c=c/10; } if(a/b<=0) write_date(0x30); write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } } } break; } } } main() { init(); while (1) { keyscan(); } } 3.8ADC0808/9信号采集实验 #include"reg51.h" #include"intrins.h" #definebyteunsignedchar #definewordunsignedint bytedataline[16]; bytecodenumchar[]={'0','1','2','3','4','5','6','7','8','9'}; sbitRS=P2^0; sbitRW=P2^1; sbitE=P2^2; sbitclk=P2^3; sbitstart=P2^4; sbitoe=P2^5; sbitout=P2^6; sbiteoc=P2^7; byteADdata1,ADdata0,f1,f2,f3; wordnum,frequency,t; bitADend; voiddelayms(wordms) { wordi,j; for(i=0;i for(j=0;j<120;j++); } bitlcd_busy() { bitflag; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); flag=(b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学 信息 学院 单片机 实验 报告 最新