单片机原理及应用实验指导书9.docx

上传人:b****9 文档编号:25654691 上传时间:2023-06-11 格式:DOCX 页数:51 大小:756.53KB
下载 相关 举报
单片机原理及应用实验指导书9.docx_第1页
第1页 / 共51页
单片机原理及应用实验指导书9.docx_第2页
第2页 / 共51页
单片机原理及应用实验指导书9.docx_第3页
第3页 / 共51页
单片机原理及应用实验指导书9.docx_第4页
第4页 / 共51页
单片机原理及应用实验指导书9.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

单片机原理及应用实验指导书9.docx

《单片机原理及应用实验指导书9.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用实验指导书9.docx(51页珍藏版)》请在冰豆网上搜索。

单片机原理及应用实验指导书9.docx

单片机原理及应用实验指导书9

MCS51单片机原理及应用

实验指导书

 

淮阴师范学院物理与电子电气工程学院

2015.9

 

实验要求

1、实验前预习实验内容,理解实验原理。

2、按规定时间进入实验室,登记领取实验板和连接线,按操作程序将实验板连接到PC机上,开始实验。

2、实验完毕请指导老师确认后,按操作程序拆除实验板,将连接线收拾好,与实验板一起归还指导老师,方可离开实验室。

3、按时撰写并上交实验报告。

实验报告格式为:

(1)实验目的,

(2)实验内容,(3)源代码及流程图,(4)结果记录及分析,(5)思考题,(6)体会及设想。

 

实验板原理图

51单片机集成开发环境MedWinV2.39简介

1.安装

从网站免费下载MedWinV2.39集成开发环境安装程序压缩包,将其释放后,按照默认路径安装到C:

\PManley\MedWin文件夹。

2.设置

(1)每次启动MedWin会出现对话框,询问使用仿真器还是模拟仿真,应点击[模拟仿真]按钮。

(2)设置仿真器点击[设置]—[设置仿真器]命令,选择时钟频率为12兆赫兹。

(3)设置工作目录MedWin集成开发环境默认的工作目录为C:

\MedWin\PMedWin,建议根据需要建立自己的工作目录。

注意:

不得使用长文件名或长目录名!

(4)设置编译器将C语言编译器C51(文件夹)拷贝到C:

\MedWin文件夹下,点击[设置]—[设置编译工具]命令,打开“设置编译工具”对话框,使用汇编语言时选择第一行,使用C语言时选择第二行,如下图所示。

3.使用

(1)新建项目点击[项目管理]—[新建项目]命令,输入项目名称,点击[确定]按钮,出现“添加项目文件”对话框,输入源代码文件名,如T1.C(或T1.ASM),单击[打开]按钮,出现代码窗口,即可开始编程。

(2)打开项目点击[项目管理]—[打开项目]命令,点击项目文件名(项目文件后缀为.mpf),点击[打开]按钮,即可打开上次保存的项目。

(3)编译点击[项目管理]—[编译/汇编]命令,启动编译器对源文件进行语法检查并编译,在消息窗口中显示编译结果。

(3)模拟仿真当源程序编译无误后,可进行模拟仿真调试。

点击[项目管理]—[产生代码并装入]命令,编译器对源程序进行重新编译并装入。

这时,可使用[调试]菜单中的相关命令进行调试,如设置断点、单步及全速执行等。

(4)生成目标代码点击[项目管理]—[输出Binary文件]命令,生成BIN文件,用下载工具将其下载到实验板的单片机中执行。

 

STC单片机下载软件STC-ISP的使用

该软件界面如下图所示:

按照界面上的提示:

第一步,设置单片机型号为STC89C52RC。

第二步,点击[OpenFile]按钮,打开编译生成的BIN文件或HEX文件。

第三步,选择串口,设置波特率。

如:

COM1(具体COM口号在设备管理器中查看),115200。

第四步,可按默认值不用设置。

第五步,下载程序。

在进行第五步之前,一定要保持实验板的USB线与PC机连接良好,并且实验板的电源开关处于关闭状态,然后,点击[下载]按钮,再打开实验板电源开关,此时,软件将自动完成程序下载,下载完毕,实验板上的单片机立即开始运行。

目前,MCS51内核单片机中STC89C5X(宏晶)和AT89S5X(ATMEL)两种芯片支持在线下载功能。

 

实验一LED流水灯

一、实验目的

1.学习单片机并口的使用方法。

2.学习延时子程序的编写和使用。

3.学习集成开发环境MedWin的安装与使用。

4.学习STC单片机在线下载软件STC-ISP的使用。

二、实验内容

所谓流水灯就是8个发光二极管(LED)轮流点亮,周而复始。

实验板上以P1口作输出口,接8只发光二极管LED1-LED8。

当单片机的引脚输出为低电平时发光二极管点亮,为高电平时熄灭。

编写程序,使8个发光二极管循环点亮,时间间隔约0.5秒。

三、实验电路连线

实验板上与本实验有关的硬件如下图所示。

P1口输出接8个发光二极管,排阻PZ1为限流电阻,以防止电流过大烧坏发光二极管。

单片机的主时钟为11.0592MHz。

发光二极管电路

四、实验说明

1、编写一个软件延时子程序,延时时间约0.5秒,采用三重循环实现,汇编语言程序如下:

DELAY:

MOVR7,#198

DEL1:

MOVR6,#50

DEL2:

MOVR5,#23

DJNZR5,$

DJNZR6,DEL2

DJNZR7,DEL1

RET

查指令表可知执行MOV指令需用1个机器周期,DJNZ指令需用2个机器周期,在11.0592MHz晶振时,一个机器周期时间长度为1.085μs,所以该段程序执行时间为:

[1+(1+2×23)×50]×198×1.085μs≈500mS

2、若使用C语言,可用for循环实现延时,下面的程序延时约500mS。

voiddelay(void)

{inti,j;

for(i=0;i<1000;i++)

for(j=0;j<50;j++)

{_nop_();_nop_();}

}

3、流水灯的主程序(汇编语言)为:

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVA,#0FEH

LOP:

MOVP1,A

LCALLDELAY

RLA

SJMPLOP

END

4、流水灯的C语言主程序为:

#include

#include

#include

voidmain(void)

{unsignedchara,c;

a=0xfe;

while

(1)

{P1=a;

c=a&0x80;

a=a<<1;

a=a|(c==0x80);

delay();

}

}

五、思考题

1.如何使点亮的LED从下往上移动?

2.如何使点亮的LED从两边往中间移动?

 

实验二用一位数码管循环显示数字0~9

一、实验目的

1.学习单片机并口的使用方法。

2.学习延时子程序的编写和使用。

3.学习LED数码管的驱动、编码。

二、实验内容

实验板上有6个LED数码管,编写程序,使最右边的一个LED数码管循环显示0~9十个数字。

时间间隔约0.5秒,其余LED数码管关闭。

三、实验电路连线

实验板上与本实验有关的硬件如下图所示。

6个共阴的LED数码管上同名的引脚连接在一起,由单片机P0口通过锁存器74HC573进行控制。

锁存器U2的11脚接单片机的P26,用于控制数码管上显示的数字与字母(P26为段选);锁存器U3的11脚接单片机的P27,用于控制6个数码管中的哪个进行显示。

单片机的主时钟为11.0592MHz。

数码管电路

实验板上所用数码管为共阴极数码管,其显示原理如下图所示。

共阴极数码管显示原理

四、实验说明

1、下表为驱动LED数码管的段代码表,1--代表对应的笔段亮,0--代表对应的笔段不亮。

数字

dp

g

f

e

d

c

b

a

十六进制

P0.7

P0.6

P0.5

P0.4

P0.3

P0.2

P0.1

P0.0

共阴

0

0

0

1

1

1

1

1

1

3F

1

0

0

0

0

0

1

1

0

06

2

0

