单片机实验Word格式文档下载.docx

上传人:b****5 文档编号:20666826 上传时间:2023-01-24 格式:DOCX 页数:75 大小:186.01KB
下载 相关 举报
单片机实验Word格式文档下载.docx_第1页
第1页 / 共75页
单片机实验Word格式文档下载.docx_第2页
第2页 / 共75页
单片机实验Word格式文档下载.docx_第3页
第3页 / 共75页
单片机实验Word格式文档下载.docx_第4页
第4页 / 共75页
单片机实验Word格式文档下载.docx_第5页
第5页 / 共75页
点击查看更多>>
下载资源
资源描述

单片机实验Word格式文档下载.docx

《单片机实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机实验Word格式文档下载.docx(75页珍藏版)》请在冰豆网上搜索。

单片机实验Word格式文档下载.docx

RET

END

实验2分支和循环程序设计

sy2a.asm版本:

设变量X存于内部RAM20H单元,函数值Y存于H单元,试按照下式要求对Y赋值。

X+3X>

Y=20X=0

XX<

0

*/

ORG0100H

MOV20H,#1

MOVA,20H

JZZERO

JBACC.7,STORE

ADDA,#03H

SJMPSTORE

ZERO:

MOVA,#00H

STORE:

MOV21H,A

RET

sy2b.asm版本:

P10、P11口控制红色LED和绿色LED交替秒亮灭(1亮灭)注明:

DELAY实现延时约DelayTime*100ms(晶振M)

100.003ms*DelayTime+0.004ms;

DelayTimeEQU30H

MOVR0,#0FEH

MOVR1,#0FDH

MOVDelayTime,#10

MOVP1,R0

MOVR2,DelayTime;

2us

;

ACALLDELAY;

MOVP1,R1

MOVR2,DelayTime

ACALLDELAY

LJMPLOOP

DELAY:

MOVR7,#200;

1us

DLYLOOP:

MOVR6,#248;

NOP;

DLYLOOP1:

DJNZR6,DLYLOOP1;

2us*248

DJNZR7,DLYLOOP;

DJNZR2,DELAY;

RET;

END

实验3I/O口扩展实验

一、实验目的:

1、学习P1口既做输入又做输出的使用方法。

2、学习I/O口数据输入、输出程序的C51编程方法。

二、实验设备:

EL-MUT-III型单片机实验箱、8051CPU模块

三、实验内容

1、P10、P11口作为输入口,输入开关的状态。

2、P12、P13、P14、P15口作为输出口,输出四个LED的亮灭状态。

3、C51编程实验开关量输入,并控制LED亮灭。

四、实验原理

1.I/O口

MCS-51系列单片机共有4个I/O口,分别是P0、P1、P2、P3,此四个接口都可以单独的做输入或输出使用。

实际应用中,P0口用于输出外部数据存储器的低8位,并分时复用作为与外部连接的数据总线口;

P2口用于输出高8位地址;

P3口常操作于定义的第二功能;

P1口一般为留给用户使用的基本I/O口。

在单片机C语言中,对于端口(位)的使用可以使用sbit来定义,如:

sbitP10=P1^0//定义变量P10指向P1端口的第0位

在程序中就可以使用P10变量来访问P1口的第0位。

对于P0口、P2口,一般在访问外部数据空间时使用,在单片机C语言中的使用方法可以看下例:

#include<

reg51.h>

absacc.h>

#defineINPORTXBYTE[0XCFA8]//定义变量INPORT指向外部空间0XCFA8

#defineOUTPORTXBYTE[0XCFB0]//定义变量OUTPORT指向外部空间0XCFB0

voidmain(void)

{

OUTPORT=INPORT;

……

}

该例实现了将外部空间0xCFA8的数据转存入外部空间0xCFB0的功能,注意的是,在单片机C语言中,对于外部空间的使用,需要用XBYTE关键字来定义,而且程序要包含absacc.h这一函数库。

本实验利用单片机P1口扩展,实现由单片机I/O口读取开关量状态,同时将状态数据由单片机I/O口输出到LED显示。

其中两个开关的不同组合,对应不同LED显示状态。

本实验程序为减少总线口读写的频繁程度,需要增加一段延时程序,不会影响显示的稳定。

单片机C语言中延时的方法可以采用:

for循环、定时器定时。

sy3a.asm版本:

开关编码控制LED显示*/

ORG0000H

LJMPMAIN

ORG4100H

MOVR0,#00H

ACALLSCAN

ACALLSHOW

MOVP1,#0FFH

ORG0200H

SCAN:

MOVA,P1

ANLA,#03H

MOVR0,A

RET

SHOW:

MOVA,R0

LEDOFF:

CJNEA,#00H,LEDON

SETBP1.4

SETBP1.5

SETBP1.6

SETBP1.7

ACALLDELAY

SJMPLEDEND

LEDON:

CJNEA,#03H,LEDCO

CLRP1.4

CLRP1.5

CLRP1.6

CLRP1.7

LEDCO:

SETBP1.5

LEDEND:

MOVR1,#5;

延时.5秒

DEL1:

MOVR2,#200

DEL2:

MOVR3,#126

DEL3:

DJNZR3,DEL3

DJNZR2,DEL2

DJNZR1,DEL1

END

sy3a.c版本:

V1.0_C功能:

开关编码控制LED显示/

sbitP10=P1^0;

sbitP11=P1^1;

sbitP12=P1^4;

sbitP13=P1^5;

sbitP14=P1^6;

sbitP15=P1^7;

unsignedcharSwitchScan(void);

voidLedShow(unsignedcharswitch_state);

voidLedOff(void);

voidLedLight(void);

voidLedColor(void);

voidDelay(inttemp);

/*****函数名:

main主函数功能:

扫描开关状态并显示不同方式的LED状态说明:

无*/

unsignedcharSwitchState;

while

(1)

{

SwitchState=SwitchScan();

LedShow(SwitchState);

}

/**函数名:

LedShow功能:

LedShow根据开关状态实现LED对应显示输入:

switch_state=SwitchState返回:

LED显示状态*/

voidLedShow(unsignedcharswitch_state)

if(switch_state==0x00)//开关k1、k2接地

LedOff();

elseif((switch_state==0x01)||(switch_state==0x02))//开关k1接高、k2接地;

开关k1接低、k2接高

LedColor();

elseif(switch_state==0x03)//开关k1、k2接高

LedLight();

else;

SwitchScan

*功能:

SwitchScan实现开关状态扫描

*输入:

SWITCH244

*返回:

temp_state&

0x03*/

unsignedcharSwitchScan(void)

unsignedchartemp_state;

temp_state=P1;

returntemp_state&

0x03;

LedOff

LedOff实现LED全部熄灭

LED273状态*/

voidLedOff(void)

P12=1;

P13=1;

P14=1;

P15=1;

Delay(50);

LedLight

LedLight实现LED全部点亮

voidLedLight(void)

P12=0;

P13=0;

P14=0;

P15=0;

LedColor

LedColor实现LED循环点亮

ColorData[]

LED273状态*/

voidLedColor(void)

Delay(500);

Delay

Delay实现延时约ms*temp(晶振M)

*for循环执行一次需:

(12*(1/6M))*8s

延时时间temp

无*/

voidDelay(inttemp)

unsignedchari;

while(temp--)

for(i=0;

i<

62;

i++)

{

}

实验四定时器及外部中断实验

1、熟练在单片机系统中扩展简单I/O接口的方法。

2、熟练C51语言数据输出程序的设计方法。

3、学习外部中断技术及定时器中断的C51基本使用方法。

4、学习中断处理程序C51编程方法。

三、实验内容:

本实验的原理图如下:

1.扩展实验箱上的74LS273作为输出口,控制八个发光二极管亮灭,模拟交通灯管理。

2.在上述实验内容的基础上增加允许急救车优先通过的要求。

具体要求为:

当有急救车到达时,东西和南北方向上的红灯亮,以便让急救车通过,假定急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。

本实验以单脉冲为中断申请,表示有急救车通过。

四、实验原理:

1、实验方案

本实验的设计可以有两种设计方案:

方案一:

用十二个发光二极管分别表示南面路口的绿灯、黄灯、红灯,东面路口的绿灯、黄灯、红灯,北面路口的绿灯、黄灯、红灯,西面路口的绿灯、黄灯、红灯。

方案二:

虽然实际交通灯的数量是十二个,但是因为南北路口的两个红灯、绿灯以及黄灯的亮灭 规律相同,其它路口的灯也满足同样的规律,所以用六个发光二极管也能模拟交通灯。

由原理图可定义如下:

LED1、LED2、LED3→东西方向的红灯、绿灯、黄灯

LED5、LED6、LED7→南北方向的红灯、绿灯、黄灯

要完成本实验,首先必须了解交通路灯的亮灭规律,本实验的亮灭规律如下:

1、初始态是两个方向路口的红灯全亮。

2、东西路口的绿灯亮,南北路口的红灯亮,东西方向通车。

3、延时一段时间后,东西路口绿灯灭,黄灯开始闪烁、闪烁若干次。

4、东西路口红灯亮,同时南北路口绿灯亮,南北方向开始通车。

5、延时一段时间后,南北路口绿灯灭,黄灯开始闪烁、闪烁若干次。

6、切换到东西路口方向,如此反复下去。

特别注意的是中断现场的保护。

要求用软件或者定时器来完成延时。

2、实验说明

本实验74LS273芯片对于单片机而言,为外扩的外部资源,其对应的地址由片选信号CS273控制,本实验74LS273的片选CS273接片选信号CSO,则74LS273项对于单片机的外部空间抵制为0xCFA0,C51语言定义如下:

#defineOUTPORTXBYTE[0xCFA0]

因此交通灯(发光二极管)的显示数据可以赋给OUTPORT变量,实现结果的输出。

本实验中还要注意的是,交通灯的每一种状态的显示,都需要延时一段时间再切换到另一种状态,从而实现每一种状态的稳定显示。

其C51语言的实现方法如下:

OUTPORT=x;

//显示交通灯某一状态数据x

Delay

(1);

//延时1ms

OUTPORT=y;

//显示交通灯另一状态数据y

//延时1ms

……

实验中涉及到急救车通过,要求使用外部中断的方式实现。

在本实验中我们可以利用单片机的外部中断INT0实现。

也就是说,急救车通过时,首先利用INT0外部中断给单片机发脉冲,告知单片机,急救车要求通过,然后单片机接收到脉冲,并做出判断并使东西和南北方向上的红灯亮,同时延时10秒,10秒后表明急救车已经通过,此时单片机恢复原状态。

利用C51语言可定义外部中断如下:

voidRescure_bus()interrupt0

EA=0;

//关闭中断,即不允许其它中断

OUTPORT=0x11;

//0x11为东西和南北方向上红灯亮的状态数据

Delay(10000);

//延时10s

EA=1;

//开启中断

在调用外部中断0时,一定要注意的是中断现场的保护,要就是说,中断完成后,一定能够恢复中断前的状态,那么在中断程序中使用的变量、外部端口、内部资源,如果在中断前正在使用,那么在中断开始前一定要保护,中断后一定要恢复。

同时,注意的是由于在实验中使用到单片机资源外部中断0,需要对对应的特殊寄存器作一定的配置。

首先需要定义特殊寄存器变量:

sfrIE=0xA8;

sbitEA=IE^7;

sbitEX0=IE^0;

当然,这些特殊寄存器的定义实际上在reg51.h库中定义了,因此在C51编程时,只要包含上reg51.h即可,如下所示:

本实验需要使用到这些特殊寄存器,就是在程序初始化时需要对这些寄存器赋初值,才可保证对应的INT0中断正常工作。

本实验赋初值如下:

IT0=1;

EX0=1;

EA=1;

本实验可以根据实际实验箱的配置来选择以上方案中的任意一种。

本实验按照方案二来设计,选用实验箱上八个发光二极管中的六个,即红、黄、绿各两个。

例如将L1(红)、L2(绿)、L3(黄)作为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)作为南北方向的指示灯,同学们还可以用别的设计方法。

各发光二极管的阳极通过保护电阻接到+5V的电源上,阴极接到输入端上,因此使其点亮应使相应输入端为低电平。

sy4a.c版本:

V2.0_C功能:

交通灯控制模拟,可模拟救护车,定时器延时*/

#defineLED273XBYTE[0xCFA0]

dataunsignedchar*TrafficData;

dataunsignedcharDataBuf;

codeunsignedcharData[]={0xEE,0xED,0xEB,0xEF,0xDE,0xBE,0xFE};

unsignedchardatatime_100ms,sn;

voidTrafficInit(void);

voidTrafficLed(void);

voidDelay(unsignedinttemp);

***********************

*/

/*函数名:

INIT0_Timer1Init

实现Timer1初始化状态和INIT0初始化状态

无*返回:

voidINIT0_Timer1Init(void)

{IP=1;

EX0=1;

TMOD=0x10;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

ET1=1;

TR1=0;

Timer1(定时器中断服务函数)功能:

Timer1实现中断ms(晶振M)输入:

time_1s返回:

time_1s

说明:

定时器实现的定时无法直接达到s*/

voidTimer1()interrupt3

{TH1=(65536-50000)/256;

time_100ms--;

if(time_100ms==0){TR1=0;

sn=0;

Rescure_bus(外部中断服务函数)

功能:

Rescure_bus实现救护车通过功能

输入:

救护车通过交通灯显示数据TrafficData[0]

返回:

无说明:

输出到LS273数据的现场保护及恢复*/

voidRescure_bus()interrupt0

{

EA=0;

LED273=TrafficData[0];

/*东西、南北红灯亮*/

Delay(5000);

LED273=DataBuf;

/*输出到LS273数据的现场恢复*/

EA=1;

初始化、交通灯显示*/

{

INIT0_Timer1Init();

TrafficLed();

}

TrafficLed

TrafficLed实现交通灯规律显示

交通灯规律显示数据TrafficData[]

voidTrafficLed(void)

TrafficData=((unsignedchar*)Data);

DataBuf=TrafficData[1];

/*东西绿灯亮、南北红灯亮*/

TR1=1;

sn=1;

time_100ms=20;

while(sn);

DataBuf=TrafficData[4];

/*东西红灯亮、南北绿灯亮*/

LED273=DataBuf;

Delay功能:

for循环执行一次需:

(12*(1/6M))*8s输入:

无*/

voidDelay(unsignedinttemp)

unsignedcharj;

while(temp--)

for(j=0;

j<

j++)

{;

实验五8255扩展八段数码管实验

一、实验目的:

1、学习8255芯片的结构及编程方法。

2、掌握八段数码管的使用方法,及动态显示的编程方法。

实验的原理图如下所示:

本实验通过单片机控制8255芯片,利用8255的PA口输出数码管的段码,PB口输出数码管的位码。

编写C51程序实现六个数码管以固定时间间隔交替动态显示“012345”和“ABCDEF”。

8255芯片是单片机通用的并行接口扩展芯片,可扩展PA、PB、PC三个8位并行口。

对于单片机而言,如果外接8255芯片,那么8255所对应的外部空间地址不再是固定为一个值了。

本实验8255的片选信号接CS0,则表明8255相对于单片机的外部地址范围是0xCFA0-0xCFA7,此时8255的PA口、PB口、PC口、控制字寄存器对应于单片机的外部地址为:

0xCFA0、0xCFA1、0xCFA2、0xCFA3,其对应C51定义可如下例:

#definePAXBYTE[0xCFA0]

#definePBXBYTE[0xCFA1]

#definePCXBYTE[0xCFA2]

#definePCTLXBYTE[0xCFA3]

对于八段数码管,显示数据时需要同时送入段码和位码,位码就是选择哪一个数码管接收段码数据,段码就是需要显示的字符的编码。

在C51中段码可定义如下:

Unsignedcharcodetable[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7f,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

上面定义的是字符0-9、A-F以及黑屏的段码数据,而且是共阴极八段数码管的段码数据。

当需要显示某一个字符时,只要查询table[]数组即可,如:

显示A字符

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

当前位置:首页 >

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

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