?? text2.lst
字號(hào):
C51 COMPILER V8.05a TEXT2 05/14/2008 12:22:47 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE TEXT2
OBJECT MODULE PLACED IN Text2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text2.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3 //-----------------------函數(shù)聲明,變量定義--------------------------------------------------------
4 #include <reg51.h>
5 sbit INT_0 =P1^2; // 將p3.2外部中斷0
6 sbit pulse_A=P1^2; // P1.2為脈沖A輸入
7 sbit PWM=P1^0; //PWM波形輸出
8 sbit DR=P1^1; //方向控制
9 //-----------------------預(yù)定義值--------------------------------------------------------
10 #define PWM_T 1800 //定義PWM的周期T為18ms
11 #define Ts 1000 //定義光電編碼器采樣時(shí)間為10ms
12 #define timer_data (256-10) //定時(shí)器預(yù)置值,12M時(shí)鐘是,定時(shí)0.01ms
13 //-----------------------預(yù)設(shè)定值--------------------------------------------------------
14 bit direction; //方向標(biāo)志位 用戶設(shè)定
15 unsigned char R; //需要得到的直流電機(jī)轉(zhuǎn)速 用戶設(shè)定
16 //-----------------------實(shí)際運(yùn)行狀態(tài)--------------------------------------------------------
17 bit real_direction; //電機(jī)實(shí)際運(yùn)行方向
18 unsigned char Rr; //直流電機(jī)實(shí)際轉(zhuǎn)速
19 //-----------------------計(jì)算所得補(bǔ)償狀態(tài)------------------------------------------
20 bit compensate_polarity; //補(bǔ)償極性
21 unsigned char dR; //轉(zhuǎn)速補(bǔ)償
22 //-----------------------經(jīng)補(bǔ)償后得到的脈寬------------------------------------------
23 unsigned char PWM_t; //PWM_t為脈沖寬度(320~400)時(shí)間為3.2~4.0ms
24 unsigned char PWM_count; //輸出PWM周期計(jì)數(shù)
25 //-----------------------各中間計(jì)數(shù)值------------------------------------------
26 unsigned char pulseB_count; //脈沖計(jì)數(shù)
27 unsigned char time0_count; //定時(shí)計(jì)數(shù)
28 unsigned char time1_count; //定時(shí)計(jì)數(shù)
29 //--------------------------------------------------------------------------------------------------
30 // 函數(shù)名稱:timer_init
31 // 函數(shù)功能:初始化設(shè)置定時(shí)器
32 //--------------------------------------------------------------------------------------------------
33 void timer_init()
34 {
35 1 TMOD=0x22; /*定時(shí)器1為工作模式2(8位自動(dòng)重裝),0為模式2(8位自動(dòng)重裝) */
36 1 PCON=0x00;
37 1 TF0=0;
38 1 TH0=timer_data; //保證定時(shí)時(shí)長(zhǎng)為0.01ms
39 1 TL0=TH0;
40 1 TH1=timer_data; //保證定時(shí)時(shí)長(zhǎng)為0.01ms
41 1 TL1=TH0;
42 1 ET0=1; //定時(shí)器0中斷允許
43 1 TR0=1; //定時(shí)器0開(kāi)始計(jì)數(shù)
44 1 ET1=1; //定時(shí)器1中斷允許
45 1 TR1=1; //定時(shí)器1開(kāi)始計(jì)數(shù)
46 1 EA=1; //中斷允許
47 1 }
48 //--------------------------------------------------------------------------------------------------
49 // 函數(shù)名稱: INT0_init()
50 // 函數(shù)功能: 初始化設(shè)置
51 // 設(shè)定INT0的工作方式
52 //--------------------------------------------------------------------------------------------------
53 void INT0_init(void )
54 {
55 1 pulseB_count=0; //脈沖計(jì)數(shù)器清零
C51 COMPILER V8.05a TEXT2 05/14/2008 12:22:47 PAGE 2
56 1 IT0=1; //選擇INT0為沿觸發(fā)方式
57 1 EX0=1; //外部中斷允許
58 1 EA=1; //系統(tǒng)中斷允許
59 1 }
60 //--------------------------------------------------------------------------------------------------
61 // 函數(shù)名稱:setting_PWM
62 // 函數(shù)功能:設(shè)置PWM的脈沖寬度和設(shè)定方向
63 //--------------------------------------------------------------------------------------------------
64 void setting_PWM()
65 {
66 1 // direction=1; //設(shè)定轉(zhuǎn)動(dòng)方向
67 1 // R=540; //設(shè)定轉(zhuǎn)速
68 1 // dR=0; //轉(zhuǎn)速補(bǔ)償為零
69 1 // calculate_PWM_t(); //重新計(jì)算脈寬
70 1 }
71 //--------------------------------------------------------------------------------------------------
72 // 函數(shù)名稱: calculate_PWM_t
73 // 入口參數(shù): R需要得到的直流電機(jī)轉(zhuǎn)速,dR轉(zhuǎn)速補(bǔ)償
74 // 出口參數(shù): PWM_t為脈沖寬度(320~400)時(shí)間為3.2~4.0ms
75 // 函數(shù)功能: 計(jì)算脈沖寬度,PWM_t=R/150;
76 //--------------------------------------------------------------------------------------------------
77 void calculate_PWM_t()
78 {
79 1 if(compensate_polarity==1) //正補(bǔ)償
80 1 PWM_t=(R+dR)/150;
81 1 else
82 1 PWM_t=(R-dR)/150; //負(fù)修正
83 1 }
84 //--------------------------------------------------------------------------------------------------
85 // 函數(shù)名稱: calculate_Rr
86 // 入口參數(shù): pulseB_count脈沖計(jì)數(shù)
87 // 出口參數(shù): Rr直流電機(jī)實(shí)際轉(zhuǎn)速
88 // 函數(shù)功能: 計(jì)算實(shí)際轉(zhuǎn)速
89 //--------------------------------------------------------------------------------------------------
90 void calculate_Rr()
91 {
92 1 Rr=pulseB_count/6;
93 1 }
94 //--------------------------------------------------------------------------------------------------
95 // 函數(shù)名稱: compensate_dR
96 // 入口參數(shù): Rr直流電機(jī)實(shí)際轉(zhuǎn)速
97 // R需要得到的直流電機(jī)轉(zhuǎn)速
98 // 出口參數(shù): dR轉(zhuǎn)速補(bǔ)償
99 // 函數(shù)功能: 計(jì)算實(shí)際補(bǔ)償值和補(bǔ)償極性 ,根據(jù)不同的補(bǔ)償算法重新設(shè)計(jì)
100 //--------------------------------------------------------------------------------------------------
101 void compensate_Rr()
102 {
103 1 Rr=1;
104 1 if(Rr>R)
105 1 compensate_polarity=0; //補(bǔ)償極性
106 1 else
107 1 compensate_polarity=1;
108 1 }
109 //--------------------------------------------------------------------------------------------------
110 // 函數(shù)名稱: INT0_intrupt
111 // 函數(shù)功能: 外部中斷0處理程序
112 //--------------------------------------------------------------------------------------------------
113 void INT0_intrupt() interrupt 0 using 1
114 {
115 1 pulseB_count++;
116 1 if(pulse_A==0)
117 1 {
C51 COMPILER V8.05a TEXT2 05/14/2008 12:22:47 PAGE 3
118 2 real_direction=1; //若P1.2為低電平,則電機(jī)為正轉(zhuǎn),計(jì)數(shù)器N的值加1
119 2 }
120 1 else //若為高電平,則電機(jī)為反轉(zhuǎn),計(jì)數(shù)器N值減l。
121 1 {
122 2 real_direction=1;
123 2 }
124 1 }
125 //--------------------------------------------------------------------------------------------------
126 // 函數(shù)名稱:IntTimer0
127 // 函數(shù)功能:定時(shí)器中斷處理程序
128 //--------------------------------------------------------------------------------------------------
129 void IntTimer0() interrupt 1
130 {
131 1 time0_count++;
132 1 DR=direction;
133 1 if(time0_count>=PWM_T)
134 1 {
135 2 time0_count=0;
136 2 PWM_count++;
137 2 setting_PWM(); //每輸出一個(gè)PWM波調(diào)用一次
138 2 }
139 1 if(time0_count<PWM_t)
140 1 PWM=1;
141 1 else
142 1 PWM=0;
143 1 }
144 //--------------------------------------------------------------------------------------------------
145 // 函數(shù)名稱:IntTimer1
146 // 函數(shù)功能:定時(shí)器中斷處理程序
147 //--------------------------------------------------------------------------------------------------
148 void IntTimer1() interrupt 3
149 {
150 1 time1_count++;
151 1 if(time1_count==1)
152 1 {
153 2 INT0_init(); //初始化外部中斷設(shè)置
154 2 }
155 1 if(time1_count>=Ts)
156 1 {
157 2 time1_count=0; //一個(gè)補(bǔ)償周期結(jié)束,計(jì)數(shù)器清零
158 2 calculate_Rr(); //計(jì)算實(shí)際轉(zhuǎn)速
159 2 compensate_Rr(); //計(jì)算實(shí)際補(bǔ)償值和補(bǔ)償極性
160 2 calculate_PWM_t(); //重新計(jì)算脈寬
161 2 }
162 1 }
163 //--------------------------------------------------------------------------------------------------
164 // 函數(shù)名稱:main
165 // 用戶主函數(shù)
166 // 函數(shù)功能:主函數(shù)
167 //--------------------------------------------------------------------------------------------------
168 void main()
169 {
170 1 direction=1; //設(shè)定轉(zhuǎn)動(dòng)方向
171 1 R=540; //設(shè)定轉(zhuǎn)速
172 1 dR=0; //轉(zhuǎn)速補(bǔ)償為零
173 1 calculate_PWM_t(); //重新計(jì)算脈寬
174 1 timer_init();
175 1 }
176
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V8.05a TEXT2 05/14/2008 12:22:47 PAGE 4
CODE SIZE = 200 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -