📄 systhree_master.lst
字号:
C51 COMPILER V8.05a SYSTHREE_MASTER 06/28/2007 21:08:47 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE SYSTHREE_MASTER
OBJECT MODULE PLACED IN Systhree_master.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE Systhree_master.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************/
2 /** **/
3 /** 作者:jia **/
4 /** 时间:2007/6/6 **/
5 /** National University of Defence Technology **/
6 /** 0731-4573493 **/
7 /*********************************************************/
8
9 #include <absacc.h>
10 #include <reg52.h>
11 #include<intrins.h>
12
13 #define uchar unsigned char
14 #define uint8 unsigned char
15 #define uint16 unsigned int
16
17 #define LED8 XBYTE [0xA000] //数码管地址
18 #define LED7 XBYTE [0xA001]
19 #define LED6 XBYTE [0xA002]
20 #define LED5 XBYTE [0xA003]
21 #define LED4 XBYTE [0xA004]
22 #define LED3 XBYTE [0xA005]
23 #define LED2 XBYTE [0xA006]
24 #define LED1 XBYTE [0xA007]
25
26
27
28 #define KEY XBYTE [0xA100] //键盘地址
29
30 /*扫描键盘使用的变量 */
31 sbit first_row = P1^4; //键盘第一行控制
32 sbit second_row = P1^3; //键盘第二行控制
33 bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位
34 bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
35 bit keyon = 0; //防止按键冲突标志位
36 bit change_led = 0;
37 bit lessAlarm = 0;
38 uchar keynum = 0; //获得的有效按键值寄存器
39
40
41 sbit P1_2 = P1^2;
42 sbit P1_6 = P1^6;
43 sbit P1_7 = P1^7;
44 sbit P1_5 = P1^5;
45 uchar sbuf_t = 0x0C1;
46
47
48
49
50 // 系数
51 #define COEF 167 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
52 #define HEIGHT0 100 // 初始高度1m,系数1.67
53 #define V_INITIAL0 78 // 初始液滴速度 78 t/min
54 #define MotorV 32 // 电机速度,50cm/min
55 #define CIRCLE 20
C51 COMPILER V8.05a SYSTHREE_MASTER 06/28/2007 21:08:47 PAGE 2
56
57
58 uchar Vnow[16] = {0};
59 uchar Vset[16] = {0};
60 uint16 bdata alarm =0;
61 uchar que[16] = {0};
62 uchar state = 0 ;
63 uchar NOset = 0;
64 //bit lessAlarm = 0;
65
66 uint16 temV = 0;
67 uchar i = 0;
68 uchar qu_i =0;
69
70
71
72 /*数码管显示使用的变量和常量*/
73 uchar lednum = 0; //数码管显示位控制寄存器
74 uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器
75 uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0
-x8c,0xff}; //七段码段码表
76 // "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "
-P" ,"black"
77
78
79
80
81 void leddisp(void); //数码管显示函数
82 void readkey(void); //读键盘函数
83 void setvalue (unsigned char keynum);
84 void sendBuf(uchar i);
85 void delay(uint8 time_nop);
86 void setAlarm(uchar b,uchar a);
87
88
89 void intTL0() interrupt 1 //TL0 定时中断处理函数
90 {
91 1 static uchar TL0_i = 0; // 定义静态变量,用来计数TL0定时器的溢出次数(进入本函数的次数)
92 1 TL0 = -2720%256;//定时器中断时间间隔 4ms
93 1 if(TL0_i++ == 11)
94 1 {
95 2 TL0_i = 0;
96 2 leddisp(); //每次定时中断显示更新一次
97 2
98 2 if(control_readkey == 1) //每两次定时中断扫描一次键盘
99 2 {
100 3 readkey();
101 3 }
102 2 control_readkey = !control_readkey;
103 2 }
104 1 }
105
106 //*************************************外部中断0**********************************************************
-***
107 //******************************************************************************************
108 void ps_serve (void )interrupt 4
109 {
110 1 static uchar wait = 0;
111 1 uchar a = 0;
112 1 uchar b=0;
113 1 if(RI == 1)
114 1 {
C51 COMPILER V8.05a SYSTHREE_MASTER 06/28/2007 21:08:47 PAGE 3
115 2 P1_6 = 0;
116 2 P1_7 = 0;
117 2 a = SBUF;
118 2 P1_7 = 1;
119 2
120 2 b = a & 0x0F;
121 2 if(a>=192)
122 2 {
123 3
124 3 setAlarm(b,a);
125 3 wait = 128 + b;
126 3 P1_7 = 1;
127 3 SBUF = Vset[b];
128 3 P1_6 = 0;
129 3 P1_7 = 0;
130 3
131 3 }
132 2 else if(wait >= 128)
133 2 {
134 3
135 3 Vnow[wait - 128] = a;
136 3 Vset[b] = 255;
137 3 change_led = 1;
138 3 wait = 0;
139 3 }
140 2 RI =0;
141 2
142 2 }
143 1 else TI =0;
144 1
145 1 }
146 //************************************************************************************************
147
148
149 //********************************************************************************************************
-*********************
150
151 // 由于T0采用工作方式3,所以T1只能用作串口波特率发生器
152 // 注意:从站Fsoc=12MHz,主站Fsoc=24MHz,只需将波特率设置相同即可
153 // 此时,TH0占用TF1,所以此中断处理程序是处理T0的TH0的,定时器T0占用TF1,相当于T1中断
154 // 最大定时周期为256us
155 void time2_serve (void)interrupt 5
156 {
157 1
158 1 static uchar T2_i = 0; // 定义静态变量,用来计数TL0定时器的溢出次数(进入本函数的次数)
159 1
160 1 TF2 = 0;
161 1 if( T2_i++ == 48 )
162 1 { change_led =1 ;
163 2 T2_i = 0 ;
164 2 if(i <= qu_i-1 && qu_i != 0)
165 2 { sendBuf(i); i++;}
166 2
167 2 if(i == qu_i)
168 2 i = 0;
169 2 }
170 1 }
171 //********************************************************************************************************
-*********************
172 //********************************************************************************************************
-*********************
173 // end of time1
C51 COMPILER V8.05a SYSTHREE_MASTER 06/28/2007 21:08:47 PAGE 4
174
175 void main(void)
176 {
177 1
178 1 TL0 = -2720%256; //定时器中断时间间隔 4ms
179 1 TMOD = 0X23;
180 1
181 1 RCAP2H=0x0B;
182 1 RCAP2L=0xDC;
183 1
184 1 SCON=0x50;//串口方式1,允许接受
185 1 TH1=244;
186 1 TL1=244;
187 1
188 1 ES = 1;
189 1 ET0 = 1;
190 1 ET1 = 0;
191 1 ET2= 1;
192 1 EA = 1;
193 1 TR0 =1;
194 1 TR1 =1;//启动定时器
195 1 TR2 = 1;
196 1 while(1)
197 1 {
198 2 if(getkey == 1 ||change_led == 1) //判断是否获得有效按键
199 2 {
200 3 getkey = 0;
201 3 if(state == 0 && qu_i > 0)
202 3 {
203 4 led[0]=que[i];
204 4 led[1]=Vset[que[i]]/100;
205 4 led[2]=(Vset[que[i]]%100)/10;
206 4 led[3]=Vset[que[i]]%10;//
207 4 }
208 3 else
209 3 {
210 4 led[0]=NOset;
211 4 led[1]=Vset[NOset]/100;
212 4 led[2]=(Vset[NOset]%100)/10;
213 4 led[3]=Vset[NOset]%10;
214 4 }
215 3 if(qu_i > 0)
216 3 {
217 4 if(alarm^que[i] == 1)
218 4 {
219 5 led[5]=16;
220 5 led[6]=16;
221 5 led[7]=16;//
222 5
223 5 }
224 4 else
225 4 {
226 5 led[4]=que[i];
227 5 led[5]=Vnow[que[i]]/100;
228 5 led[6]=(Vnow[que[i]]%100)/10;
229 5 led[7]=Vnow[que[i]]%10;//
230 5 }
231 4 }
232 3 }
233 2 }
234 1 }
235
C51 COMPILER V8.05a SYSTHREE_MASTER 06/28/2007 21:08:47 PAGE 5
236 /***************************************************
237 键盘扫描函数
238 原型: void readkey(void);
239 功能: 当获得有效按键时,令getkey=1,keynum为按键值
240
241 ****************************************************/
242 void readkey(void)
243 {
244 1 uchar M_key = 0;
245 1
246 1 first_row = 0;
247 1 second_row = 0;
248 1 M_key = KEY;
249 1 if(M_key != 0xff) //如果有连续两次按键按下,认为有有效按键按下。消除按键抖动
250 1 {
251 2 if(first_getkey == 0)
252 2 {
253 3 first_getkey = 1;
254 3 }
255 2 else //当有有效按键按下时,进一步识别是哪一个按键
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -