如图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集成...