- #include<stc12c5a.h>
- #include <intrins.h>
- #include <math.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit S1=P2^4;
- sbit S2=P2^5;
- sbit S3=P2^6;
- sbit S4=P2^7;
- //電機pwm輸入接口為P1^3和P1^4 可通過控制2和5控制電機停轉
- //sbit P13=P1^3;
- //sbit P14=P1^4;
- //sbit IN1=P1^2;
- //sbit IN2=P1^5;
- sbit pwm=P3^5;
- #define k10 0xe5
- #define k20 0xcc
- #define k30 0xb3
- #define k35 0xa6
- #define k40 0x99
- #define k45 0x8c
- #define k50 0x80
- #define k55 0x73
- #define k60 0x66
- #define k65 0x59
- #define k70 0x4d
- #define k75 0x40
- #define k80 0x33
- #define k85 0x26
- #define k90 0x1a
- #define k95 0x0d
- #define k00 0x00 //控制電機轉速的幾個中斷pwm波的占空比
- //控制電機轉速的幾個中斷pwm波的占空比
-
- #define mh00 0xf8 //中間角度初值 //打直第一次出現吧
- #define ml00 0xee // 1810*1.09=1.9729 10
-
- #define zh01 0xf8 //高位
- #define zl20 0x26 //低位 //2010*1.09=2.1708 9
- #define zl19 0x30 //低位 //2000*1.09=2.18 9
- #define zl18 0x3a //低位 //1990*1.09=2.1691 9
- #define zl17 0x44 //低位 //1980*1.09=2.1582 9
- #define zl16 0x4e //低位 //1970*1.09=2.1473 9
- #define zl15 0x58 //低位 //1960*1.09=2.1364 9
- #define zl14 0x62 //低位 //1950*1.09=2.1255 9
- #define zl13 0x6c //低位 //1940*1.09=2.1146 9
- #define zl12 0x76 //低位 // 1930*1.09=2.1037 9
- #define zl11 0x80 //低位 // 1920*1.09=2.0928 10
- #define zl10 0x8a //低位 // 1910*1.09=2.0819 10
- #define zl09 0x94 //低位 // 1900*1.09=2.071 10
- #define zl08 0x9e //低位 // 1890*1.09=2.0601 10
- #define zl07 0xa8 //低位 // 1880*1.09=2.0492 10
- #define zl06 0xb2 //低位 // 1870*1.09=2.0383 10
- #define zl05 0xbc //低位 // 1860*1.09=2.0274 10
- #define zl04 0xc6 //低位 // 1850*1.09=2.0165 10
- #define zl03 0xd0 //低位 //1840*1.09=2.0056 10
- #define zl02 0xda //低位 // 1820*1.09=1.9838 10 //左轉角度
- #define yh00 0xf8 //高位
-
- #define yl01 0xf8 //低位 // 1800*1.09=1.962 10
- #define yh01 0xf9 //高位
- #define yl02 0x02 //低位 // 1790*1.09=1.9511 10
- #define yl03 0x0c //低位 // 1780*1.09=1.9402 10
- #define yl04 0x16 //低位 // 1770*1.09=1.9293 10
- #define yl05 0x20 //低位 // 1760*1.09=1.9184 10
- #define yl06 0x2a //低位 // 1750*1.09=1.9075 10
- #define yl07 0x34 //低位 // 1740*1.09= 1.8966 10
- #define yl08 0x3e //低位 // 1730*1.09=1.8857 10
- #define yl09 0x48 //低位 // 1720*1.09= 1.8748 10
- #define yl10 0x52 //低位 // 1710*1.09=1.8639 10
- #define yl11 0x5c //低位 // 1700*1.09=1.853 10
- #define yl12 0x66 //低位 // 1690*1.09=1.8421 10
- #define yl13 0x70 //低位 //1680*1.09=1.8321 10
- #define yl14 0x7a //低位 // 1670*1.09=1.8203 11
- #define yl15 0x84 //低位 // 1660*1.09=1.8094 11
- #define yl16 0x8e //低位 // 1650*1.09=1.7985 11
- #define yl17 0x98 //低位 // 1640*1.09=1.7876 11
- #define yl18 0xa2 //低位 // 1630*1.09=1.7767 11
- #define yl19 0xac //低位 // 1620*1.09=1.7658 11
- #define yl20 0xb6 //低位 // 1610*1.09=1.7549 11
- #define yl21 0xc0 //低位 // 1600*1.09= 1.7440 11 //右轉角度
-
- uchar h, l;
- uchar count2=14, count=0;
- uchar loadz,loady, dz,dy,d0,d1,d2,d3,d4,d5,d6,d7,d8,d9;
- void pwm_init();
- void Time_Init();
- void motor();
- void delay(uint z);
- //*********主函數*****************/
- void main ()
- {
-
- d2=k45;d3=k50;d5=k60;d7=k70;
- P14=0;
- delay(10000);
- delay(10000);
- delay(10000);
- Time_Init();
- pwm_init() ;
- //延時發車
- P0=0xff;
- P2=0xfa;
- h=0xfa;
- l=0xe7;
- dz=dy=d7; // dz<dy 左轉
- while(1) //dy大表示右邊輪子轉的快
- { //左邊輪子接P0^3 //右邊輪子接P0^4
- if(P0==0x80) {h=0xfa;l=0x1F; count2=13;dz=d2;dy=d5; }
- //if(P0==0xc0) {h=0xfa;l=0x4d;count2=13;dy=d5;dz=d8;}
- if(P0==0x40) {h=0xfa;l=0x7D;count2=13;dy=d3;dz=d5;}
- //if(P0==0x60) {h=0xfa;l=0x7f;count2=13;dy=d5;dz=d7;}
- if(P0==0x20) {h=0xfa;l=0xBD;count2=14;dy=d3;dz=d5;}
- //if(P0==0x30) {h=0xfa;l=0xb1a;count2=14;dy=d6;dz=d7;}
- if(P0==0x10) {h=0xfa;l=0xD2;count2=14;dy=d7;dz=d7;}
- // if(P0==0x00||0xff) {h=0xfa;l=0xfc;count2=14;dz=d8;dy=d8;} //4度 l改變19
- if(P0==0x08) {h=0xfA;l=0xFC;count2=15;dy=d7;dz=d7;}
- //if(P0==0x0c) {h=0xfb;l=0x47;count2=15;dy=d7;dz=d6;} //15
- if(P0==0x04) {h=0xfb;l=0x11;count2=15;dy=d5;dz=d3;}
- //if(P0==0x06) {h=0xfb;l=0x79;count2=15;dy=d7;dz=d5;} //50 左轉
- if(P0==0x02) {h=0xfb;l=0x51;count2=16;dy=d5;dz=d3;}
- //if(P0==0x03) {h=0xfb;l=0xab;count2=16;dy=d8;dz=d5;} /39
- if(P0==0x01) {h=0xfb;l=0xAF;count2=16;dy=d5;dz=d2;}
- motor();
- }
- }
- /**************定時器初始化數據**********************/
- void Time_Init()
- {
- TMOD = 0x01 ; //定時器0工作方式1,16位定時器
- TH0 = h;
- TL0 = l;
- EA=1;
- ET0=1;
- TR0 = 1;
- }
-
- /***************pwm初始化***********************************
-
- /************************************************************/
- void pwm_init()
- {
- CCON=0; // CR=0;開始不計時,可以省略
- CMOD=0X00; //頻率選擇,選系統時鐘/12為PWM輸出頻率
- CH=0; //
- CL=0; //PCA計數器的計數值
- CCAP0H=k00; //初始PWM占空比100%
- CCAP0L=k00; //初始PWM占空比100%
- CCAP1H=k00; //初始PWM占空比100%
- CCAP1L=k00; //初始PWM占空比100%
- PCA_PWM0=0X00; //控制占空比的第九位為0
- PCA_PWM1=0X00;
- CCAPM0=0X42; //工作方式選擇,選擇為PWM輸出工作方式
- CCAPM1=0X42; //工作方式選擇,選擇為PWM輸出工作方式
- CR=1; //啟動PCA定時器
- }
- void motor()
- {
- CCAP0H=dz; //CCAP0L CCAP0H是捕捉/ 比較寄存器, 代表的是調節占空比,CCAP0L= CCAP0H=0x80,占空比輸出為50% 。
- CCAP0L=dz; //PWM設置占空比
- CCAP1H=dy;
- CCAP1L=dy; //PWM設置占空比
- }
- void delay(uint z) //延時 Z 毫秒
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*************************定時中斷1輸出pwm波****************************/
- void Time0_Int() interrupt 1
- {
- TH0=h;
- TL0=l;
- if(count < 1)
- pwm = 1;
- else
- pwm = 0;
- count++;
- if(count >= count2)
- count = 0;
- }
復制代碼
|