1

0

1

1

0

1

1

5B

3

0

1

0

0

1

1

1

1

4F

4

0

1

1

0

0

1

1

0

66

5

0

1

1

0

1

1

0

1

6D

6

0

1

1

1

1

1

0

1

7D

7

0

0

0

0

0

1

1

1

07

8

0

1

1

1

1

1

1

1

7F

9

0

1

1

0

1

1

1

1

6F

A

0

1

1

1

0

1

1

1

77

B

0

1

1

1

1

1

0

0

7C

C

0

0

1

1

1

0

0

1

39

D

0

1

0

1

1

1

1

0

5E

E

0

1

1

1

1

0

0

1

79

F

1

1

1

1

0

0

0

1

71

2、下表为驱动LED数码管的位代码表,实验板上数码管从右向左依次表示为S0、S1、S2、S3、S4、S5。

数码管

P0.7

P0.6

P0.5

P0.4

P0.3

P0.2

P0.1

P0.0

十六进制

S0

1

1

0

1

1

1

1

1

DF

S1

1

1

1

0

1

1

1

1

EF

S2

1

1

1

1

0

1

1

1

F7

S3

1

1

1

1

1

0

1

1

FB

S4

1

1

1

1

1

1

0

1

FD

S5

1

1

1

1

1

1

1

0

FE

因此,若需要在最右边数码管(S0)上显示数字“5”,只要从段代码表中查得6DH写入P0口,置P2.6为高,将6DH锁存在锁存器U2的输出端,再置P2.6为低;然后从位代码表中查得0DFH写入P0口,置P2.7为高,将0DFH锁存在锁存器U3的输出端,再置P2.7为低即可。

3、实现最右边的一个LED数码管循环显示0~9十个数字的汇编语言程序如下:

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVR1,#00H

LOOP:

MOVA,R1

MOVDPTR,#TAB

MOVCA,@A+DPTR

MOVP0,A

MOVP2,#40H

MOVP2,#00H

MOVP0,#0DFH

MOVP2,#80H

MOVP2,#00H

LCALLDELAY

INCR1

MOVA,R1

CJNEA,#10,LOOP

CLRA

MOVR1,A

SJMPLOOP

DELAY:

MOVR7,#198

DEL1:

MOVR6,#50

DEL2:

MOVR5,#23

DJNZR5,$

DJNZR6,DEL2

DJNZR7,DEL1

RET

TAB:

DB3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH

END

五、思考题

1.分别写出

六个字母(用于显示十六进制数)的段代码,编写程序,在最右边数码管上实现0-F的循环显示。

2.能否交替点亮点6个LED数码管?

 

实验三LED数码管的动态驱动

一、实验目的

1.学习LED数码管的动态驱动编程。

2.学习使用定时/计数器、中断。

3.学习汇编语言的有关运算。

二、实验内容

编写程序,使实验板上的6个LED数码管稳定显示6个不同的数字,并使这四位数从000000开始,每0.5秒钟加1。

三、实验电路连线

本实验有关的硬件见实验二。

四、实验说明

1.在实验二中,我们已经能够让某一个LED数码管显示需要的数字,比如选让第一个LED显示“1”,隔一较短的时间(如2.5毫秒)后关闭第一个LED,让第二个LED显示“2”,如此周而复始,让6个LED依次显1、2、3、4、5、6,我们就能看到6个LED上稳定地显示6个不同的数字。

当然,每个瞬间只有一个LED被点亮,大家亮的时间相同,均为2.5毫秒,6个LED数码管点亮一遍需要15毫秒,一秒钟各亮66次,所以看上去不会有闪烁感,但亮度只是实验二中LED亮度的六分之一。

要实现每隔再隔2.5毫秒变换一个LED,最好的方法是使用定时器中断。

2.汇编语言参考程序为:

DSEG

ORG10H

DISP_BUF:

DS6;显示缓冲区

SCN_INX:

DS1;扫描指针

SCN_COD:

DS1;扫描码

