单片机实验电路Word格式.docx
《单片机实验电路Word格式.docx》由会员分享,可在线阅读,更多相关《单片机实验电路Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
DJNZR6,D2
DJNZR7,D1
RET
延时时间:
(250*2+3)*250+3=125753个机器周期
一个机器周期=1us
延时125753us=125.753ms
三、点亮8个闪烁的发光二极管
MOVP1,#0FFH;
LCALLDELAY ;
(2)
MOVP1,#00H ;
(3)
(4)
(5)
(6)
MOVR6,#250 ;
(7)
DJNZR6,D2 ;
(8)
DJNZR7,D1 ;
(9)
RET ;
(10)
四、认识八段数码显示管
共阳数码管共阴数码管显示原理
数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。
单片机与共阳数码管的连接
(1)让左边的数码管显示一个2字
显示一个2字,那么呢应当是A亮B亮G亮E亮D亮F不亮C不亮
显示数字
p0.7
c段
p0.6
e段
p0.5
h段
p0.4
d段
p0.3
g段
p0.2
f段
p0.1
a段
p0.0
b段
16进制代码
1
28H
7EH
2
A4H
3
64H
4
72H
5
61H
6
21H
7
7CH
8
20H
9
60H
28h,7eh,0a4h,64h,72h,61h,21h,7ch,20h,60h代表0123456789
程序如下:
程序1:
CLRP2.6;
选中左边的数码管
SETBP2.7;
不选右边的数码管
SETBP0.2;
f段不亮
SETBP0.5;
小数点不亮
SETBP0.7;
C段不亮
CLRP0.2;
其余的都亮
CLRP0.3
CLRP0.4
CLRP0.6
CLRP0.0
END
程序2:
CLRP2.6;
选中右边的数码管
不选左边的数码管
MOVP0,#0A4H;
将10100100送P0口
(2)100位计数器(数码管显示00--99依次循环)
两个数码管的位选为P2.6P2.7
a_bitequ20h
;
个位数存放处
b_bitequ21h
十位数存放处
tempequ22h
计数器寄存器
star:
movtemp,#0
初始化计数器
stlop:
acalldisplay
inctemp
mova,temp
cjnea,#100,next;
=100重来
movtemp,#0
next:
ljmpstlop
;
显示子程序
display:
mova,temp
将temp中的十六进制数转换成10进制
movb,#10
10进制/10=10进制
divab
movb_bit,a;
十位在a
mova_bit,b;
个位在b
movdptr,#numtab;
指定查表启始地址
movr0,#4
dpl1:
movr1,#250;
显示1000次
dplop:
mova,a_bit;
取个位数
MOVCA,@A+DPTR;
查个位数的7段代码
movp0,a;
送出个位的7段代码
clrp2.7;
开个位显示
acalld1ms;
显示1ms
setbp2.7
mova,b_bit;
取十位数
查十位数的7段代码
movp0,a;
送出十位的7段代码
clrp2.6;
开十位显示
setbp2.6
djnzr1,dplop;
250次没完循环
djnzr0,dpl1;
4个250次没完循环
ret
1ms延时(按12MHZ算)
====================================================
D1MS:
MOVR7,#80
DJNZR7,$
7段数码管各划的数字排列表
numtab:
db28h,7eh,0a4h,64h,72h,61h,21h,7ch,20h,60h
0123456789
end
(3)让四个数码管从左到右显示8051几个数字
四个数码管的位选为P2.3P2.4P2.6P2.7,连接图如下:
动态扫描的原理
动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。
其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了。
而所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
loop:
movp0,#0ffh;
关显示(共阳,0为点亮,1为灭)
movp2,#0ffh;
关显示
clrp2.4
;
选中第一个数码管
movp0,#20h;
数码管显示8
lcalldelay;
调用延时
movp0,#0ffh
movp2,#0ffh
clrp2.5;
选中第二个数码管
movp0,#28h;
数码管显示0
lcalldelay
clrp2.6;
选中第三个数码管
movp0,#61h;
数码管显示5
clrp2.7;
选中第四个数码管
movp0,#7eh;
数码管显示1
ajmploop;
程序条转到第一步,反复执行
delay:
延时子程序
movr6,#250
d1:
djnzr6,d1
ret
end
第五个实验:
999999计数器
org00h
a_bitequ30h;
个位数存放处
b_bitequ31h;
十位数存放处
c_bitequ32h;
百位数存放处
d_bitequ33h;
千位数存放处
e_bitequ34h;
万位数存放处
f_bitequ35h;
十万位数存放处
org0000h
ajmpstar
org0030h
mova,#00h;
清0
mova_bit,a
movb_bit,a
movc_bit,a
movd_bit,a
move_bit,a
movf_bit,a
acalldisplay;
显示
inca_bit
mova,a_bit
cjnea,#10,stlop;
mova_bit,#00h
incb_bit
mova,b_bit
cjnea,#10,stlop
movb_bit,#00h
incc_bit
mova,c_bit
movc_bit,#00h
incd_bit
mova,d_bit
movd_bit,#00h
ince_bit
mova,e_bit
move_bit,#00h
incf_bit
mova,f_bit
movf_bit,#00h
ajmpstlop
movdptr,#numtab;
指定查表启始地址
movr0,#4
显示1000次
mova,a_bit;
取个位数
MOVCA,@A+DPTR;
movp0,a;
送出个位的7段代码
clrp2.6;
acalld1ms;
setbp2.6
mova,b_bit;
查十位数的7段代码
clrp2.5;
setbp2.5
mova,c_bit;
取百位数
查百位数的7段代码
movp0,a;
送出百位的7段代码
clrp2.4;
开百位显示
setbp2.4
mova,d_bit;
取千位数
查千位数的7段代码
送出千位的7段代码
clrp2.3;
开千位显示
显示1ms
setbp2.3
mova,e_bit;
取万位数
查万位数的7段代码
送出万位的7段代码
clrp2.2;
开万位显示
setbp2.2
mova,f_bit;
取十万位数
查十万位数的7段代码
送出十万位的7段代码
clrp2.1;
开十万位显示
setbp2.1
djnzr1,dplop;
250次没完循环
djnzr0,dpl1;
4个100次没完循环
1MS延时(按12MHZ算)
MOVR7,#2
DJNZR7,$
RET
end
五、小键盘控制的数字显示
如果按小键盘p3.2那么数码管显示0,
如果按小键盘p3.3那么数码管显示1,
如果按小键盘p3.4那么数码管显示2,
如果按小键盘p3.5那么数码管显示3
数码管的位选为P2.6
org0000
ljmpstart
org30h
start:
movsp,#5fh
movp1,#0ffh
movp2,#0ffh
CLRP2.6;
选中p2.6右边的数码管
movp3,#0ffh
movp0,#0ffh
初始化;
键盘口以及数码管口全部置高清零
l1:
jnbp3.2,l2;
如果p3.2等于低(键按下)那么执行l2
jnbp3.3,l3
如果p3.3等于低(键按下)那么执行l3
jnbp3.4,l4
如果p3.4等于低(键按下)那么执行l4
jnbp3.5,l5
如果p3.5等于低(键按下)那么执行l5
ljmpl1
l2:
movp0,#28H;
显示数字0
l3:
movp0,#7EH;
显示数字1
l4:
movp0,#0A4H;
显示数字2
l5:
movp0,#64H;
显示数字3
六、点阵式汉字LED显示屏的原理与制作
汉字显示的原理:
我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。
即国标汉字库中的每一个字均由256点阵来表示。
我们可以把每一个点理解为一个像素,而把每一个字的字形理解为一幅图像。
事实上这个汉字屏不仅可以显示汉字,也可以显示在256像素范围内的任何图形。
在本例中单片机首先显示的是左上角的第一列的上半部分,即第0列的p00---p07口。
方向为p00到p07,显示汉字“大”时,p05点亮,由上往下排列,为p0.0灭,p0.1灭,p0.2灭p0.3灭,p0.4灭,p0.5亮,p0.6灭,p0.7灭。
即二进制00000100,转换为16进制为04h.。
上半部第一列完成后,继续扫描下半部的第一列,为了接线的方便,我们仍设计成由上往下扫描,即从p27向p20方向扫描,从上图可以看到,这一列全部为不亮,即为00000000,16进制则为00h。
然后单片机转向上半部第二列,仍为p05点亮,为00000100,即16进制04h.
这一列完成后继续进行下半部分的扫描,p21点亮,为二进制00000010,即16进制02h.
依照这个方法,继续进行下面的扫描,一共扫描32个8位,可以得出汉字“大”
的扫描代码为:
20H,00H,20H,02H,04H,02H,04H,04H
04H,08H,04H,30H,05H,0C0H,0FEH,00H
05H,80H,04H,60H,04H,10H,04H,08H
04H,04H,0CH,06H,04H,04H,00H,00H
由这个原理可以看出,无论显示何种字体或图像,都可以用这个方法来分析出它的扫描代码从而显示在屏幕上。
不过现在有很多现成的汉字字模生成软件,我们就不必自己去画表格算代码了。
电路原理说明:
单片机,一共使用32条io口,这样造成了io资源的耗尽,系统也再无扩充的余地。
实际应用中我们使用4-16线译码器74ls154来完成列方向的显示。
而行方向16条线则接在p0口和p2口。
电路中行方向由p0口和p2口完成扫描,由于p0口没有上拉电阻,因此接一个4.7k*8的排阻上拉。
如没有排阻,也可用8个普通的4.7k1/8w电阻。
为提供负载能力,接16个2n5551的NPN三极管驱动。
列方向则由4—16译码器74LS154完成扫描,它由89S51的P1.0---P1.3控制。
同样,驱动部分则是16个2N5401的三极管完成的。
电路的供电为一片LM7805三端稳压器,耗电电流为100Ma左右。
将程序编译后烧写入89c51,插入40pinIc座,即可看到屏幕轮流显示:
“倚天一出宝刀屠龙”。
程序设计思路:
(1)扫描指针R4
MOVR4,#00H;
扫描指针清零
(2)取码指针R0
每个字32个码
(3)MOVR6,#16;
每个字有16列
(4)MOVR1,#100;
每个字的停留时间
程序清单:
ORG00H
LOOP:
MOVA,#00H;
开机初始化,清除画面
MOVP0,A;
清除P0口
ANLP2,#00;
清除P2口
MOVR2,#200
D100MS:
MOVR3,#250;
延时100毫秒
DJNZR3,$
DJNZR2,D100MS
MOV20H,#00H;
取码指针的初值
l100:
MOVR1,#100;
L16:
MOVR6,#16;
MOVR4,#00H;
MOVR0,20H;
取码指针存入R0
L3:
MOVA,R4;
扫描指针存入A
MOVP1,A;
扫描输出
INCR4;
扫描指针加1,扫描下一个
MOVA,R0;
取码指针存入A
MOVDPTR,#TABLE;
取数据表的上半部分的代码
MOVCA,@A+DPTR
MOVP0,A;
输出到P0
INCR0;
取码指针加1,取下一个码。
MOVA,R0
取数据表下半部份的代码
MOVP2,A;
输出到P2口
INCR0
MOVR3,#02;
扫描1毫秒
DELAY2:
MOVR5,#248;
DJNZR5,$
DJNZR3,DELAY2
清除屏幕
MOVP0,A
ANLP2,#00H
DJNZR6,L3;
一个字32个码是否完成?
DJNZR1,L16;
每个字的停留时间是否到了?
MOV20H,R0;
取码指针存入20H
CJNER0,#0FFH,L100;
8个字256个码是否完成?
JMPLOOP;
反复循环
TABLE:
汉字“倚”的代码
db01H,00H,02H,00H,04H,00H,1FH,0FFH
db0E2H,00H,22H,00H,22H,0FCH,26H,88H
db2AH,88H,0F2H,88H,2AH,0FAH,26H,01H
db63H,0FEH,26H,00H,02H,00H,00H,00H
以下分别输入天,一,出,宝,刀,屠,龙,的代码,略。