QuakeGod
2024-04-12 5dd1b7fdcc52a43867f924e8d220de8467af372a
提交 | 用户 | age
5dd1b7 1 #include "STC15F2K60S2.H"
Q 2 #include "intrins.h"
3 #include "SLP.h"
4 #include "modbus.h"
5
6 //#include "main.h"
7 //#include "STC15Wxx.h"
8 //#include "delay.h"
9 //#include "uart.h"
10 //#include "tim.h"
11 //#include "gpio.h"
12 //#include "pwm.h"
13 //#include "modbus.h"
14 //#include "unibus.h"
15
16
17 #define S3RI  0x01              //S3CON.0
18 #define S3TI  0x02              //S3CON.1
19 #define S3RB8 0x04              //S3CON.2
20 #define S3TB8 0x08              //S3CON.3
21
22
23 //#define uchar unsigned char
24 //#define uint unsigned int
25
26
27 //typedef unsigned char uchar;
28 typedef unsigned int uint;
29
30 sbit IN0=P0^0;
31 sbit IN1=P0^1;
32 sbit IN2=P0^2;
33 sbit IN3=P0^3;
34 sbit IN4=P0^4;
35 sbit IN5=P0^5;
36 sbit IN6=P0^6;
37 sbit IN7=P0^7;
38
39 sbit TXD3_2=P5^1;
40 sbit RXD3_2=P5^0;
41
42 sbit OUT0=P2^0;
43 sbit OUT1=P2^1;
44 sbit OUT2=P2^2;
45 sbit OUT3=P2^3;
46 sbit OUT4=P2^4;
47 sbit OUT5=P2^5;
48 sbit OUT6=P2^6;
49 sbit OUT7=P2^7;
50
51 sbit ERR=P4^5;
52 sbit RUN=P4^6;
53
54 sbit KEY1=P3^6;
55 sbit KEY2=P3^7;
56 sbit KEY3=P4^1;
57 sbit KEY4=P4^2;
58 sbit KEY5=P4^3;
59 sbit KEY6=P4^4;
60
61 bit uart1busy;
62 bit uart3busy;
63
64
65 //#pragma anon_unions
66 char uart1recvbuf[8];
67 uchar uart1recvlen=0;
68 uchar uart1recvtimeout =0;
69
70
71 char uart3recvbuf[8];
72 uchar uart3recvlen=0;
73 uchar uart3recvtimeout =0;
74
75 int nCount=0;
76
77
78
79 void PutOutput(uchar a);
80
81 typedef union tagcoils
82 {
83     uchar Byte;
84     struct stByte{
85         uchar b0:1;
86         uchar b1:1;
87         uchar b2:1;
88         uchar b3:1;
89         uchar b4:1;
90         uchar b5:1;
91         uchar b6:1;
92         uchar b7:1;
93       }bits;
94 }Coils;
95     
96 Coils inputdata;    
97 void Delay1ms()        //@22.1184MHz
98 {
99     uchar data i, j;
100
101     _nop_();
102     _nop_();
103     i = 22;
104     j = 128;
105     do
106     {
107         while (--j);
108     } while (--i);
109 }
110
111
112 void Delay_ms(uint n)
113 {
114     while(n--)
115     {
116         Delay1ms();
117     }
118     
119 }    
120
121 void Delay_us(uint n)
122 {
123     uchar data j;
124     while(n--){
125     j=5;
126         while (--j);
127 }
128 }
129
130 void Timer0_Isr(void) interrupt 1
131 {}
132 /*
133 void Timer0_Init(void)        //125微秒@22.1184MHz
134 {
135     AUXR |= 0x80;            //定时器时钟1T模式
136     TMOD &= 0xF0;            //设置定时器模式
137     TL0 = 0x33;                //设置定时初始值
138     TH0 = 0xF5;                //设置定时初始值
139     TF0 = 0;                   //清除TF0标志
140     TR0 = 1;                  //定时器0开始计时
141     ET0 = 1;                  //使能定时器0中断
142 }
143
144 */
145 void Timer1_Isr(void) interrupt 3
146 {}
147 /*
148 void Timer1_Init(void)        //1毫秒@22.1184MHz
149 {
150     AUXR |= 0x40;            //定时器时钟1T模式
151     TMOD &= 0x0F;            //设置定时器模式
152     TL1 = 0x9A;                //设置定时初始值
153     TH1 = 0xA9;                //设置定时初始值
154     TF1 = 0;                  //清除TF1标志
155     TR1 = 1;                  //定时器1开始计时
156     ET1 = 1;                  //使能定时器1中断
157 }
158 */
159 //void UartInit(void)        //115200bps@22.1184MHz
160 //{
161 //    SCON = 0x50;        //8位数据,可变波特率
162 //    AUXR |= 0x40;        //定时器时钟1T模式
163 //    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
164 //    TMOD &= 0x0F;        //设置定时器模式
165 //    TL1 = 0xD0;            //设置定时初始值
166 //    TH1 = 0xFF;            //设置定时初始值
167 //    ET1 = 0;            //禁止定时器中断
168 //    TR1 = 1;            //定时器1开始计时
169 //}
170
171
172 //void UART1_Isr()     interrupt 4
173 //{}
174
175
176 //void Uart3Init(void)        //115200bps@22.1184MHz
177 //{
178 //    S3CON = 0x10;        //8位数据,可变波特率
179 //    S3CON |= 0x40;        //串口3选择定时器3为波特率发生器
180 //    T4T3M |= 0x02;        //定时器时钟1T模式
181 //    T3L = 0xD0;            //设置定时初始值
182 //    T3H = 0xFF;            //设置定时初始值
183 //    T4T3M |= 0x08;        //定时器3开始计时
184 //}
185
186
187 void Uart3Init(void)        //57600bps@22.1184MHz
188 {
189     S3CON = 0x10;              //8位数据,可变波特率
190     S3CON |= 0x40;            //串口3选择定时器3为波特率发生器
191     T4T3M |= 0x02;            //定时器时钟1T模式
192     T3L = 0xA0;                  //设置定时初始值
193     T3H = 0xFF;                  //设置定时初始值
194     T4T3M |= 0x08;            //定时器3开始计时
195     P_SW2 |= 0x02;    
196     IE2 |= 0x08;
197     
198 }
199
200
201 void UART3_Isr()     interrupt 17
202 {
203     if (S3CON & S3RI)
204     {
205         S3CON &= ~S3RI;         //清除S3RI位
206     
207             uart3recvbuf[uart3recvlen] = S3BUF;
208             if (uart3recvlen < sizeof(uart3recvbuf)-1 ) {uart3recvlen++;}
209             uart3recvtimeout=0;
210 //            PutOutput(S3BUF);
211       //  P0 = S3BUF;             //P0显示串口数据
212       //  P2 = (S3CON & S3RB8);   //P2.2显示校验位
213     }
214     if (S3CON & S3TI)
215     {
216         S3CON &= ~S3TI;         //清除S3TI位
217         uart3busy = 0;          //清忙标志
218     }
219 }
220
221
222 void IO_Init(void)
223 {
224         P0M0 = 0x00; P0M1 = 0x00; 
225     P1M0 = 0x00; P1M1 = 0x00; 
226     P2M0 = 0xff; P2M1 = 0x00; 
227     P3M0 = 0x00; P3M1 = 0x00; 
228     P4M0 = 0x00; P4M1 = 0x00; 
229     P5M0 = 0x00; P5M1 = 0x00; 
230     P6M0 = 0x00; P6M1 = 0x00; 
231     P7M0 = 0x00; P7M1 = 0x00; 
232       
233     
234 }
235
236 //void senddata(uint n)
237 //{
238 //    uchar i ,j;
239 //    if(i=0,i<n;i++)
240 //    {
241 //        if(j=0;j<i;j++)
242 //        {
243 //            S3BUF = rece[0];
244 //            
245 //        }
246 //    }
247 //}
248
249 uchar GetInput()
250 {
251     
252     return ~P0;
253 /*    
254     Coils input;
255     Coils input1;
256     input.bits.b0=~IN0;
257     input.bits.b1=~IN1;
258     input.bits.b2=~IN2;
259     input.bits.b3=~IN3;
260     input.bits.b4=~IN4;
261     input.bits.b5=~IN5;
262     input.bits.b6=~IN6;
263     input.bits.b7=~IN7;
264     
265     intput.Byte = P0;
266     
267     return input.Byte;
268 */    
269 }
270
271 void PutOutput(uchar out)
272 {
273     P2 = out;
274     return ;
275 /*    
276     Coils output;
277     output.Byte=out;
278     
279     
280     OUT0 = output.bits.b0;
281     OUT1 = output.bits.b1;
282     OUT2 = output.bits.b2;
283     OUT3 = output.bits.b3;
284     OUT4 = output.bits.b4;
285     OUT5 = output.bits.b5;
286     OUT6 = output.bits.b6;    
287     OUT7 = output.bits.b7;
288 */    
289 }
290
291 void Uart3SendPacket(char * str, uchar len)
292 {
293     uchar i;
294     for (i=0;i<len;i++)
295     {
296         while (uart3busy); 
297         S3BUF = str[i];
298         uart3busy=1;
299     }
300 }
301 void SLPSendPacket(char * str, uchar len)
302 {
303     Uart3SendPacket(str,len);
304 }
305
306 void Uart3RecvPacket()
307 {
308         if (uart3recvtimeout <2){
309         uart3recvtimeout++;
310     }else
311     { /// recieved packet;
312             RUN=~RUN;        //闪灯                
313             SLPparsePacket(uart3recvbuf,uart3recvlen);
314             uart3recvlen =0;
315     }
316 }
317
318 void Uart1RecvPacket()
319 {
320         if (uart1recvtimeout <2){
321         uart1recvtimeout++;
322     }else
323     { /// recieved packet;
324             RUN=~RUN;        //闪灯                
325             ModbusparsePacket(uart1recvbuf,uart1recvlen);
326             uart1recvlen =0;
327     }
328 }
329
330 void OtherProcess()
331 {
332 /*    
333         if(inputdata.bits.b4==1)
334     {
335         OUT0 = ~ OUT0;
336         OUT1 = ~ OUT1;
337         OUT2 = ~ OUT2;
338         OUT3 = ~ OUT3;
339         OUT4 = ~ OUT4;
340         OUT5 = ~ OUT5;
341         OUT6 = ~ OUT6;
342         OUT7 = ~ OUT7;
343         //Delay_ms(500);
344     }
345 */    
346 }
347
348 uchar GetJumper()
349 {
350     Coils keys;
351     keys.bits.b0=~KEY1;
352     keys.bits.b1=~KEY2;
353     keys.bits.b2=~KEY3;
354     keys.bits.b3=~KEY4;
355     keys.bits.b4=~KEY5;
356     keys.bits.b5=~KEY6;
357     keys.bits.b6=0;
358     keys.bits.b7=0;
359     
360     return keys.Byte;
361 }
362 int main(void)
363 {
364     unsigned char daa;
365     daa = DPH;
366     
367     // Init
368     IO_Init();
369 //    Timer0_Isr();
370     Uart3Init();
371 //    Timer0_Init();
372 //    Timer1_Init();
373
374         ES = 1;
375         EA = 1;
376
377     // Get config jumpper
378     
379     inputdata.Byte = GetJumper();        
380     bSLPMaster = inputdata.bits.b5 ; //master?
381     nStation = inputdata.Byte & 0x0f;
382 //    bSLPMaster=1;
383     
384     while(1)
385     {
386         // toggle LED
387 //        RUN =~ RUN;
388 //        Delay_ms(1000);
389         
390         // Get Input Port;
391         inputdata.Byte = GetInput();        
392         SLPinputB = inputdata.Byte; 
393                 RUN =~ RUN;
394 //        Delay_ms(1);
395         // receive packet 
396         Uart3RecvPacket();
397         // Process Packet
398         SLPProcess();
399         
400         if (SLPErrSign) {
401             ERR = 0;
402         }else {
403             ERR =1;
404             
405         }
406         
407         // Set Ouput Port
408         PutOutput(SLPoutputB);
409
410         
411         // receive packet 
412         Uart1RecvPacket();
413         // Process Packet
414         ModbusProcess();        
415         
416         
417         // Other process
418         OtherProcess();
419         
420         
421         Delay_us(100);
422
423         nCount++;        
424     }
425         
426     //return ;
427 }
428
429 /*  
430 中断系统,函数名与前面命名无关,只与interrupt后面接的序号有关
431 void INT0_Isr()     interrupt 0        // 外部中断0
432 void TM0_Isr()         interrupt 1        // 定时器0
433 void INT1_Isr()     interrupt 2        // 外部中断1
434 void TM1_Isr()         interrupt 3        // 定时器1
435 void UART1_Isr()     interrupt 4        // 串口1
436 void ADC_Isr()         interrupt 5        // 模数转换
437 void LVD_Isr()         interrupt 6        // 低压检测
438 void PCA_Isr()         interrupt 7        // 捕获
439 void UART2_Isr()     interrupt 8        // 串口2
440 void SPI_Isr()         interrupt 9        // 串行外设接口
441 void INT2_Isr()     interrupt 10    // 外部中断2
442 void INT3_Isr()     interrupt 11    // 外部中断3
443 void TM2_Isr()         interrupt 12    // 定时器2
444 void INT4_Isr()     interrupt 16    // 外部中断4
445 void UART3_Isr()     interrupt 17    // 串口3
446 void UART4_Isr()     interrupt 18    // 串口4
447 void TM3_Isr()         interrupt 19    // 定时器3
448 void TM4_Isr()         interrupt 20    // 定时器4
449 void CMP_Isr()         interrupt 21    // 比较器
450 void PWM0_Isr()     interrupt 22    // PWM0
451 void PWM0FD_Isr()     interrupt 23    // PWM0异常检测
452 void I2C_Isr()         interrupt 24    // I2C总线
453
454
455 void PWM1_Isr()     interrupt 28    // PWM1
456 void PWM2_Isr()     interrupt 29    // PWM2
457 void PWM3_Isr()     interrupt 30    // PWM3
458 void PWM4_Isr()     interrupt 31    // PWM4
459
460 // 32以上的中断号,即中断向量大于0100H的中断,keil编译会出错,需要特殊处理才可使用
461 void PWM5_Isr()     interrupt 32    // PWM5
462 void PWM2FD_Isr()     interrupt 33    // PWM2异常检测
463 void PWM4FD_Isr()     interrupt 34    // PWM4异常检测
464 void PTKSU_Isr()     interrupt 35    // 触摸按键中断
465 */