单片机C语言程序的设计实训100例_基于8051+PROTEUS仿真1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机C语言程序设计卖训100例—基于8051+Proteus仿真》案例
目录
第一篇基础程序设计 (1)
01闪烁的LED (1)
02 从左到右的流水灯 (1)
03 8只LED左右来回点亮 (2)
04花样流水灯 (3)
05 LED模拟交通灯 (4)
06单只数码管循环显示0~9 (5)
07 8只数码管滚动显示单个数字 (6)
08 8只数码管动态显示多个不同字符 (7)
09 8只数码管闪烁显示数字串 (8)
108只数码管滚动显示数字串 (9)
11K1-K4 控制LED 移位 (10)
12K1-K4按键状态显示 (11)
13K1-K4 分组控制LED (12)
14K1-K4控制数码管移位显示 (13)
15K1-K4控制数码管加减演示 (14)
164X4矩阵键盘控制条形LED显示 (16)
17数码管显示4X4矩阵键盘按键号 (17)
18开关控制LED (19)
19继电器控制照明设备 (20)
20数码管显示拨码开关编码 (21)
21开关控制报警器 (22)
22按键发音 (22)
23播放音乐 (23)
24INTO中断计•数 (24)
25外部INTO中断控制LED (26)
26INTO及INTI中断计数 (26)
27定时器控制单只LED (28)
28TIMER0控制流水灯 (29)
29定时器控制4个LED滚动闪烁 (30)
30TO控制LED实现二进制计数 (31)
31TIMER0 与TIMER 1 控制条形LED (31)
32 10s的秒表 (32)
33用计数器中断实现100以的按键计数 (34)
34 100 000s以的计时程序 (35)
35定时器控制数码管动态显示 (37)
36 8X8LED点阵显示数字 (38)
37按键控制8X8LED点阵屏显示图形 (39)
38用泄时器设计的门铃 (40)
39演奏音阶 (41)
40按键控制定时器选播多段音乐 (42)
41定时器控制交通指示灯 (44)
42报警与旋转灯 (46)
43串行数据转换为并行数据 (47)
44并行数据转换为串行数据 (48)
45甲机通过串口控制乙机LED (49)
46单片机之间双向通信 (51)
47单片机向主机发送字符串 (55)
48 单片机与PC通信 (56)
第二篇硬件应用 (58)
01 74LS138译码器应用 (58)
02 74HC154译码器应用 (58)
03 74HC595串入并出芯片应用 (59)
04 74LS148扩展中断 (60)
06 24C04与数码管 (64)
07 用6264扩展存 (67)
08用8255实现接口扩展(仿真未成功) (67)
09 555定时器实验 (69)
10BCD译码数码管显示数字 (69)
11MAX7221控制数码管动态显示 (70)
12LCD 1602字符液晶滚动演示程序 (71)
19用ADCO8O8控制PWM输出 (76)
20ADC0809数模转换与显示 (77)
第一篇基础程序设计01闪烁的LED
/*需称:闪烁的LED
说明:LED按设定的时间间隔闪烁 */
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int ;
r~
sbit LED=P1A O; 丄

