单片机实验总结.docx
- 文档编号:13488430
- 上传时间:2023-06-14
- 格式:DOCX
- 页数:24
- 大小:263.59KB
单片机实验总结.docx
《单片机实验总结.docx》由会员分享,可在线阅读,更多相关《单片机实验总结.docx(24页珍藏版)》请在冰点文库上搜索。
单片机实验总结
程序由410出品,与老师的不大一样,此处省去1万字-----最终解释归410所有
1.试编写程序。
统计片RAM30H~50H单元中FFH的个数,并将统计结果存51H。
movr0,#30h//把30h赋给R0
movr1,#00h//把00h赋给R1
loop:
cjner0,#0ffh,next//把R0所指的地址里的数(地址30h中的数)与0ffh比较
incr1//若为0ffh则R1加1(计算0ffh的个数)
next:
incr0//若不一样则R0加1(即把R0里的地址加1,R0将指向下一个地址)
cjner0,#51h,loop//比较R0所存的地址与51h,若不等则跳回loop继续执行
mov51h,r1//若相等(R0里的数就为51h,完成30h到50h的计数)将R1里的值赋到地址51h里,即地址51h中存储着0ffh的个数
sjmp$//等待
end
2、从片RAM30H单元开始存放着一组无符号数,其个数存在21H单元中。
试编写程序,找出其中最小的数,并将其存入20H单元中。
movr0,#30h//把30h赋给R0
mova,r0//把R0所指30H中的数赋给a(a中就是地址30h中的无符号数)
movr1,21h//把21h中的数赋给R1
loop:
incr0//R0加1(即R0将指向下一个地址)
mov30h,r0//把R0所指地址的数给到地址30h中
cjnea,30h,chk//比较a中的数与地址30h中的数的大小,若a中的数>30H中的数,则Cy=0;否则相反
chk:
jclop//判断Cy是否为1,若是,则执行下面程序,否则跳至lop继续执行
mova,r0//把R0所指地址中的数给a,即把最小数赋给了a
lop:
djnzr1,loop//R1减一,程序跳至loop继续执行,循环直至R1减到0
mov20h,a//把a中的数赋到地址20h中
end
3、设片外RAM2000H单元中有一个8位二进制数,试编程将该数的低四位屏蔽掉,并送回原存储单元。
movdptr,#2000h//将片外地址2000h给dptr
movxa,dptr//将片外地址2000h中的数赋给a
anla,#0f0h//将a中的数与0f0h与下,屏蔽低四位的数
movxdptr,a//将屏蔽好的数送回到片外地址2000h中
end
4、试编写程序,求出片RAM20H单元中“1”的个数,并将结果存入21H单元。
mov21h,#0h//将地址21h中置0(例如20h中是01101000)
movr2,#08h//将8赋给R2(8个有效数)
mova,20h//将地址20h中的数赋给a
lop:
rlca//带Cy左循环移位(即第一次移位变为11010000,Cy=0)
jncloop//判断Cy是否不等于1,若不等1,则程序跳至loop
inc21h//若Cy等于1,则地址21h中的数加1
loop:
djnzr2,lop//R2减1,程序跳至lop执行直至R2=0,才执行下面的
end
5、试编一程序,分别统计在部RAM的30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。
movr0,#30h//把30h给R0
movr1,#20h//把20h给R1
mov51h,#0
mov52h,#0//把地址51h,52h中的数置零
L1:
movb,#02h//把2h给b
mova,r0//把R0所指地址中的数给a
divab//a除以b,商给a,余数b
mova,b//把b的数给a
cjnea,#0,L2//比较a与0的大小,若不等跳至L2
inc52h//若相等地址52h中的数加一
jmpL3//跳至L3
L2:
inc51h//地址51h中的数加一
L3:
incr0//R0加一
djnzr1,L1//R1减一,跳至L1执行
jmp$//等待
end
6、在2000H~2004H单元中,存有5个压缩的BCD码,试编程将它们转换成ASCII码,并存入2005H开始的连续单元中。
movdph,#20h
movdpl,#00h
movr0,#5h
movr1,#0h
lop:
movdpl,r1
movxa,dptr
movb,a
anla,#0fh
orla,#30h
movdpl,r0
movxdptr,a
incr0
xcha,b
swapa
anla,#0fh
orla,#30h
movdpl,r0
movxdptr,a
incr0
incr1
cjner1,#5h,lop
End
7、参考书中P109页,编写C语言和汇编语言的流水灯程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddelayms(t)
{
uinti;
for(;t>0;t--)
for(i=0;i<120;i++);
}
voidmain()
{
uinti;
while
(1)
{
P1=0xfe;
for(i=0;i<8;i++)
{
P1=_crol_(P1,1);
delayms(300);
}
}
}
8、使用89C51的P1连接到8颗LED,P1在正常状况下会输出跑马灯,然后通过用户触动外部按钮来中断INT0,当INT0引脚有低电位的脉冲出现时,8个LED会一闪一灭4次。
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddelayms(t)
{
uinti;
for(;t>0;t--)
for(i=0;i<120;i++);
}
voidintx0_isr()interrupt0
{
uinti;
for(i=0;i<4;i++)
{
P1=0xff;
delayms(200);
P1=0x00;
delayms(200);
}
}
voidmain()
{
uinti;
IT0=1;
EX0=1;
EA=1;
while
(1)
{
P1=0xfe;
for(i=0;i<8;i++)
{
P1=_crol_(P1,1);
delayms(300);
}
}
}
9、使用89C51的P1连接到8颗LED,使用外部中断方式,程序执行时,当用户每按一次按钮的中断进行计数,将其数值按二进制数在P1口驱动LED灯上显示出来,计数到9次之后又会恢复到0。
(分别使用汇编语言和C51编程)
#include
#defineucharunsignedchar
#defineuintunsignedint
uintj=255;
voidintx0_isr()interrupt0
{
j--;
P1=j;
if(j==245)
{
j=255;
P1=255;
}
}
voidmain()
{
P1=255;
IT0=1;
EX0=1;
EA=1;
while
(1);
}
10、并行换串行输出
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitspl=P2^5;
voiddelay(uinttime)
{
uintj=0;
for(;time>0;time--)
{
for(j=0;j<120;j++);
}
}
voidmain()
{
SCON=0x10;
while
(1)
{
spl=0;
spl=1;
if(RI)
RI=0;
P0=SBUF;
delay(100);
}
}
11、串行换并行输出
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitclk=P3^1;
voiddelay(uinttime)
{
uintj=0;
for(;time>0;time--)
{
for(j=0;j<120;j++);
}
}
voidmain()
{
uintdataa=1;
SCON=0;
clk=1;
while
(1)
{
unsignedintj;
SBUF=dataa;
if(TI)
TI=0;
dataa=_crol_(dataa,1);
delay(500);
}
}
12、按键显示相应的数(数码管)
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharPre=0xff,no=0xff;
UcharcodeDSY_CODE[]={0x3f,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};
voiddelay(uintms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voidkey()
{
uchartmp;
P1=0xf0;
delay
(1);
tmp=P1^0xf0;
switch(tmp)
{
case0x10:
no=0;break;
case0x20:
no=1;break;
case0x40:
no=2;break;
case0x80:
no=3;break;
default:
no=16;
}
P1=0x0f;
delay
(1);
tmp=P1^0x0f;
switch(tmp)
{
case2:
no+=0;break;
case4:
no+=4;break;
case8:
no+=8;break;
}
}
voidmain()
{
P0=0x00;
while
(1)
{
P1=0xf0;
if(P1!
=0xf0)key();
if(Pre!
=no)
{
P0=DSY_CODE[no+1];
Pre=no;
}
delay(100);
}
}
13、数码管循环显示(0~F)
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voiddelay(t)
{
uinti;
while(t--)
for(i=0;i<121;i++);
}
voidmain()
{
uintj=0;
while
(1)
{
j=++j%16;
P0=table[j];
delay(300);
}
}
14、甲机通过串口控制乙机LED闪烁
甲机:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P0^0;
sbitLED2=P0^3;
sbitK1=P1^0;
ucharOperation_No=0;//操作代码
//延时
voidDelayMS(uintms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//向串口发送字符
voidPutc_to_SerialPort(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
//主程序
voidmain()
{
LED1=LED2=1;
SCON=0x40;//串口模式1,允许接收
TMOD=0x20;//T1工作模式2
PCON=0x00;//波特率不倍增
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while
(1)
{
DelayMS(100);
if(K1==0)//按下K1时选择操作代码0,1,2,3
{
while(K1==0);
Operation_No=(Operation_No+1)%4;
switch(Operation_No)//根据操作代码发送A/B/C或停止发送
{
case0:
Putc_to_SerialPort('X');
LED1=LED2=1;
break;
case1:
Putc_to_SerialPort('A');
LED1=~LED1;LED2=1;
break;
case2:
Putc_to_SerialPort('B');
LED2=~LED2;LED1=1;
break;
case3:
Putc_to_SerialPort('C');
LED1=~LED1;LED2=LED1;
break;
}
}
}
}
乙机:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P0^0;
sbitLED2=P0^3;
sbitK2=P1^0;
ucharNumX=-1;
//延时
voidDelayMS(uintms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{
LED1=LED2=1;
SCON=0x50;//串口模式1,允许接收
TMOD=0x20;//T1工作模式2
TH1=0xfd;//波特率9600
TL1=0xfd;
PCON=0x00;//波特率不倍增
RI=0;
TR1=1;
while
(1)
{
DelayMS(100);
if(RI)//如收到则LED则动作
{
RI=0;
switch(SBUF)//根据所收到的不同命令字符完成不同动作
{
case'X':
LED1=LED2=1;break;//全灭
case'A':
LED1=0;LED2=1;break;//LED1亮
case'B':
LED2=0;LED1=1;break;//LED2亮
case'C':
LED1=LED2=0;//全亮
}
}
}
}
15、乙机通过串口控制甲机数码管显示
甲机:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P1^0;
sbitLED2=P1^3;
sbitK1=P1^7;
ucharOperation_No=0;//操作代码
//数码管代码
ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
voidDelayMS(uintms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//向串口发送字符
voidsend(ucharc)
{
SBUF=c;
while(TI==0);
TI=0;
}
//主程序
voidmain()
{
LED1=LED2=1;
P0=0x00;
SCON=0x50;//串口模式1,允许接收
TMOD=0x20;//T1工作模式2
PCON=0x00;//波特率不倍增
TH1=0xfd;
TL1=0xfd;
TI=RI=0;
TR1=1;
IE=0x90;//允许串口中断
while
(1)
{
DelayMS(100);
if(K1==0)//按下K1时选择操作代码0,1,2,3
{
while(K1==0);
Operation_No=(Operation_No+1)%4;
switch(Operation_No)//根据操作代码发送A/B/C或停止发送
{
case0:
send('X');
LED1=LED2=1;
break;
case1:
send('A');
LED1=~LED1;LED2=1;
break;
case2:
send('B');
LED2=~LED2;LED1=1;
break;
case3:
send('C');
LED1=~LED1;LED2=LED1;
break;
}
}
}
}
//甲机串口接收中断函数
voidSerial_INT()interrupt4
{
if(RI)
{
RI=0;
if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];
elseP0=0x00;
}
}
乙机:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED1=P1^0;
sbitLED2=P1^3;
sbitK2=P1^7;
ucharNumX=-1;
//延时
voidDelayMS(uintms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//主程序
voidmain()
{
LED1=LED2=1;
SCON=0x50;//串口模式1,允许接收
TMOD=0x20;//T1工作模式2
TH1=0xfd;//波特率9600
TL1=0xfd;
PCON=0x00;//波特率不倍增
RI=TI=0;
TR1=1;
IE=0x90;
while
(1)
{
DelayMS(100);
if(K2==0)
{
while(K2==0);
NumX=++NumX%11;//产生0~10围的数字,其中10表示关闭
SBUF=NumX;
while(TI==0);
TI=0;
}
}
}
voidSerial_INT()interrupt4
{
if(RI)//如收到则LED则动作
{
RI=0;
switch(SBUF)//根据所收到的不同命令字符完成不同动作
{
case'X':
LED1=LED2=1;break;//全灭
case'A':
LED1=0;LED2=1;break;//LED1亮
case'B':
LED2=0;LED1=1;break;//LED2亮
case'C':
LED1=LED2=0;//全亮
}
}
}
16、LCD显示
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P2^6;
sbitrw=P2^5;
sbite=P2^7;
ucharcodetable[]={""};
voiddelayms(t)
{
uinti;
while(t--)
for(i=0;i<121;i++);
}
voidwr_(uchar)
{
rs=0;
rw=0;
P0=;
e=1;
e=0;
}
voidwr_dat(uchardat)
{
rs=1;
rw=0;
P0=dat;
e=1;
e=0;
}
voidplay(uchar*p)
{
while(*p!
='\0')
{
wr_dat(*p);
p++;
delayms
(1);
}
}
voidinit()
{
delayms(15);
wr_(0x38);
delayms(5);
wr_(0x01);
delayms(5);
wr_(0x14);
delayms(5);
wr_(0x06);
delayms(5);
wr_(0x0c);
delayms(5);
}
voidmain()
{
e=0;
init();
wr_(0x80);
play(table);
delayms
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 总结