51单片机汇编语言及C语言经典实例

发布 2019-07-18 02:44:57 阅读 9316

如图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 <>

sbit l1=p1^0;

void delay02s(void) /延时 0.2 秒子程序。

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 0start: clr p1.0

lcall delay

setb p1.0

lcall delay

ljmp start

delay: mov r5,#20 ;延时子程序,延时 0.2 秒。

d1: mov r6,#

d2: mov r7,#

djnz r7,$

djnz r6,d2

djnz r5,d1

retend

如图 3 所示,at89s51 单片机的 p1.0-p1.3 接四个发光二极管 l1-l4,p1.

4-p1.7 接了四个开关 k1-k4,编程将开关的状态反映到发光二极管上。

开关闭合,对应的灯亮,开关断开,对应的灯灭)。

对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状。

态,根据每个开关的状态让相应的发光二极管指示,可以采用 jb

或 jnb 指令来完成;也可以一次性检测四路开关状态,然后让其指。

示,可以采用 mov a,p1 指令一次把 p1 端口的状态全部读入,然后取高 4 位的状态来指示。

方法1(汇编源程序)

org 00h

start: mov a,p1

anl a,#0f0h

rr arr a

rr arr a

orl a,#0f0h

mov p1,a

sjmp start

end方法1(c语言程序)

#include <>

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

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 <>

void main(void)

while(1)

if(p1_4==0)

p1_0=0;

elsep1_0=1;

if(p1_5==0)

p1_1=0;

elsep1_1=1;

if(p1_6==0)

p1_2=0;

elsep1_2=1;

if(p1_7==0)

p1_3=0;

else利用取表的方法,使端口 p1 做单一灯的变化:左移 2 次,右移 2 次,闪烁 2 次。

延时的时间 0.2 秒)。

利用 mov dptr,#data16 的指令来使数据指针寄存器指到表的开。

头。利用 movc a,@a+dptr 的指令,根据累加器的值再加上 dptr 的。

值,就可以使程序计数器 pc 指到**内所要取出的数据。因此,只要把控制码建成一个表,而利用 movc a,@a+dptr 做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:

汇编源程序。

org 0start: mov dptr,#table

loop: clr a

movc a,@a+dptr

cjne a,#01h,loop1

jmp start

loop1: mov p1,a

mov r3,#

lcall delay

inc dptr

jmp loop

delay: mov r4,#

d1: mov r5,#

djnz r5,$

djnz r4,d1

djnz r3,delay

rrett able: db 0feh,0fdh,0fbh,0f7h

db 0efh,0dfh,0bfh,07fh

db 0feh,0fdh,0fbh,0f7h

db 0efh,0dfh,0bfh,07fh

db 07fh,0bfh,0dfh,0efh

db 0f7h,0fbh,0fdh,0feh

db 07fh,0bfh,0dfh,0efh

db 0f7h,0fbh,0fdh,0feh

db 00h, 0ffh,00h, 0ffh

db 01h

endc 语言源程序。

#include <>

unsigned char code table=

unsigned char i;

void delay(void)

unsigned char m,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--)

void main(void)

while(1)

if(table[i]!=0x01)

p1=table[i];

i++;delay();

elsei=0;

如下图8所示,在 at89s51 单片机的 p0 和 p2 端口分别接有两个共阴数码管,p0 口驱动显示秒的时间的十位,而 p2 口驱动显示秒的时间的个位。在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加 1,当秒计数达到 60 时,就自动返回到 0,重新秒计数。

对于秒计数单元中的数据要把它十位数和个位数分开,方法仍采用对 10 整除和对 10 求余。

汇编源程序。

second equ 30h

org 0000h

start: mov second, #00h

next: mov a, second

mov b,#

div ab

mov dptr,#table

movc a,@a+dptr

mov p0,a

mov a,b

movc a,@a+dptr

mov p2,a

lcall dely1s

inc second

mov a,second

cjne a,#60,next

ljmp start

dely1s: mov r5,#

d2: mov r6,#

d1: mov r7,#

djnz r7,$

djnz r6,d1

djnz r5,d2

rettable: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

endc 语言源程序。

#include <>

unsigned char code table=

unsigned char second;

void delay1s(void)

unsigned char i,j,k;

for(k=100;k>0;k--)

for(i=20;i>0;i--)

for(j=248;j>0;j--)

void main(void)

second=0;

p0=table[second/10];

p2=table[second%10];

while(1)

delay1s();

second++;

if(second==60)

second=0;

p0=table[second/10];

p2=table[second%10];

如图 9 所示,p0 端口接动态数码管的字形码笔段,p2 端口接动态数码管的数位选择端,p1.7 接。

一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“hello”字样。

C51单片机实验总结报告

hefei university 单片机实验报告。系别电子信息与电气工程系 专业。班级。学号。姓名。指导老师。完成时间。一 预习要求 1 构建单片机最小系统,熟悉51单片机的结构及编程方法。2 按照程序流程图编写出程序。二 实验目的。1 熟悉星单片机最小系统的组成和工作原理,熟悉keil c51集成...