📄 main.c
字号:
#include <c8051F020.h>
#include <intrins.h>
#include <main.h>
bit Moto_Dir=0;
uchar irq_count;
uchar irq_count_t;
uchar PWM_TIME_H,PWM_TIME_L;
bit i=0;
/***********************短延时*******************************/
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
//OSCICN = 0x07; //interal 16MHZ
}
void PORT_Init (void)
{
// XBR0 = 0x07; // Enable SMBus, SPI0, and UART0
XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
EMI0CF = 0x27;
EMI0TC = 0x21;
P74OUT = 0xFF;
P0MDOUT = 0x15;
P2MDOUT |= 0x0F; //P1.2-P1.5推挽输出
P2 &= 0xff;
P1MDOUT |= 0x00; //P1.2-P1.5推挽输出
P1 &= 0xff; //P1.2-P1.5=0
}
void SPI0_Init (void)
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CFG|=0xC0; //CKPOL =1;
SPI0CN = 0x03; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = SYSCLK/2/8000000-1; // SPI clock <= 8MHz (limited by
// EEPROM spec.)
}
void ShortDelay(void)
{ uchar x,y;
for(x=0;x<5;x++)
for(y=0;y<125;y++)
_Nop();
return;
}
/************************主函数******************************/
void main(void)
{
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SYSCLK_Init (); //初始化时钟
//Timer0_Init(); //初始化定时器
PORT_Init (); //初始化IO口
SPI0_Init (); //初始化SPI0
PWM1=0; PWM2=0; PWM3=1; PWM4=1;
irq_count=0;
i=0;
PWM_TIME_H=80;
PWM_TIME_L=20;
ET0=1; // T1使能
TMOD=0x01; // T1都为方式1计时*/
TH0=0x0FF; TL0=0x0F2; // T1 初值
TR0=1; // 定时器启动
EA=1; // 开全局中断
while(1)
{ //**************按键处理*****************************/
if(!LEFT_KEY)
{ ShortDelay();
if(!LEFT_KEY) // 延时去抖
{
Moto_Dir=1;
PWM3=0; PWM4=1;
} // end if(LEFT_KEY)
while(!LEFT_KEY);
} // end if(LEFT_KEY)
if(!RIGHT_KEY)
{ ShortDelay();
if(!RIGHT_KEY) // 延时去抖
{
Moto_Dir=0;
PWM3=1; PWM4=0;
} // end if(RIGHT_KEY)
while(!RIGHT_KEY);
} // end if(RIGHT_KEY)
if(!UP_KEY)
{ ShortDelay();
if(!UP_KEY) // 延时去抖
{
if(PWM_TIME_H > 70)
{
PWM_TIME_H--;
PWM_TIME_L = 100-PWM_TIME_H;
}
} // end if(UP_KEY)
while(!UP_KEY);
} // end if(UP_KEY)
if(!DOWN_KEY)
{ ShortDelay();
if(!DOWN_KEY) // 延时去抖
{
if(PWM_TIME_H < 96)
{
PWM_TIME_H++;
PWM_TIME_L = 100-PWM_TIME_H;
}
} // end if(DOWN_KEY)
while(!DOWN_KEY);
} // end if(DOWN_KEY)
} // end while(1)
}
void timer1(void) interrupt 1 //using 1 // T0定时器中断 发PWM脉冲
{
TH0=0x0FF;
TL0=0x0F2;
irq_count++;
if (irq_count>=irq_count_t)
{ irq_count=0; i=~i;
if(i==1)
irq_count_t = PWM_TIME_H;
else
irq_count_t = PWM_TIME_L;
if(Moto_Dir==1)
{ PWM2=~PWM2; PWM1=1; }
else
{ PWM2=1; PWM1=~PWM1; }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -