?? 無刷0621.lst
字號:
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE _轤_0621
OBJECT MODULE PLACED IN .\無刷0621.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\無刷0621.c DEBUG OBJECTEXTEND
stmt level source
1 //===================================================================================================
2 #include<reg51.h> //包含文件預(yù)處理命令
3 #define uchar unsigned char //8位單片機習慣性定義
4 #define uint unsigned int //8位單片機習慣性定義
5 //
6 //*********AD轉(zhuǎn)換要用到的特殊寄存器地址定義*************************************
7 sfr adc_contr=0xc5; //定義AD轉(zhuǎn)換控制寄存器地址
8 sfr adc_data=0xc6; //定義AD轉(zhuǎn)換結(jié)果寄存器地址
9 sfr p1m0=0x91; //帶有8路AD的P1口模式選擇寄存器0定義地址
10 sfr p1m1=0x92; //帶有8路AD的P1口模式選擇寄存器1定義地址
11 //
12 //*********PWM輸出要用到的特殊寄存器地址定義************************************
13 sfr ccap0h=0xfa; //PCA模塊0捕捉/比較寄存器高8位
14 sfr ccap1h=0xfb; //PCA模塊1捕捉/比較寄存器高8位
15 sfr ccap2h=0xfc; //PCA模塊2捕捉/比較寄存器高8位
16 sfr ccap3h=0xfd; //PCA模塊3捕捉/比較寄存器高8位
17 sfr pca_pwm0=0xf2; //PCA模塊0-PWM寄存器
18 sfr pca_pwm1=0xf3; //PCA模塊1-PWM寄存器
19 sfr pca_pwm2=0xf4; //PCA模塊2-PWM寄存器
20 sfr pca_pwm4=0xf5; //PCA模塊3-PWM寄存器
21 sfr ccapm0=0xda; //PCA模塊0工作模式寄存器
22 sfr ccapm1=0xdb; //PCA模塊1工作模式寄存器
23 sfr ccapm2=0xdc; //PCA模塊2工作模式寄存器
24 sfr ccapm3=0xdd; //PCA模塊3工作模式寄存器
25 sfr ch=0xf9; //PCA計數(shù)器高8位
26 sfr cl=0xe9; //PCA計數(shù)器低8位
27 sfr ccon=0xd8; //PCA控制寄存器
28 sfr cmod=0xd9; //PCA工作模式寄存器
29 sbit cr=ccon^6; //PCA計數(shù)器控制位,1開0關(guān)
30 sbit epca_lvd=IE^6; //PCA中斷允許控制位1開0關(guān)
31 sfr auxr=0x8E; //定時器工作于1T控制位
32 //==============================================================================
33 sbit zb=P1^3;
34 sbit pwmal=P2^3; //A相下橋驅(qū)動定義
35 sbit pwmbl=P2^2; //B相下橋驅(qū)動定義
36 sbit pwmcl=P2^1; //C相下橋驅(qū)動定義
37 sbit led=P2^7; //指示燈定義
38 sbit abs=P2^5; //ABS剎車功能選擇口,對地為ABS功能
39 sbit shache=P3^0; //剎車口定義,對地剎車
40 sbit fd=P3^3; //防盜檢測口定義
41 int ledcs; //定義一個指示燈閃燈次數(shù)變量
42 static fd_hej;
43 static timebj; //定義一個定時器計數(shù)比較變量
44 static timejs; //定義一個定時器中斷計數(shù)次數(shù)變量
45 static pwm_bl; //PWM輸出變量
46 static zs_bl=20; //pwm舊的變量數(shù)據(jù),備份的
47 static pwm_bls; //PWM軟啟動加速用變量
48 static shache_bz; //剎車后該標志置1供軟啟動使用
49 static hehc; //霍爾數(shù)據(jù)暫存區(qū)
50 static hehc_bl; //上相霍爾數(shù)據(jù)暫存區(qū),用于檢測霍爾變化
51 static dz_bz; //堵轉(zhuǎn)標志,為1堵轉(zhuǎn)
52 static dz_bz1;
53 static zbyx_bz; //轉(zhuǎn)把有效標志,歸0時為0,行駛時為1有效
54 static ds_bf=10; //轉(zhuǎn)把上次的數(shù)據(jù)備份
55 static zs_js; //轉(zhuǎn)速數(shù)據(jù)
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 2
56 static zs_ds_js;
57 static he_cs_bz1;
58 static he_cs_bz2;
59 static he_cs_bz3;
60 static he_cs_sj1;
61 static he_cs_sj2;
62 static he_cs_sj3;
63 int qy_1,qy_2,qy_3; //欠壓測量暫存區(qū)1,2,3
64 int cs1,cs2,cs3,cs_fx; //電機測速全局變量
65 static qy_bf; //欠壓上次的數(shù)據(jù)備份
66 int h; //ABS剎車用變量
67 int dz;
68 int dz2;
69 void zb_fx(void);
70 void he_gzjc(void);
71 void pwm_out(void);
72
73 //*********************AD轉(zhuǎn)換后PWM對照表*****************************************
74 uchar code pwmout[256]=
75 {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,
76 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以下
77 //------------------------------------------------------------------------------------------
78 241,239,237,235,233,231,229,227,225,223,221,219,217,215,213,211,209,207,205,203,
79 201,199,197,195,193,191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,
80 161,159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129,127,125,123,//60
81 121,119,117,115,113,111,109,107,105,103,101,99,97,95,93,91,89,87,85,83,81,79,77,//23
82 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
83 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
84 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
85 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以上
86 //*********************1MS延時函數(shù)***********************************************
87 void delay(int t)
88 {
89 1 int i,j;
90 1 for(i=0;i<t;i++)
91 1 for(j=0;j<250;j++)
92 1 ;
93 1 }
94 //*********************ABS剎車延時函數(shù)***********************************************
95 void delay1(int t)
96 {
97 1 int i,j;
98 1 for(i=0;i<t;i++)
99 1 for(j=adc_data;j>0;j--)
100 1 {}
101 1 }
102 //*********************設(shè)置AD電源和開漏函數(shù)**************************************
103 adc_power()
104 {
105 1 adc_contr|=0x80; //開AD電源
106 1 delay(2); //首次開AD電源要延時1MS左右
107 1 p1m0|=0x88; //設(shè)置P1.3和P1.7為開漏即AD轉(zhuǎn)換模式
108 1 p1m1|=0x88; //同上
109 1 }
110 //-------------------設(shè)置P1.3為轉(zhuǎn)把測量通道函------------------------------------
111 set_p13_adc()
112 { zb=1;
113 1 adc_contr=0xe3; //P13口為轉(zhuǎn)換通道
114 1 }
115 //-------------------設(shè)置P17為電機超載測量通道函數(shù)--------------------------------
116 set_p17_adc()
117 {
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 3
118 1 adc_contr=0xe7;
119 1 }
120 //------------------設(shè)置P15為欠壓檢測測量通道-------------------------------------
121 set_p15_adc()
122 {adc_contr=0xe5;}
123 //===================測量電壓函數(shù)=================================================
124 get_ad_dy()
125 { int adon=0; //定義一個整型變量用于檢測AD轉(zhuǎn)換是否結(jié)束
126 1 adc_data=0; //AD轉(zhuǎn)換結(jié)果寄存器清0
127 1 adc_contr|=0x08; //轉(zhuǎn)換位置1啟動轉(zhuǎn)換
128 1 while(adon==0) //循環(huán)判斷表達式成立反復(fù)執(zhí)行語句,不成立退出
129 1 {adon=adc_contr&0x10;} //循環(huán)語句體,即判斷AD轉(zhuǎn)換是否完成,完成后高第4位為1
130 1 adc_contr&=0xe7; //循環(huán)語句退出轉(zhuǎn)換完成,清adc_flag,adc_start,停止轉(zhuǎn)換
131 1 }
132 //********************PWM初始化函數(shù)***********************************************
133 pwm_sz()
134 {
135 1 cmod=0x82; //PCA在空閑模式下停止PCA計數(shù)器工作
136 1 //PCA時鐘源為1/2溢出
137 1 //禁止PCA計數(shù)器溢出中斷
138 1 ccon=0x00; //禁止PCA計數(shù)器工作,清除中斷標志和計數(shù)器溢出標志
139 1 cl=0x00; //清0計數(shù)器
140 1 ch=0x00;
141 1 //======================以下為4路PWM輸出設(shè)置程序=============================
142 1 //設(shè)置模塊0為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.7口輸出
143 1 ccapm0=0x42; //***程序核心語句,-----0100,0010
144 1 pca_pwm0=0x03; //先關(guān)閉PWM-輸出為0,寫入0x00就可開PWM輸出
145 1 //設(shè)置模塊1為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P3.5口輸出
146 1 ccapm1=0x42; //***程序核心語句,-----0100,0010
147 1 pca_pwm1=0x03; //先關(guān)閉PWM-輸出為0,寫入0x00就可開PWM輸出
148 1 //設(shè)置模塊2為8位PWM輸出模式,PWM無需中斷支持,,脈沖在P2.0口輸出
149 1 ccapm2=0x42; //***程序核心語句,-----0100,0010
150 1 pca_pwm2=0x03; //先關(guān)閉PWM-輸出為0,寫入0x00就可開PWM輸出
151 1 //模塊3未用
152 1 epca_lvd=1; //開PCA中斷
153 1 EA=1; //開總中斷
154 1 cr=1; //開PCA計數(shù)器打開
155 1 }
156 //********************快閃燈函數(shù)***********************************************
157 led_k()
158 { int k; //定義一個臨時變量
159 1 for(k=0;k<ledcs;k++) //表達式2條件不滿足即次數(shù)未到重復(fù)執(zhí)行循環(huán)體語句
160 1 {led=0;delay(700);
161 2 led=1;delay(700);}
162 1 delay(2000);
163 1 }
164 //********************定時器0和1初始化函數(shù)*******************************************
165 time_csh()
166 {
167 1 TMOD=0x11; //定時器0工作于8位自動重裝,1工作于方式1
168 1 TH0=0x3c; //
169 1 TL0=0x0b;
170 1 TH1=0x3c; //12MHZ時50MS數(shù)據(jù),20次為1S
171 1 TL1=0x0b;
172 1 IT0=1; //設(shè)置外中斷0為下降沿觸發(fā)358第一腳
173 1 EX0=1; //開外中斷0
174 1 EA=1; //開總中斷
175 1 ET0=1; //開定時期0中斷
176 1 ET1=1; //開定時期1中斷
177 1 }
178 //********************定時器0中斷函數(shù)PWM頻率用************************************
179 void time0(void)interrupt 1
C51 COMPILER V6.12 _轤_0621 06/28/2005 07:25:16 PAGE 4
180 {TR0=0;TH0=0x3c;TL0=0x0b;
181 1 zs_ds_js++;
182 1 if(zs_ds_js==10)
183 1 {if(zs_js<20)
184 2 {
185 3 dz_bz1=1;zs_ds_js=0;zs_js=0;
186 3 TH1=0X3C;TL1=0X0B;TR1=1;
187 3 TH0=0x3c;TL0=0x0b;TR0=1;
188 3 // pwm_bls=200;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -