📄 text1.lst
字号:
C51 COMPILER V8.02 TEXT1 10/15/2007 21:53:38 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
*** WARNING C500 IN LINE 1 OF TEXT1.C: LICENSE ERROR (R208: RENEW LICENSE ID CODE (LIC))
1 #include <AT89X51.h>//51芯片管脚定义头文件
2 #include <intrins.h>//内部包含延时函数 _nop_() ;
3 #include <LCD1602.H>
4 #define uchar unsigned char
5 #define uint unsigned int
6 #define keys P1 //按键控制端口
7 #define stepper P2 //stepper motor control output
8 #define TMax 20000
9 #define TMin 100
10 uchar nstr[5]; //字符串形式的转速值
11 uchar code cdis1[ ] = {" welcome "};
12 uchar code cdis2[ ] = {" On P "};
13 uchar code cdis3[ ] = {" On N"};
14 uchar code cdis4[ ] = {" off "};
15
16 uchar ctlw[8]={0x0c,0x06,0x03,0x09,0x0c,0x06,0x03,0x09}; //双三拍控制字
17 uchar m;
18 bit qt=0; //启停
19 bit fx=0; //方向
20 bit max=0; //最大转速限制 =1时,到达最大值允许值
21 bit min=0; //最小转速限制
22 unsigned int T=10000; //时钟控制;
23
24 // init()初始化
25 void init()
26 {
27 1
28 1 TMOD = 0x01; // 设置定时器0工作模式
29 1 EA = 1;
30 1 ET0 = 1;
31 1 TH0 = -T/256;
32 1 TL0 = -T%256;
33 1 lcd_init();
34 1 lcd_pos(0) ;
35 1 m = 0 ;
36 1 while(cdis1[m] != '\0')
37 1 {
38 2 lcd_wdat(cdis1[m]) ; //显示字符
39 2 m++ ;
40 2 }
41 1 }
42 //计算转速
43 int ncal()
44 {
45 1 uint fw,N,ZR;
46 1 fw=500000/T;
47 1 return 60*fw/N/ZR;
48 1 }
49
50 //整数转字符串,保存到 nstr 中
51 void itoa(uint Value)
52 {
53 1 uchar ch,*right,*left;
54 1 left = right = nstr;
C51 COMPILER V8.02 TEXT1 10/15/2007 21:53:38 PAGE 2
55 1
56 1 //把数字转换成字符串(倒置的)
57 1 while(Value)
58 1 {
59 2 *right = (Value%10)+0x30;
60 2 Value = Value/10;
61 2 right++;
62 2 }
63 1 *right-- = '\0';
64 1 //把倒置的字符串正放过来
65 1 while(right > left)
66 1 {
67 2 ch = *left;
68 2 *left++ = *right;
69 2 *right-- = ch;
70 2 }
71 1 }
72
73 //显示转速
74 void ndisp()
75 {
76 1 uint i=ncal();
77 1 itoa(i);
78 1 lcd_pos(0) ;
79 1 m = 0 ;
80 1 while(nstr[m] != '\0')
81 1 {
82 2 lcd_wdat(nstr[m]) ; //显示字符
83 2 m++ ;
84 2 }
85 1 }
86
87 //显示函数
88 void display()
89 {
90 1 if(qt)
91 1 {
92 2 if(fx)
93 2 {lcd_wcmd(0x01) ;
94 3 lcd_pos(0) ;
95 3 m = 0 ;
96 3 while(cdis2[m] != '\0')
97 3 {
98 4 lcd_wdat(cdis2[m]) ; //显示字符
99 4 m++ ;
100 4 }
101 3 }
102 2
103 2 else
104 2 {lcd_wcmd(0x01);
105 3 lcd_pos(0) ;
106 3 m = 0 ;
107 3 while(cdis3[m] != '\0')
108 3 {
109 4 lcd_wdat(cdis3[m]) ; //显示字符
110 4 m++ ;
111 4 }
112 3 }
113 2 ndisp();
114 2 }
115 1 else
116 1 {lcd_wcmd(0x01);
C51 COMPILER V8.02 TEXT1 10/15/2007 21:53:38 PAGE 3
117 2 lcd_pos(0) ;
118 2 m = 0 ;
119 2 while(cdis4[m] != '\0')
120 2 {
121 3 lcd_wdat(cdis4[m]) ; //显示字符
122 3 m++ ;
123 3 }
124 2 }
125 1 }
126 //加速
127 void accelerate()
128 {
129 1 if(T>=TMin+500){T-=200;min=0;}
130 1 else max=1;
131 1 }
132
133 //减速
134 void decelerate()
135 {
136 1 if(T<=TMax+500){T+=200;max=0;}
137 1 else min=1;
138 1 }
139
140
141
142
143
144
145
146 /* 定时器0服务子程序 */
147 void time0() interrupt 1 using 1 // 用定时器0中断来产生CLK时钟
148 {
149 1 /* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
150 1 static uchar n=0;
151 1 TH0 = -T/256;
152 1 TL0 = -T%256;
153 1 if(fx)
154 1 {
155 2 stepper=ctlw[n%4];
156 2 if(n<3)n++;
157 2 else n=0;
158 2 }
159 1 else
160 1 {
161 2 stepper=ctlw[n%4];
162 2 if(n>0)n--;
163 2 else n=3;
164 2 }
165 1
166 1 }
167
168 /* 键消抖延时函数 */
169 void delay(void)
170 {
171 1 uchar i;
172 1 for (i=300;i>0;i--);
173 1 }
174
175 /* 键扫描函数 */
176 void keyscan(void)
177 {
178 1 uchar tmpkey;
C51 COMPILER V8.02 TEXT1 10/15/2007 21:53:38 PAGE 4
179 1 keys = 0x0f; // 发全0行扫描码
180 1 if ((keys&0x0f)!=0x0f) // 若有键按下
181 1 {
182 2 delay(); // 延时去抖动
183 2 if ((keys&0x0f)!=0x0f) // 延时后再判断一次,去除抖动影响
184 2 {tmpkey=keys&0x0f;
185 3 while((keys&0x0f)!=0x0f); //直至键松开
186 3 switch(tmpkey)
187 3 {case 0x0e:
188 4 qt=~qt;
189 4 break;
190 4 case 0x0d:
191 4 if(qt==1)fx=~fx;
192 4 break;
193 4 case 0x0b:
194 4 if(qt==1&&!max)accelerate();
195 4 break;
196 4 case 0x07:
197 4 if(qt==1&&!min)decelerate();
198 4 break;
199 4 default: break;
200 4 }
201 3 display();
202 3 }
203 2 } // 无键按下,返回值为0
204 1 }
205
206 /* 主程序 */
207 void main()
208 {
209 1 init();
210 1 while(1)
211 1 {
212 2 keyscan(); // 调用键盘扫描函数
213 2 if(qt) TR0=1;
214 2 else TR0=0;
215 2 }
216 1 }
217
218
219
220
221
222
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 981 ----
CONSTANT SIZE = 31 ----
XDATA SIZE = 17 12
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 4 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -