大佬们,求助啊。
背景:PS2手柄与STC89C52RC串口发送数据,89C52驱动74HC595,74HC595驱动两个L293D。目的:PS2控制四个马达,PWM无级调速(PS手柄按键加减占空比实现)。
问题:用定时器产生PWM控制马达转速时,PWM周期设置貌似有问题,周期7秒左右,改TH0和TL0小于500手柄就无法通讯。
纯新手,只要能给我指出问题,随便喷。。。另,若是能帮我解决调通,耐心指导我一下相关知识,可给报酬20R,我知道不多,但是毕竟有点穷。。。
代码如下(暂时为4种占空比):
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //#define Self_Define_ISP_Download_Command 0x3D
- //sfr IAP_CONTR=0xE7;
- sbit DATA=P0^0;
- sbit CMND=P0^1;
- sbit ATT=P0^2;
- sbit CLK=P0^3;
- uchar code scan[9]={0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- uchar out[9];
- uchar time;
- double count=0; //定义占空比
- bit PWM=0;
- int mid_TH0,mid_TL0;
- sbit sck=P1^0;
- sbit ser=P1^1;
- sbit rck=P1^2;
- sbit EN1=P1^3; //ic2 M4
- sbit EN2=P1^4; //ic2 M3
- sbit EN3=P1^5; //ic1 M2
- sbit EN4=P1^6; //ic1 M1
- uchar code Tab[]={0x99,0x66};
- void timer0_init(); //定时器0初始化
- /************函数声明**************/
- void delayxms(uint z); //延时
- /********************************************************************
- * 名称 : void delayms(uint xms)
- * 功能 : 延时
- * 输入 : 有
- * 输出 : 无
- ***********************************************************************/
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=1700;j>0;j--);
- }
- /********************************************************************
- * 名称 : Com_Init()
- * 功能 : 初始化串口程序,晶振11.0592, 波特率9600
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Com_Init()
- {
- TMOD &= 0x0F;
- TMOD |= 0x20;
- /************ps2*************/
- PCON = 0x00; //波特率不加倍
- SCON = 0x50; //配置串口工作模式,使能串口接收中断,等价于SM0=0,SM1=1,REN=1
- TH1 = 0xFd;
- TL1 = 0xFd;
- TR1 = 1;
- EA=1; //总中断开关
- ES=1; //串口中断开关
- ET1=0; //定时器1中断开关
- // IP=0x10;
- /**************烧写***********/
- // SM0=0;
- // SM1=1;
- // REN=1;
- }
- void input(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- if((dat<<i)&0x80)
- {
- ser=1;
- }
- else
- {
- ser=0;
- }
- sck=0;
- sck=1;
- }
- }
- void output()
- {
- rck=0;
- rck=1;
- rck=0;
- }
- void delay(uint n) //delay(x)=(2.5+x)us;
- {
- uint i;
- for(i=0;i<n;i++) _nop_();
- // _nop_();//每个_nop_();大概0.1微秒
- }
- uchar scanout(uchar command)//手柄
- {
- uchar i,j=1;
- uchar res=0;
- for(i=0;i<=7;i++) //逐位接收
- {
- if(command&0x01)
- CMND=1;
- else
- CMND=0;
- command=command>>1;
- _nop_();
- _nop_();
- CLK=0;
- delay(10);
- if(DATA) res=res+j;
- j=j<<1;
- CLK=1;
- delay(3);
- }
- CMND=1;
- return res;
- }
- void Read_PS2(void)//手柄读取程序
- {
- uchar i;
- ATT=0;
- for(i=0;i<9;i++) //扫描按键
- {
- out[i]=scanout(scan[i]);
- }
- ATT=1;
-
- }
- void main()
- {
- IP=0x10;
- Com_Init();
- timer0_init();
-
- EN1=0; //M4 FR
- EN2=0; //M3 RR
- EN3=0; //M2 FL
- EN4=0; //M1 RL
- while(1)
- {
- Read_PS2();
- delayms(10);
- if(out[3]==0xEF)//上,PS2手柄按键
- {
- count=100;
- EN1=PWM; //M4
- EN2=PWM; //M3
- EN3=PWM; //M2
- EN4=PWM; //M1
- input(Tab[1] );
- output();
- }
- else if(out[3]==0xBF)//下
- {
- count=60;
- EN1=PWM; //M4
- EN2=PWM; //M3
- EN3=PWM; //M2
- EN4=PWM; //M1
- input(Tab[1] );
- output();
- }
- else if(out[3]==0x7F)//左
- {
- count=30;
- EN1=PWM; //M4
- EN2=PWM; //M3
- EN3=PWM; //M2
- EN4=PWM; //M1
- input(Tab[1] );
- output();
- }
- else if(out[3]==0xDF)//右
- {
- count=10;
- EN1=PWM; //M4
- EN2=PWM; //M3
- EN3=PWM; //M2
- EN4=PWM; //M1
- input(Tab[1] );
- output();
- }
- else if(out[4]==0xFB)//停
- {
- EN1=0; //M4
- EN2=0; //M3
- EN3=0; //M2
- EN4=0; //M1
- input(Tab[0] );
- output();
- }
- else{
- EN1=0; //M4 FR
- EN2=0; //M3 RR
- EN3=0; //M2 FL
- EN4=0; //M1 RL
- }
- }
- }
- /****************延时处理**********************/
- void delayxms(uint z) //延时xms程序
- {
- uint x,y;
- for(y=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void timer0_init()
- {
- TMOD&=0xF0;
- TMOD|=0x01;
- mid_TH0=(65536-500)/256;
- mid_TL0=(65536-500)%256;
- TR0=1;
- ET0=1;
- EA=1;
- }
- /**************定时0中断处理******************/
- void timer0_int() interrupt 1
- {
- TMOD&=0xF0;
- TMOD|=0x01;
- TR0=0; //设置定时器初值期间,关闭定时器
- TH0=mid_TH0;
- TL0=mid_TL0;
- TR0=1;
-
- time++;
- if(time<count) //count为占空比
- {
- PWM=1; //输出高电平
- }
- else
- PWM=0;
- if(time>=100)
- {
- time=0;
- }
- }
- void Com_Int() interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- }
- }
复制代码
|