给初学单片机的40个实验1.docx

上传人:b****1 文档编号:1989873 上传时间:2023-05-02 格式:DOCX 页数:61 大小:499.32KB
下载 相关 举报
给初学单片机的40个实验1.docx_第1页
第1页 / 共61页
给初学单片机的40个实验1.docx_第2页
第2页 / 共61页
给初学单片机的40个实验1.docx_第3页
第3页 / 共61页
给初学单片机的40个实验1.docx_第4页
第4页 / 共61页
给初学单片机的40个实验1.docx_第5页
第5页 / 共61页
给初学单片机的40个实验1.docx_第6页
第6页 / 共61页
给初学单片机的40个实验1.docx_第7页
第7页 / 共61页
给初学单片机的40个实验1.docx_第8页
第8页 / 共61页
给初学单片机的40个实验1.docx_第9页
第9页 / 共61页
给初学单片机的40个实验1.docx_第10页
第10页 / 共61页
给初学单片机的40个实验1.docx_第11页
第11页 / 共61页
给初学单片机的40个实验1.docx_第12页
第12页 / 共61页
给初学单片机的40个实验1.docx_第13页
第13页 / 共61页
给初学单片机的40个实验1.docx_第14页
第14页 / 共61页
给初学单片机的40个实验1.docx_第15页
第15页 / 共61页
给初学单片机的40个实验1.docx_第16页
第16页 / 共61页
给初学单片机的40个实验1.docx_第17页
第17页 / 共61页
给初学单片机的40个实验1.docx_第18页
第18页 / 共61页
给初学单片机的40个实验1.docx_第19页
第19页 / 共61页
给初学单片机的40个实验1.docx_第20页
第20页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

给初学单片机的40个实验1.docx

《给初学单片机的40个实验1.docx》由会员分享,可在线阅读,更多相关《给初学单片机的40个实验1.docx(61页珍藏版)》请在冰点文库上搜索。

给初学单片机的40个实验1.docx

给初学单片机的40个实验1

1.闪烁灯

1. 实验任务

如图4.1.1所示:

在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2. 电路原理图

图4.1.1

3. 系统板上硬件连线

把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4. 程序设计内容

(1).延时程序的设计方法

作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?

下面具体介绍其原理:

如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒

机器周期微秒

MOVR6,#202个机器周期 2

D1:

MOVR7,#2482个机器周期 2       2+2×248=498 20×

DJNZR7,$2个机器周期 2×248            498

DJNZR6,D12个机器周期   2×20=40         10002

因此,上面的延时程序时间为10.002ms。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:

DELAY:

MOVR5,#20

D1:

MOVR6,#20

D2:

MOVR7,#248

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

(2).输出控制

如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5.程序框图

  如图4.1.2所示

 

 

 

 

 

 

 

 

图4.1.2

6.汇编源程序

ORG0

START:

CLRP1.0

LCALLDELAY

SETBP1.0

LCALLDELAY

LJMPSTART

DELAY:

MOVR5,#20;延时子程序,延时0.2秒

D1:

MOVR6,#20

D2:

MOVR7,#248

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END

7.C语言源程序

#include

sbitL1=P1^0;

voiddelay02s(void)//延时0.2秒子程序

{

unsignedchari,j,k;

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

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

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

}

voidmain(void)

{

while

(1)

{

L1=0;

delay02s();

L1=1;

delay02s();

}

}

2.模拟开关灯

1.实验任务

如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。

2.电路原理图

图4.2.1

3.系统板上硬件连线

(1).把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;

(2).把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;

4.程序设计内容

(1).开关状态的检测过程

单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。

单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。

(2).输出控制

如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5.程序框图

图4.2.2

6.汇编源程序ORG00H

START:

JBP3.0,LIG

CLRP1.0

SJMPSTART

LIG:

SETBP1.0

SJMPSTART

END

7.C语言源程序

#include

sbitK1=P3^0;

sbitL1=P1^0;

voidmain(void)

{

while

(1)

{

if(K1==0)

{

L1=0;//灯亮

}

else

{

L1=1;//灯灭

}

}

}

3.多路开关状态指示

1.实验任务

如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。

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

2.电路原理图

图4.3.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;

