单片机PLC实验报告.docx

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

单片机PLC实验报告.docx

《单片机PLC实验报告.docx》由会员分享,可在线阅读,更多相关《单片机PLC实验报告.docx(28页珍藏版)》请在冰豆网上搜索。

单片机PLC实验报告.docx

单片机PLC实验报告

实验一、单片机输入输出实验

一、实验目的:

熟悉C8051F系列单片机的C语言编程,熟悉C8051F系列单片机的定时器使用方法,学习使用C8051F系列单片机数字量输入/输出。

二、实验原理:

1.对于8位LED输出实验将C8051F020的P4口连接到8盏LED灯,通过定时器3计数溢出的方式产生中断,实现8盏灯依次循环点亮。

2.对于8路拨档开关输入,只需要使P5端口的输入传给P4端口,从而驱动对应LED小灯点亮。

三、实验步骤:

1.8位LED输出

准备工作:

用短接线将实验箱上的P4.0~P4.7与LD1~LD8接线端子短接。

利用定时器3作定时(系统主频2MHz,定时间隔要求0.3秒),用C8051F020的P4口作输出控制发光二极管LD1~LD8。

让发光二极管LD1~LD8依次点亮(同一时刻只有一个发光二极管发光)。

其中LD1最先点亮,LD8最后点亮;当LD8点亮后,LD1再点亮,然后重复。

2.8路拨档开关输入

准备工作:

闭合开关K11。

A.编写程序,读入开关K1~K8的状态。

B.编写程序,读入开关K1~K8的状态,取反后通过发光二极管LD1~LD8输出。

四、实验流程:

1.8位LED输出

N

Y

 

2.8路拨档开关输入

五、实验程序:

1.8位LED输出

//-----------------------------------------------------------------------------

//程序说明:

//此程序用于测试教学实验机上的8个发光二极管,正常情况下应轮流点亮.定时时间为0.3s

//---------------------------------------------------------------------

//头文件包含

//-------------------------------------------------------------------------

#include

//-------------------------------------------------------------------------

//16位特殊寄存器定义

//------------------------------------------------------------------------

sfr16TMR3RL=0x92;

sfr16TMR3=0x94;

//---------------------------------------------------------------------------

//常量定义

//----------------------------------------------------------------------

#defineSYSCLK2000000//系统工作频率

//---------------------------------------------------------------------

//全局变量定义

//---------------------------------------------------------------------------

unsignedchari=0xfe;

//---------------------------------------------------------------------------

//函数定义

//---------------------------------------------------------------------------

voidPORT_Init(void);

voidTimer3_Init(intcounts);

voidTimer3_ISR(void);

//---------------------------------------------------------------------------

//主程序

//---------------------------------------------------------------------------

voidmain(void){

WDTCN=0xde;

WDTCN=0xad;//禁止看门狗定时器

PORT_Init();

Timer3_Init(0xc350);//定时时间为0.3s

REF0CN=0x02;

EA=1;

while

(1){

}

}

//-------------------------------------------------------------------------

//函数名称:

PORT_Init()

//函数功能:

通用I/O口及交叉开关初始化

//入口参数:

//出口参数:

//全局变量引用:

//调用模块:

//----------------------------------------------------------------------

voidPORT_Init(void)

{

XBR2=0x40;/*使能交叉开关*/

P74OUT|=0x000;/*推挽输出*/

}

//--------------------------------------------------------------------

//函数名称:

Timer3_Init()

//函数功能:

定时器3初始化

//入口参数:

intcounts

//出口参数:

//全局变量引用:

//调用模块:

//----------------------------------------------------------------------

voidTimer3_Init(intcounts)

{

TMR3CN=0x00;//用十二分频

TMR3RL=-counts;

TMR3=0xffff;

EIE2|=0x01;

TMR3CN|=0x04;

}

//-------------------------------------------------------------------

//函数名称:

Timer3_ISR()

//函数功能:

定时器3中断服务程序

//入口参数:

//出口参数:

//全局变量引用:

//调用模块:

//-------------------------------------------------------------------

voidTimer3_ISR(void)interrupt14

{

intj;

TMR3CN&=~(0x80);/*清中断标志*/

P4=i;/*送数据到P4*/

i<<=1;

i=i|0x01;

if(i==0xff)

i=0xfe;

}

2.8路拨档开关输入

//-----------------------------------------------------------------------------

//程序说明:

//开关输入,小灯输出

//---------------------------------------------------------------------

//头文件包含

//-------------------------------------------------------------------------

#include

//---------------------------------------------------------------------------

//主程序

//----------------------------------------------------------------------------

voidmain(void){

WDTCN=0xde;

WDTCN=0xad;//禁止看门狗定时器

XBR2=0x40;/*使能交叉开关*/

P74OUT|=0x000;/*推挽输出*/

P4=P5;/*送数据到P4*/

}

五、作业:

1.试分析8位LED输出电路图的原理。

答:

8位LED输出电路图如下,当测试铜头为低电平时,LED能够发光,当测试铜头为高电平或浮空状态时,LED不亮。

2.试分析8路拨档开关输入电路图的原理。

答:

8路拨档开关输入电路图如下,K11是总的开关,当K1-K8任意一个开关接通时,对应的P5上的端口被置‘0’,同时弱上拉端口产生一个中断,即INT0=0.

 

实验二、单片机控制步进电机实验

一、实验目的:

了解步进电机工作原理,掌握使用C8051F020控制步进电机的硬件设计方法,熟悉步进电机驱动程序的设计与调试。

二、实验原理:

1.步进电机的工作原理:

以三相反应式步进电机为例:

它的定子上有三对磁极,每一对磁极上绕着一相绕组,绕组通电时,这两个磁极的极性相反;三相绕组接成星形,转子铁心及定子极靴上有小齿,定转子齿距通常相等。

转子铁心上没有绕组,转子的齿数为40,相邻两个齿之间夹角为9°。

当某一相绕组通电时,由于定转子上有齿和槽,所以当转子齿的相对位置不同时,在磁场的作用下,转子将转动一个角度,使转子和定子的齿相互对齐,这就是使步进电机旋转的原因。

步进电机运转是由脉冲信号控制。

通过改变各相通电的次序可以调整步进电机的运转方向。

改变脉冲信号的周期就可以改变步进电机的运转速度。

本实验板选用的是四相步进电机,实验例程采用四相八拍的方式驱动步进电机。

正方向:

A-AB-B-BC-C-CD-D-DA-A

反方向;A-DA-D-CD-C-BC-B-AB-A

AA,BB,CC.DD是步进电机的4个线圈,D8,D9,D11,D12为续流二极管,是为步进电机的4个线圈放电用的,当电机断电时,它的线圈要放电用二流管导流。

本实验将P5的四个端口P5.0-P5.3连接到步进电机A、B、C、D四个口上,通过改变P5.0-P5.3四个口高低电平的轮流改变实现了步进电机的驱动。

通过改变每个周期的高低电平改变时间控制步进电机的速度。

三、实验步骤:

1.准备工作

教学实验机的步进电机驱动信号是STEPA~STEPD,本例程用P5.0~P5.3来控制步进电机的4个线圈处于通电或断电状态,所以在运行例程前,用跳线将STEPA~STEPD分别同P5.0~P5.3连接;同时也应将步进电机的引出线同CN2正确连接(VCC—黑,AA—红,BB—黄,CC—白,DD—蓝)。

2.步进电机正

编制程序控制步进电机实现正功能

3.步进电机反转

编制程序控制步进电机实现反功能

4.步进电机定速运行

编制程序使步进电机以每分钟30圈的速度正转

 

四、实验流程:

1.步进电机正

2、步进电机反

3、步进电机定速运行

五、实验程序:

1.步进电机正

//P50--STEPAP51--STEPBP52--STEPCP53--STEPD

//------------------------------------------------------------------------------------

//Includes

//------------------------------------------------------------------------------------

#include//SFRdeclarations

#include

//------------------------------------------------------------------------------------

//FunctionPROTOTYPES

//------------------------------------------------------------------------------------

voidPORT_Init(void);

/***************************************************************************************

函数名称:

voidsleep_ms(WORDcount)

功能描述:

延时

输入:

WORDcount(所要延时的长度)

输出:

全局变量:

调用模块:

_nop_()

***************************************************************************************/

voidsleep_ms(unsignedcharcount)

{

unsignedcharii,jj;

for(ii=0;ii

{

for(jj=0;jj<250;jj++)

_nop_();

}

}

//------------------------------------------------------------------------------------

//MAINRoutine

//------------------------------------------------------------------------------------

voidmain(void){

unsignedchark;

unsignedcharSendData;

/*无效看门狗*/

WDTCN=0xde;

WDTCN=0xad;

PORT_Init();

SendData=0xff;/*4相线圈都截止*/

while

(1)

{

//步进电机正转

SendData=0x0e;/*A相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x0c;/*AB相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x0d;/*B相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x09;/*BC相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x0b;/*C相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x03;/*CD相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x07;/*D相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x06;/*DA相通电*/

P5=SendData;

sleep_ms(250);

}

}

/***************************************************************************************

函数名称:

voidPORT_Init(void)

功能描述:

初始化I/O

输入:

输出:

全局变量:

XBR2,P74OUT

调用模块:

***************************************************************************************/

voidPORT_Init(void)

{

XBR2=0x40;/*使能交叉开关和弱上拉*/

P74OUT|=0x0f;/*P5低4位为推挽输出,其余口为开漏输出*/

}

2.步进电机反:

//程序说明:

此程序通过I/O口驱动步进电机反转

//P50--STEPAP51--STEPBP52--STEPCP53--STEPD

//----------------------------------------------------------------------------

//Includes

//----------------------------------------------------------------------------

#include//SFRdeclarations

#include

//----------------------------------------------------------------------------

//FunctionPROTOTYPES

//----------------------------------------------------------------------------

voidPORT_Init(void);

/*****************************************************************************函数名称:

voidsleep_ms(WORDcount)

功能描述:

延时

输入:

WORDcount(所要延时的长度)

输出:

全局变量:

调用模块:

_nop_()

*****************************************************************************/

voidsleep_ms(unsignedcharcount)

{

unsignedcharii,jj;

for(ii=0;ii

{

for(jj=0;jj<250;jj++)

_nop_();

}

}

//----------------------------------------------------------------------------

//MAINRoutine

//----------------------------------------------------------------------------

voidmain(void){

unsignedchark;

unsignedcharSendData;

/*无效看门狗*/

WDTCN=0xde;

WDTCN=0xad;

PORT_Init();

SendData=0xff;/*4相线圈都截止*/

/*步进电机反转*/

while

(1){

SendData=0x0e;/*A相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x06;/*DA相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x07;/*D相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x03;/*CD相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x0b;/*C相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x09;/*BC相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x0d;/*B相通电*/

P5=SendData;

sleep_ms(250);

SendData=0x0c;/*AB相通电*/

P5=SendData;

sleep_ms(250);

}

}

/*****************************************************************************

函数名称:

voidPORT_Init(void)

功能描述:

初始化I/O

输入:

输出:

全局变量:

XBR2,P74OUT

调用模块:

****************************************************************************/

voidPORT_Init(void)

{

XBR2=0x40;/*使能交叉开关和弱上拉*/

P74OUT|=0x0f;/*P5低4位为推挽输出,其余口为开漏输出*/

}

3.步进电机定速运转:

//程序说明:

此程序通过I/O口驱动步进电机定速运转,且每分钟30转

//P50--STEPAP51--STEPBP52--STEPCP53--STEPD

//------------------------------------------------------------------------------------

//Includes

//------------------------------------------------------------------------------------

#include//SFRdeclarations

#include

//------------------------------------------------------------------------------------

//FunctionPROTOTYPES

//-----------------------------

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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