CNT:

DS1;中断计数,每2.5ms加1

CSEG

ORG00H

LJMPMAIN;主程序入口,转初始化程序

ORG0BH;定时中断0入口

LJMPINTP0;每2.5ms中断一次,用于刷新显示

ORG30H

MAIN:

MOVSP,#50H;初始化堆栈指针

CLRRS0;选用第0组通用寄存器

CLRRS1

CLRA

MOVCNT,A

MOVR1,#6

MOVR0,#DISP_BUF

LOOP1:

MOV@R0,A;显示缓冲区清零

INCR0

DJNZR1,LOOP1

MOVSCN_INX,A;扫描指针置0

MOVTMOD,#01H;定时器0,方式1

MOVTH0,#0F7H;计数初值,每次2.5ms(11.0592MHz晶振)

MOVTL0,#000H;65536-(2.5ms/1.085μs)=63232=0F700H

SETBTR0;启动定时器0

SETBEA;中断总允许

SETBET0;允许定时器0中断

SJMP$;主程序在此循环

;---------定时器0中断服务程序,间隔2.5ms---------

INTP0:

PUSHACC

PUSHPSW

MOVTH0,#0F7H;置计数初值

MOVTL0,#00H

SETBRS0;选用第1组通用寄存器

CLRRS1

MOVA,SCN_INX;取扫描指针

CJNEA,#06H,LOOP2

MOVA,#00H

MOVSCN_INX,#00H

LOOP2:

MOVR3,A

ADDA,#DISP_BUF;加显示缓冲区首地址

MOVR1,A

MOVA,@R1

MOVDPTR,#CODE_TAB;DPTR指向笔画代码表

ANLA,#0FH

MOVCA,@A+DPTR;取笔画代码

MOVP0,A

MOVP2,#40H;段选信号P2.6置高

MOVP2,#00H

MOVA,R3

MOVDPTR,#TAB1;DPTR指向位代码表

MOVCA,@A+DPTR

MOVP0,A

MOVP2,#80H;位选信号P2.7置高

MOVP2,#00H

INCSCN_INX;扫描指针加1

INCCNT

MOVA,CNT

CJNEA,#200,EN

MOVCNT,#0

INCDISP_BUF+0;个位加1

MOVA,DISP_BUF+0

CJNEA,#10,EN;不进位转移

MOVDISP_BUF+0,#0;进位则个位清零

INCDISP_BUF+1

MOVA,DISP_BUF+1

CJNEA,#10,EN

MOVDISP_BUF+1,#0

INCDISP_BUF+2

MOVA,DISP_BUF+2

CJNEA,#10,EN

MOVDISP_BUF+2,#0

INCDISP_BUF+3

MOVA,DISP_BUF+3

CJNEA,#10,EN

MOVDISP_BUF+3,#0

INCDISP_BUF+4

MOVA,DISP_BUF+4

CJNEA,#10,EN

MOVDISP_BUF+4,#0

INCDISP_BUF+5

MOVA,DISP_BUF+5

CJNEA,#10,EN

MOVDISP_BUF+5,#0

EN:

POPPSW

POPACC

RETI

;-----------段选代码表-------------

CODE_TAB:

DB3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH

;-----------位选代码表-------------

TAB1:

DB0DFH,0EFH,0F7H,0FBH,0FDH,0FEH

END

五、思考题

如何让8个LED数码管从00-00-00开始,每秒钟自动加1,前两位代表时,中间两位代表分,后两位代表秒?

 

实验四用单片机自动演奏乐曲

一、实验目的

1.进一步熟悉89C51定时器/计数器的功能及应用;

2.掌握其初始化与中断服务程序的编程方法;

3.掌握用定时器/计数器发出不同音调的编程方法。

二、实验内容

用单片机的定时器/计数器0作定时器使用,工作于模式1,中断产生方波发声,根据各个的频率,计算对应的定时时间常数,定时器中断后按此常数赋初值,从而发出对应的音调。

将歌曲的音调和节拍编成一个表,用音调作为定时器的初值,用节拍控制发音时间,就可以实现自动演奏。

三、实验电路连线

本实验有关的硬件如下图所示,FM为蜂鸣器控制端,在使用蜂鸣器时,需要用杜邦线将P2.0引脚与FM引脚进行短接。

蜂鸣器电路

四、实验说明

声单定时初值常数计算方法:

根据下表的音阶频率,计算对应的音阶周期T,用T/2计算定时周期数(晶振11.0592MHz),填入下表中。

定时器的计数初值为65536-定时周期数,在程序计算产生。

定时周期数增加1倍,音阶降低八度,定时周期数降低1倍,音阶升高八度。

 

音阶(C调)

1

2

3

4

5

6

7

频率(Hz)

256

288

320

341

384

427

480

周期(μs)

3906

3472

3125

2932

2604

2342

2083

定时周期数

3600

3200

2880

2702

2400

2158

1920

自动演奏《东方红》乐曲的C语言程序为:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitP20=P2^0;

codeuintcyc[]={3600,3200,2880,2702,2400,2158,1920};//音阶1-7对应的计数周期数

codeuchartone[]={15,15,16,12,11,11,06,12,15,15,16,21,16,15,11,11,

06,12,15,12,11,7,6,5,15,12,13,12,11,11,6,12,

13,12,11,12,11,7,6,5,0};//乐曲《东方红》的简谱表

codeuchartime[]={8,4,4,16,8,4,4,16,8,8,4,4,4,4,8,4,

4,16,8,8,8,4,4,8,8,8,4,4,8,4,4,4,

4,4,4,4,4,4,4,16,0};//节拍表(8为1拍,约570mS)

ucharH0,L0,cnt;

voidcntint0(void)interrupt1//定时器0中断用于产生音调

{TH0=H0;

TL0=L0;

P20=~P20;//P2.0是音乐信号输出脚

}

voidcntint1(void)interrupt3//定时器1中断用于产生节拍

{cnt++;//定时器的计数初值为0,所以不用赋值

}

voidmain(void)

{uchari,a,t;

uintb;

next:

TMOD=0x11;

EA=1;

ET0=1;

ET1=1;

cnt=0;

TR1=1;

i=0;

while

(1)

{t=tone[i];//读音调

if(t==0)break;//是0,则结束

b=cyc[t%10-1];

if(t<10)b=b*2;

if(t>20)b=b/2;

b=b/2;

H0=(65536-b)/256;

L0=(65536-b)%256;

cnt=0;

a=time[i];//读节拍

if(a!

=255)TR0=1;//255是休止符

while(a>cnt);

TR0=0;

i++;

for(b=0;b<1000;b++);

}

P20=1;//关闭喇叭

gotonext;//重放一遍

}

五、思考题

参考《东方红》乐曲的演奏程序,编写《康定情歌》乐曲的演奏程序。

《康定情歌》的乐谱如下:

康定情歌

13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13,13,15,16,16,15,

8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,

16,13,12,12,15,13,12,13,12,11,12,6,6,12,

8,8,12,4,8,8,4,4,4,4,8,24,8,24,

15,13,12,6,16,15,13,12,13,12,11,12,6,5,6

8,24,8,16,8,8,8,4,4,4,4,8,16,8,32

附:

自动演奏乐曲《八月桂花启遍地开》的汇编语言参考程序。

ORG0000H

LJMPSTART

ORG000BH

INC20H;中断服务,中断计数器加1

MOVTH0,#0DCH

MOVTL0,#00H;11.0592MHz晶振,形成10毫秒中断

RETI

START:

MOVSP,#50H

MOVTH0,#0DCH

MOVTL0,#00H

MOVTMOD,#01H

MOVIE,#82H

MUSIC0:

NOP

MOVDPTR,#DAT;表头地址送DPTR

MOV20H,#00H;中断计数器清0

MUSIC1:

NOP

CL

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

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1