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