单片机实验Word格式文档下载.docx
- 文档编号:20666826
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:75
- 大小:186.01KB
单片机实验Word格式文档下载.docx
《单片机实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机实验Word格式文档下载.docx(75页珍藏版)》请在冰豆网上搜索。
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字符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验