(2.把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;

4.程序设计内容

(1.开关状态检测

对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。

(2.输出控制

根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。

5.程序框图

 

读P1口数据到ACC中

ACC内容右移4次

ACC内容与F0H相或

ACC内容送入P1口

[endif]-->

图4.3.2

6.方法一(汇编源程序)

ORG00H

START:

MOVA,P1

ANLA,#0F0H

RRA

RRA

RRA

RRA

ORlA,#0F0H

MOVP1,A

SJMPSTART

END

7.方法一(C语言源程序)

#include

unsignedchartemp;

voidmain(void)

{

while

(1)

{

temp=P1>>4;

temp=temp|0xf0;

P1=temp;

}

}

8.方法二(汇编源程序)

ORG00H

START:

JBP1.4,NEXT1

CLRP1.0

SJMPNEX1

NEXT1:

SETBP1.0

NEX1:

JBP1.5,NEXT2

CLRP1.1

SJMPNEX2

NEXT2:

SETBP1.1

NEX2:

JBP1.6,NEXT3

CLRP1.2

SJMPNEX3

NEXT3:

SETBP1.2

NEX3:

JBP1.7,NEXT4

CLRP1.3

SJMPNEX4

NEXT4:

SETBP1.3

NEX4:

SJMPSTART

END

9.方法二(C语言源程序)

#include

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

{

P1_3=1;

}

}

}

4.广告灯的左移右移

1.实验任务

做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。

2.电路原理图

图4.4.1

3.系统板上硬件连线

把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:

P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。

4.程序设计内容

我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。

每次送出的数据是不同,具体的数据如下表1所示:

P1.7

P1.6

P1.5

P1.4

P1.3

P1.2

P1.1

P1.0

说明

L8

L7

L6

L5

L4

L3

L2

L1

 

1

1

1

1

1

1

1

0

L1亮

1

1

1

1

1

1

0

1

L2亮

1

1

1

1

1

0

1

1

L3亮

1

1

1

1

0

1

1

1

L4亮

1

1

1

0

1

1

1

1

L5亮

1

1

0

1

1

1

1

1

L6亮

1

0

1

1

1

1

1

1

L7亮

0

1

1

1

1

1

1

1

L8亮

表1

5.程序框图

 

 

 

 

 

 

图4.4.2

6.汇编源程序

ORG0

START:

MOVR2,#8

MOVA,#0FEH

SETBC

LOOP:

MOVP1,A

LCALLDELAY

RLCA

DJNZR2,LOOP

MOVR2,#8

LOOP1:

MOVP1,A

LCALLDELAY

RRCA

DJNZR2,LOOP1

LJMPSTART

DELAY:

MOVR5,#20;

D1:

MOVR6,#20

D2:

MOVR7,#248

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END

7.C语言源程序

#include

unsignedchari;

unsignedchartemp;

unsignedchara,b;

voiddelay(void)

{

unsignedcharm,n,s;

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

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

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

}

voidmain(void)

{

while

(1)

{

temp=0xfe;

P1=temp;

delay();

for(i=1;i<8;i++)

{

a=temp<

b=temp>>(8-i);

P1=a|b;

delay();

}

for(i=1;i<8;i++)

{

a=temp>>i;

b=temp<<(8-i);

P1=a|b;

delay();

}

}

}

5.广告灯(利用取表方式)

1.实验任务

利用取表的方法,使端口P1做单一灯的变化:

左移2次,右移2次,闪烁2次(延时的时间0.2秒)。

2.电路原理图

图4.5.1

3.系统板上硬件连线

  把“单片机系统”区域中的P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:

P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。

4.程序设计内容

在用表格进行程序设计的时候,要用以下的指令来完成

(1).利用MOV DPTR,#DATA16的指令来使数据指针寄存器指到表的开头。

(2).利用MOVC A,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。

因此,只要把控制码建成一个表,而利用MOVC A,@A+DPTR做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:

5.程序框图

 

 

 

 

 

 

 

 

 

 

 

图4.5.2

6.汇编源程序

ORG0

START:

MOVDPTR,#TABLE

LOOP:

CLRA

MOVCA,@A+DPTR

CJNEA,#01H,LOOP1

JMPSTART

LOOP1:

MOVP1,A

MOVR3,#20

LCALLDELAY

INCDPTR

JMPLOOP

DELAY:

MOVR4,#20

D1:

MOVR5,#248

DJNZR5,$

DJNZR4,D1

DJNZR3,DELAY

RET

TABLE:

DB0FEH,0FDH,0FBH,0F7H

DB0EFH,0DFH,0BFH,07FH

DB0FEH,0FDH,0FBH,0F7H

DB0EFH,0DFH,0BFH,07FH

DB07FH,0BFH,0DFH,0EFH

DB0F7H,0FBH,0FDH,0FEH

DB07FH,0BFH,0DFH,0EFH

DB0F7H,0FBH,0FDH,0FEH

DB00H,0FFH,00H,0FFH

DB01H

END

7.C语言源程序

#include

unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f,

0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,

0xf7,0xfb,0xfd,0xfe,

0x7f,0xbf,0xdf,0xef,

0xf7,0xfb,0xfd,0xfe,

0x00,0xff,0x00,0xff,

0x01};

