51单片机总汇编语言及C语言经典实例Word格式文档下载.docx
- 文档编号:16894101
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:88
- 大小:2.06MB
51单片机总汇编语言及C语言经典实例Word格式文档下载.docx
《51单片机总汇编语言及C语言经典实例Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机总汇编语言及C语言经典实例Word格式文档下载.docx(88页珍藏版)》请在冰豆网上搜索。
SETBP1.0
LJMPSTART
DELAY:
MOVR5,#20;
延时子程序,延时0.2秒
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
END
二、多路开关状态指示
如图3所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,
P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。
(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状
态,根据每个开关的状态让相应的发光二极管指示,可以采用JBP1.X,REL
或JNBP1.X,REL指令来完成;
也可以一次性检测四路开关状态,然后让其指
示,可以采用MOVA,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
方法1(汇编源程序)
ORG00H
MOVA,P1
ANLA,#0F0H
RRA
ORLA,#0F0H
MOVP1,A
SJMPSTART
方法1(C语言程序)
图4程序流程图
#INClude<
unsignedchartemp;
temp=P1>
>
4;
temp=temp|0xf0;
P1=temp;
方法2(汇编源程序)
JBP1.4,NEXT1
CLRP1.0
SJMPNEX1
图3单片机原理图
NEXT1:
SETBP1.0
NEX1:
JBP1.5,NEXT2
CLRP1.1
SJMPNEX2
NEXT2:
SETBP1.1
NEX2:
JBP1.6,NEXT3
CLRP1.2
SJMPNEX3
NEXT3:
SETBP1.2
NEX3:
JBP1.7,NEXT4
CLRP1.3
SJMPNEX4
NEXT4:
SETBP1.3
NEX4:
SJMPSTART
方法2(C语言源程序)
if(P1_4==0)
P1_0=0;
Else
P1_0=1;
if(P1_5==0)
P1_1=0;
else
P1_1=1;
if(P1_6==0)
P1_2=0;
P1_2=1;
if(P1_7==0)
P1_3=0;
图5单片机原理图
三、广告灯的设计
利用取表的方法,使端口P1做单一灯的变化:
左移2次,右移2次,闪烁2次
(延时的时间0.2秒)。
利用MOVDPTR,#DATA16的指令来使数据指针寄存器指到表的开
头。
利用MOVCA,@A+DPTR的指令,根据累加器的值再加上DPTR的
值,就可以使程序计数器PC指到表格内所要取出的数据。
因此,只要把控制码建成一个表,而利用MOVCA,@A+DPTR做取码的操作,
就可方便地处理一些复杂的控制动作,取表过程如下图所示:
MOVDPTR,#TABLE
LOOP:
CLRA
MOVCA,@A+DPTR
CJNEA,#01H,LOOP1
JMPSTART
LOOP1:
MOVP1,A
MOVR3,#20
INCDPTR
JMPLOOP
MOVR4,#20
MOVR5,#248
图6程序流程图
DJNZR5,$
DJNZR4,D1
DJNZR3,DELAY
RRET
TABLE:
DB0FEH,0FDH,0FBH,0F7H
DB0EFH,0DFH,0BFH,07FH
DB0FEH,0FDH,0FBH,0F7H
DB07FH,0BFH,0DFH,0EFH
DB0F7H,0FBH,0FDH,0FEH
DB00H,0FFH,00H,0FFH
DB01H
unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01};
unsignedchari;
voiddelay(void)
unsignedcharm,n,s;
for(m=20;
m>
m--)
for(n=20;
n>
n--)
for(s=248;
s>
s--);
if(table[i]!
=0x01)
P1=table[i];
i++;
delay();
i=0;
四、00-59秒计时器
如下图8所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒的时间的十位,而P2口驱动显示秒的时间的个位。
在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新秒计数。
对于秒计数单元中的数据要把它十位数和个位数分开,方法仍采用对10整除和对10求余。
SecondEQU30H
ORG0000H
MOVSecond,#00H
NEXT:
MOVA,Second
MOVB,#10
DIVAB
MOVDPTR,#TABLE
MOVP0,A
MOVA,B
MOVP2,A
LCALLDELY1S
INCSecond
MOVA,Second
CJNEA,#60,NEXT
图7程序流程图
DELY1S:
MOVR5,#100
DJNZR6,D1
DJNZR5,D2
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharSecond;
voiddelay1s(void)
for(k=100;
k--)
for(j=248;
j--);
Second=0;
P0=table[Second/10];
P2=table[Second%10];
delay1s();
Second++;
if(Second==60)
图8单片机原理图
五、动态数码显示技术
如图9所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接
一个开关,当开关接高电平时,显示“12345”字样;
当开关接低电平时,显示“HELLO”字样。
动态扫描方法:
动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。
在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。
对于显示的字形码数据我们采用查表方法来完成。
图9单片机原理图
JBP1.7,DIR1
MOVDPTR,#TABLE1
SJMPDIR
DIR1:
MOVDPTR,#TABLE2
DIR:
MOVR0,#00H
MOVR1,#01H
MOVA,R0
MOVA,R1
LCALLDAY
INCR0
RLA
MOVR1,A
CJNER1,#0DFH,NEXT
DAY:
MOVR6,#4
图10单片机原理图
TABLE1:
DB06H,5BH,4FH,66H,6DH
TABLE2:
DB78H,79H,38H,38H,3FH
Unsignedcharcodetable1[]={0x06,0x5b,0x4f,0x66,0x6d};
Unsignedcharcodetable2[]={0x78,0x79,0x38,0x38,0x3f};
Unsignedchari;
Unsignedchara,b;
Unsignedchartemp;
while
(1)
temp=0xfe;
for(i=0;
i<
5;
i++)
{
if(P1_7==1)
P0=table1[i];
}
else
P0=table2[i];
P2=temp;
a=temp<
<
(i+1);
b=temp>
(7-i);
temp=a|b;
for(a=4;
a>
a--)
for(b=248;
b>
b--);
六、4×
4矩阵式键盘识别技术
如图11所示,用AT89S51的并行口P1接4×
4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;
在数码管上显示每个按键的“0-F”序。
对应的按键的序号排列如图12所示每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么;
还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的
功能。
KEYBUFEQU30H
MOVKEYBUF,#2
WAIT:
MOVP3,#0FFH
CLRP3.4
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY1
LCALLDELY10MS
CJNEA,#0EH,NK1
MOVKEYBUF,#0
LJMPDK1
NK1:
CJNEA,#0DH,NK2
MOVKEYBUF,#1
NK2:
CJNEA,#0BH,NK3
MOVKEYBUF,#2
NK3:
CJNEA,#07H,NK4
MOVKEYBUF,#3
NK4:
NOP
DK1:
MOVA,KEYBUF
DK1A:
MOVA,P3
JNZDK1A
NOKEY1:
CLRP3.5
JZNOKEY2
CJNEA,#0EH,NK5
MOVKEYBUF,#4
LJMPDK2
NK5:
CJNEA,#0DH,NK6
MOVKEYBUF,#5
NK6:
CJNEA,#0BH,NK7
MOVKEYBUF,#6
NK7:
CJNEA,#07H,NK8
MOVKEYBUF,#7
NK8:
DK2:
DK2A:
JNZDK2A
NOKEY2:
CLRP3.6
JZNOKEY3
CJNEA,#0EH,NK9
MOVKEYBUF,#8
LJMPDK3
NK9:
CJNEA,#0DH,NK10
MOVKEYBUF,#9
NK10:
CJNEA,#0BH,NK11
MOVKEYBUF,#10
NK11:
CJNEA,#07H,NK12
MOVKEYBUF,#11
NK12:
DK3:
DK3A:
JNZDK3A
NOKEY3:
CLRP3.7
JZNOKEY4
CJNEA,#0EH,NK13
MOVKEYBUF,#12
LJMPDK4
NK13:
CJNEA,#0DH,NK14
MOVKEYBUF,#13
NK14:
CJNEA,#0BH,NK15
MOVKEYBUF,#14
NK15:
CJNEA,#07H,NK16
MOVKEYBUF,#15
NK16:
DK4:
DK4A:
JNZDK4A
NOKEY4:
LJMPWAIT
DELY10MS:
MOVR6,#10
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsignedcharkey;
unsignedchari,j;
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&
0x0f;
if(temp!
=0x0f)
for(i=50;
for(j=200;
switch(temp)
case0x0e:
key=7;
break;
case0x0d:
key=8;
case0x0b:
key=9;
case0x07:
key=10;
P1_0=~P1_0;
P0=table[key];
while(temp!
P3_5=0;
key=4;
key=5;
key=6;
key=11;
P3_6=0;
key=1;
key=2;
key=3;
key=12;
P3_7=0;
key=0;
key=13;
key=14;
key=15;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 汇编语言 语言 经典 实例