-
单片机编程实例100例大全
单片机编程实例
*
< br>实例
1:
使用
P3
口流水点亮
8
位
L
ED
#
i
n
clud
e
e
g
5
1
、
h
>
//
包含单片机寄存器得头文件
/
函数
功能:延时一段时间
v
o
id d
el
a
y
(voi
d
)
{
unsigned
char i,j
;
for(i
=0;
i<2
5<
/p>
0;i
+
+)
for(j=0;j
〈2
50;j++)
;
}
/
函数功能
:
主函数
vo
id mai
n
< br>(
vo
id)
{
wh
il
e
(1)
{
P3=0x
f
e;
/
/第一个灯亮
de
la
y(
)
;
//
调用延时函数
P
3=
0
xf
d
;
/
/<
/p>
第二个灯亮
d
el
a
y
()
; /
/调用延时函数
P3=0x<
/p>
f
b
;
//第三个灯亮
d
< br>el
ay
(
);
/
/
调用延时函数
P3=0xf7; //
第四个灯亮
dela
y
()
;
//
调用延时函数
P
3
=0xef;
/
/第五个灯亮
de
l
ay
()
;
//
调用延时函数
P3=0xd
f
;
< br>/
/
第六个灯亮
d
elay
()
;
//
调用延时函数
P3=
0x
bf;
< br>/
/
第七个灯亮
delay(); //
调用延时函数
P3=0x7f
;
//
第八个灯亮
delay
(
);
//
调用延时函数
}
/
/
}
*
实例
2:
通
过对
P3
口地址得操作流水点亮
8
p>
位LED
#in
c
lude
〈
reg5
1、
h
〉
//
包含单片机寄存器得头文件
sf
r x=0xb0; //P3
口
在存储器中得地址就是
b
0
H,
p>
通过
sfr
可定
义
8
051
内核单片机
//
得所有内部8位特殊功能寄存器,对地址
x
得操作也就就是对P
1
口得操作
/
函数功能
:
延时一段时间
/
v
o
id
d
e
l
a
y
(v
oid)
{
uns
i
gne
d
char
i,j
;
f
or(
i
=0
;i<
2
50
;i++)
for
(j=
0;j
〈<
/p>
25
0
;
j
p>
++
)
;
p>
/
/
利用循环等待若干机器周期,从而延时
一段时间
}
/
函数功能
:
主函数
/
v
o
i<
/p>
d
main(v
o
id
)
{
while(1)
{
x
=0x
f
e;
//
第一个灯亮
d
elay()
;
/
/调用延时函数
< br>x=0x
f
d
;
//
第二个灯亮
d
e
lay
(
);
//
调用延时函数
x=0
x
fb;
//
第三个灯亮
del
a
y
(
);
/
/
调用延时函数
x=
0
x
f
7
;
//第四个灯亮
delay(
);
//
调用延时函数
x=0
x
ef
;
//
第五个灯亮
d
p>
el
a
y
();
//
调用延时函数
x=0xdf;
/
/
第六个灯亮
d
elay(
);
/
/调用延时函数
x=0xbf
;
//
第七个灯亮
d
el
ay();
//
调用延时函数
x=
0
x7f
;
/
/
第八个灯亮
d
e
la
y
(
)
;
//
调用延时函数
}
}
*<
/p>
实例
3:
用不同数据类型控制灯闪烁时间
#
inc
l
ude
〈
reg51
< br>、
h
〉
/
/包含单片机寄存器得头文件
/
函数功能
:
用整形数据延时一段时间<
/p>
/
void
i
nt
_
d
elay
(
voi
d
< br>)
//
延时一段较长得时间
{
u
n
si
g
ned int
m;
//
定义无符号整形变量
,
双字节数据,值域
p>
为
0~
6
5535
f
o
r
(m=
0
;
m
〈
36
0
00
;m
+
+)
;
//空操作
}
/
函数功能
:
用字符型数据延时一段时间
/
void c
h
a
r_del
ay(void)
//
延时一段较短得时间
{
unsigned cha
r
i
,j
;
/
/
定义无符号字符型变量
,
单字节数据
,
值
域0
~2
55 for(i=0;i<20
0
;i++)
for(j=0
;j<
1
8
0;j++)
;
/
/空操作
}
/
函数功能
:
主函数
/
void mai
n
(
v
oid)
{
un
s
i
g
ne
d
ch
ar
i
;
w
hi
le
(
1)
{
f
o
p>
r
(i
=0
;i<
3
;
i++
)
{
P1<
/p>
=0
x
f
e;
//
P
1、
0
口得灯点亮
i
n
t_d
e
lay
< br>(
);
//
延时一段较长得时间
P1=
p>
0
x
f
f
;
/
/
熄灭
<
/p>
in
t
_
d
p>
el
a
y()
;<
/p>
//
延时一段较长得时间
}
f
or<
/p>
(
i
=0;
i<
3;i++)
{
P1=0x
ef
;
< br>/
/P
1、
4
< br>口得灯点亮
cha
r
_
d
e
l
ay
(
)
;
//
延时一段较长得时间
} P1
=0
xff
< br>;
//
熄灭
c
h
ar
_
d
e
lay
(
);
//
延时一段较长得时
间
}
}
*
实例<
/p>
4
:用单片机控制第一个灯亮
#
inc
/ 单片机寄存器定义得头文件 <
br>11
lude
e
g5
1、h
>
/
包含
51
v
oid
main
(
void)
{
P
1
=0xf
e;
p>
//P1=1
1
11
10B,
即
P1
、0输出低电平
}
<
/p>
*实例
5
:用单片机控制一个灯闪烁:认
识单片机得工作频率
#
i
n
cl
ude〈
reg<
/p>
51、
h>
/
/包含单片机寄存器得头文件
/
函数功能:延时一段时间
/
v
o
i
d <
/p>
d
e
l
ay(<
/p>
v
oid)
/
/
两个v
oid
意思分别为无需返回值
,
没
有参数传递
{
unsigned
int
i
;
//
定
义无符号整数
,
最大取值范围6
553
5 f
o
r(i=0;
i<
20
00
0
;
i++
)
//
做20
0
00次空循环
; //
什么也不做
,
等待一个机器周期
}
/
函数功能
:
主函数
(C
语言规定必须有也只能有1个主函数)
/
v
o
i
d
main(void)
{
while(
1
)
/
/
无限循环
{
P1=0xfe;
//
P
1=1111
11
10B,
P
1、0输出低电平
dela
y
(
)
; /
/延时一段时间
P
1
=0x
ff;
//P1=1111
1111B
,
P1
< br>、
0
输出高电平
del
a
y
();
//
延时一段时间
}
}
*实例
6:
将
P
1口状态分别送入
P
0、
P
2、
P3
口
:
认识
I
/
O
口
得引脚功能
#inc
lu
de
〈
reg51
、
h>
/
/包含单片机寄存器得头文件
/
函数功能:
主函数
(C
语言规定必须有也只能有
1
个主函数
)
voi
d
ma
i
n(
vo
i
d
)
{
w
h
p>
ile(
1
)
//
无限循环
/
{
P1<
/p>
=
0xff
;
/
/
P1=1
11
1
1111B,
熄灭L
E
D
P
0=P1;
/
/
将
P
1口状态送入
P0
口
< br>
P2=
P
1;
//
将
P
1
口状态送入
P2
口
< br>
P3
=
P1;
/
/
将
P
1口状态送入
P
3口
< br>
}
}
*
< br>实例7
:
用
P
< br>0口、P1
口分别显示加法与减法运算结果
#in
c
lude
<
r
e
g5
1、h
>
voi
d
m
ai
n
(vo
i
d
)
{
u
n
s
i
g<
/p>
ned
c
h
ar m,n;
m=
4
3;
//
即十进制数
2x
1
6+11=43
n
=
6
0;
//
即十进制数3
x1
6
+
1
2=60
P
1
=
m
+n;
//
P
1
=
1
03
=0110 <
/p>
0111
B
,
结
果
P1
、
3
、
P1
、
4
、<
/p>
P
1、
7
口得灯被点亮
P0
=n-
m; /
< br>/
P0=17
=
0001 00
0
1
B,
结果
P
0、
0
、
P
0、
4
得灯被熄灭
}
*
实例8:用P
0
、P1口显示乘法运算结果
#
include
〈
reg51
、
h
〉
/
/包含单片机寄存器得头文件
vo
i
d
main
(
void)
{
u
n
sign
e
d
ch
a
r
m
,
n
;
unsigned
int
s;
m=
6
4;
n=71
;
s=m n;
/
/
s
=64
7
1=
4
5<
/p>
4
4,
需要
16
位二进制数表示,高
8
位送
P1
口,低8位送
P
0口
//
由于
4
544
=1
7
256+19
2=
H3 16
16
1
6+
H2
16 16+H1 16+
H0
/<
/p>
/
两边同除以
256,
< br>可得
17
+
19
2
/256=H3
1
6
p>
+H2+
(
H
1<
/p>
16+
H0
)/
2
56
//
因此
< br>,
高
8
位1
6
进制数
H3
16+H
2必然等于
17,
即454
4
除以
256
得商
//
低8位1
6
进制数
H1 16
+
H0
必然等于
1
9
2,
即
45
4
4
除以
256
得
余数
P
1
=s/2
5
6
;
//
高
8
位送
P1
口
,
P
1=17
=
11H=000
1
0001B,
P1
、
0与
P
1
、
4
口灭
,
其余亮
P0=s%256
;
//
低
8
位送
P
0口
,
P3
=
192=c0H=
1<
/p>
1
00
0
00
0
B,
P
3、
1,
P
3
、
6
,
P3、
7
口灭
,
其余亮
}
*
实例<
/p>
9:
用
P1
、<
/p>
P0
口显示除法运算结果
n(void
#include
、
h
〉
/
/包含单片机寄存器得头文件
v
oid m
ai
)
{
P1
=
36/5;
//
求整数
P0=((36
%
5)
10)
/5;
/
/求小数
while(1
)
;
//
无限循环防止程序“跑飞”
}
*
实例
1
0
:用自增运算控制
P
0口
8
位
LED
流水花样
p>
#in
c
l
p>
u
de
〈r
eg<
/p>
5
1
、
h
〉
//
包含单片机寄存器得头文件
/
函数功能
:
延时一段时间
/
void del
a
y
(
v
o
id)
{
u
nsigned
i
n
t
i;
f
or
(
i=
0
;
i<20
0
0
0
;i
++)
;
}
/
函数功能?:主函数
/
v
oid
main(void)
{
unsi
g
n
e
d
char
i;
for(i=0
;<
/p>
i
〈
2
5
5
;
i
+
+)
/
/注意
i
得值不能超过
2
5
5
{
P0=i
;
//
将
i
得值送
P
0口
de
lay(
)
;
//
调用延时函数
}
}
*
实例
1
1
:
用P
0<
/p>
口显示逻辑”与”运算结果
#i
nclu
d
e
〈
p>
reg51
、
h
〉
//
包含单片机寄存器得头文件
voi
d
mai
n(
v
oi
d)
{
P0
=
(
4>
0
)
&
&
(9>
0
x
a
b)
;
/
/将逻辑运算结果送
P0
口
wh
i
l
e(
1)
;
/
/设置
无限循环
,
防止程序“跑飞”
}
*
实例
1
2
:用
P0
口显示条件运算结果
#i
n
cl
ud
e
〈
r
e
g51
、
h
〉
/
/包含单片机寄存器得头文件
void
< br>m
a
in
(v
< br>oid)
{
P0
=
(
8>4)
?
8
:
4;
/
/
将条件运算结果送
P0
口,
P0=8=0000
1000
B
whil
e
(1
)
;
//设置无限循环
,
防止程序“跑飞”
}
*
实例1
3
:用P
0
口显示按位”异或”运算结果
#i
n
c
lud
e
〈
reg
5
1
、
h
〉
//
包含单片机寄存器得头文件
vo
i
d
m
ai
n
(v
o
id
)
{
P0=0x
a
2^0
< br>x
3
c
;//
< br>将条件运算结果送
P0
口
,
p>
P0
=8=0000
100
0
B
while
(
1
)
;
//
设置
无限循环
,
防止程序“跑飞”
}
*
实例<
/p>
16:
用
P0
显
示左移运算结果
#
in
c
lude<
reg5
1<
/p>
、
h
〉
//包含单片机寄存器得头文件
void
< br>main(v
o
id
)
{
P0=0x3b
〈〈
2
;//将左移运算结果送
P0<
/p>
口
,P
0
=11
1
0
11
0
0
B=
0
xe
c
whil
e
(1)
; //
无限循环
,
< br>防止程序“跑飞”
}
*
p>
实例17:”万能逻辑电路
实验
#
i
nclude
p>
〈r
e
g
51
p>
、
h
〉
//
包含单片机寄存器得头文件
s
b
it
F=
P
1^4;
/
< br>/
将
F
位定义为
P
1、
4
s
bit
X
=
P
1
^5;
//
将X位定义为
P1
、
5
sbi
t
Y=P
1
^6
;
/
/将
Y
位定义为
< br> P
1、
6
s
bi
t
Z=P1^
7
;
/
< br>/
将
Z
位定义为
P1
、7
v
oid
ma
i
n
(voi
d)
< br>
{
whil
e
(1
)
{
F=((
~X
)
&
Y)|
Z;
//
将逻辑运算结果赋给
F
;
}
}
*
实例
18:
用右移运算流水点亮
P1
口8位L
E<
/p>
D
#i
n
p>
clude
〈
r
e
g51
、
h
〉
//
包含单片机寄存器得头文件
/
函数功能
:
延时一段时间
/
void de
l
ay(vo
i
d)
{
unsig
n
ed
in
t
n;
for(
n=
0;n
〈3
0000<
/p>
;n
++
)
;
}
/
函数功能
:
主函数
/
v
o
id
main(voi
d)
{
unsi
g
ned
ch
ar
i
;
while(1)
{
P1=
0
xff
;
delay
()
;
< br>f
or
(
i=0
;
i
〈
8;
< br>i
++)/
/设置循环次数为
8
{
P1=
P
1
〉〉
1;
//每次循环
P1
得各二进位右移
1<
/p>
位
,
高位补
0
de
lay();
//
调用延时函数
}
}
}
*
实例<
/p>
19
:
用
i
p>
f语句控制P
0
口
8
位
L
E
D<
/p>
得流水方向
#
in
clu
d
e
<
r
eg51
、
h>
//
包含单片机寄存器得头文件
s
bit S1=P
1
^
4
;
//
将
S1
位定义为
P
1、
4
sb
it
S2=
P
1^5
;
//将
S2
位定义为P
1
、
5
/
函数功能:主函数
/
void m
a
in(vo
id)
{
while
(
1
)
}
{
if(S
1
==0) //
如果按键<
/p>
S1
按下
P<
/p>
0
=
0x0
f;
/
/P0口高四位
L
ED
点亮
i
f(S2==0
)
//
如果
按键
S
2按下
P0=
0x
f0;
//P0
口低
四位LE
D
点亮<
/p>
}
*实例2
0
:
用s
wt
i
ch
语句得控制
P0
口
8
位L
E
D得点亮状态
#in
c
lu
d
(
e
g<
/p>
5
1、
h
〉
p>
//
包含单片机寄存器得头文件
sbit S1=
P
1^4;
/
/
将
S1
位定义为
P1
、
4
/
函数功能:延时一段时间
/
v
oi
d
<
/p>
del
a
y
(v
oi
d
)
{
u
n
sig
n
ed
i
nt
n
;
for(
n
=0;n<100
00
;n++)
;
}
/
函数功能
:
主函数
/
v
oid
m
ain(voi
d
)
{
u
ns
i
g
n
ed
c
h
ar i;
i
=0
;
/
/
将
i
初始化为
0
w
h
ile
1)
{
if
(
S1
=
=0)
//
如果
S1
键按下
p>
{
de
l
a
y
()
;
//
延时一段时间
if(S
1
==0)
//
如果再次检测到
S1
键按
下
i
++;
/
/i
自增
1
i
f(i
==
9
)
//
如果
i=9,
重新将其置为
1
i=1
;
}
swi
t
c
h
(i
)<
/p>
//
使用多分支选择语句
{
}
}
cas
e
1:
P
0=
0
xfe
;
//
第一个
LE
D亮
< br> bre
a
k
;
c
a
s
e
2:
P
0
=
0
xfd;
/
/第二个
L
ED亮
b
r
e
a
k;
ca
se
3:P
0=
0xfb
;
//
第三个L
ED
亮
b
r
eak
;
ca
se
4
:
P
0
=0
x
f7;
//
第四个
< br>LED
亮
br
e
ak;
c
a
s
e
5
:P0=0xef;
/
/
第五个LE
D
亮
brea
k
;
c
as
e
<
/p>
6
:P0
=0
x
d
f; //
第六个
< br>LED
亮
brea
k;
c
ase
7:P0=0xb
f
; //
第七个<
/p>
LED
亮
b
rea
k;
c
a
s
e <
/p>
8
:
P
0
=0
x7
f
;
p>
//
第八个
LE
D
亮
br
eak;
defau
l
t:
/
/
缺省值
,
关闭所有
LE
D
P0
=0xff;
}
*
实例
2
1:用f
or
语句控制蜂鸣器鸣笛次数
#incl
u
de
<
r
e
g5
1、
h
〉
//
包含单片机寄存器得头文件
sb
it
so
u
nd=P
3
^
7;
/
/
将
sou
nd位定义为
P3
、
7 /
函数功能:延时形
成
1600H
z音频
/
void
de
la
y
16
00(
void
)
{
u
nsigned
char
n;
f
or
(
n
=
0
p>
;n
<100;n+
+)
< br>
;
}
/
函数功能:延时形成
8
0
0H
z音频
/
voi
d
de
l
ay8
0
0
(
vo
i
d)
{
u
nsi
gne
d
c
har
n
;
f
or
(
n
=
0
;n
<200;n+
+
)
;
}
/
函数功能
:
主函数
/
v
oi
d
main
(v
oid)
{
un
s
igned
in
t
i
;
while(1
)
{
for(i=
0
;i<830;i+
+
)
{
soun
d=0;
//P
3、7输出低电平
d
e
l
a
y1600
p>
(
)
;
sound=
1
;
< br>//
P
3
、
7
输出高电平
delay1600();
}
for(
i=0
< br>;
i<200;i+
+)
{
sou
n
d=0; /
/
P3
、7输出低电平
d<
/p>
el
ay80
0
()
;
soun
d
=
1
;
/
/
P
3
、
7
输出高电平
del
a
y80
0
()
;
}
}
}
*实
例2
2:
用
w
h
ile
语句控制
LE
D
#i
n
< br>cl
u
de
〈
< br>re
g
5
1、h
>
/
/
包含单片机寄存器得
头文件
/
函
数功能
:
延时约
60ms
(
3
10
0
2<
/p>
00
=6
0
00
0μs
) /
vo
i
d
d
e
lay60m
s
(vo
i
d)
{
un
sig
n
ed
char m
,n;
f
o
r(
m
=0
;m<
10
0;m
+
+
)
f
or(n<
/p>
=
0;
n<2
0
0;
n
++)
;
}
/
函数
功能
:
主函数
/
vo
i
d
main(v
o
id)
{
uns
i
gned
c
ha
r
i
;
whil
e(1
)
//无限循环
{
i=0
;
//
将i初始化为
0
whil
e
(i
〈0
xff) //
当
i
小
于
0x
f
f(2
5
5)
时执行循环体
{
P
0=i;
/
/将i送
P0
口显示
d
e
la
y
60ms(
);
//
延时
i
++;
/
/
i自增
1
}
}
}
*
实例
2
3
:
用
d
p>
o
-
wh
ile<
/p>
语句控制
P
0口
8
位L
ED
流水点亮
< br> #inc
l
u
d
<
br>0=60 a <
br>v
<
br>/ <
br>ED亮 <
br>/
e
e
g51
、h〉
p>
/
/
包含单片机
寄存器得头文件
/
函数功能
:
延时约
60m
s<
/p>
(3 100
2
0
000μs
)
/
void d
e
l
y60
m
s(
oi
d
)
{
uns
i
gne
d
char
m
,
n
;
fo
r
(
m=
0
;
m
〈
100;
m
+
+)
fo
r
(n=0
;n〈
2
0
0;
n
++
)
;
}
/
函数功能:主函数
/
v
oid
m
ai
n
(
vo
i
d
)
{
do
{
P0=0xf
e;
/
第一个
L
delay60
m
s();
}
P0=0
xfd
;
/第二个
LED
亮
de
l
ay
60m
p>
s()
;
P0=0x
fb;
//
第三个
L
E
D
亮
de
la
y6
0
ms
(
)
;
P0
=0x
f
7;
//第四个
L
E
D
亮
d<
/p>
e
l
ay60ms()
< br>;
P0=
0
x
e
f
;
/
/
第五个
LED
亮
delay60ms()
;
P
0
=0xdf
;
//
第六个LED亮
d
el
ay6
0
ms()
p>
; d
e
lay
6
0m
s();
P0=
0
xbf; //
第七个LE<
/p>
D
亮
de
l<
/p>
ay
6
0ms
(
);
P
0
=
0
x7
f
;
//
第八个
LED
亮
de
l
a
y60ms()
;
}wh
i
le
(
1
);
//
无限循环,使
8
位
LED
循环流水点亮
*
实例
24:
用字符型数组控制
P0
口
8
位
LED
流水点亮
#
i
n
c
< br>l
u
de
〈
r
e
g51
、
h
〉
/
/
包含单片机寄存器得头文件
/
函数功能:延时约
60ms (3 100
< br>200=
6000
0μs)
/
vo
i
d
del
a
y60ms
< br>(
vo
i
d
)
{
unsi
g
ne
d
cha
r
m,n
;
for
(m
=0;m
〈
100;m
+
+)
f
o
r(n
=
0
;
n
〈
2
0
0;n++)
;
}
/
函数功能
:
主函数
/
v
o
i
d
main
(
v
oid
)
{
u
ns
i
g
n
ed
cha
r
i;
unsi
g
n
e
d
char
code
T
ab[
]
=
{
0xfe
,
0
x
f
d
,
0xfb
,
0
x
f7
,
0xef
,0x
df,0
x
bf,
0x
p>
7f}
;
/
p>
/
定义无符号字符型数组
wh
ile(
1
)
{
for(
i=
p>
0
;
i
〈
8
;
i+
+)
{
P
0
=Tab
[
i];//<
/p>
依次引用数组元素,并将其送P0口显示
delay60
ms
(
)
;
/
/
调用延时函数
p>
}
}
}
*实例
25:
< br>用
P0
口显示字符串常量
#include
1、h>
/
/包含单片机寄存器得头文件
/
函数功能
:
延时约
1
5
0ms
(
3
2
0
0
250
=1
5
0 00
0μs=
1
50
ms
/
void
de
lay
150
m
s
(
void
)
{
unsi
g
ned char
m,n
;
f
or(m=0
;
m
〈2
00;m
+
+
)
for(n=0;n
<<
/p>
250
;n+
+)
;
}
/
函数功能:主函数
/
voi
d
m
ai
n(
vo
i
d)
{
unsign
e
d
c
h
ar
s
t
r
[]
=<
/p>
{
w,
Temp
eratu
r
e
is
:”};
//
将字符串赋给字符型全部元素赋值
u
nsigned
c
h
ar i;
while(1
)
{
i=0; //
将
i
初始化为
0
,从第一个元素
开始显示
while(
str
[i
]!=’
0'<
/p>
)
//
只要没有显示到结束标志'\0
'
{
P
0
=<
/p>
str[i]
;
//
< br>将第
i
个字符送到
P0
口显示
d
e
lay
15
0
m
s
(
)
;
//
调用
15
0m
p>
s
延时函数
i<
/p>
+
+
;
/
/
指向下一个待显字符
}
}
}
< br>*实例
26:
用P
0
口显示指针运算结果
#in
c
lu
d
e
<
re
g
5
1、
h
〉
voi
d
m
a
in
(
v<
/p>
o
id)
{
u
nsigne
d
ch
ar
p1,
p
2
;
//
定义无符号字符型指针变量
p1
,
p>
p2
uns
ig
ne
d
c
h
ar
i
,
j;
//
定义无符号字符型数据
i=25; //
给
i
赋初值
25
j
=
1
5;
p
1=
&
i;
//
使指针变量指向
i
,对指针初始化
p2=&j
;
//
使指针变量指向
j
,
对指针初始化
P0=
p
1
+
p
2
;
/
/
p1+
p2
相当于i
+j,
所以
P
0
=25+15=
4<
/p>
0=0x28
/
/则P0
=0
0
10
1000
p>
B
,
结果
P0
p>
、
3
、P
0
、5引脚
L
E
D
p>
熄灭
,
其余
点亮<
/p>
wh
i
le(1)
; //
无限循环,防止程序“跑飞”
}
*
实例<
/p>
2
7
:
用指针数
组控制
P0
口
8
位LE
D
流水点亮
#in
clude
〈r
eg51
、h〉
/
函数功能
:
延时约
150
ms
(
3
2
00
2
5
0=
1
50
000μs=1
50
m
s
/
voi
d
d
ela
y
15
0m
s(voi
d)
{
unsigne
d
char
m,n;
for(
m
=0;m
〈
2
00
;m+
p>
+
)
f
o
r
(n
=
0;
n〈
250
;
n++
)
;
}
/
函数功能:主函数
/
vo
i
d main
< br>(
vo
i
d
)
{
unsigned
c
ha
r code T
a
b
[]=
{0xf
e,0
xfd
,
0x
f
b
,0x
f
7
,0x
e
f
,0xd
f,
0xbf,0x7
f
p>
}
;
un
s
ign
ed
c
h
a
r
p
[
]
=<
/p>
{
&Tab[0
]
,
&
T
a
b
[
1]
,&Ta
b
[2]
,
&
T
ab
[3
]
,
&
T
a
b
[4]
,
&
T
a
b
[
5],
&
Tab[6],&Ta
b
[7
]
};
unsigne
d
char
i; //
定义无符号字符型数据
while
(
1)
{
for
(
i=0;i
<
8;
i
++)
{
P0
=
p[i]
;
dela
y1
50
ms
()
;
}
}
}
*<
/p>
实例
2
8
:
p>
用数组得指针控制
P0
口
8
位
LE
D流水点亮
#
i
n
c
l
u
d
e〈
r
e
g
5
1
、h〉
/
函数功能
:
延时约
150ms (
3
200
250
=1
50
00
0μs=
150ms
/
vo
i
d d
el
ay15
0
m
s
(void)
{
uns
i
g
n
ed char
m,n
;
f
o
r
(
m=0;m<200;
m
++
)
f
or
(
n
=0;
n
<
2
50;n+
+
)
;
}
/
函数功能
:
主函数
/
vo
i
d
m
a
in(
vo
i
d)
{
unsigned cha
r
i;
unsig
n
e
d
char
Ta
b
[
]={0xFF
,
0xFE,0x
FD,
0x
F
B,0xF7,0xE
F
,0xDF
,
0x
B
F, 0x7F
,
0xBF,0xDF
,0xE
F
,0
xF
< br>7,0xFB,0
x
F
D,
p>
0
x
FE
,
0
x
FE,
0x<
/p>
FC
,
0xFB,0xF
0,
0
x
E0,0xC0
p>
,
0
x
8
0
,0x0
0,
p>
0xE7,0xDB,0xBD,0x7E,0x3C,0x18,
0
x00,0x81,
0
x
C3
,
0x
E
7,0x7E
,
0x
B
D
,0xD
B,0
x
< br>E7
,0x
BD,0
x
DB
}
;
/
/
流水灯控制码
unsig
ne
d
c
h
a
r
p
;
/
/定义无符号字符型指针
p
=Ta
b
;
/
/
将数组首地址存入指针p
wh
i
le(1
p>
)
{
for<
/p>
(
i
=0
;i<
/p>
〈
3
2
;i++
)
//
共
3
2
个流水灯控制码
{
P
0
=
(p
+
i
)
;
//
(p+
i)
得值等于
a[i
]
}
d
ela
y
1
50
ms(
)
;
p>
/
/调用
150ms
延时函数
} }
*
实例
29:
用P
0
、
P
1
口显示整型函
数返回值
#in
c
< br>lude
〈
re
g
51
、
h
〉
/
函数功能:计算两个无符号整数得与
/ unsigned int
s
u
m
(i
nt
a,i
n
t
b)
{
u
ns
i
g
n
e
d
i
nt
s
;
s=a+
b
;
r
e
turn
(
s
)
;
}
/
函数功能
:
主函数
/
v
oid main
(v
o
i
d)
{
u
nsig
n
ed
z;
z=s
um
(
2
008,
200
9
);
< br>P
1=
z
/
2
56; //
取得z得高
8
p>
位
P0=z
%2
56
;
//
取得
z
得低8位
w
hi
l
e(1)
;
}
*
实
例
3
0
:
用有
参函数控制P
0
口8位
L
E
D
流水速度
#i
n
cl
ud
e
、
h
〉
/
函数功能
:
延时一段时间
/
v
o
id
delay(unsi
g
ned
c
h
ar
x
)
{
u
nsi
g
n
e
d
<
/p>
c
h
a
r
m
,
n
; <
/p>
for
(
m=0
;
m<
x
;
m
++
)
fo
r(n=0
;n
<200
;
n++
)
;
}
/
函数功能
:
主函数
/
vo
i
d main(void)
{
unsigned
c
har
i;
u
nsi
g
ned
c
har
c
ode
Ta
b[
]={0xFE,0
x
FD
,
0xFB,
0xF7
,
0xE
F
< br>,0xD
F
,0xBF,0x7F
};
//
流水灯控制码
while(
1)
{
//
快速流水点亮LED
for
(
i=0;i<8;
i
++
)
//
共8个流水灯控制码
{
P
0=T
a
b[
p>
i
];
delay(1
< br>0
0)
;
//
延时约
60ms,
(3
10
0
200=6
0
00
0μs)
}
//
慢速流水点亮L
ED
for(i
=0;
i<8;i++)
//
共8个流水灯控制码
{
P
0=T
a
b
[
i
p>
]
;
d
elay
(2
50);
//延时约
150m
s
,
(
3
250
200=
1
50
000μs)
}
}
}
*
实
例
31:
用数组作函数参数控制流水花样
#in
c
l
ud
e
<
re
g
51
、
h
〉
/
函数功能
:
延时约
150ms
/
v
o
id d
e
lay(voi
d
)
{
un
s
igned
cha
r
m
,n;
fo
r(
m=0;m<
2
00;m++)
f
or(n
=0
;
n
<
2
5
0
;n++
)
;
}
/
函数功能
:
流水点亮
P
0口
8
< br>位
LED
/
v
oid
l
e
d_
f
low(unsig
n
ed
c
ha
r
{
un
si
gne
d
c
h
ar
i
;
fo
r
(
i
=
0;i
<8;i++)
{
P
0=
a[i];
< br>d
e
l
ay
(
)
;
}
}
/
函数
功能
:
主函数
/
v
o
id
ma
in
(void)
8])
a[
{
<
/p>
unsi
g
n
e
d
c
har
c
o
de
Ta
b
[
]
={0xFE
,
0
x
F
D,
0
xFB,
0
xF
7
< br>,0x
E
F,
0
xDF,0xBF
,
0x7F};
< br>/
/
流水灯控制码
le
d_
f
low(T<
/p>
a
b)
;
}
*
实例3
2:
用指针作函数参数控制
P
0口
p>
8
位
LE
D流水点
亮
#inclu
d
e
e
g
5
1
、
h>
/
函数功能
:
延时约
1
50
p>
ms
/
void delay
(
voi
d
)
{
unsign
e
d
cha
r
m,
n;
for
(
m=0;
m〈
2
0
0;m+
+
)
fo
r(
n=
0
;
n〈2
5
0;n
p>
++)
;
}
/
函数功能
:
流水点亮
P0
口8位L
ED
/
void
l
ed
_
f
low(
uns
i
g
ned
cha
r
p
)
/
/<
/p>
形参为无符号字符
型指针
{
u
n
p>
s
ig
n
ed
c
har i;
while(
1
)
{
i
=
0
; <
/p>
/
/
将i置为0,指向数组第一个元素<
/p>
w
h
ile(
(p+i
)
!=
'
0
')
//
只要没有指向数组得结束标志
{
P
0=
(
p
+
i
);/
/
取得指针所指变量
(
数组元素)
得值,
送
P
0口
p>
d
el
ay()
;
/
/
p>
调用延时函数
i++
;
//指向下一个数组元素
}
}
}
/
函数功能:主函数
/
vo
i
d m
a
i
n
(voi
d
)
{
unsi
g
n
ed
char
code Ta
b[
]={0
x
FE,0xFD
,
0xFB
,0
xF
7<
/p>
,
0xE
F
,<
/p>
0xDF
,
0xB
F,
0x7F
,
< br>0
x
7
F
,0
xB
F
,0xDF,0xEF,
0x
F7,0
x
FB
,0
x
FD
,0
x
FE
,
0
xF
F,
0
x
F
E,
0xFC,0
x
F
B
,0xF0,0xE0,0xC0,0x
8
0
,
0x00,0x
E
7,
0
x
D<
/p>
B
,
0xBD
,
0x7E,0xFF,0xFF,0x3C,
0
x18,0
x0,0
x81,0
xC
3,
0
xE
< br>7,0
xF
F
, 0xFF,0
x7
E
}
;
/
/
流水灯控制码
unsigned cha
r
poi
n
te
r
;
poin
t
er=Tab; <
/p>
led
_f
low
(
po
i
nter)
;
}
*实例3
3:
用函数型指针控制
P
1口灯花样
#
i
n
c
lude<
< br>r
e
g
51
、h〉
//
包含
51
单片机寄存器定义得头文件
uns
i
g
ned
char
c
o
de
T
ab[
]
={
0x
FE
,
0xFD,
0
xFB,0xF
7,
0xEF
,
0xDF
,0
xBF
,0x
7F};
/
/流水
灯控制码
,
该数组被定义为
全局变量<
/p>
/
函数功能
:
延时约
150m
s
< br>
/
vo
i
d delay
(
v
oi
d)
{
unsi
g
ned char
m,
n
;
<
/p>
f
or(
m=
0
;m<200
;
m++)
for
p>
(n
=0;n
〈
2
50;n
+
+
)
;
}
/
函数功能
:
流水灯左移
/ void
l
ed_flow
p>
(
voi
d
)
{
uns
i
g
ne
d
ch
a
r
i;
f
o
r(i
=
0
;i
<8;i+
+)
//8
位控制码
{
P
0
p>
=
T
a
b
[i
];
d
e
lay(
);
}
}
/
函数功能:主函数
/
void m
a
i
n(
void)
{
void
(
p
)
p>
(v
o
i
d
); //
定义函数型指针,所指函数无参数
,
无返
回值
p=
le
d_f
l
ow;
/
/
将函数得入口地址赋给函数型指针
p
w
hile
(1)<
/p>
(
p
)
();
/
/
通过函数得指针
p
调用函数
le
d_
fl
o
p>
w()
}
*<
/p>
实例3
4:
用指针数组作为函数得参数显
示多个字符串
#in
c
l
ud
e〈
re
g
51
、h〉
/
/包含
51
单片机寄存器定义得头文件
un
s
igned
c
h
ar
cod
e
str1[
]=”Temperat
ure
is
test
ed
b
y
D
p>
S1
8B20”;/
/C
< br>语言中,字符串就是作为字符数组来处理得
un
s
igned
c
h
ar
co
de
s
tr2[ ]=”Now
t
em<
/p>
pe
r
ature
i
s
:”; //所以
,
字符串得名字就就是字符串得首地址
uns
i
gn
ed
char code s
t
r3[ ]=
p>
s
t
e
rm
i
s
d
e
s
i
gned
by
Z
h
ang
Sa
n”;
u
ns
ig
n
ed
ch
a
r
c
ode
s
tr4[
]=”Th
e
date
is 20
0
8
-
9-
30”;
un
s
igned
char
p[
]
< br>={str1,st
r
2,
s<
/p>
t
r
3,str4};
//
定义
p
[
4
]
为指向
4
个字符串得字符型指针数组
/
函数功能:延时约15
0ms
/
void de
la
y(
vo
i
d
)
{
unsign
e
d
c
har m,n;
for
(
m=0;m<200;m++)
f
or
(
n=0
;
n<250;n++)
;
}
/
函数功能
:
流水点亮
P0
口
8
位L
ED
/
void
led_di
sp
lay
(un
si
g<
/p>
n
e
d
c
p>
h
a
r
x
[
])
//
形参
必须为指针数组
{
u
n
si
g
ne
d
char
i,j
;
for
(i=
0;i
〈
4
;
i++) //
有
4
个字符串要显示
{
j=0
;
//
指向待显字符串得第
0
号元素
w
h
i
le(
(x
[
i]+j
)!=’
0’)
/
/
只要第
i
个字符串得第
p>
j
号元
素不就是结束标志
< br> {
P0=
(x
[i]
p>
+j
)
; /
/取
得该元素值送到
P
0口显示
de
l
ay(
);
p>
/
/调用延时函数
j
++
;
//
指向下一个元素
}
}
}
/
函数功能:主函数
/
v
oi
d
m
a
i
n(
void
)
{
unsign
ed
c
h
ar
i;
w
h
i
le(1
)
{
f
o
r(i=0;i<4;
i
p>
++)
led_disp
l
ay(p)
;
//
将指针数组名作实际参数传递
}
}
*实
例
3
5
:
字符
函数
ctyp
e、h应用举例
#
inc
<
br>51、
lude
h> //
包含5
1
p>
单片机寄存器定义得头文件
#
inc
l
ude
〈c
p>
t
y
p
e、
h>
void
ma
in(vo
i
d)
{
w
hile(1)
{
P3=i
s
a
lp
ha(
'
_’)?0xf
0:0x0f
;
/
/条件运算,
p>
若
'
_
'
就是英文
字母,
P
3=
0x
f
0
}
}
p>
*实例
36
:内部函数
i
nt
r
i
ns
、
h
应用举例
< br>
#i
n
clude<
r
eg51
、
h
〉
//
包含
51<
/p>
单片机寄存器定义得头文件
#inc<
/p>
l
u
de
n
tri
n
s<
/p>
、
h
>
//<
/p>
包含函数
is
al
ph
a
(
)
声明得头文件
/
< br>函数功能
:
延时约
1
50m
s
/
void
delay
(
void)
{
u
ns
i
g
ne
d
c
h
a
r
m
,
n;
for(m=0;
m〈
2
0
0;m++)
for
(
n=0;n
< br>〈
250;n++)
;
}
/
函数功能
:
主函数
/
vo
id
main(
v
oid)
{
P3=0x
fe
;
< br>//P
3
=
11
1
1 111
0
B
wh
i
l
e
(1
)
{
P3=
_
c
r
o
l
_(P
3
,1
)
;//
将
P3
得二进制位循环左移1位后再赋给
P3
delay(
);
//
调用延时函数
}
}
p>
*
实例
37:
标准
函数
std
l
ib
、
h
应用举例
< br>#
inclu
d
<
br>// c
nsigne <
br>fo
e
e
g
5
1
、
h
>
包含
51
单片机寄存器定义
得头文件
#
i
n
lude
li
b
、
h
〉
//
包含函数
isalpha()
声明得头文件<
/p>
/
函数功能:延时约
150m
s
/
v
o
id
d
elay(
voi
d
)
{
u
d
char m,n;
r
(m=0;m
〈
2
0
0
;
m++)
for(
n=
0
;
n
〈
2
p>
5
0;n+
+
)
;
}
/
函数功能
:
主函数
/ void
ma
in
(
vo
i
d)
{
u
n
p>
s
ig
ne
d
cha
r
i
;
w
p>
hile(1
)
{
fo
r<
/p>
(
i
=
0;
p>
i〈
10
;
i++
)
//产生
10
个随机数
{
P3=ra
n
d()/
1
6
p>
0;
//
将产生得随机数缩小
16
0倍后送P
3
显示<
/p>
delay
()
;
}
}
}
*实例
38:
字符串函数
str
i
ng
、
h
应用举例
#
in
c
lude<
/p>
〈
r
e
g
5
1
、
h
〉
//
包含
51
单片机寄存器定义得头文件
#
in
clude
a <
br>
<
br>peratur e <
br>1,
<
br>r1〉 、h〉
n
g
、
h
〉<
/p>
//
包含函数i
s
lp
h
a
(
)
声明得头文
件
voi
d
m
a
in(v
o
id)
{
uns
i
gn
e
d
c
h
ar
s
t
r1
[
]=
The
te
m
e
i
s
:”;
un
s
ign
e
d
c
h
a
r
st
r2[
]
=”Now,
The
t
e
mper
a
tu
r
i
s 36
C
entgrad
e:”;
u
nsigned
ch
a
r
i;
i=st
r
cmp
(
str
str2)
;
/
/比较两个字符串,并将结果存入i
if
(
i==0)
//st
r
1=str2
P3
=
0
x00
;
e
l
se
if
(
i
〈0)
p>
//s
tr
1<
/p>
〈
str2
P3=0x
f
0
;
else
/
/st
s
t
r2
P3
=
0x0
f;
w
hil
e(
1)
;
//
防止程序“跑飞”
}
*实例
39
:宏定义应用举例
2
#i
n
clud
e〈
reg51
//
包含
51
单片机寄存器定义得头文件
# define
F(a
,
b) (a
)
+(a
)
(b)
/
2
5
6+
(
b)
/
/
带参数得宏定
义
,a
与
p>
b
为形参
vo
i
d
m
a
in
(
v
o
id)
{
unsigned
c
h
ar
i,j,
k;
i=40;
j=30;
k=
2
< br>0
;
P
3=F(
i,
j
+
< br>k
)
; //
i与
j
+
k
分别为实参
,
宏展开时
,
实参将替
代
宏定义中得形参
while
(
1)
;
}
*实
例
40:
宏定义应用举例2
#inclu
de<
AT89X51
、
h
〉
#
i
nc
l
< br>u
d
e
<
ctype
、
h>
v
o
id
m
ain(void
)
{
P3_
0
=0;
//
将P3、
0
引脚置低电平,L
E
D点亮
P3_1=0; //
将
P3
、0引脚置低电平,
LED
点亮
P
3
_2=0; //
p>
将
P3
、
0
引脚置低电平,
LED
点亮
< br>
P3_
3
=
< br>0
; /
/将P
3
、
0
引脚置低电平,
LED
点亮
P3_4=
1
;
/
/将P3、
4
引脚置高电平
p>
,LE
D熄灭
}
P3_5
=
1;
//
将
P
3、
5
引脚置高电平
,
LE
D
熄灭
P3_6=1;
//
将P
3
、
7
引脚置高电平,
L
< br>ED熄灭
P3_
7
=1;
/
/将
P3
、
7
引脚置高电
平
,
LED熄灭
while
(1)
;
*
实例<
/p>
41
:宏定义应用举例
3
#
inc
l
u
de<re
g5
1、
h
p>
〉
//
包含5
1
单片机寄存器定义得头文
件
#
defi
n
e
MA
X
100
/
< br>/
将
MAX
宏定义为字符串
p>
100
v
oi
d
mai
n(v
o
i
d)
{
#if
MAX
〉8
0
//
如果字符串1
00
大于
80
P
3
=
0x
f0;
//
P<
/p>
3
口低四位
LED
点亮
#e
l
se
P
3
=
0x0f
;
//
否则
,P
3口高四位L
ED
点亮
#
end
if
p>
/
/
结束本次编译
}
/
中断、定时器
中断、定时器
中断、定时器
中断、定时器
/
*
实例4
2:
用定时器
T0
查询方式
P2
口
8
位控制
L
ED闪烁
#i
n
clu
d
e
g
51
、<
/p>
h>
/
/
包
含
51
单片机寄存器定义得头文件
/
函数功能
:
主函数
/
v
o
i
d
main(vo
i
d)
{
/
/ EA=1;
/
/
开总中断
// E
T
0=1; //
定时器
T0
中断允许
<
/p>
T
MO
D
=
p>
0
x0
1
;
/
/使用定时器
T0得模式
1
T
H
0=(
6
5536
-4
6
0<
/p>
83)/256
;
//
定时器T
0
得高8位赋初值
TL0=(6
5
5
3
6
-
46083
)%2
5
6
;
/
/
定时器
T0
得高
8
位赋初值
TR0=
1;
//
启动定时器
T0
TF0=0
;
P2=0xff;
while(1
)
/
/
无限循环等待查询
{
w
hil
e(T
F
0
=
=0
)
;
T
F
0=0
;
P
2
=
p>
~P2;
T
H0
=
(6
5
536
—4
6083)
/2
56
;
//
定时器
T0
p>
得高
8
位赋初值
T
L
0
=(6
553
6-
46083
)%2
56; //
定时器
T0
得高8位赋初值
}
}
*实例<
/p>
43
:用定时器
T1
查询方式控制单片机发出
1KHz
音频
#
i
nclude<
r
e
g
51
、
h〉
//
包含
51
单片机寄存器定义得头文件
sb
i
t
s
ound=P
3
^
7
;
//
将
sound
位定义为P
3
、
7
引脚
/
函数功能:主函数
/
voi
d m
a
i
n
(v
o
id
)
{
//
EA=1;
//
开总中断
//
ET0
=
1
;
//
定时器
T0
中断允许
TM
O
D
p>
=
0
x
10; <
/p>
//使用定时
器
T
1得模式
1
T
H
< br>1=(65536
—9
21)
/
25
6;
//
定时器
T1
得高8位赋初值
TL<
/p>
1=(6
5
536
-
9
21
)
%
256; /
/定时器T
1
得高
8
位赋初值
T
R1=1;
//
启动定时器
T1
TF1=
0
;
wh
i
le(1)/
/无限循环等待
查询
{
w
hile(T
F1
==0)
;
T
F1=0;
< br>sou
n
d=
~
sound;
//将P
3
、
7引脚输出电平取反
TH1=
(
p>
65536-92
1
)
/
256;
/
/
定时器
T0
得高
8
位赋初值
TL1=(6
5
53
6
-
9
2
1
)%256
;
//定时器
T0
得高
8
位赋初值
}
}
*实
例
4
4:将计数器
T0
计数得结果送
P
1口8位
LE
D
显示
#inc
l
ude
〈
reg51
、
h>
//
包含
p>
5
1单片机寄存器定义得头文件
sbi
t
S
=P3
^4;
/
/将
S
位定义为
P3
、
4
引脚
/
函数功能:主函数
/
void main(void)
{
/
/
EA=
1
;
//
开总中断
//
ET0
=
1; //
定时器
T0
中断允许
T
M
O
D
=
0x
0
2; /
/使用定
时器
T
0得模式
2
TH0=256-156
;
//
定时器
T0
得高<
/p>
8
位赋初值
T
L
0
=2
56—
156
;
//
定时器T
0
得高
8
位赋初值
TR0
=1;
/
/
启动定时器
T0
< br>w
h
i
le
(1
)//
无限循环等待查询
{
wh
il
e(T
F
0=
=
0
)
//
如果未计满就等待
{
i
f
(S==
0
)
//
按键
S
p>
按下接地
,
电平为
0
P
1=
T
L0;
/
/
计数器
< br>TL0
加
1
后送
P1
口显示
}
TF
0=0;
//
< br>计数器溢出后
,
将
T
F
0
清
0
}
}
*<
/p>
实例
45:
用定时器
T0
得中断控制
1
位
LED
闪烁
#include
〈
reg5
1、
h
>
/
/
包含
51
单片机寄存器定义得头文件
< br>s
b
i
t
D
1=P2^0
;
/
/将
D
1位定义为P2、
0
引脚
/
函数功能
:
主函数
/
void
mai
n(
void
)
{
E
A=1;
//
开总中断
ET
0
=1;
//
定时器T
0
中断允许
TM
O
D=
0
x01
;
//
使用定时器
T0
得模
式
2
T
H0
=(
6
5
5
3
6
—
46
0
8
3)/256;
//
定时器T0得高
8
位赋初值
TL
0=
(
65
5
36
—
460
8
< br>3)%2
5
6
;
/
/定时器
T0
得高
8
位赋初值
T
p>
R
0
=
1
; //
启动定时器
T
0
while
(
1)
/
/
无限循环等待中断
;
}
/
p>
函数功能
:
定时器
T0
得中断服务程序
/
vo
id
T
i
m
e
p>
0(
voi
d)
i
n
ter
r
u
p
t 1
us
in
g 0
//“interrupt”声明函数为中断服务函数
//<
/p>
其后得
1
为定时器
T0
得中断编号;
0
表示使用第
p>
0
组工作寄存器
{
D
1=~D1
;
/
/
按位取反操作
,
将
P
< br>2、
0
引脚输出电平取反
p>
TH
0
=(65536
—
46083
)
/
2
5
6;
< br>/
/
定时器T
0
得高
8
位重新赋初
值
T
L0=(655
3
6-
4608
3)
%2
56
;
/
/
定时器
T0
得高
8
位重新赋初
值
}
p>
*
实例
46:
用定
时器
T0
得中断实现长时间定时
p>
#in
clu
d
e
<
reg
51、
h〉
/
/
包含
51
单片机寄存器定义得头
文件
sbi
t
D1=P2^0
;
//
将
D1
位定义为P
2
、
0
引脚
unsigned
char
Cou
n
tor
;
/
/设置全局变量
,
储存定时器
T0
中断次
数
/
函数功能
:
主函数
/ void
main
(v
oid)
{
E
A
=1;
//
开总中断
E
T
0=
1
; //
定时器
T0
中断允许
TMOD=0
x
01;
//使用定时器
T0
得模式
2
T
H
0=
(65
53
6—4
6
< br>0
83)/256; /
/定时器
T
0得高8位赋初值
TL
0=
(65
5
3
6
-46083
)
%
256
;
//定时器T
0
得高
8
位赋初值
T
R
0=1;
p>
//
启动定时器
T
0
Countor
=
0;
/
/
从0开始累计中断次数
wh
ile
(
1)
//
无限循环等待中断
;
}
/
函数功能
:
定时器
T0
得中断服务程序
/ void Ti
m
e0
(
void) i
p>
nt
erru
p
t
1
using
0
//“inter
ru
p
t
声明函数为中断服务函数
//
其
后得1为定时器
T
0得中断编号
;0<
/p>
表示使用第
0
组工作寄存器
{
C
o
unto
r
++
;
//
中断次数自加
1
if
(C
o
u
ntor==2
0
) /
/若累计满<
/p>
2
0次
,
即计时
满1s
{
D
1=~
D1
;
//
按位取反操作
,
将P
2
、
0
引脚输出电平取反
Co
un
tor=0
;
//
将
Countor
清
0,
重新从
0
开始计数
}
TH
0=(
6
5536-4608
3)
/256
; //
定时器
T
0得高
8
位重新赋初值
TL
p>
0=
(65536-46083)
%
25
6
; //
定时
器
T0
得高8位重新赋初值
}
*实例
4
7:
用定时器T
1
中断控制两个
LED
以不同周期闪烁
#i
nc
l
ude〈
r
e
g51
、
h
〉
//
包含
51
单片机寄存器定义得头文件
sbit
D
1
=
P
2
^0;
/
/
将
D
1位定义为
P2
、
0
引脚
sbi
t
D
2
=P2^1
;
//
将D
2
位定义为
P
2、1引脚
u
ns
i
g
ne
d
c
har
Count
o
r1; /
/设置全局变
量
,
储存定时器
T1
< br>中断次数
unsigne
d
ch
a
r
C
o
u
n
t
p>
o
r2; /
/设置全局变量,储存定时器
T1
中断次数
/
函数功能
:
主函数
/ void
main(void
)
{
EA
=
1;
//
开总中断
ET1=1
;
//
< br>定时器
T1
中断允许
TM
O
D=
0x
10
;
//
使用定
时器T
1
得模式
1
< br>T
H
1=(65536-
4
p>
6
0
8
3)
/256;
/
/
定
时器
T
1得高8位赋初值
T
L
1=(
6
55
36-
46
083)
%
2
56
;
/
/
定时器
T
1
得高
8
位赋初值
TR1
=
1
;
/
/启动定时器
T
1
C
o
u
nt
or1=
0
;
//
从
0
开始累计中断次数
Counto
r
2=0; /
/从
0
开始累计中断次数
wh
i
l
e
(1)//
无限循环等待中断
;
}
/
函数功能:定时器
T1
得中断服务程序
/
v
o
i
d
Time1(v
o
id)
in
t
errupt
3
usin
g
0
//“in
terrupt”声明函数为中断服务函数
//
其后得
3
为定时器T1得中
断编号<
/p>
;0
表示使用第0组工作寄存器
{
C
ou
ntor1++;
/
/C
ou
nto
r
1
自加
1
Co
u
n
tor2+
+
;
/
/C
ount
o
r2
自加
< br>1
if(Coun
t
o
r
1==
2)
/<
/p>
/若累计满
2
次
,
即计时满
1
0
0
m
s
{
D1=~
D
1;
//
按位取反操作,将
P2
、
p>
0
引脚输出电平取反
C
< br>oun
tor
1=
0
;
//
将C
o
u
n
t
o
r
1
清
0
< br>,重新从
0
开始计数
}
if
(
C
o
u
ntor2
==
8)
//若累计满8次
,
p>
即计时满4
00
m
s
{
D2=~D2; //
按位取
反操作
,
将
P2
、
1
引脚输出电平取反
C
ou
n
to
r
2
=0;
/
/
将
Countor
1清0,重新从0开始计数
}
T
p>
H
1=(655
36-
4
6
08
3)
/25
6
;
//定时器
T1
得高8位重新赋
初值
TL1=(6553
6—
4608
3)
%2
5
6
;
/
/
定时器T
1
得高
8
位重新赋初值
}
*实例
4
8
:
用计数器T
1
得中断控制蜂鸣器发出
1
< br>K
Hz
音频
#i
n
c
lud
7 <
br>引脚 函数功能 i <
br>0
e
e
g51
、
h> //
包含
5
1单片机寄存器定义得头文件<
/p>
sbi
t
<
/p>
sound=P
3
^
;
/
/
将s
ou
n
d
位定义为
P3
、
7
/
:
主函数
/
v
oid
mai
n
(
vo
d)
{
EA=1;
/
/
开总中断
ET1=1; //
定时器
T1
中断允许
T
MO<
/p>
D=
0
x1
0<
/p>
;
//T
MO
D=0
0
01
00
B
,使用定时器
T1
得模式1
TH1=(65536-9
21)
/256; //
定时器T
1
得高
8
位赋初值
TL1
=(6
553
6
—
921)%256; //
定时器
T1
得高
8
位
赋初值
T
R1=
1;
/
/启动定时器
T1
whi
l
e(1
)
//
无限循环等待中断
;
}
/
函数功能:定时器T
1
得中断服务程序
/ voi
d
T
im
e
1(
v
o
id
)
i
n
t
erru
p
t 3
u
si
ng
0
//
“i
nterr
upt”声明函数为中断服务函数
< br>
{
so
u
< br>nd=
~
so
un
d
;
TH1=
(
6
5
53
6—
921
)/
256;
//
定时器
T1
得高
< br>8
位重新赋初值
TL1=(6
55
36
—
9
2
1
)
%25
6;
/
/<
/p>
定时器
T1
得高
8
位重新赋初值
}