?? test.lst
字號:
C51 COMPILER V7.50 TEST 11/15/2008 18:47:31 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN Test.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Test.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg52.h"
2 #define uchar unsigned char
3 #define uint unsigned int
4 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7
-1,0x00}; //共陰極0~9對應16進制數
5 //數碼管位選控制口定義
6 sbit LED4=P2^7;
7 sbit LED3=P2^6;
8 sbit LED2=P2^5;
9 sbit LED1=P2^4;
10 //按鍵口申明
11 sbit S1=P2^3;
12 sbit S2=P2^2;
13 sbit S3=P2^1;
14
15 sbit PWM=P3^3; //控制電機的PWM口
16 unsigned char tabArry[4]; //存入顯示數據
17
18 char flag=1; //按鍵標志,當flag=1時表示沒有按下,當flag=0時表示有按鍵按下
19 int counter; //用于頻率計定時器計數,當為50時,定時為1秒
20 int speed,setspeed=16; //電機實際轉速,設定的電機轉速
21 int speedcount; //轉速計數
22 int keycount=0; //按鍵計數,為0時測轉速,為1時設置轉速
23 int z_counter=0; //占空比計數,計100次
24 int zkb=50; //所調制的占空比
25 int pwmcount=0;
26 //毫秒延時程序
27 void delayms(int ms)
28 {
29 1 uchar i;
30 1 while(ms--)
31 1 {
32 2 for(i=250;i>0;i--);
33 2 }
34 1 }
35 //數據分位
36 void change(char ch,unsigned int frequency)
37 {
38 1 tabArry[0]=ch; //顯示字母,A為測得轉速,b為設置轉速
39 1 tabArry[1]=frequency%1000/100; //百位
40 1 tabArry[2]=frequency%100/10; //十位
41 1 tabArry[3]=frequency%10; //個位
42 1 }
43 //鍵盤掃描
44 void keyscan()
45 {
46 1 if(flag==1)
47 1 {
48 2 if(S3==0) //用S3切換實際轉速與設定轉速
49 2 {
50 3 delayms(2); //延時去抖
51 3 if(S3==0)
52 3 {
53 4 flag=0;
54 4 keycount++;
C51 COMPILER V7.50 TEST 11/15/2008 18:47:31 PAGE 2
55 4 if(keycount>=2) keycount=0;
56 4 }
57 3 }
58 2
59 2 if(S2==0 && keycount==1) //設置轉速加1
60 2 {
61 3 delayms(2);
62 3 if(S2==0 && keycount==1)
63 3 {
64 4 flag=0;
65 4 setspeed++;
66 4 if(setspeed>1000) setspeed=999;
67 4 }
68 3 }
69 2 if(S1==0 && keycount==1) //設置轉速減1
70 2 {
71 3 delayms(2);
72 3 if(S1==0 && keycount==1)
73 3 {
74 4 flag=0;
75 4 setspeed--;
76 4 if(setspeed<0) setspeed=0;
77 4 }
78 3 }
79 2
80 2 }
81 1 if(S1!=0 && S2!=0 && S3!=0) flag=1; //判斷按鍵是否彈起
82 1 }
83
84 //顯示函數
85 void display()
86 {
87 1
88 1 switch(keycount)
89 1 {
90 2 case 0: //當keycount=0時顯示實際轉速
91 2 change(0x0a,speed);
92 2 break;
93 2 case 1:
94 2 change(0x0b,setspeed); //當keycount=1時顯示設置轉速
95 2 break;
96 2 }
97 1
98 1 P0 = table[tabArry[0]];
99 1 LED1=0;
100 1 delayms(2);
101 1 LED1=1;
102 1
103 1 P0 = table[tabArry[1]];
104 1 LED2=0;
105 1 delayms(2);
106 1 LED2=1;
107 1
108 1 P0 = table[tabArry[2]];
109 1 LED3=0;
110 1 delayms(2);
111 1 LED3=1;
112 1
113 1 P0 = table[tabArry[3]];
114 1 LED4=0;
115 1 delayms(2);
116 1 LED4=1;
C51 COMPILER V7.50 TEST 11/15/2008 18:47:31 PAGE 3
117 1 }
118 //程序初始化
119 void Init()
120 {
121 1 TMOD=0x11; //定時器1方式1,定時器0方式1
122 1
123 1 TH0=0x70;//定義20ms,用于測速,晶振22.1184MHz
124 1 TL0=0x00;
125 1
126 1 TH1=0xf8; //定義1mS,用于控制電機轉速
127 1 TL1=0xcc;
128 1
129 1 ET0=1;//允許定時0中斷
130 1 ET1=1;//允許定時1中斷
131 1 TR0=1;//定時器0啟動
132 1 TR1=1;//定時器1啟動
133 1 EX0=1;//允許外部中斷
134 1 IT0=1;//邊沿出發
135 1 EA=1;//總中斷打開
136 1 }
137 //*******************************************************
138 void main(void)
139 {
140 1 Init();
141 1 while(1)
142 1 {
143 2 keyscan();//按鍵程序
144 2 display();//顯示程序
145 2 }
146 1 }
147 //定時器0,用于測電機轉速
148 void timer0() interrupt 1
149 {
150 1 TH0=0x70;//定義20ms
151 1 TL0=0x00;
152 1 counter++;
153 1 if(counter>=50) //1s時將電機脈沖讀出
154 1 {
155 2 counter=0; //定時器計數清零,便于下一次測速計數
156 2 speed=speedcount; //將測得的頻率賦給speed顯示
157 2 speedcount=0; //將電機轉速計數清零,重新計數
158 2 }
159 1
160 1 }
161 //定時器1,用于控制PWM輸出
162 void timer1() interrupt 3
163 {
164 1 TH1=0xf8; //重新賦初值
165 1 TL1=0xcc;
166 1 z_counter++; //占空比計數加1
167 1 if(z_counter>=100) z_counter=0; //當計數超過100后清零,便于重新計數
168 1 if(setspeed>speed) //當設定的值大于實際值時,所調制的占空比加1
169 1 {
170 2 zkb++;
171 2 if(zkb>100) zkb=100;
172 2 }
173 1 else if(setspeed<speed) //當設定的值小于實際值時,所調制的占空比減1
174 1 {
175 2 zkb--;
176 2 if(zkb<0) zkb=0;
177 2 }
178 1 else zkb=50; //當設定的值等于實際值時,所調制的占空恒為50
C51 COMPILER V7.50 TEST 11/15/2008 18:47:31 PAGE 4
179 1 if(z_counter<zkb) PWM=0;
180 1 else PWM=1;
181 1
182 1 }
183
184 //外中斷0,用于電機速度計數,每產生一次中斷計數一次
185 void Pint0() interrupt 0
186 {
187 1 speedcount++;
188 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 615 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -