单片机与PLC技术实验报告.docx
《单片机与PLC技术实验报告.docx》由会员分享,可在线阅读,更多相关《单片机与PLC技术实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
单片机与PLC技术实验报告
一、简述实验内容
1.8位LED输出:
准备工作:
用短接线将实验箱上的P4.0~P4.7与LD1~LD8接线端子短接。
A.利用定时器3作定时(系统主频2MHz,定时间隔要求0.3秒),用C8051F020的P4口作输出控制发光二极管LD1~LD8。
让发光二极管LD1~LD8依次点亮(同一时刻只有一个发光二极管发光)。
其中LD1最先点亮发光,LD8最后点亮,LD1再点亮,然后重复。
2.8路拨档开关输入
准备工作:
闭合开关K11
A.编写程序,读入开关K1~K8的状态。
B.编写程序,读入开关K1~K8的状态,取反后通过发光二极管LD1~LD8输出。
2、试分析8位LED输出电路图的原理。
答:
发光二极管LD1~LD8正极均通过200Ω电阻接+3V电源,负极接实验箱上的P4.0~P4.7。
当P4.0~P4.7输出高电平时,发光二极管截止不发光,当P4.0~P4.7中有输出低电平的时,该端口对应的发光二极管导通,发光。
由此可以通过控制P4.0~P4.7输出电平控制灯的点亮与熄灭,可通过设一个低电平再通过移位的方法实现发光二极管LD1~LD8依次点亮的效果。
3、写出8位LED输出实验的以及子程序的流程图。
8位LED输出实验的以及子程序的流程图在实验报告上
4、写出8位LEDC语言源程序(要求有注释)
#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(SYSCLK*1024);
REF0CN=0x02;
EA=1;
while
(1){
}
}
//-------------------------------------------------------------------------
//函数名称:
PORT_Init()
//函数功能:
通用I/O口及交叉开关初始化
//入口参数:
无
//出口参数:
无
//全局变量引用:
无
//调用模块:
无
//----------------------------------------------------------------------
voidPORT_Init(void)
{
XBR2=0x40;/*使能交叉开关*/
P74OUT|=0x11;/*推挽输出*/
}
//--------------------------------------------------------------------
//函数名称:
Timer3_Init()
//函数功能:
定时器3初始化
//入口参数:
intcounts
//出口参数:
无
//全局变量引用:
无
//调用模块:
无
//----------------------------------------------------------------------
voidTimer3_Init(intcounts)
{
TMR3CN=0x00;
TMR3RL=-counts;
TMR3=0xffff;
EIE2|=0x01;
TMR3CN|=0x04;
}
//-------------------------------------------------------------------
//函数名称:
Timer3_ISR()
//函数功能:
定时器3中断服务程序
//入口参数:
无
//出口参数:
无
//全局变量引用:
无
//调用模块:
无
//-------------------------------------------------------------------
voidTimer3_ISR(void)interrupt14
{
TMR3CN&=~(0x80);/*清中断标志*/
P4=i;/*送数据到P4*/
i<<=1;
i=i|0x01;
if(i==0xff)
i=0xfe;
}
5、试分析8路拨档开关输入电路图的原理。
答:
将K1~K8分别与P5.0~P5.7相连,当K1~K8中有开关按下时,其对应P5.0~P5.7端口为低电平。
由此可见,将P5.0~P5.7通过程序赋给P4.0~P4.7,即可实现用8路拨档开关控制8个灯的开关。
6、写出8路拨档开关输入的程序流程图,以及C语言源程序(要求有注释)
#include
//16位特殊寄存器定义
sfr16TMR3RL=0x92;
sfr16TMR3=0x94;
//常量定义
#defineSYSCLK2000000//系统工作频率
//全局变量定义
unsignedchari=0xfe;
//主程序
voidmain(void){
WDTCN=0xde;
WDTCN=0xad;//禁止看门狗定时器
P4=P5;
}
}
8路拨档开关输入的程序流程图在实验报告上
1、简述实验内容
1.准备工作
教学实验机的步进电机驱动信号是STEPA~STEPD,本例程用P5.0~P5.3来控制步进电机的4个线圈处于通电或断电状态,所以在运行历程前,用跳线将STEPA~STEPD分别同P5.0~P5.3连接。
2.步进电机正转
编制程序控制步进电机实现正功能
3.步进电机反转
编制程序控制步进电机实现反功能
4.步进电机定速运行
编制程序使步进电机以每分钟30圈的速度正转
2、写出实验中,步进电机正反转,以及恒速运行的程序流程图,以及C语言源程序。
1.步进电机正反转
//程序说明:
此程序通过I/O口驱动步进电机,实现步进电机正反转
//P50--STEPAP51--STEPBP52--STEPCP53--STEPD
#include//SFRdeclarations
#include
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)
{
/*步进电机正转*/
for(k=0;k<10;k++){
SendData=0x0e;/*A相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x0c;/*AB相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x0d;/*B相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x09;/*BC相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x0b;/*C相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x03;/*CD相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x07;/*D相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
SendData=0x06;/*DA相通电*/
P5=SendData;
sleep_ms(250);
sleep_ms(250);
sleep_ms(250);
}
/*步进电机反转*/
for(k=0;k<10;k++){
SendData=0x06;
P5=SendData;
sleep_ms(250);
sleep_ms(250);
SendData=0x03;
P5=SendData;
sleep_ms(250);
sleep_ms(250);
SendData=0x09;
P5=SendData;
sleep_ms(250);
sleep_ms(250);
SendData=0x0c;
P5=SendData;
sleep_ms(250);
sleep_ms(250);
}
}
}
/***************************************************************************************
函数名称:
voidPORT_Init(void)
功能描述:
初始化I/O
输入:
无
输出:
无
全局变量:
XBR2,P74OUT
调用模块:
无
***************************************************************************************/
voidPORT_Init(void)
{
XBR2=0x40;/*使能交叉开关和弱上拉*/
P74OUT|=0x0f;/*P5低4位为推挽输出,其余口为开漏输出*/
}
2.步进电机恒速运行
//程序说明:
此程序通过I/O口驱动步进电机,实现步进电机以每分钟30圈的速度正转
//P50--STEPAP51--STEPBP52--STEPCP53--STEPD
#include//SFRdeclarations
#include
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)
{
/*步进电机正转*/
for(k=0;k<10;k++){
SendData=0x0e;/*A相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x0c;/*AB相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x0d;/*B相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x09;/*BC相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x0b;/*C相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x03;/*CD相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x07;/*D相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
SendData=0x06;/*DA相通电*/
P5=SendData;
sleep_ms(25);
sleep_ms(25);
sleep_ms(25);
}
}
}
/***************************************************************************************
函数名称:
voidPORT_Init(void)
功能描述:
初始化I/O
输入:
无
输出:
无
全局变量:
XBR2,P74OUT
调用模块:
无
***************************************************************************************/
voidPORT_Init(void)
{
XBR2=0x40;/*使能交叉开关和弱上拉*/
P74OUT|=0x0f;/*P5低4位为推挽输出,其余口为开漏输出*/
}
流程图在实验报告上
1、简述实验内容
准备工作:
将P1.0用短接线连接到实验箱上的PWM点。
1.编制程序将PCA模块中的CEX0引脚配置在P1.0
2.编制程序实现8位PWM控制直流电机的运行,试改变8位PWM信号的占空比,观察电机转速的变化。
3.编制程序实现16位PWM控制直流电机的运行,试改变16位PWM信号的占空比,观察电机转速的变化。
2、说明PCA模块的交叉开关引脚分配。
题目中要求将PCA模块中的CEX0引脚配置在P1.0,但实际操作时没有配置成功,最终将PCA模块中的CEX0引脚配置在P1.2。
具体引脚分配:
P0.0被分配给TX0,P0.1被分配给RX0,P0.2被分配给SCK,P0.3被分配给MISO,P0.4被分配给MOSI,P0.5被分配给NSS,P0.6被分配给SDA,P0.7被分配给SCL,P1.0被分配给TX1,P1.1被分配给RX1,P1.2被分配给CEX0。
3、写出程序的流程图,以及C语言源程序。
1.8位PWM控制直流电机的运行
//程序说明:
此程序实现PCA的8位PWM输出,输出脚配置在P1.2脚。
#include/*SFR定义*/
//------------------------------------------------------------------------------------
//FunctionPROTOTYPES
//------------------------------------------------------------------------------------
voidPORT_Init(void);
voidPCA_Init(void);
voidPCA_ISR(void);
//------------------------------------------------------------------------------------
//MAINRoutine
//------------------------------------------------------------------------------------
voidmain(void){
WDTCN=0xde;
WDTCN=0xad;/*关看门狗*/
PORT_Init();/*初始化IO口*/
PCA_Init();/*PCA初始化成16位脉宽调置方式*/
EA=1;/*开总中断*/
while
(1){
}
}
voidPORT_Init(void)
{
XBR0=0x0f;/*CEX0-->P1.2*/
XBR2=0x44;/*使能交叉开关和弱上拉*/
}
voidPCA_Init(void)
{
EIE1=0x08;
PCA0L=0x00;
PCA0CPM0=0x4b;/*8位PWM方式,当CCF0=1时,允许辅捉/比较标志的中断申请*/
PCA0CPL0=0x00;/*置初值*/
PCA0CPH0=0x80;
PCA0CN=0x40;/*允许PCA定时器/计数器*/
}
/*PCA中断子程序*/
voidPCA_ISR(void)interrupt9
{
CF=0;/*清溢出中断标志*/
CCF0=0;/*清匹配中断标志*/
}
2.16位PWM控制直流电机的运行
//程序说明:
此程序实现PCA的16位PWM输出,输出脚配置在P1.2脚。
#include/*SFR定义*/
//------------------------------------------------------------------------------------
//FunctionPROTOTYPES
//------------------------------------------------------------------------------------
voidPORT_Init(void);
voidPCA_Init(void);
voidPCA_ISR(void);
//------------------------------------------------------------------------------------
//MAINRoutine
//------------------------------------------------------------------------------------
voidmain(void){
WDTCN=0xde;
WDTCN=0xad;/*关看门狗*/
PORT_Init();/*初始化IO口*/
PCA_Init();/*PCA初始化成16位脉宽调置方式*/
EA=1;/*开总中断*/
while
(1){
}
}
voidPORT_Init(void)
{
XBR0=0x0f;/*CEX0-->P1.2*/
XBR2=0x44;/*使能交叉开关和弱上拉*/
}
voidPCA_Init(void)
{
EIE1=0x08;
PCA0L=0x00;
PCA0H=0x00;
PCA0CPM0=0xcb;/*16位PWM方式,当CCF0=1时,允许辅捉/比较标志的中断申请*/
PCA0CPL0=0x00;/*置初值*/
PCA0CPH0=0x80;
PCA0CN=0x40;/*允许PCA定时器/计数器*/
}
/*PCA中断子程序*/
voidPCA_ISR(void)interrupt9
{
CF=0;/*清溢出中断标志*/
CCF0=0;/*清匹配中断标志*/
}
流程图在实验报告上
实验1PLC实现启动、保持和停止功能
(1)将输入端X0,X1接至开关0,开关1,编制程序实