📄 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 + -