//延时
void DclayMS(uint x)
uchar i;
while(x-)
{ for(i=0;i<120;i++);
}
}
//主程序
void main()
while(l)
{
LED=~LED;
DclayMS(150);
02从左到右的流水灯匸
/*划称:从左到右的流水灯
说明:接在P0 口的8个LED 从左到右循环依次点亮,产生走马灯效果*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char #define uint unsigned int 〃延时
.ioyp.
-Z-
T"
~
\ VTAI 1PO.O/ADD
>XIALl
SZTAI C
PO 1/AD1
P0.2/AD2
P0.3/AD3
Al ALz
OQT
PO 4/ftD4
P0.5/AD5
PO 6/AD6
DA 7/Zi Ti7
m I
P2.WA6
P2.1^9
P2.2JA10
P3EN
ALE ETT
P2.3JA11
P2.4JA12
P2.5JA13
P2.6.IA14
P2.7JA15
P1.0 P3.0JRXD
P1.1 P3.1/E<D
P1.2 P3JJINT0
P1.3 P1.4 P3.3JINT1
P3.4JT0
PI.5 P3.5H-1
P1.6 P3B/WR
PI.7P3.7JRD
1
di
-t
4l
=5
-
10*


LL
di
df
di
-II J
.和_i_ 匚1
•—l—
r*ii
XTAL2
pcmw 町
MW
P04MC7
POVAW
M7ZAC7
rar
ME
PIQ
PI 1
PIN
Pl、
PI 4
2
P2
5 7
P21<69
P22AMD
P2SUA11
P2M2
P2SJAU
P3QK>D
P31/TXD P〉
2询
PJ>«7T F
P33T0
PJ壮
瓯曲
void DclayMS(uint x)
uchar i; while(x-) {
for(i=0;i<120;i++); } }
//主程序
void main() {
PO=Oxfe; while(l) {
PO=_crol_(POJ);//PO 的值向左循环移动 DclayMS(150);
03 8只LED 左右来回点亮
/*需称:8只LED 左右来回点亮
说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/
//主程序
void main() {
uchar i; P2=0x01; while(l)
for(i=0:i<7;i++)
#include<reg51.h> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int
//延时
void DclayMS(uint x)
uchar i; while(x-) { for(i=0;i<120;i++);
XTAL1
P01'A£?3
1ST
P0525

PZCW P21皿 P22CX10 P23^11
ALE
A
P2WI0 P1.0 P2a«A14 P2TXftl5 P3QQ 口 PI 1 Mimr. PI ? P3.2C1HL Pl 3 P3.3r<n Pt < P 、d/TO
”5 PMS PI .6 P3.6VIB PI 7
P37.R7
Z2Q
P2=_crol_(P2.1);//P2的值向左循环移动
DelayMS(150);
for(i=0;i<7;i++)
{
P2=_cror_(P2J);//P2的值向右循坏移动
DelayMS(150);
04花样流水灯C1
tor
D10


1
D3呦D11

012
XTAU
RM
233
R15
DI 5

;
D17
R3R18 XTALf Fpauxia
随Mam
冈鬧5
S3?
/*名称:花样流水灯
说明:16只LED分两组按预设的多种花样变换显示 */ #include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar code Pattern_PO[]= {
0xfc
t
0xf9,0xf3,0xe7,0xcf.0x9f.0x3f.0x7f,0xff,0x(f,0xff0xff.0xff.0xff,0xff,0xff 0xc7・
0xdb,0xbd・0x7c・0xbd、0xdb・0xc7,0xff.0xc7・0xc3,0x81,0x00,0x81.0xc3,0xe7,0xff,
0xaa,0x55,0x 1 & 0xfT,0xf0,0x0f,0x00,0xfT,0xf8,Oxfl ,0xc3,0xc7,0x8f,0x 1 f.0x3f.0x7f,
Ox7f.Ox3f,Ox 1 f,0x8f,0xc7,0xc3,0xf 1,0xf8
r
0xff,0x00,0x00.0xff,0xff,0x0f,0xf0,0xff
0xfe,0xfd,0xfb,0xf7,0xet0xdf
?
0xbf.0x7f,0xff,0xff0xfL0xff.0xff.0xff.0xff.0xff,
0xff,0xff,0xff0xff,0xff0xff.0xff.0xff0x7f.0xbf0xdf,0xeL0xf7
5
0xfb.0xfd.0xfe,
0xfe,0xfc,0xf8,0xf0,0xe0.0xc0,0x80.0x00,0x00.0x00,0x00.0x00,0x00,0x00.0x00,0x00
t
0x00,0x00.0x00,0x00,0x00,0x00,0x00.0x00,0x00.0x80.0xc0.0xe0,0xf0,0xf8
r
0xfc.0xfe, OxOO,Oxff.OxOO.Oxff,OxOO.Oxff.OxOO.Oxff
};
uchar code Pattern_P2[]=
{
0xff.0xff,0xff,0xff,0xft0xff.0xff.0xfe.0xfc,0xf9.0xf3,0xe7,0xct0x9L0x3f,0xff
0xe7,0xdb.0xbd,0x7e,0xbd.0xdb.0xe7,0xff,0xe7.0xc3,0x81,0x00,0x81 ・0xc3,0xc7,0xff.
0xaa,0x55,0x 1 & OxfT,OxfO,OxOf,0x00,0xfT,0xf8,Oxfl ,0xc3,0xc7,0x8f,0x 1 f.0x3f.0x7f, 0x7f,0x3f,0x 1 f,0x8f,0xc7,0xe3,0xf 1,0xf8,0xff,0x00,0x00.0xff,0xff,0x0f,0xf0,0xff
0xff.0xff,0xff0xff,0xft0xff.0xff.0xff.0xfe,0xfd.0xfb,0xf7,0xef,0xdC0xbf.0x7f
0x7f.0xbf0xdf,0xet0xf7.0xfb.0xfd.0xfe.0xff,0xff,0xff,0xff0xff
r
0xff.0xff.0xff,
0xff.0xff,0xff,0xff,0xff.0xff.0xff.0xff.0xfe,0xfc
5
0xf8.0xf0,0xe0.0xc0.0x80.0x00,
0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xfT,0xff, OxOO,Oxff.OxOO.Oxff,OxOO.Oxff,OxOO.Oxff
};03
D2
D14
2X
R16
R17
〃延时
void DelayMS(uint x)
{ uchar i;
while(x-)
{
for(i=0;i<120;i++);
〃主程序
void main()
{
uchar i;
while(l)
{ 〃从数组中读取数据送至P0和P2 口显示for(i=0;i<136;i++)
{
PO=Pattern_PO[i];
P2=Pattern_P2[i];
DelayMS(lOO);
05 LED模拟交通灯
/*名称:LED模拟交通灯
说明:东西向绿灯亮若干秒,黄灯闪烁
5次后红灯亮,红灯亮后,南北向由红灯变为
绿灯,若干秒后南北向黄灯闪烁5此后变红
灯,东西向变绿灯,如此重复。

*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0A0; 〃东西向灯
sbit YELLOW_A=PO A1:
sbit GREEN_A=P0A2;
sbit RED_B=P0A3; 〃南北向灯
sbit YELLOW—B^POM;
sbit GREEN_B=P0A5;
uchar Flash_Count=O.Opcration_15;pe= 1; 〃闪烁次数,操作类型变量〃延时void DelayMS(uint x)rorwiio 风%*a
XTAL?
TC4CAIM
VGUAM ro^cAX»r RSI
P2XW
A1E ST P2 "人匕
‘ P2S/W
cA
P2W “
P2XA15
Pio
P11P31/T«D PI 2
咖帕Pl 4
PI 5FJJini
PI r 形如'
Cl
C2早
4F
R1 •
uchar i;
while(x-) for(i=0;i<120;i++);
〃交通灯切换
void Traffic_Light()
{
switch(Operation_T\pe)
case 1: //东西向绿灯与南北向红灯亮
RED_A= 1: YELLOW_A= 1 ;GREEN_A=0;
RED_B=0;YELLOW_B= 1 ;GREEN_B= 1;
DelayMS(2000);
Operation_T^-pe=2;
break;
case 2: 〃东西向黄灯闪烁,绿灯关闭
DelayMS(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!= 10) return; 〃闪烁 5 次
Flash_Count=0;
Opcration_T}^pe=3;
break;
case 3: //东西向红灯,南北向绿灯亮
RED_A=0:YELLOW_A=1 ;GREEN_A=1;
RED_B= 1 ;YELLOW_B= 1 ;GREEN_B=0;
DelayMS(2000);
Opcration_T\f pe=4;
break;
case 4: 〃南北向黄灯闪烁5次
DclayMS(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Opcration_T^-pe=l;
//主程序
void main()
{
while(l) Traffic_Light();
}
06单只数码管循环显示0〜9
/*需称:单只数码管循环显示0~9
说明:主程序中的循环语句反复将0~9的段码送至P0 口,使数字0~9循环显示
*/ #include<reg51.h>
#includc<intrins.h> #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={OxcO,Oxf9・Oxa4.OxbO.0x99.0x92.0x82.0xf&0x80.0x90,Oxff};
i=(i+l)%10; DclayMS(300);
SGVEN-SEG
#define uchar unsigned char #define uint unsigned int
uchar code DSY_CODE|l={0xc0,0xf9.0xa4.0xb0.0x99,0x92,0x82,Oxf8,0x80.0x90};
〃延时
void DelayMS(uint x) {
〃延时
RP1
void DelayMS(uint x) {
uchar t;
while(x-) for(t=0;t<120;t++); }
//主程序
void main() {
uchar i=0; P0=0x00;
while(l) { /*
for(:i<ll;i++){ P0=~DSY_CODE[i]; DelayMS(300);) //注:另一方案 */ P0=~DSY_CODE[i];
cr •••
r~<r
耐 _l —
..... I I C2 —T —
C3
1CLF
X.1 12M
XTAL2
RST
PS€W ALE £A
Q .1.23 4 s
乃 7
FOCWCO ro.iAWX F02W02 FO3JAD3 FO4JAO4 FgADS F0&M96 F0??AD7 P2XM40 P2.1颂 P2.2KA10
々站 1
P24KA12 P2.5X413 P2BXM4 P2.7JA15
P30
磁D
P3.irrxp P32JVT0" ps^firr P3.4/T0 P3STT1 PS&t 迈 P37

07 8只数码管滚动显示单个
数字
/*需称:8只数码管滚动显示单个数 字
说明:数码管从左到右依次滚动显 示
0~7,程序通过每次仅循环选通一只 数码管
*/
#include<reg51.h> # include<intrins.h>

si
MO PI i
P12
PIJ
Pl 4 FM Mfl PI r
rooxco K»W>2 TO4CAC4
旳如 3
r<tOMC4 rotcAc-y
■2<W P21AK8 P2UM0 P2MM , P2 4«A12 Pi Mi P2Z6
PSOfW
P)
也 2 ":血
PJ 2*n
M4.T0
刃创丄
02
04
R^FACK-6 ■
XTA4.1
灯心
Alt
rx
fit n
ml
uchar t;
while(x-) for(t=0;t<120;t++);
}
//主程序
void main()
{
uchar i,wei=0x80;
while(l)
{
for(i=0;i<8;i++)
{
P2=0xff; 〃关闭显示
wei=_croL(weiJ);
PO=DSY_CODE[i]; 〃发送数字段码
P2=wei; 〃发送位码
DelayMS(300);
}
}
}
08 8只数码管动态显示多个不同字符
电路如上图
/*名称:8只数码管动态显示多个不同字符说明:数码管动态扫描显示0~7。

*/
#include<reg51.h>
#includc<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0xc0,0xf9.0xa4.0xb0.0x99,0x92,0x82,0xf8,0x80.0x90}; 〃延时
void DclayMS(uint x)
{
uchar t;
while(x-) for(t=0;t<120;t++);
}
//主程序
void main()
uchar i,wei=0x80; while(l)
for(i=0;i<8;i++)
{
P2=0xff;
PO=DSY_CODE(i]; 〃发送段码wei=_croL(weiJ);
P2=wei; 〃发送位码
DelayMS ⑵;
09 8只数码管闪烁显示数字串
电路如上图
/*名称:8只数码管闪烁显示数字串说明:数码管闪烁显示由0~7构成的一串数字本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。

*/
#include<reg5 l.h>
#define uchar unsigned char
#define uint unsigned int
//段码表
uchar code DSY_CODE[]={0xc0,0xf9.0xa4.0xb0.0x99,0x92,0x82,0xf8,0x80.0x90};
//位码表
uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
〃延时
void DelayMS(uint x)
{
uchar t;
while(x-) for(t=0;t<120;t++);
}
//主程序
void main()
{
uchar i.j;
while(l)
{
for(i=0;i<30;i++)
{
for(j=0;j<8;j++)
{
PO=Oxff:
PO=DSY_CODE[j]; 〃发送段码
P2=DSYJDX[jJ; 〃发送位码
DelayMS ⑵;
P2=OxOO; 〃关闭所有数码管并延时
DclayMS(lOOO);
10 8只数码管滚动显示数字串
电路如上图
/*名称:8只数码管滚动显示数字串说明:数码管向左滚动显示3个字符构成的数字串*/
#include<reg51.h>
#includc<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//段码表
uchar code DSY_CODE[]={0xc0,0xf9.0xa4・0xb0.0x99.0x92,0x82.0xf8、0x80・0x90,0xff}; 〃下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏)
uchar Num[ ]={10」0」0」0 J0.10」0,102,9,8};
〃延时
void DclayMS(uint x)
{
uchar t;
while(x-) for(t=0;t<120;t++);
}
//主程序
void main()
{
uchar i,j,k=0.m=0x80:
while(l)
{ //刷新若干次,保持一段时间的稳泄显示
for(i=0:i<15;i++)
{
for(j=0;j<8;j 卄)
{ 〃发送段码,采用环形取法,从第k个开始取第j个
PO=Oxff;
PO=DSY_CODE[Num[(k+j)%l 1 ]];
m=_crol_(m」);
P2=m; 〃发送位码
DelayMS ⑵;
}
}
k=(k+l)%ll; 〃环形队列首支针k递增,Num下标围0~10,故对11取余
11 K1-K4控制LED 移位
/* 需称:K1-K4控制LED 移位
说明:按下K1时,POD LED±移一位
按下K2时,P0 口 LED 下移一位 按下K3时,P2 口 LED 上移一位 按下K4时,P2 口 LED 下移一位
void Move_LED()
if ((P1&0xl0)==0) PO=_crorjPO 」);//KI
else if((Pl&0x20)=0) PO=_crol_(PO,l); //K2 else if((Pl&0x40)=0) P2=_cror_(P2,l); //K3 else if((Pl&0x80)=0) P2=_crol_(P2,1);
//K4
〃主程序
void main()
uchar Rccent_Key; 〃最近按键 PO=Oxfe; P2=0xfe; Pl=Oxff;
Recent_Key=Oxff; while(l) {
if(Recent_Key!=Pl)
Recent_Key=Pl; //保存最近按键
Movc_LED(); DelayMS(lO);
*/ # includc<reg51.h> # include<intrins.h>
#define uchar unsigned char #define uint unsigned int 〃延时
void DelayMS(uint x) {
uchar i; while(x-)
for(i=0;i<120;i++); }
〃根据Pl 口的按键移动 LED
DIO
C1
£
220
D 3
DU
R16
L 上移
L 下移二. 3
D 仃
R
• • • •
• D12 --
-C3
-JF-
.・ w...
C2 T 卜
2:俨
22B
‘・ F)11-
....
m • • R12 …
—I —- 1^1
R 上後
眾“Id
POWADO 旳tw P0W>3
RST
POSIWK P07XW
P2J0 跑 P22A10
0N ALE
FA
PIO
P2 5JA13 P2&JA14 P2.7A15
p?
P1.1 P3・ffT 畑 P12
P13
P340JT1 PI 4 PIS P3.OT0
PIO
P17
P37/?T

1 z
ze 4 z
XT
1 /
_/ 筮
/ /
/
32
21 A " 22 L L \
c 、
- J.
二―
R10
2K
• RS • «
R13
R7
R5
220
R3
R14 R15
D15
• D16 Ri7
R18
12 K1-K4按键状态显示
/*需称:K1-K4按键状态显示 说明:KI 、K2按下时LED 点亮,松开时熄灭,
K3、K4按下并释放时LED 点亮,再次按下并释放时熄火;
*/
uchar i;
while(x-) for(i=0;i<120;i++); }
//主程序
void niain() {
PO=Oxff; Pl=Oxff; while(l) {
LED1=K1;
LED2=K2; if(K3==O)
{ while(K3==0); LED3=~LED3; } if(K4==0)
{ whi!e(K4==0); LED4=~LED4;
#include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit LED1=PO A O; sbit LED2=PO A 1; sbit LED3=P0A
2; sbit LED4=P0A 3; sbitKl=Pl A O; sbit K2=P1A 1; sbit K3=P1A
2; sbit K4=P1A 3; 〃延时 void DclayMS(uint x) <2
C1
‘・・ c=]
益±±盘±盍嗤宝兰兰
C2
I I
C3
D I
2
►XTAL1
FOCVAEO
FOUAD!
印 2502
XTU2
g 心
FQ4WQ4
场&心
KST
FO ?;AD7 P2XM46 P2.1/A9 P2S10
pj.atAii ALE P2.4J «12
&
P25W13
P27XA15
PM P3.0iRxD P1.1
P3.1/TXD
P32.r«JT0 Pl .3 P33J'JT1 P1.4 P3.3TO P15 P.3QH
P1£
PU
P3.侃
JI
D1
UK2按TMLED 尺松开討灭 W K3冲如雄班再次虾B 灰;
22G
DclayMS(lO);
13 K1-K4分组控制LED
/*名称:K1-K4分组控制LED
说明:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始,
K2按下后点亮上面4只LED, K3按下后点亮下而4只LED, K4按下后关闭所有LED
*/
if(t!=Oxff) {
DelayMS(lO); if(t!=Pl) continue;
〃取得4位按键值,由模式XXXX1HKX 中有一位为0,其他均为I) 〃变为模式0000XXXX(X 中有一位为I,其他均为0)
Key_State=-t»4; k=0;
〃检査I 所在位置,累加获取按键号k
while( Key_State!=0)
k++:
Key_State»=l; }
〃根据按键号k 进行4种处理 switch(k)
# include<reg51.h>
#define uchar unsigned char #define uint unsigned int
〃延时
void DelayMS(uint x) {
uchar i; while(x-) for(i=0;i<120;i++); }
//主程序
void main() {
uchar k,t,Key_State; PO=Oxff; Pl=Oxff;
while(l) { t=pl; •XTAL1
RSI
PSFT AL£ 罠
PIC
P11 P12
P13 P14 PIS P16 PI 7
⑵閉
P2.NAW
P2^A11 P2.4 心 2 P2MM3 P2/"4 P2.7ai5 £
i
2
J 、
4、
5、 引 5、 33 7 \ 32 3、
PMOAXD P3.1/TXD, P3镜匝 pssmfF P34E) P3Sfi1 P3Q 匝 P3?応
LEWD
D2
C|

I
LED RED
上四个売
下西个亮
LED-KED
LED-KtD
J
[g I3F
你•
心•
. . R_2
233
LHOfifD. ....
D7
TOflCOO P01WD1 P02 如 2
P03 如 3
P04C404
POSCAD5
TO6W &
case 1: if(PO==OxOO) PO=Oxff;
PO«=1;
DelayMS(200); break;
case 2: PO=OxfO;break; case 3: PO=OxOf;break; case 4:
PO=Oxff;
/*名称:K1-K4控制数码管移位显示
说明:按下K1时加1计数并增加显示位, 按下K2时减1计数并减少显示位, 按下K3时淸零。

*/
#include<reg51.h>
#define uchar unsigned char #define uint unsigned int 〃段码
uchar code DSY_CODE[]={OxcO,Oxf9・Oxa4.OxbO.0x99.0x92.0x82.0xf&0x80.0x90,0xff};
〃位码
uchar code DSY 」ndcx[]={0x80,0x40.0x20,0xl0.0x0&0x04,0x02,0x01};
〃待显示到各数码管的数字缓冲(开始仅在0位显示0,苴他黑屏)
uchar Display_B uffer[]={0J0J0J0J0J0J0J0};
〃延时
14 K1-K4控制
:码管移位显示
void DclayMS(uint x) {
uchar i;
while(x-) for(i=0;i<120;i++); }
void Show_Count_ON_DSY() {
uchar i;
for(i=0;i< 8;i++) {
PO=Oxff;
PO=DSY_CODE[Display_Buffcr[i]];
P2=DSYJndex[i]: DclayMS(2);
C1
a xi

K1
45678
RN1 220
roivwj
rorAwr
ma
//主程序
void main()
uchar i,Kcy_NOKcy_Coums=0;
PO=Oxff;
Pl=Oxff;
P2=0x00:
while(l)
{
Show_Count_ON_DSY();
Pl=Oxff;
Key.NO=Pl;
//Pl 口按键状态分别为Kl-Oxfe, K2-Oxfd.K3-Oxfb
switch(Kcy_NO)
{
case Oxfe: Key_Counts++;
if(Key_Counts>8) Key_Counts=8;
Display_Buffer[ Key_Counts-l ]=Key_Counts; break;
case Oxfd: if(Key_Counts>0)Display_Buffer[-Kcy_Counts]=10;
break;
case Oxfb: Display_Buffcr[O]=O;
for(i=l;i<8;i++) Display_Buffer[i]= 10;
Key_Counts=0;
}
//若键未释放则仅刷新显示,不进行键扫描
while(Pl!=Oxff) Show_Count_ON_DSY();
15 K1-K4控制数码管加减演示
/*需称:K1-K4控制数码管加减演示说明:按下K1后加1计数,按下K2后减1计数,按下K3后淸零。

*/
#include<reg51.h>
DSY_CODE[]={0xc0,0xf9,0xa4.0xb0,0x99.0x92,0x82.0xf8,0x80.0x90,0xff);
〃待显示的3位缓冲
uchar Num_Buffer[]={ 0.0.0};
#include<intrins.h> 4,
#define uchar unsigned char
#define uint unsigned int //段码
uchar
z MCUW0
9Q6M
〃按键代码,按键汁数
uchar Kcy_Codc,Kcy_Counls=0;
〃延时
void DclayMS(uint x)
{
uchar i;
while(x-) for(i=0;i<120;i++);
}
〃显示函数
void Show_Counls_ON_DSY()
{
uchar ij=OxOI;
Num_Buffer[2]=Key_Counts/100;
Num_Buffer| 1 ]=Key_Counts/10% 10;
Num_Buffer|0]=Key_Counts% 10;
for(i=0;i<3;i++)
{
j=_cror_(j」);
P0=0xff;
PO=DSY_CODE[Num_Buffer[i]];
P2=j;
DelayMS( 1);
}
}
//主程序
void main()
{
uchar i;
PO=Oxff;
Pl=Oxff;
P2=0x00:
Kcy_Codc=Oxff;
while(l)
{
Show_Coimts_ON_DSY();
Pl=OxlT;
Kcy_Codc=Pl;
//有键按下时,数码管刷新显示30次,该行代码同时起到延时作用
if(Key.Code!=Oxff)
for(i=0;i<30;i++) Show_CouMs_ON_DSY();
switch(Key_Code)
case Oxfe: if(Key_Counts<255) Key_Counts++;
break;
if(Key_Counts>0) Key_Counts-; break;
Key_Counts=0:
# include<reg51.h>
# includc<intrins.h> #define uchar unsigned char
#define uint unsigned int
//矩阵键盘按键特征码表
uchar code KeyCodeTable[]={OxlLOxl2,Ox 14,Ox 18,0x21, 0x22,0x24,0x28,0x41.0x42,0x44.0x4&0x81,0x82,0x84,0x88}:
〃延时
void DelayMS(uint x)
uchar i;
while(x-) for(i=0;i<120;i++); }
〃键盘扫描
uchar Keys_Scan() {
uchar sCode.kCode,i,k;
〃低4位置0,放入4行 Pl=OxfO;
〃若高4位岀现0,则有键按下 if((Pl &OxfO)!=OxfO)
DclayMS ⑵; if((Pl&OxfO)!=OxfO)
sCode=Oxfe;
〃行扫描码初值
for(k=0;k<4;k++) 〃对4行分别进行扫描
{
Pl=sCode;
if((Pl &OxfO)!=OxfO)
{
kCodc=~Pl;
case Oxfd:
case Oxfb: }
Kcy_Codc=Oxff;
16 4X4矩阵键盘
控制条形LED 显 示
/*名称:4X4矩阵键盘 控制条形LED 显示
说明:运行本例时, 按下的按键值越大点亮的 LED 越多。

*/
7"^
-------------- C=1—~

1 C3 na
• •・• U Q

£
..:

K7
n
旳33 KM 加
內沁2
FO’/AD?
Xi AL2
RST
nw 生
fQ <AM 2
々阿4
CA
P27W5
殆血e P1.1/T 用 PI .価!r
円V
P1.1 PI 2
PI S Z j
KJ AHU
PI 5 PI Z
I Z

w- 性
一 一:

.1

1E
-- 亠
RN2创

RT 、打
22D K1
R D -

c
j... K10…
j
K11 --
二匸
• K12
K13
C2
U1
JtLJ _____
i ll 4k-W
for(i=0;i<16;i卄)〃查表得到按键序号并返回
if(kCode==KeyCodeTable[i])
return(i);
}
else
sCodc=_crol_(sCodc」);
return(-l);
}
//主程序
void main()
{
uchar if 2_LED,P 3_LED:
uchar KeyNo=-l; 〃按键序号,表示无按键
while(l)
{
KeyNo=Kcys_Scan(); 〃扫描键盘获取按键序号KeyNo if(KeyNo!=-l)
{
P2_LED=Oxff;
P3_LED=Oxff;
for(i=0;i<=KeyNo;i++) 〃键值越大,点亮的LED越多 {
if(i<8)
P3_LED»=1;
else
P2_LED»=1:
}
P3=P3_LED: 〃点亮条形LED
P2=P2_LED;
17数码管显示4X4矩阵键盘按键号
uchar code DSY_CODE| ]={0xc0.0xf9.0xa4.0xb0.0x99.0x92.0x82.0xf&0x80.0x90,
0x88,0x83,0xc6,Oxa 1,0x86,0x8c,0x00};
sbit BEEP=P3A 7;
//上次按键和当前按键的序号,该矩阵中序号围0~15, 16表示无按键
uchar Pre_KeyNo= 16.KeyNo= 16;
〃延时
void DclayMS(uint x) {
uchar i;
while(x-) for(i=0;i<120;i++); }
//矩阵键盘扫描
void Keys_Scan() {
uchar Tmp;
Pl=OxOf;//髙4位置0,放入4行 DelayMS(l);
Tmp 二PMOxOf://按键后Of 变成0000XXXX, X 中一个为0, 3个仍为1,通过异或把3个1变为0,唯 一的0变为1 switch(Tmp) 〃判断按键发生于0~3列的哪一列 {
case 1: KeyNo=0;break; case 2: KeyNo= 1 ;break; case 4: KeyNo=2;break; case & KeyNo=3;break:
default:KeyNo= 16; 〃无键按卜 }
Pl=OxfO; 〃低4位置0,放入4列 DelayMS(l);
Tmp=Pl>>4人OxOf 〃按键后f0变成XXXX0000, X 中有1个为0,三个仍为1 :高4位转移到低4位并 异或得到改变的值 switch(Tmp) 〃对0~3行分别附加起始值0, 4, 8, 12
/*需称:数码管显示 4X4矩阵键盘按键号
说明:按下任意键时, 数码管都会显示其键的序 号,扫描程序首先判断按 键发生在哪一列,然后根 据所发生的行附加不同的 值,从而得到按键的序号。

*/ #include<reg51.h> # define uchar unsigned char #define uint unsigned int 〃段码 C2
C1
HI —r — 汐Axi C :2 —T —你
C3
tor
Uf
►XTAL 1 xr*L2
Alt
PT
Plfl P11 M 2
E
PI 4 MT
RP1
rooAco PO 如
g
ras<*c«5
P2OM P2E P24A12 P2Z3 P2UM4 P2M5
PJDTXD
切*rr
P3&T0 P3 2«Tf
旳逝
case 1: KeyNo+=0;break; case 2: KeyNo+=4;break: case 4: KeyNo+=8;brcak; case & KeyNo+=12;
} }
//蜂鸣器
void BecpO {
uchar i;
for(i=0;i<100;i++) {
DclayMS ⑴; BEEP=~BEEP;
BEEP=0;
//主程序
void main() {
P0=0x00: BEEP=0; while(l) {
Pl=OxfO;
if(Pl !=OxfO) Keys.ScanO; 〃获取键序号 if(Pre_KeyNo!=KeyNo) {
PO=~DSY_CODE[KcyNo]; BeepO;
Prc_KcyNo=KcyNo; }
DelayMS(lOO);
18开关控制LED
•• C1 • •
Tl
帥.
/*需称:开关控制LED 说明:开关S1和S2分别控 制 LED1 和 LED2c */ #include<reg51.h>
.......... r ~i xi I —
C2 • ~I <RYSTAL- T
l 丁 爼
R1
・・
(4・•
• C3
Th-
JU->XTAL1
FO.OfADO
FO.IfADI FO.2rACC TO.3fAM X lALx
FO.UfAW FO.SfAD5 FU.63D6
FO.7fAD7
P23㈱
P21/A9 AtE P2 2^10
P2.4XA12 GA
P2£yA14 P2 7/A1S
P1.0 P3.1/TXD
rl.i P1.2
P13 P3.7
丽 PI 4 P34A0
PI S pssai
PI 8 P3 5AW P1.7
P3.7W
sbitSl=Pl A O; sbit S2=P1A 1; sbit LED1=PO A O; sbit LED2=P0A l;
//主程序
void main() {
while(l) {
LED1=S1; LED2=S2;
19继电器控制照明设备
/*名称:继电器控制照明设备
说明:按下K1灯点亮,再次按下时灯熄火 */
ffinclude<reg51.h> #define uchar unsigned char
RELAY" while(l)
if(Kl==O)
whi!e(Kl==O);
#define uint unsigned int sbitKl=Pl A O; sbit RELAY=P2A
4; //延时 void DelayMS(uint ms) { uchar t; T 伊
10Z
X7AL1
XTAL2
while(ms-)for(t=0:t< 120;t++); } //主程序 void niain() {
Pl=Oxff; X-
R5T
Q J .2n .45£.T
PI P1P1PI P1P1P1P1
POttlAtX) PO.1AHW
PO.WX PO.倔 W P2CTAS P2.KA9 P22>A10 P23*11 PJ&A13 P2CUA2
“mm P32»no PO.IfTO
刃曰理 P 珈Q
RELAY=~RELAY;
DelayMS(20);
20数码管显示拨码开关编码
/*名称:数码管显示拨码开关编码说明:系统显示拨码开关所设宜的编码000-255 */
#include<reg51.h>
#includc<intrins.h>
#define uchar unsigned char
#define uint unsigned int
〃各数字的数码管段码(共阴)
uchar code DSY_CODE[]={Ox3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
〃显示缓冲
uchar DSY_Buffer[3]={ 0,0,0);
〃延时
void DclayMS(uint ms)
{
uchar t; while(ms-)for(t=0:t< 120;t++);
}
//主程序
void main()
{
uchar i,m.Num:
PO=Oxff;
P2=0xff;
while(l)
{
m=0xfe;
Nim匸Pl;//读取拨码开关的值
DSY_Buffer[0]=NunV100;
DSY_Buffer[l ]=NunV10% 10;
DS Y_Buffer[2]=Num% 10;
for(i=0;i<3;i卄)〃刷新显示在数码管上
{
m=_crol_(m.l);
P2=m;
PO=DSY_CODE[DSY_Buffer(i]];
DelayMS(lO);
21开关控制报警器
/*需称:开关控制报警器
说明:用KI开关控制报警器,程序控制PI.O输岀r 两种不同频
率的声音,模拟很逼真的报警效果占
*/ :::
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbitSPK=Pl A O;
sbitKl=Pl A7;
[弐
//发声函数
[刁
iC L void Alarm(uchar t)
►XTAL1
XTAL2
RST
POXWACO
P0.1XAD1
P0.MO2
PO^WCO
P04AC4
PthSWM
PO^XAC€
POJIAET £=

uchar ij;
for(i=0;i<200;i++)
{
SPK=~SPK:
for(j=0:j<t:j卄);〃由参数t行成不同的频率
void main()
{
SPK=O;
while(l)
{ if(Kl==l)
{
Alarm(90);
Alarm(120); PEfM
ALE EA
O
,
.2
3
.4
5
7
P1
P1
P1
P1
P1
P1
P1
P1
P2.WAB
P2 1/A9
R2.2M1O
P2 3fA11 P2
4W2
P2.5fA13 P2
6fA14
W.?fAl5
P3CIRXD
P3.in^D P3
2<亚
P3.W4T1
P3«ino
P3S41
P3S^ P3
7fiD*
22按键发音
/*名称:按键发音
说明:按下不同的按键会是SOUNDER
发出不同频率的声音。

本例使用延时函数
实现不同频率的声音输出,以后也可使用
泄时器
…_2<3
-_K419
18
U1
叹LMJ
XTAL2
RST
P$£N
ALE EA
P1.0
P1.1
P1.2
P1.3
PI .4
P1.5
P1.B
P1.7
PO.03D3
PO.I^DI
PO.2WD2
P0.33D3
P0.flM£W
P0.53C6
P0.6JAD6
P0.7JAD7
P2J0JAA
P2;1?A9
P22/A10
PWA11
P2.4/A12 P2
5/A13
P2J6/A14 P2
7/A15
P3ORXD P3
5“D
P3JifiT0~
P3Jinn
P3.4HD
ps^ni P3B>

P3.7 丽
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int sbit
BEEP=P3A7;
sbitKl=Pl A4;
sbit K2=P1A5;
sbit K3=P1A6;
sbit K4=P1A7;
〃延时
void DclayMS(uint x)
{
uchar t; while(x-)
for(t=0;t<l20;t++);
}
//按周期t发音
void Play(uchar t)
{
uchar i; for(i=0;i<100;i++) {
BEEP=~BEEP; DelayMS(t);
}
BEEP=0;
}
void niain()
{
Pl=Oxff;
BEEP=0;
while(l)
{
if(Kl==O) Play(l);
if(K2==O) Play(2);
if(K3==O) Play(3);
if(K4==0) Play ⑷;• •C1 }
}
C2 23播放音乐
• • <TP
/*名称:播放音乐
说明:程序运行时播放生日快乐歌,未使用立
时器中断,所有频率完全用延时实现 */
>XTAL1PO OJADO
XT42 砂
PO UAD1
TO 2WD2
PO 3丿AD3
P0.dWD4 P05 炉D5
PO.6WD8 PO 乃AM
P2Q期
P22C3O
PSEN1
P24XA12 PNS
如 3 P2&CM4
P27X^15
EA
PIO P3XVRXD
P11P31/7XD
PI 2P3.2IWT0
P13F5.3itni
PI .4P3.4fT0
P15P3.5fTl
P1€ PI 7P3.EMR
P3说’
K
1


J:





±
±


-


iz
AT^Sl
#include<reg5l.h>
#define uchar unsigned char #define uint unsigned int sbit BEEP=P3A 7;
//生日快乐歌的音符频率表,不同频率由不同的延时来决左
uchar code SONG_TONE[]=(212,212,190,212,159,169,212,212,190,212,142,159,
212,212 J 06 J 26 J 59 J 69,190,119,119,126,159,142,159,0};
//生日快乐歌节拍表,节拍决建每个音符的演奏长短
uchar code SONG_LONG[]={93J2J2J2,24,9,3,12,12,12,24,
9.3」2,12,12,12,12,9,3,12,12,12,24,0};
〃延时
void DelayMS(uint x) {
uchar t;
while(x-) for(t=0;t<120;t++); }
〃播放函数
void PlayMusicO {
uint i=0,j,k;
while(SONG_LONG[i]!=OIISONG_TONE[i]!=0)
{ 〃播放各个音符,SONG.LONG 为拍子长度
for(j=0;jvSONG_LONG[i 严 20:j++) {
BEEP=~BEEP;
//SONG_TONE 延时表决左了每个音符的频率 for(k=0;k<SONG_TONE[i]/3;k 卄); }
DclayMS(lO); i++;
} }
void main() {
BEEP=0; while(l)
PlayMusicO; // 播放生 日快
乐 DelayMS(500); // 播 放完后暂停一段时间 C1
C2 —p-讪
r*L<
XTAL2
24 INTO 中断计数
pt 1
of 2 /
/
£.U - . i / 111 i 匕 *
.5
E M
< P12 MJ R 4
PIS 怖
n r
roa'wo K»iW TO2IAD2 KlWS 旳guw
刃晦
P22U10
弦Z2 滋a”
F2
/*坷称:INTO中断计数
说明:每次按下计数键时触发INTO中断,中断程序累加计数,计数值显示在3只数码管上,按下淸零键时数码管淸零
*/
# include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
〃0~9的段码
uchar code DSY_CODE[]={0x3f,0x06.0x5b,0x4t0x66.0x6d,0x7d.0x07,0x7f.0x6f.0x00};
〃计数值分解后各个待显示的数位
uchar DSY_Buffer[l={ 0.0.0};
uchar Count=0;
sbit Clear_Key=P3A6;
//数码管上显示计数值
void Show_Count_ON_DSY()
{
DSY_Buffer(2]=Count/100; 〃获取 3 个数
DSY_Buffer[ l]=Count% 100/10;
DSY_Buffer[0]=Count% 10;
if(DSY_Buffer(2]==0) 〃髙位为0 时不显示
{
DSY_Buffer[2]=0x0a;
if(DSY_Buffer[l]==O) 〃髙位为0,若第二位为0同样不显示
DSY_Buffer[ 1 ]=0x0a;
}
PO=DSY_CODE[DSY_Buffer[OJ];
Pl=DSY_CODE[DSY_Buffer[l]];
P2=DSY_CODE[DSY_Buffcr[2]];
}
//主程序
void main()
{
P0=0x00:
Pl=0x00:
P2=0x00:
IE=0x81;//允许INTO 中断
IT0=l; 〃下降沿触发
while(l)
{
if(Clear_Key==O) Count=0; 〃淸0
Show_Count_ON_DS Y();
//INTO中断函数
void EX」NT0() internipt 0
Count卄;〃汁数值递增
25 外部INTO中断控制LED
/*劣称:外部INTO中断控制LED 说明:每次按键都会触发INTO中断,中断发生时将LED状态取反,产生LED状态由按键控制的效果
*/
# includc<reg51.h>
#define uchar unsigned char
LED=~LED; 〃控制LED 亮灭
26 INTO及INTI中断计数
/*名称:INTO及INTI中断计数
说明:每次按下第1个计数键时, 第1
组计数值累加并显示在右边3只数码管上,
每次按下第2个计数键时,第2组计数值累
加并显示在左边3只数码管上,后两个按键分别淸零。

*/
# include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K3=P3A4; //2 个淸零键丄
EL2
tl
PI

Pl 1
Pl 2
PI 3
PI a
PI 5
P1.6
PI ?
P2 06X8
P2.1W9 P2
2fA1D
R2.3W11
P2 4fA12
P2 5fA13
P2 6fAH
P27M1S
1
PS&<
ALE EA
2
G计教1
亡2脸2
POWACO
P0.1W1
P0JLW2
P0MQ3
P0.4X94
P0SCAC6
P0.7/AD?
P3ORXD
p^mxD P3
KNTO"
P3.MPH1 P3
arra
P35Q£
P36WR
P3啸T
R1
• 10k
C3 0,/
222
二―3 /
244y
益S/
266/
#define uint unsigned int sbit LED=PO A O;
//主程序
void main()
{
LED=1;
EA=1;
EXO=1;
ITO=1; while(I);
}
//INTO中断函数
void EX」NT0() internipt 0
PO OfADO
PD 1f*D1
P0.2 蚀
2
PO 3M3
PO
P0.5fAD$
PO EfADG
P2CUA8
P2.1AJX9
P2 2;A10
P23UA11
F2.4AM2
P25/A13
P2&JA14
F2.7JA15
P3HfiXD
P3.1OD
P3 2fhT0~
P3 3(M T
P34/TO
P3竺P3
6血
p$7^r
AT89C53


-11 工JI
XTAL1
5OAL2
ftST
• lUh •-
1Out
PSBU
MX EA
Pl o
P1.1
PI 2
PI 3
P1.4
PI 5
PI 6
PI 7。

相关文档
最新文档