单片机实验总结
mov dptr,#2000h//将片外地址2000h给dptr
movx a,@dptr//将片外地址2000h中的数赋给a
anla,#0f0h //将a中的数与0f0h与下,屏蔽低四位的数
movx@dptr,a //将屏蔽好的数送回到片外地址2000h中
end
4、试编写程序,求出片内RAM20H单元中“1”的个数,并将结果存入21H单元。
voiddelayms(t)
{
uint i;
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次。
单片机实验总结
————————————————————————————————作者:
———————————————————————————————— 日期:
程序由410出品,与老师的不大一样,此处省去1万字-----最终解释归410所有
1.试编写程序。统计片内RAM30H~50H单元中FFH的个数,并将统计结果存51H。
movr1,#20hﻩﻩ//把20h给R1
mov51h,#0
mov 52h,#0ﻩﻩ//把地址51h,52h中的数置零
L1:mov b,#02hﻩ//把2h给b
mova,@r0//把R0所指地址中的数给a
divabﻩ//a除以b,商给a,余数b
mov a,bﻩ//把b的数给a
cjne a,#0,L2ﻩﻩ//比较a与0的大小,若不等跳至L2
mov 21h,#0h//将地址21h中置0(例如20h中是01101000)
mov r2,#08h //将8赋给R2(8个有效数)
mova,20h //将地址20h中的数赋给a
lop:rlc a //带Cy左循环移位(即第一次移位变为11010000,Cy=0)
jncloop//判断Cy是否不等于1,若不等1,则程序跳至loop
chk:jclop//判断Cy是否为1,若是,则执行下面程序,否则跳至lop继续执行
mov a,@r0//把R0所指地址中的数给a,即把最小数赋给了a
lop:djnzr1,loop//R1减一,程序跳至loop继续执行,循环直至R1减到0
mov20h,a//把a中的数赋到地址20h中
end
3、设片外RAM2000H单元中有一个8位二进制数,试编程将该数的低四位屏蔽掉,并送回原存储单元。
mov dph,#20h
mov dpl,#00hﻩ
mov r0,#5h
movr1,#0h
lop:movdpl,r1
movx a,@dptr
movb,a
anla,#0fh
orla,#30h
mov dpl,r0
movx@dptr,a
incr0
xcha,b
swapa
anl a,#0fh
orl a,#30h
#include<reg51.h>
#include<intrins.h>
#defineuchar unsigned char
#define uintunsignedint
void delayms(t)
{
uint i;
for(;t>0;t--)
for(i=0;i<120;i++);
}
voidintx0_isr()interrupt 0
{
uinti;
for(i=0;i<4;i++)
{
P1=0xff;
movdpl,r0
movx@dptr,a
inc r0
incr1
cjne r1,#5h,lop
End
7、参考书中P109页,编写C语言和汇编语言的流水灯程序
#include<reg51.h>
#include<intrins.h>
#defineucharunsigned char
#defineuintunsignedint
mov r0,#30h//把30h赋给R0
movr1,#00h//把00h赋给R1
loop:cjne @r0,#0ffh,next//把R0所指的地址里的数(地址30h中的数)与0ffh比较
incr1//若为0ffh则R1加1(计算0ffh的个数)
next: inc r0//若不一样则R0加1(即把R0里的地址加1,R0将指向下一个地址)
movr0,#30h//把30h赋给R0
mov a,@r0 //把R0所指30H中的数赋给a(a中就是地址30h中的无符号数)
movr1,21h//把21h中的数赋给R1
loop:incr0//R0加1(即R0将指向下一个地址)
mov30h,@r0//把R0所指地址的数给到地址30h中
cjne a,30h,chk //比较a中的数与地址30h中的数的大小,若a中的数>30H中的数,则Cy=0;否则相反
inc 21h //若Cy等于1,则地址21h中的数加1
loop:djnzr2,lop//R2减1,程序跳至lop执行直至R2=0,才执行下面的
end
5、试编一程序,分别统计在内部RAM的30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。
movr0,#30hﻩ//把30h给R0
inc 52hﻩ//若相等地址52h中的数加一
jmpL3ﻩﻩ//跳至L3
L2: inc51hﻩ//地址51h中的数加一
L3:inc r0ﻩﻩ//R0加一
djnzr1,L1ﻩ//R1减一,跳至L1执行
jmp$ﻩ//等待
end
6、在2000H~2004H单元中,存有5个压缩的BCD码,试编程将它们转换成ASCII码,并存入2005H开始的连续单元中。
cjne r0,#51h,loop//比较R0所存的地址与51h,若不等则跳回loop继续执行
mov 51h,r1//若相等(R0里的数就为51h,完成30h到50h的计数)将R1里的值赋到地址51h里,即地址51h中存储着0ffh的个数
sjmp$//等待
end
2、从片内RAM30H单元开始存放着一组无符号数,其个数存在21H单元中。试编写程序,找出其中最小的数,并将其存入20H单元中。