單片機源程序如下:
- #include<reg51.h> //包含文件預處理命令</span>
- #define uchar unsigned char //8位單片機習慣性定義
- #define uint unsigned int //8位單片機習慣性定義
- //
- //*********AD轉換要用到的特殊寄存器地址定義*************************************
- sfr adc_contr=0xc5; //定義AD轉換控制寄存器地址
- sfr adc_data=0xc6; //定義AD轉換結果寄存器地址
- sfr p1m0=0x91; //帶有8路AD的P1口模式選擇寄存器0定義地址
- sfr p1m1=0x92; //帶有8路AD的P1口模式選擇寄存器1定義地址
- //
- //*********PWM輸出要用到的特殊寄存器地址定義************************************
- sfr ccap0h=0xfa; //PCA模塊0捕捉/比較寄存器高8位
- sfr ccap1h=0xfb; //PCA模塊1捕捉/比較寄存器高8位
- sfr ccap2h=0xfc; //PCA模塊2捕捉/比較寄存器高8位
- sfr ccap3h=0xfd; //PCA模塊3捕捉/比較寄存器高8位
- sfr pca_pwm0=0xf2; //PCA模塊0-PWM寄存器
- sfr pca_pwm1=0xf3; //PCA模塊1-PWM寄存器
- sfr pca_pwm2=0xf4; //PCA模塊2-PWM寄存器
- sfr pca_pwm4=0xf5; //PCA模塊3-PWM寄存器
- sfr ccapm0=0xda; //PCA模塊0工作模式寄存器
- sfr ccapm1=0xdb; //PCA模塊1工作模式寄存器
- sfr ccapm2=0xdc; //PCA模塊2工作模式寄存器
- sfr ccapm3=0xdd; //PCA模塊3工作模式寄存器
- sfr ch=0xf9; //PCA計數器高8位
- sfr cl=0xe9; //PCA計數器低8位
- sfr ccon=0xd8; //PCA控制寄存器
- sfr cmod=0xd9; //PCA工作模式寄存器
- sbit cr=ccon^6; //PCA計數器控制位,1開0關
- sbit epca_lvd=IE^6; //PCA中斷允許控制位1開0關
- sfr auxr=0x8E; //定時器工作于1T控制位
- //==============================================================================
- sbit zb=P1^3;
- sbit pwmal=P2^3; //A相下橋驅動定義
- sbit pwmbl=P2^2; //B相下橋驅動定義
- sbit pwmcl=P2^1; //C相下橋驅動定義
- sbit led=P2^7; //指示燈定義
- sbit abs=P2^5; //ABS剎車功能選擇口,對地為ABS功能
- sbit shache=P3^0; //剎車口定義,對地剎車
- sbit fd=P3^3; //防盜檢測口定義
- int ledcs; //定義一個指示燈閃燈次數變量
- static fd_hej;
- static timebj; //定義一個定時器計數比較變量
- static timejs; //定義一個定時器中斷計數次數變量
- static pwm_bl; //PWM輸出變量
- static zs_bl=20; //pwm舊的變量數據,備份的
- static pwm_bls; //PWM軟啟動加速用變量
- static shache_bz; //剎車后該標志置1供軟啟動使用
- static hehc; //霍爾數據暫存區
- static hehc_bl; //上相霍爾數據暫存區,用于檢測霍爾變化
- static dz_bz; //堵轉標志,為1堵轉
- static dz_bz1;
- static zbyx_bz; //轉把有效標志,歸0時為0,行駛時為1有效
- static ds_bf=10; //轉把上次的數據備份
- static zs_js; //轉速數據
- static zs_ds_js;
- static he_cs_bz1;
- static he_cs_bz2;
- static he_cs_bz3;
- static he_cs_sj1;
- static he_cs_sj2;
- static he_cs_sj3;
- int qy_1,qy_2,qy_3; //欠壓測量暫存區1,2,3
- int cs1,cs2,cs3,cs_fx; //電機測速全局變量
- static qy_bf; //欠壓上次的數據備份
- int h; //ABS剎車用變量
- int dz;
- int dz2;
- void zb_fx(void);
- void he_gzjc(void);
- void pwm_out(void);
-
- //*********************AD轉換后PWM對照表*****************************************
- uchar code pwmout[256]=
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//60個1為1.3v以下
- //------------------------------------------------------------------------------------------
- 241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,
- 201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,
- 161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,//60
- 121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,//23
- 75,73,71,69,67,65,63,61,59,57,55,53,51,49,47,46,45,44,43,42,41,40,39,38,37,36,//26
- 35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,//26
- 9,8,7,6,5,4,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,//34 //25個0為4.1--4.5v
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1}; //26個為4.5V以上
- //*********************1MS延時函數***********************************************
- void delay(int t)
- {
- int i,j;
- for(i=0;i<t;i++)
- for(j=0;j<250;j++)
- ;
- }
- //*********************ABS剎車延時函數***********************************************
- void delay1(int t)
- {
- int i,j;
- for(i=0;i<t;i++)
- for(j=adc_data;j>0;j--)
- {}
- }
- //*********************設置AD電源和開漏函數**************************************
- adc_power()
- {
- adc_contr|=0x80; //開AD電源
- delay(2); //首次開AD電源要延時1MS左右
- p1m0|=0x88; //設置P1.3和P1.7為開漏即AD轉換模式
- p1m1|=0x88; //同上
- }
- //-------------------設置P1.3為轉把測量通道函------------------------------------
- set_p13_adc()
- { zb=1;
- adc_contr=0xe3; //P13口為轉換通道
- }
- //-------------------設置P17為電機超載測量通道函數--------------------------------
- set_p17_adc()
- {
- adc_contr=0xe7;
- }
- //------------------設置P15為欠壓檢測測量通道-------------------------------------
- set_p15_adc()
- {adc_contr=0xe5;}
- //===================測量電壓函數=================================================
- get_ad_dy()
- { int adon=0; //定義一個整型變量用于檢測AD轉換是否結束
- adc_data=0; //AD轉換結果寄存器清0
- adc_contr|=0x08; //轉換位置1啟動轉換
- while(adon==0) //循環判斷表達式成立反復執行語句,不成立退出
- {adon=adc_contr&0x10;} //循環語句體,即判斷AD轉換是否完成,完成后高第4位為1
- adc_contr&=0xe7; //循環語句退出轉換完成,清adc_flag,adc_start,停止轉換
- }
- //********************PWM初始化函數***********************************************
- pwm_sz()
- {
- cmod=0x82; //PCA在空閑模式下停止PCA計數器工作
- //PCA時鐘源為1/2溢出
- //禁止PCA計數器溢出中斷
- ccon=0x00; //禁止PCA計數器工作,清除中斷標志和計數器溢出標志
- cl=0x00; //清0計數器
- ch=0x00;
- //======================以下為4路PWM輸出設置程序=============================
- //設置模塊0為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.7口輸出
- ccapm0=0x42; //***程序核心語句,-----0100,0010
- pca_pwm0=0x03; //先關閉PWM-輸出為0,寫入0x00就可開PWM輸出
- //設置模塊1為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.5口輸出
- ccapm1=0x42; //***程序核心語句,-----0100,0010
- pca_pwm1=0x03; //先關閉PWM-輸出為0,寫入0x00就可開PWM輸出
- //設置模塊2為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P2.0口輸出
- ccapm2=0x42; //***程序核心語句,-----0100,0010
- pca_pwm2=0x03; //先關閉PWM-輸出為0,寫入0x00就可開PWM輸出
- //模塊3未用
- epca_lvd=1; //開PCA中斷
- EA=1; //開總中斷
- cr=1; //開PCA計數器打開
- }
- //********************快閃燈函數***********************************************
- led_k()
- { int k; //定義一個臨時變量
- for(k=0;k<ledcs;k++) //表達式2條件不滿足即次數未到重復執行循環體語句
- {led=0;delay(700);
- led=1;delay(700);}
- delay(2000);
- }
- //********************定時器0和1初始化函數*******************************************
- time_csh()
- {
- TMOD=0x11; //定時器0工作于8位自動重裝,1工作于方式1
- TH0=0x3c; //
- TL0=0x0b;
- TH1=0x3c; //12MHZ時50MS數據,20次為1S
- TL1=0x0b;
- IT0=1; //設置外中斷0為下降沿觸發358第一腳
- EX0=1; //開外中斷0
- EA=1; //開總中斷
- ET0=1; //開定時期0中斷
- ET1=1; //開定時期1中斷
- }
- //********************定時器0中斷函數PWM頻率用************************************
- void time0(void)interrupt 1
- {TR0=0;TH0=0x3c;TL0=0x0b;
- zs_ds_js++;
- if(zs_ds_js==10)
- {if(zs_js<20)
- {
- dz_bz1=1;zs_ds_js=0;zs_js=0;
- TH1=0X3C;TL1=0X0B;TR1=1;
- TH0=0x3c;TL0=0x0b;TR0=1;
- // pwm_bls=200;
- }
- else
- {dz_bz1=0;zs_ds_js=0;zs_js=0;zs_bl=zs_js;
- TH1=0X3C;TL1=0X0B;TR1=0;
- TH0=0X3C;TL0=0X0B;TR0=1;
- }
- }
- else
- {TR0=1;}
- }
- //********************定時器1中斷函數*********************************************
- void time1(void)interrupt 3
- { TR1=0;TH1=0x3c;TL1=0x0b;
- timejs++;
- if(timejs==12) //中斷次數等于給定的次數就取反LED
- {if(zbyx_bz==0) //轉把歸0標志為0,可以閃燈
- {led=~led;timejs=0;TR1=1;}
- }
- if(timejs==80)
- {if(dz_bz1==1)
- {TR0=0;dz_bz1=0;dz_bz=1;zs_ds_js=0;zs_js=0;timejs=0;}
- else
- {dz_bz=0;zs_ds_js=0;zs_js=0;timejs=0;}
- }
- TR1=1;
- }
- //*******************電機堵轉轉函數***********************************************
- //根據2S定時內一直堵轉的話置DZ_BZ為1,本函數檢測到該標志為1立即關閉所有輸出
- //并閃爍指示燈間隔快閃2次提示,最后監控轉把歸0后可以退出本函數重新啟動
- void dgdz(void)
- {
- while(dz_bz1==1)
- {pwm_bls=170;he_gzjc();pwm_out();
- if(dz_bz==1)
- { TR0=0;TR1=0;
- pca_pwm0=0x03; //關3路PWM信號
- pca_pwm1=0x03; //
- pca_pwm2=0x03; //
- pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
- set_p13_adc(); //電機進入保護后開始等待轉把歸零后可以重新啟動
- do{ledcs=2;led_k();get_ad_dy();} //間隔開閃2次提示堵轉保護,測量轉把電壓是否歸0
- while(adc_data>=61); //沒有歸0執行DO循環體語句
- led=1;dz_bz=0;dz_bz1=0; //轉把歸0后關指示燈清堵轉標志
- }
- }
- }
- //********************外中斷0函數限流或康銅開路************************************
- void intt0()interrupt 0
- {
- TR0=0;TR1=0; //關PWM頻率
- pca_pwm0=0x03; //關3路PWM信號
- pca_pwm1=0x03; //
- pca_pwm2=0x03; //
- pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
- set_p13_adc();
- get_ad_dy();
- while(adc_data>=61)
- {ledcs=4;led=0;get_ad_dy();}
- led=1;
- }
- //********************PWM驅動橋驅動輸出函數****************************************
- void pwm_out(void) //入口:pwm_bl里有轉把調速參數.出口:輸出全橋驅動信號
- {
- switch(hehc) //多分支語句根據霍爾位置輸出對應節拍
- {case 0x01:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
- ccap0h=pwm_bls;pwmcl=1;pca_pwm0=0x00;break;} //第1拍ccap0h刷新參數開C下橋A上橋
- //-------------------------------------------------------------
- case 0x03:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
- ccap1h=pwm_bls;pwmcl=1;pca_pwm1=0x00;break;} //第2拍ccap1h刷新參數開C下橋b上橋
- //-------------------------------------------------------------
- case 0x02:{pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
- ccap1h=pwm_bls;pwmal=1;pca_pwm1=0x00;break;} //第3拍ccap1h刷新參數開a下橋b上橋
- //-------------------------------------------------------------
- case 0x06:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
- ccap2h=pwm_bls;pwmal=1;pca_pwm2=0x00;break;} //第4拍ccap2h刷新參數開a下橋c上橋
- //-------------------------------------------------------------
- case 0x04:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
- ccap2h=pwm_bls;pwmbl=1;pca_pwm2=0x00;break;} //第5拍ccap2h刷新參數開b下橋c上橋
- //-------------------------------------------------------------
- case 0x05:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
- ccap0h=pwm_bls;pwmbl=1;pca_pwm0=0x00;break;} //第6拍ccap0h刷新參數開b下橋a上橋
- }
- }
- //********************上電初始化函數**********************************************
- void sd_csh(void)
- {P1=0xff;zb=0;P2=0xff;P3=0xff;
- pwmal=0; //上電復位后首先關閉3組下橋
- pwmbl=0; //
- pwmcl=0; //
- adc_power(); //調AD轉換用初始化函數
- pwm_sz(); //調PWM輸出用初始化函數
- time_csh(); //調兩個定時器初始化函數
- }
- //********************上電防飛車函數歸0后LED正常閃爍******************************
- void sd_ffc(void)
- {
- set_p13_adc(); //調轉把電壓轉換通道
- get_ad_dy(); //上電后測量轉把電壓是否歸零
- while(adc_data>=61) //61為1.2V轉換值轉把如果大于1.2V執行循環體語句等待歸0
- {ledcs=2;led_k(); //循環體語句,2次間隔性快閃燈
- get_ad_dy(); //循環體語句,重新檢測電壓等待歸0
- }
- TR0=0; //關PWM頻率否則干擾閃燈
- timebj=12; //歸0后定時器中斷10次閃爍一次LED
- TR1=1; //歸0后開定時器1-LED閃爍
- }
- //*************剎車函數自動選擇是斷電還是ABS剎車功***************************
- void sc_stop(void) //ABS剎車有外接口對地選擇,對地時為ABS功能
- {
- if(shache==0) //判斷語句剎車口等于0執行大語句1
- { abs=1;
- //大語句體1
- if(abs==1) //判斷ABS選擇不為0就執行普通剎車斷電,否則執行ABS剎車
- //==========普通剎車斷電==================================================
- {
- TR0=0;led=0; //關測速定時器,亮剎車燈
- pca_pwm0=0x03; //關3路PWM信號AH
- pca_pwm1=0x03; //關3路PWM信號BH
- pca_pwm2=0x03; //關3路PWM信號CH
- pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
- //----------------------------------------------------------------------
- while(shache==0) //循環語句,剎車口沒松開就一直等待
- {delay(500);} //語句體,延時抗干擾防止抖動
- hehc_bl=0;led=1; //剎車口松開后清霍爾變量內存再關剎車燈
- //----------------------------------------------------------------------
- for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--) //以下兩句為剎車口松開后減緩沖擊
- {he_gzjc();pwm_out();} //從最低速度加高到實時的轉把設定速度
- }
- //===========EABS剎車斷電=====================================================
- else //ABS功能已選擇進入ABS剎車
- { //
- TR0=0;led=0; //關測速定時器,亮剎車燈
- pca_pwm0=0x03; //關3路PWM信號AH
- pca_pwm1=0x03; //關3路PWM信號BH
- pca_pwm2=0x03; //關3路PWM信號CH
- pwmal=0;pwmbl=0;pwmcl=0; //關閉3個下橋:AL-BL-CL
- //-------------------------------------------------------------------------
- do //do-while語句先執行do再執行while判斷表達式
- {
- for(h=100;h>0;h--) //每檢測一次沒松開就先執行1萬次ABS點剎,防止剎車抖動干擾
- { pwmal=0;pwmbl=0;pwmcl=0;
- delay1(1);
- pwmal=1;pwmbl=1;pwmcl=1; //ABS點剎
- delay1(80);
- }
- }
- while(shache==0); //內鑲循環語句,只要剎車沒松開就一直開ABS點剎制動
- hehc_bl=0;led=1; //剎車口為1后清霍爾變量內存再關剎車燈
- pwmal=0;pwmbl=0;pwmcl=0; //點剎后要關閉所有下橋防止剎車松開后車推不動
- for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)//以下幾句剎車后軟啟動,減少剎車后高速沖擊
- {he_gzjc();pwm_out();}
- }
- //---------------
- }
- }
- //*******************欠壓檢測函數**************************************************
- void qy_jc(void)
- { //連續3次測量電池電壓抗干擾
- set_p15_adc();
- get_ad_dy(); //第1次測量電池電壓
- if(adc_data<=158) //電壓小于等于3.1v嗎,不等于直接退出
- {TR0=0;TR1=0;led=1; //小于等于,電池電壓過低,關PWM頻率保護電池
- pca_pwm0=0x03; //關3路PWM信號
- pca_pwm1=0x03; //
- pca_pwm2=0x03; //
- pwmal=0;pwmbl=0;pwmcl=0; //關3路下橋
- do{ledcs=3;led_k();get_ad_dy();} //閃燈提示重新測量電壓
- while(adc_data<=175); //檢測是否恢復到正常電壓44V
- ledcs=3;led_k(); //電壓恢復44V以上再閃燈做為延時用
- hehc_bl=0; //清霍爾舊數據為了起動
- }
- }
- //*******************霍爾故障檢測函數**********************************************
- void he_gzjc(void)
- {
- hehc=P1&0x07; //讀入霍爾數據,并分離有效數據
- //--查霍爾是否全1--------
- while(hehc==0x07) //判斷是否為3個全1,成立循環執行語句體
- {pca_pwm0=0x03; //霍爾出現故障關閉所有輸出
- pca_pwm1=0x03; //
- pca_pwm2=0x03; //
- pwmal=0;pwmbl=0;pwmcl=0; //
- TR0=0;zs_ds_js=0;zs_js=0; //關測速定時器,定時計數器清0,轉速度計數器清0
- ledcs=6;led_k(); //循環執行語句體6次閃爍,直到不成立退出
- hehc=P1&0x07; //重新檢測霍爾
- }
- //--查霍爾是否全0--------
- while(hehc==0x00) //不為3個1再判斷是否為3個0,成立執行循環語句體
- {pca_pwm0=0x03; //霍爾出現故障關閉所有輸出
- pca_pwm1=0x03; //
- pca_pwm2=0x03; //
- pwmal=0;pwmbl=0;pwmcl=0; //
- TR0=0;zs_ds_js=0;zs_js=0; //關測速定時器,定時計數器清0,轉速度計數器清0
- ledcs=6;led_k(); //循環執行語句體6次閃爍,直到不成立退出
- hehc=P1&0x07; //重新檢測霍爾
- }
- //--查霍爾是否更新--------
- if(hehc_bl!=hehc) //判斷霍爾是否變化,成立執行語句1后退出
- {hehc_bl=hehc; //語句2,霍爾變化存入新的數據到變量中
- he_cs_sj1=hehc;he_cs_bz1=1;
- if(he_cs_bz1==1){he_cs_sj2=hehc;he_cs_bz2=1;}
- if(he_cs_bz2==1){he_cs_sj3=hehc;he_cs_bz3=1;}
- //----------------------------------------
- if(he_cs_bz1==1)
- {if(he_cs_bz2==1)
- {if(he_cs_bz3==1)
- {if(he_cs_sj1&he_cs_sj2&he_cs_sj3!=0x00)
- {zs_js++;he_cs_bz1=0;he_cs_bz2=0;he_cs_bz3=0;}
- }
- }
- }
- //--------------------
- }
- }
- //**********電流自動調整函數******************************************************
- void dl_tz(void)
- { set_p17_adc();
- do
- {get_ad_dy();}
- while(adc_data>=20);
- {pwm_bls=adc_data*10+pwm_bl;
- if(pwm_bls>=241){pwm_bls=241;}
- he_gzjc();pwm_out();zb_fx();dgdz();
- }
- pwm_bls=pwm_bl;
- }
- //********************轉把工作狀態分析函數****************************************
- //函數出口--pwm_bl里有查表后數據,PWM輸出程序直接讀出放入PWM占空比寄存器
- //ccap0h,ccap1h,ccap2h中即可
- //********************************************************************************
- void zb_fx(void)
- { //---連續3次測量轉把電壓--------
- set_p13_adc(); //調轉把電壓轉換通道
- get_ad_dy(); //第一次測量轉把電壓
- pwm_bl=pwmout[adc_data]; //在數組中查出對應的AD轉換PWM值
- if(pwm_bl==1) //為1成立執行大的語句1后退出,不成立執行語句2后退出
- //語句1,轉把電壓等于1說明轉把在1.3v以下或4.5v以上停止輸出閃LED
- {
- hehc_bl=0; //霍爾存儲舊數據的變量及時清0否則很難起動
- pca_pwm0=0x03; //停止所有輸出
- pca_pwm1=0x03;
- pca_pwm2=0x03;
- TR0=0;zs_ds_js=0;zs_js=0; //關測速定時器,定時計數器清0,轉速度計數器清0
- pwmal=0;pwmbl=0;pwmcl=0; //關3個下橋
- timebj=15; //定時器1中斷12次閃爍一次LED
- TR1=1;zbyx_bz=0; //開定時器1-LED閃爍,轉把歸0標志位為0,pwm輸出就無效
- }
- else
- //語句2,轉把電壓不等于1說明在1.3v-4.5v之間正常行駛數據
- {led=1;zbyx_bz=1;TR0=1;} //關定時器1指示燈,轉把有效標志位為1,pwm輸出有效
- }
- //**********************軟啟動************************************
- //dg_rqd()
- //{dgdz();
- //if(pwm_bl!=pwm_blj)
- // {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
- // {he_gzjc();pwm_out();}pwm_blj=pwm_bl;
- // }
- //else
- // {if(shache_bz==1)
- // {for(pwm_bls=241;pwm_bl!=pwm_bls;pwm_bls--)
- // {he_gzjc();pwm_out();}pwm_blj=pwm_bl;shache_bz=0;
- // }
- // else
- // {he_gzjc();pwm_out();}
- // }
- //}
- //********************防盜鎖電機函數**********************************************
- fd_dg()
- {while(fd==0)
- {
- {int fd_he;
- fd_he=P1&0X07;
- if(fd_he!=fd_hej)
- {fd_hej=fd_he;
- //switch(fd_he) //多分支語句根據霍爾位置輸出對應節拍
- // {case 0x01:{
- pca_pwm0=0x03;pca_pwm2=0x03;pwmbl=0;pwmcl=0;
- ccap1h=10;pwmal=1;pca_pwm1=0x00;delay(20);
- pwmal=0;pca_pwm1=0x03;
- pwmal=1;pwmbl=1;pwmcl=1;delay(300);
- //-------
- //pwmcl=1;pca_pwm0=0x00;delay(1);
- // pwmcl=0;pca_pwm0=0x03;delay(2);
- // break;} //第1拍ccap0h刷新參數開C下橋A上橋
- //-------------------------------------------------------------
- // case 0x03:{pca_pwm0=0x03;pca_pwm1=0x03;pwmbl=0;pwmcl=0;
- // ccap2h=10;pwmal=1;pca_pwm2=0x00;delay(20);
- // pwmal=0;pca_pwm2=0x03;
- // pwmal=1;pwmbl=1;pwmcl=1;delay(200);
- //--------
- // pwmcl=1;pca_pwm1=0x00;delay(1);
- // pwmcl=0;pca_pwm1=0x03;delay(2);
- // break;} //第2拍ccap1h刷新參數開C下橋b上橋
- //-------------------------------------------------------------
- // case 0x02:{pca_pwm0=0x03;pca_pwm1=0x03;pwmal=0;pwmcl=0;
- // ccap2h=10;pwmbl=1;pca_pwm2=0x00;delay(20);
- // pwmbl=0;pca_pwm2=0x03;
- // pwmal=1;pwmbl=1;pwmcl=1;delay(200);
- // //--------
- //pwmal=1;pca_pwm1=0x00;delay(1);
- // //pwmal=0;pca_pwm1=0x03;delay(2);
- // break;} //第3拍ccap1h刷新參數開a下橋b上橋
- //-------------------------------------------------------------
- // case 0x06:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmcl=0;
- // ccap0h=10;pwmbl=1;pca_pwm0=0x00;delay(20);
- // pwmbl=0;pca_pwm0=0x03;
- // pwmal=1;pwmbl=1;pwmcl=1;delay(200);
- //---------
- //pwmal=1;pca_pwm2=0x00;delay(1);
- //pwmal=0;pca_pwm2=0x03;delay(2);
- // break;} //第4拍ccap2h刷新參數開a下橋c上橋
- //-------------------------------------------------------------
- // case 0x04:{pca_pwm1=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
- // ccap0h=10;pwmcl=1;pca_pwm0=0x00;delay(20);
- // pwmcl=0;pca_pwm0=0x03;
- // pwmal=1;pwmbl=1;pwmcl=1;delay(200);
- // //---------
- //pwmbl=1;pca_pwm2=0x00;delay(1);
- //pwmbl=0;pca_pwm2=0x03;delay(2);
- // break;} //第5拍ccap2h刷新參數開b下橋c上橋
- //-------------------------------------------------------------
- // case 0x05:{pca_pwm0=0x03;pca_pwm2=0x03;pwmal=0;pwmbl=0;
- // ccap1h=10;pwmcl=1;pca_pwm1=0x00;delay(20);
- // pwmcl=0;pca_pwm1=0x03;
- // pwmal=1;pwmbl=1;pwmcl=1;delay(200);
- //----------
- // pwmbl=1;pca_pwm0=0x00;delay(1);
- // // pwmbl=0;pca_pwm0=0x03;delay(2);
- // break;} //第6拍ccap0h刷新參數開b下橋a上橋
- // }
- }
- }
- }
- }
- //********************主函數******************************************************
- main()
- {
- sd_csh(); //調上電初始化函數
- qy_jc(); //調欠壓檢測函數
- sd_ffc(); //調上電防飛車函數,等待歸0后才往下執行
- he_gzjc(); //調霍爾故障檢測函數,無故障才往下執行
- while(1)
- {
- qy_jc();
- if(fd==0){fd_hej=P1&0x07;fd_dg();}//如果防盜口為低電平執行防盜程序
- //--------------
- else //否則執行正常程序
- {
- if(dz_bz1!=1){zb_fx();} //1>調轉把分析函數
- if(zbyx_bz==1) //如果轉把標志位為1轉把有效,就執行語句體否則不執行
- {dl_tz();dgdz();
- he_gzjc();pwm_out();
- } //語句體,調霍爾分析函數,調PWM輸出函數
- sc_stop(); //調剎車斷電檢測函數
- }
- //-----------------------
- }
復制代碼 出自:http://www.zg4o1577.cn/bbs/dpj-178970-1.html
|