24V直流电机H桥驱动电路及51单片机C程序Word文件下载.docx
《24V直流电机H桥驱动电路及51单片机C程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《24V直流电机H桥驱动电路及51单片机C程序Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
//正反转
sbitkey3=P2^1;
//UP
sbitkey4=P2^0;
//DOWN
ucharrun_flag;
//0停止;
1启动
uchardirection_flag;
//0正转;
1反转
ucharcount;
//加,减计数--key
//=======================================
voidstatus_initial(void);
voidPWM_initial(void);
voiddelay_1us(ucharx);
voiddelay_led(ucharx);
voidkey_scan(void);
voidM_run(void);
voidmain()//注:
在程序里面,对两路PWM进行互锁,防止H桥电路共态导通!
{//调试时,也要特别注意!
status_initial();
PWM_initial();
while
(1)
{
key_scan();
M_run();
}
}
voidstatus_initial(void)
{
/*
CCAP0H=0XFF;
CCAP0L=0XFF;
//占空比为0%
CCAP1H=0XFF;
CCAP1L=0XFF;
*/
run_flag=0;
direction_flag=0;
count=0;
//----------------给定一个初始值,设定电机开机的初始转速?
?
或者按下启动,up启动加速
P1=0x00;
//灯灭
voidPWM_initial(void)
CCON=0X00;
CMOD=0X02;
//空闲模式下PCA计数器继续工作,使用系统时钟,禁止CCON的CF位中断
CCAPM0=0X42;
//01000010允许比较器功能,允许CCP0脚用作脉宽调节输出
CCAPM1=0X42;
//同上,8位PWM,无中断
//PCA捕捉/比较寄存器--低八位和高八位------频率f=SYSclk/256
//工作于PWM模式,用于控制输出的占空比
//当寄存器CL的值小于[EPCnL,CCAPnL]时,输出为低;
当寄存器CL的值等于或大于【EPCnL,CCAPnL】时,输出为高;
//当CL的值有FF变为00溢出时,[EPCnH,CCAPnH]的内容装载到[EPCnL,CCAPnL]中
//当EPCnL=0及CCAPnL=00H时,固定输出高
//当EPCnL=1及CCAPnL=FFH时,固定输出低
CL=0;
//PCA的16位计数器--低八位和高八位
CH=0;
CR=1;
//启动PCA定时器
voiddelay_1us(ucharx)
uchari,j;
for(i=0;
i<
x;
i++)
for(j=0;
j<
120;
j++);
voiddelay_led(ucharx)
j=x;
while(j--)
for(i=0;
100;
i++)//时间再调整
{
_nop_();
}
voidkey_scan(void)
uchartemp;
P2=0xff;
temp=P2;
temp=temp|0x0f;
if(temp==0x0f)//检测是否有按键按下
//============================启动停止key1
if(key1==0)
delay_1us(10);
if(key1==0)
if(run_flag==1)
run_flag=0;
//stop
else
run_flag=1;
//start
//============================正转反转key2
if(key2==0)
if(key2==0)
if(direction_flag==1)
direction_flag=0;
//正
direction_flag=1;
//反
//============================upkey3
if(key3==0)
if(count==0)
count=0;
count--;
//============================downkey4
if(key4==0)
if(count==255)
count=255;
count++;
}
//=====================================
voidM_run(void)
uchari,temp;
if(run_flag==0)//stop
//=========================不转
CCAP0H=0XFF;
CCAP0L=0XFF;
CCAP1H=0XFF;
CCAP1L=0XFF;
//占空比为0%
//==============================led_display不转,灯不亮
temp=0x00;
P1=temp;
if(run_flag==1)//run
temp=0xff;
CY=0;
if(direction_flag==0)//正转
CCAP0H=0XFF;
CCAP0L=0XFF;
CCAP1H=count;
CCAP1L=count;
//==============================led_display
for(i=0;
8;
{
P1=temp;
temp=temp<
<
1;
delay_led(count);
}
if(direction_flag==1)//反转
CCAP1H=0XFF;
CCAP1L=0XFF;
CCAP0H=count;
CCAP0L=count;
temp=temp>
>
}