📄 test.lst
字号:
C51 COMPILER V7.07 TEST 05/13/2009 17:33:17 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE test.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2
3 /******led 接口描述******/
4 //P0--->(a-g,dot) 显示
5 //选择使能控制段
6 //P2^3--->使能左第一个数码管 P2^2--->左第二个数码管
7 //P2^1--->左第三个数码管 P2^0--->左第四个数码管
8
9
10 /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
11
12 sbit P3_0=P3^0; //过热保护信号接入点
13
14 sbit en1=P1^0; //M1的使能
15 sbit en2=P1^1; //M2的使能
16 sbit s1=P1^2;//M1
17 sbit s2=P1^3;
18 sbit s3=P1^4;//M2
19 sbit s4=P1^5;
20
21 /*********显示数据表 对应0-9 ,a-f*************/
22 unsigned char code table[16]={0x3f,6,0x5b,0x4f,
23 0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,
24 0x7c,0x58,0x5e,0x79,0x71};
25 /**********显示选择表***********************/
26 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
27
28 /*****定义一个数组变量用于存放将要显示的值*******/
29
30 unsigned char d[4]={0,0,0,0}; //随意放入一些初始值
31
32 /*****定义一个全局变量 number******/
33 unsigned char number; //number 表示第几个显示 0-3
34
35 unsigned char f;//全局变量 用于判断翻转
36
37 unsigned char wind; //风类计数
38
39 unsigned char t;//用于PWM计数
40
41 unsigned char m1;//用于计数对应风类
42
43 /******按键接口描述********/
44 //左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4
45 //左第一个按键键值为1
46 //左第二个按键键值为2
47 //左第三个按键键值为3
48 //左第四个按键键值为4
49
50 void delay1(const unsigned int DELAY);
51 /******延时DELAY个ms子程序********/
52 void delay1(const unsigned int DELAY)
53 {
54 1 unsigned int x,y;
55 1 for(x=0;x<=DELAY;x++)
C51 COMPILER V7.07 TEST 05/13/2009 17:33:17 PAGE 2
56 1 {for(y=0;y<120;y++);}
57 1 }
58
59
60 /******延时程序********/
61 void delay (dy)
62 {
63 1 while(--dy);
64 1 }
65
66 /******读取按键子程序 getkey()*************/
67 unsigned char getkey (void)
68 { unsigned char k,tem,keytem;
69 1 keytem=0;
70 1 tem=P2 & 0xf0; //第一次读取按键值
71 1 if(tem!=0xf0) //判断有无按键按下
72 1 {
73 2 for(k=0;k<40;k++)
74 2 delay(250); //延时一段时间
75 2 tem=P2 & 0xf0; //再次读取按键值
76 2 if(tem!=0xf0)
77 2 { if(tem==0x70) keytem=1; //表示左第一个按键按下
78 3 else if(tem==0xb0) keytem=2; //表示左第二个按键按下
79 3 else if(tem==0xd0) keytem=3; //表示左第三个按键按下
80 3 else if(tem==0xe0) keytem=4; //表示左第四个按键按下
81 3 }
82 2 }
83 1
84 1 while(tem!=0xf0) tem=P2 & 0xf0; //等待按键释放
85 1 return(keytem); //返回按键值
86 1 }
87
88 /******停止M1 M2 TR2********/ //TR1负责M1 TR2负责M2
89 void stop()
90 {
91 1 s1=0;
92 1 s2=0;
93 1 s3=0;
94 1 s4=0;
95 1 TR2=0;
96 1 delay(500);
97 1 }
98
99
100 /*****M2正反转********/
101 void rotate()
102 {
103 1 stop();
104 1 TR2=1;
105 1 if(f)
106 1 {
107 2 s3=0;
108 2 s4=1;
109 2 }
110 1 else
111 1 {
112 2 s3=1;
113 2 s4=0;
114 2 }
115 1 }
116
117
C51 COMPILER V7.07 TEST 05/13/2009 17:33:17 PAGE 3
118 /********定时器0中断服务程序***************/
119 void timer0(void) interrupt 1
120 {
121 1 TR0=0; //停止定时器0
122 1 TH0=(65536-1000)/256; //通过定时器定时延时大约1ms左右
123 1 TL0=(65536-1000)%256;
124 1 number=(number+1)%4;
125 1 P2=digit[number]; //选择第number个数码管显示
126 1 P0=table[d[number]]; //查表显示要显示的值
127 1 TR0=1; //启动定时器0
128 1 }
129
130 /******定时器0初始化函数**********/
131 void Init_Timer0 (void)
132 {
133 1 TMOD=0x01; //
134 1 TH0=(65536-1000)/256; //通过定时器定时延时大约1ms左右
135 1 TL0=(65536-1000)%256;
136 1 EA=1;
137 1 ET0=1;
138 1 TR0=1;
139 1 }
140
141 /******定时器1初始化函数**********/
142 void Init_Timer1 (void)
143 {
144 1 t=0;
145 1 if(wind==1) m1=4;
146 1 else if(wind==2) m1=8;
147 1 else m1=2;
148 1 en1=0;
149 1 TMOD=0x11; //
150 1 TH1=(65536-1000)/256; //通过定时器定时延时大约1ms左右
151 1 TL1=(65536-1000)%256;
152 1 EA=1;
153 1 ET1=1;
154 1 TR1=1;
155 1
156 1 s1=1;
157 1 s2=0;//设置M1初值
158 1 }
159
160
161 /********定时器1中断服务程序***************/ //用于PWM
162 void timer1(void) interrupt 3
163 {
164 1 TR1=0; //停止定时器1
165 1 TH1=(65536-1000)/256; //通过定时器定时延时大约1ms左右
166 1 TL1=(65536-1000)%256;
167 1 if(t<m1) en1=1; /* 产生电机1的PWM信号 */
168 1 else en1=0;
169 1 t++;
170 1 if(t>=10) t=0; /* 1个PWM信号由10次中断产生 */
171 1 TR1=1; //启动定时器1
172 1 }
173
174 /******定时器2初始化函数**********/
175
176 void Init_Timer2 (void)
177 {
178 1 T2CON = 0x04; //设置寄存器,使定时器2工作在可编程时钟输出状态
179 1 T2MOD = 0x02;
C51 COMPILER V7.07 TEST 05/13/2009 17:33:17 PAGE 4
180 1
181 1 RCAP2H=(65536-3000)/256;//自动重载高8位,
182 1 RCAP2L=(65536-3000)%256;//低8位;
183 1 EA=1;
184 1 ET2=1;
185 1 TR2=1;//开定时器2
186 1 }
187
188
189
190 /********定时器2中断服务程序***************/ //用于正反转
191 //定时器工作于16位自动重装模式
192 void timer2(void) interrupt 5 //硬件的规定
193 {TR2=0;
194 1 TF2=0; //人为清零(必须)
195 1 rotate(); //M2正反转
196 1 f=~f; //取反
197 1 TR2=1; //启动定时器2
198 1 }
199
200
201
202
203 /********主函数************/
204 //效果就是用定时器服务程序的实现数码管动态..
205 //..显示且按键后对应的数码管数据加1
206 /*************************/
207 void main (void)
208 {
209 1 unsigned char keyboard; //存放按键值
210 1
211 1 unsigned char time; //定时计数
212 1 unsigned char timesum;//定时总数
213 1 unsigned char sway; //摇头指示
214 1
215 1 unsigned char count;//倒计数
216 1 wind=0;
217 1 time=0;
218 1 sway=0;
219 1
220 1
221 1 while(1)
222 1 {
223 2 keyboard=getkey();
224 2 if (keyboard==1) //按键设定风速
225 2 {
226 3 wind++;
227 3 if(wind>3) //默认按键3次以上设为3
228 3 wind=3;
229 3 }
230 2 else if(keyboard==2) //按键2设定定时时间
231 2 { time++;
232 3 if(time>6) //默认定时6次以上设为6
233 3 time=6;
234 3 }
235 2
236 2 else if(keyboard==3) //按键3控制摇头
237 2 {
238 3 sway=1;//摇头指示成立
239 3 }
240 2 else if(keyboard==4) //确认键
241 2 {
C51 COMPILER V7.07 TEST 05/13/2009 17:33:17 PAGE 5
242 3 d[0]=wind;
243 3 if(time==0) //对于定时的初始处理
244 3 {
245 4 d[1]=0;
246 4 d[2]=0;
247 4 d[3]=8;
248 4 }
249 3 else
250 3 {
251 4 d[1]=time; //显示定时次数
252 4 d[2]=time; //显示定时的总时间
253 4 timesum=10*time;
254 4 }
255 3 Init_Timer0(); //定时器初始化
256 3 Init_Timer1(); //定时器1初始化 开始PWM
257 3
258 3 if(sway==1)
259 3 {
260 4 Init_Timer2();//定时器2初始化 控制正反转
261 4 }
262 3
263 3 for(count=timesum;count>=0;count--)
264 3 {
265 4 d[2]=count/10; //倒计时十位
266 4 d[3]=count%10; //倒计时个位
267 4 delay1(1000); //每延时1s更改倒计时数
268 4 }
269 3
270 3 if((time!=0)&&(count==0))//有定时功能 且定时结束时
271 3 {
272 4 stop();//电机M1 M2停转 TR2=0 定时器2也停止?
273 4 }
274 3
275 3 }
276 2
277 2 }
278 1
279 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 515 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 3
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 + -