|
大佬們,求助啊。
背景:PS2手柄與STC89C52RC串口發(fā)送數(shù)據(jù),89C52驅(qū)動(dòng)74HC595,74HC595驅(qū)動(dòng)兩個(gè)L293D。目的:PS2控制四個(gè)馬達(dá),PWM無(wú)級(jí)調(diào)速(PS手柄按鍵加減占空比實(shí)現(xiàn))。
問(wèn)題:用定時(shí)器產(chǎn)生PWM控制馬達(dá)轉(zhuǎn)速時(shí),PWM周期設(shè)置貌似有問(wèn)題,周期7秒左右,改TH0和TL0小于500手柄就無(wú)法通訊。
純新手,只要能給我指出問(wèn)題,隨便噴。。。另,若是能幫我解決調(diào)通,耐心指導(dǎo)我一下相關(guān)知識(shí),可給報(bào)酬20R,我知道不多,但是畢竟有點(diǎn)窮。。。
代碼如下(暫時(shí)為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(); //定時(shí)器0初始化
- /************函數(shù)聲明**************/
- void delayxms(uint z); //延時(shí)
- /********************************************************************
- * 名稱 : void delayms(uint xms)
- * 功能 : 延時(shí)
- * 輸入 : 有
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=1700;j>0;j--);
- }
- /********************************************************************
- * 名稱 : Com_Init()
- * 功能 : 初始化串口程序,晶振11.0592, 波特率9600
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void Com_Init()
- {
- TMOD &= 0x0F;
- TMOD |= 0x20;
- /************ps2*************/
- PCON = 0x00; //波特率不加倍
- SCON = 0x50; //配置串口工作模式,使能串口接收中斷,等價(jià)于SM0=0,SM1=1,REN=1
- TH1 = 0xFd;
- TL1 = 0xFd;
- TR1 = 1;
- EA=1; //總中斷開關(guān)
- ES=1; //串口中斷開關(guān)
- ET1=0; //定時(shí)器1中斷開關(guān)
- // 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_();//每個(gè)_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
- }
- }
- }
- /****************延時(shí)處理**********************/
- void delayxms(uint z) //延時(shí)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;
- }
- /**************定時(shí)0中斷處理******************/
- void timer0_int() interrupt 1
- {
- TMOD&=0xF0;
- TMOD|=0x01;
- TR0=0; //設(shè)置定時(shí)器初值期間,關(guān)閉定時(shí)器
- 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;
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|