同時啟用定時器0和1 定時0中斷 正常 舵機能加減 但是 電機怎么也不能加減速 ,求助前輩們指導指導一下 是怎么回事呢?把我給搞蒙了
單片機源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit S2=P3^4; //加速
sbit S3=P3^5; //減速
//sbit S4=P3^6; //前進
//sbit S5=P3^7; //后退
sbit IN1=P2^4; //電機IN1
sbit IN2=P2^5; //電機IN2
sbit EN1=P2^6; //電機EN1
sbit fm=P2^3;
unsigned char count; //0.1ms次數標識
sbit PWM =P1^7 ; //PWM信號輸出
sbit jia =P3^6; //角度增加按鍵檢測IO口
sbit jan =P3^7; //角度減少按鍵檢測IO口
unsigned char jd; //角度標識
uchar pwm,num;
//void delay(unsigned char i)//延時
//{
// unsigned char j,k;
// for(j=i;j>0;j--)
// for(k=125;k>0;k--);
//}
void delay(uint ms)//延時函數
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void bee()//蜂鳴器函數
{
fm=0;
delay(100);
fm=1;
delay(100);
}
void qianjin() //前進
{
IN1=0; //電機IN1
IN2=1; //電機IN2
//EN1=1; //電機EN1
}
//void houtui() //后退
// {
// IN1=1; //電機IN1
// IN2=0; //電機IN2
// // EN1=1; //電機EN1
//
// }
//void stop( ) //停止
//
// {
// IN1=0; //電機IN1
// IN2=0; //電機IN2
// //EN1=0; //電機EN1
//
// }
void jiasu( ) //加速
{
if(pwm<32)
{
pwm++;
delay(100); //加速
}
else
{
bee();
}
}
void jiansu( ) //減速
{
if(pwm>1)
{
pwm--;
delay(100); //減速
}
else
{
bee();
}
}
void keyscan() //鍵盤函數
{
if(S2==0)
{
delay(50);
if(S2==0)
{
jiasu( );
delay(50);
}
else
{
bee();
}
}
if(S3==0)
{
delay(50); //消抖
if(S3==0)
{
jiansu( );
delay(50);
}
else
{
bee();
}
}
// if(S4==0) //正轉
// {
// delay(50); //消抖
// if(S4==0)
// {
// houtui() ;
// delay(100);
// }
// }
// if(S5==0 ) //反轉
// {
// delay(50); //消抖
// if(S5==0)
// {
// qianjin();
// delay(100);
//
// }
// }
// if(S5==0&& S4==0 )
// {
// delay(100); //消抖
// if(S5==0&& S4==0)
// {
//
// delay(1000);
// stop( );
// delay(10);
// }
// }
if(jia==0) //角度增加按鍵是否按下
{
delay(10); //按下延時,消抖
if(jia==0) //確實按下
{
jd++; //角度標識加1
count=0; //按鍵按下 則20ms周期從新開始
if(jd==25)
jd=24; //已經是180度,則保持
while(jia==0); //等待按鍵放開
}
}
if(jan==0) //角度減小按鍵是否按下
{
delay(10);
if(jan==0)
{
jd--; //角度標識減1
count=0;
if(jd==0)
jd=1; //已經是0度,則保持
while(jan==0);
}
}
}
void init_t1() //中斷函數
{
TMOD =0x01;
TH1=(65536-500)/256;
TL1=(65536-500)%256;
EA=1;
ET1=1;
TR1=1;
}
void t1() interrupt 3 //中斷服務函數
{
TR1=0;
TH1=(65536-500)/256;
TL1=(65536-500)%256;
num++;
if(num>32)
{
num=0;
}
if(num<=pwm)
{
EN1 = 1;
//P1=0xff;
//P0=0x00;
}
else
{
EN1=0;
//P1=0x00;
//P0=0xff;
}
TR1=1;
}
void Time0_Init() //定時器0初始化
{
TMOD = 0x01; //定時器0工作在方式1
IE = 0x82;
TH0 = 0xff;
TL0 = 0x9c; //12MZ晶振,0.1ms
TR0=1; //定時器開始
}
void Time0_Int() interrupt 1 //中斷程序
{
TH0 = 0xff; //重新賦值
TL0 = 0x9c;
if(count< jd) //判斷0.1ms次數是否小于角度標識
PWM=1; //確實小于,PWM輸出高電平
else
PWM=0; //大于則輸出低電平
count=(count+1); //0.1ms次數加1
count=count%40; //次數始終保持為40 即保持周期為20ms
}
void main() //主函數
{
PT1=1;
init_t1();
Time0_Init();
num=0;
pwm=16;
qianjin();
jd=12;
count=0;
while(1)
{
keyscan();
}
}
|