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