51单片机汇编语言及C语言经典实例 |
实验及课程设计 |
51单片机汇编语言及C语言经典实例 |
一、闪烁灯
如图1 所示为一简单单片机系统原理图:在 P1.0 端口上接一个发光二极管 L1,使 L1 在不停地一亮一灭,一亮一灭的时间间隔为 0.2 秒。
延时程序的设计方法,作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为 0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程
序是如何设计呢?下面具体介绍其原理:如图 4.1.1 所示的石英晶体为 12MHz,因此,1 个机器周期为 1 微秒,机器周期 微秒如图 1 所示,当 P1.0 端口输出高电平,即 P1.0=1
时,根据发光二极管的单向导电性可知,这时发光二极管 L1 熄灭;当 P1.0 端口输出低电平,即 P1.0=0 时,发光二极管 L1 亮;我们可以使用 SETB P1.0 指令使 P1.0端口输出高电平,使用 CLR P1.0 指令使 P1.0 端口输出低电平。
C 语言源程序
#include <AT89X51.H>
sbit L1=P1^0;
void delay02s(void) //延时 0.2 秒子程序
{
图1 单片机原理图
unsigned char i,j,k;for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
L1=1;
delay02s();
}
汇编源程序
ORG 0
START: CLR P1.0
LCALL DELAY
图2 程序设计流程图
SETB P1.0LCALL DELAY
LJMP START
DELAY: MOV R5,#20 ;延时子程序,延时 0.2 秒
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
二、多路开关状态指示
如图 3 所示,AT89S51 单片机的 P1.0-P1.3 接四个发光二极管 L1-L4,
P1.4-P1.7 接了四个开关 K1-K4,编程将开关的状态反映到发光二极管上。
(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状
态,根据每个开关的状态让相应的发光二极管指示,可以采用 JB P1.X,REL
或 JNB P1.X,REL 指令来完成;也可以一次性检测四路开关状态,然后让其指
示,可以采用 MOV A,P1 指令一次把 P1 端口的状态全部读入,然后取高 4 位的状态来指示。
方法1(汇编源程序)
ORG 00H
START: MOV A,P1
ANL A,#0F0H
RR A
RR A
RR A
RR A
ORL A,#0F0H
MOV P1,A
SJMP START
END
方法1(C语言程序)
图4 程序流程图
#INClude <AT89X51.H>unsigned char temp;
void main(void)
{
while(1)
{
temp=P1>>4;
temp=temp | 0xf0;
P1=temp;
}
}
方法2(汇编源程序)
ORG 00H
START: JB P1.4,NEXT1
CLR P1.0
SJMP NEX1
图3 单片机原理图
NEXT1: SETB P1.0
NEX1: JB P1.5,NEXT2
CLR P1.1
SJMP NEX2
NEXT2: SETB P1.1
NEX2: JB P1.6,NEXT3
CLR P1.2
SJMP NEX3
NEXT3: SETB P1.2
NEX3: JB P1.7,NEXT4
CLR P1.3
SJMP NEX4
NEXT4: SETB P1.3
NEX4: SJMP START
END
方法2(C 语言源程序)
#INClude <AT89X51.H>
void main(void)
{
while(1)
{
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;
}
else
{
P1_2=1;
}
if(P1_7==0)
{
P1_3=0;
}
else
图5 单片机原理图
三、广告灯的设计
利用取表的方法,使端口 P1 做单一灯的变化:左移 2 次,右移 2 次,闪烁 2 次
(延时的时间 0.2 秒)。
利用 MOV DPTR,#DATA16 的指令来使数据指针寄存器指到表的开
头。
利用 MOVC A,@A+DPTR 的指令,根据累加器的值再加上 DPTR 的
值,就可以使程序计数器 PC 指到表格内所要取出的数据。因此,只要把控制码建成一个表,而利用 MOVC A,@A+DPTR 做取码的操作,
就可方便地处理一些复杂的控制动作,取表过程如下图所示:
汇编源程序
ORG 0
汇编语言如何编程START: MOV DPTR,#TABLE
LOOP: CLR A
MOVC A,@A+DPTR
CJNE A,#01H,LOOP1
JMP START
LOOP1: MOV P1,A
MOV R3,#20
LCALL DELAY
INC DPTR
JMP LOOP
DELAY: MOV R4,#20
D1: MOV R5,#248
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论