unsignedchari;

voiddelay(void)

{

unsignedcharm,n,s;

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

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

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

}

voidmain(void)

{

while

(1)

{

if(table[i]!

=0x01)

{

P1=table[i];

i++;

delay();

}

else

{

i=0;

}

}

}

6.报警产生器

1.实验任务

用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。

2.电路原理图

图4.6.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;

(2.在“音频放大模块”区域中的SPKOUT端口上接上一个8欧的或者是16欧的喇叭;

(3.把“单片机系统”区域中的P1.7/RD端口用导线连接到“四路拨动开关”区域中的K1端口上;

4.程序设计内容

(1.信号产生的方法

500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号电平每500us变反1次;

 

5.程序框图

图4.6.2

6.汇编源程序

FLAGBIT00H

ORG00H

START:

JBP1.7,START

JNBFLAG,NEXT

MOVR2,#200

DV:

CPLP1.0

LCALLDELY500

LCALLDELY500

DJNZR2,DV

CPLFLAG

NEXT:

MOVR2,#200

DV1:

CPLP1.0

LCALLDELY500

DJNZR2,DV1

CPLFLAG

SJMPSTART

DELY500:

MOVR7,#250

LOOP:

NOP

DJNZR7,LOOP

RET

END

7.C语言源程序

#include

#include

bitflag;

unsignedcharcount;

voiddely500(void)

{

unsignedchari;

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

{

_nop_();

}

}

voidmain(void)

{

while

(1)

{

if(P1_7==0)

{

for(count=200;count>0;count--)

{

P1_0=~P1_0;

dely500();

}

for(count=200;count>0;count--)

{

P1_0=~P1_0;

dely500();

dely500();

}

}

}

7.I/O并行口直接驱动LED显示

1.实验任务

如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。

在数码管上循环显示0-9数字,时间间隔0.2秒。

2.电路原理图

图4.7.1

3.系统板上硬件连线

把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;要求:

P0.0/AD0与a相连,P0.1/AD1与b相连,P0.2/AD2与c相连,……,P0.7/AD7与h相连。

4.程序设计内容

(1.LED数码显示原理

七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2

“0”

3FH

 

“8”

7FH

 

“1”

06H

 

“9”

6FH

 

“2”

5BH

 

“A”

77H

 

“3”

4FH

 

“b”

7CH

 

“4”

66H

 

“C”

39H

 

“5”

6DH

 

“d”

5EH

 

“6”

7DH

 

“E”

79H

 

“7”

07H

 

“F”

71H

 

(2.由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。

这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!

建立的表格如下所示:

TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

5.程序框图

 

 

 

 

 

 

 

 

图4.7.2

6.汇编源程序

ORG0

START:

MOVR1,#00H

NEXT:

MOVA,R1

MOVDPTR,#TABLE

MOVCA,@A+DPTR

MOVP0,A

LCALLDELAY

INCR1

CJNER1,#10,NEXT

LJMPSTART

DELAY:

MOVR5,#20

D2:

MOVR6,#20

D1:

MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABLE:

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

7.C语言源程序

#include

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

unsignedchardispcount;

voiddelay02s(void)

{

unsignedchari,j,k;

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

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

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

}

voidmain(void)

{

while

(1)

{

for(dispcount=0;dispcount<10;dispcount++)

{

P0=table[dispcount];

delay02s();

}

}

}

8.按键识别方法之一

1.实验任务

每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。

2.电路原理图

图4.8.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;

(2.把“单片机系统”区域中的P1.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,P1.0连接到L1,P1.1连接到L2,P1.2连接到L3,P1.3连接到L4上。

4.程序设计方法

(1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。

因此在按键按下的时候,

 

 

 

图4.8.2

要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰

信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。

具体的一个按键从按下到释放的全过程的信号图如上图所示:

从图中可以看出,我们在程序设计时,从按键被识

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2