📄 直流ok.c
字号:
#include <c8051f310.h> // SFR declarations
#include <INTRINS.H>
#include <stdio.h>
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
//----------------------------------------------------------------------------
#define MOTO_BREAK DIR1A=DIR1B
//#define MOTO_BREAK DIR2A=DIR2B
#define MOTO_FORD DIR1A=0;DIR1B=1
#define MOTO_BACK DIR1A=1;DIR1B=0
//#define MOTO_FORD DIR2A=0;DIR2B=1
//#define MOTO_BACK DIR2A=1;DIR2B=0
//------------------------------------------------------------------------------------
sbit DIR1A=P1^2;//方向控制管脚
sbit DIR1B=P1^1;
//sbit DIR2A=P0^6;
//sbit DIR2B=P0^7;
//------------------------------------------------------------------------------------
void PORT_Init (void);
void PCA_Init (void);
void PCA_ISR (void);
//------------------------------------------------------------------------------------
//配置I/O端口
void PORT_Init (void)
{ P0SKIP =0x01;
XBR1 = 0x41; /*CEX0-->P0.1*/
P0MDOUT|=0x02;
P1MDOUT|=0xff;
}
//配置PCA的CEX0输出8位PWM信号
void PCA_Init (void)
{
PCA0CN = 0x40;
PCA0CPM0 = 0x42;
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
PCA0MD = 0x01;
}
//-------------------------------
void PCA_ISR (void) interrupt 11
{ unsigned char a ;
bit PWM_PAC;
CF = 0;
if(PWM_PAC==0) //占空比由0 >>0xfe
{
PCA0CPH0=a;
a++;
if(a==0xfe){PWM_PAC=1;}
}
else //占空比由0xfe >>0
{
PCA0CPH0=a;
a--;
if(a==0){PWM_PAC=0;}
}
}
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // STOP Timer2; Clear TF2H and TF2L;
// disable low-byte interrupt; disable
// split mode; select internal timebase
CKCON |= 0x10; // Timer2 uses SYSCLK as its timebase
TMR2RL = -counts; // Init reload values
TMR2 = TMR2RL; // Init Timer2 with reload value
ET2 = 0; // disable Timer2 interrupts
TR2 = 1; // start Timer2
}
//--------------------------------------------------------------------------------
void delay100ms(int time) //when time=100,the delay is 100ms
{
unsigned int count;
TF2H = 0; // Clear Timer2 overflow flag
TR2 = 1; // Start Timer2
for (count = time; count != 0; count--) {
while (!TF2H); // wait for overflow
TF2H = 0; // clear overflow indicator
}
TR2 = 0; // Stop Timer2
}
//--------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void)
{
unsigned long b;
/*关看门狗*/
PCA0MD &= ~0x40; // WDTE = 0 (watchdog timer enable bit)
OSCICN |= 0x03; // Set internal oscillator to highest
// setting (24500000)
PORT_Init (); /*初始化I/O口*/
PCA_Init (); /*PCA初始化成8位脉宽调置方式*/
EIE1= 0x10;
EA=1;
PCA0CPH0=0x00;
while (1)
{
//慢速反向运行2秒
MOTO_BACK;
//PWM_PAC=0;
delay100ms(2000);
MOTO_BREAK;//急停
//慢速正向运行2秒
MOTO_FORD;
//PWM_PAC=1;
delay100ms(2000);
MOTO_BREAK;//急停
delay100ms(2000);
//快速反向运行2秒
MOTO_BACK;
//PWM_PAC=0;
delay100ms(2000);
MOTO_BREAK;//急停
delay100ms(500);
//快速正向运行2秒
MOTO_FORD;
//PWM_PAC=1;
delay100ms(2000);
MOTO_BREAK;//急停
delay100ms(2000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -