📄 car.#3
字号:
//P0.7, P1.0为PWM脉宽输出 对电机PWM控制而言,为了得到平稳电流,PWM频率宜在1kHz以上,采用8位PWM输出
//设置T2为系统时基 500Hz,周期为2ms.
#include <c8051F330.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sfr16 ADC0VAL=0xbd; //ADC0转换值=ADC0L+ADC0H
sfr16 PCA0CP0=0xfb; //CEX0捕捉比较寄存器=PCA0CPL0+PCA0CPH0
sfr16 PCA0CP1=0xe9;
sfr16 PCA0CP2=0xeb;
sfr16 TMR2=0xcc; //定时器2计数器寄存器
sfr16 TMR2RL=0xca; //定时器2重载寄存器
#define SYSCLK 12250000 //采用内部晶振,12.25M
#define T2_Freq = 500 //T2系统时基500Hz
#define car_mode_front 0x0a //1010 小车前进
#define car_mode_back 0x06 //0101 小车后退
#define car_mode_stop 0x0f //1111 小车急停
#define car_mode_resolve 0x09 //1001 小车原地旋转
//-----------------------------------------------------------------------------
// 函数声明
//-----------------------------------------------------------------------------
void Timer2_ISR ();
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
uchar count_led=0; //LED延时控制变量
uchar count_pwm=0; //PWM占空比进行数据刷新控制变量
sbit P15_LED=P1^5;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
uchar pwm1;
uchar pwm2;
char Car_mode=2;
bit Car_mode_temp=1;
//-----------------------------------------------------------------------------
// T0初始化
//-----------------------------------------------------------------------------
/*void Timer0_Init()
{
}*/
void Timer2_Init (uint val) //2ms
{
TMR2CN = 0x00; // 选择定时器2外部时钟为(SYSCLK/12),16 位自动重装载方式
CKCON &= 0xdf; // Timer2 clocked based on T2XCLK;
TMR2RL = ~val+1; // Init reload values
TMR2 = 0xffff; // set to reload immediately
ET2 = 1; // enable Timer2 interrupts
TR2 = 1; // 启动定时器2
}
//-----------------------------------------------------------------------------
// PWM初始化,PWM频率为12.5M/256=93.8KHz
//-----------------------------------------------------------------------------
void Pca_Init()
{
PCA0MD|=0x00; //PCA采用系统时钟24M,PCA溢出中断禁止
PCA0CN=0x40; //启动PCA计数器
PCA0CPM0=0x42; //CEX0为8位PWM输出模式
PCA0CPM1=0x42; //CEX1为8位PWM输出模式
}
//-----------------------------------------------------------------------------
// 小车运行方式设置
//-----------------------------------------------------------------------------
void Car_mode_set(uchar mode) //pwm1,pwm2的范围在0-255内
{
switch (mode)
{
case 1: P10=0;P11=1;P12=0;P13=1; break;
case 2: P10=1;P11=0;P12=1;P13=0; break;
case 3: P10=1;P11=1;P12=1;P13=1; break;
case 4: P10=1;P11=0;P12=0;P13=1; break;
default : break;
}
}
//-----------------------------------------------------------------------------
// PWM占空比设置
//-----------------------------------------------------------------------------
void Pwm_set(uchar pwm1,uchar pwm2) //pwm1,pwm2的范围在0-255内
{
PCA0CPH0=pwm1;
PCA0CPH1=pwm2;
}
//-----------------------------------------------------------------------------
// 数据初始化
//-----------------------------------------------------------------------------
void Data_Init() //pwm1,pwm2的范围在0-255内
{
P10=1;P11=0;P12=1;P13=0;
}
//-----------------------------------------------------------------------------
// 处理器配置
//-----------------------------------------------------------------------------
void config()
{
// uint i,j;
PCA0MD&=0x9f; //看门狗定时器被禁止
//用端口输入方式寄存器(PnMDIN)选择所有端口引脚输入方式
P0MDIN=0xff; // 0为模拟输入,1为数字输入
P1MDIN=0xff;
// 用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)
P0MDOUT=0xc0; //1为推挽输出
P1MDOUT=0xff;
// 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚
P0SKIP=0x0f; // 1时对应交叉开关跳过
P1SKIP=0xff;
//将引脚分配给要使用的外设 ,使能交叉开关(XBARE = ‘1’)
XBR0=0x01; //XBR0.0=1:UART TX0, RX0连到端口引脚P0.4和P0.5。
XBR1=0xc2; //弱上拉禁止;交叉开关使能;:CEX0、CEX1连到端口引脚
// 晶振配置,开始采用内部晶振,等稳定后采用外部晶振
CLKSEL=0x00; //选择内部晶振
OSCICN=0x82; //内部H-F振荡器使能, SYSCLK为内部H-F频振荡器2分频 24.5/2=12.25MHz 2>>>0
/* OSCXCN=0x67; // 关闭 01100111 使能外部振荡器,晶体振荡器方式 24MHz
for (i=0;i<20;i++) // 等待至少1ms
{
for(j=0;j<200;j++);
}
while(!OSCXCN^7); //查询XTLVLD =>'1'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -