做智能家居时,下位机用的时PIC24FJ64GA004,所以写了下面那个程序。
由于对PIC24的不熟悉,忘了加配置们,导致波特率一直不对,后面加上配置位就行了。
接收的数据按一定格式,用来控制继电器。
发送的数据暂时没用到。启用发送只要使能中断就行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#
include
"p24FJ64GA004.h"
#define RELAY1 LATBbits.LATB14
#define RELAY2 LATBbits.LATB13
_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & FWPSA_PR32 & WDTPS_PS2048 & ICS_PGx3)
_CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRI)
void
UART2Init(
void
);
void
Delay(unsigned
int
t);
unsigned char Rev[
6
];
unsigned char Send[
10
]={
0x69
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
};
unsigned char i=
0
;
unsigned char Index=
0
;
int
main(
void
)
{
TRISBbits.TRISB13 =
0
;
TRISBbits.TRISB14 =
0
;
TRISBbits.TRISB5 =
1
;
UART2Init();
while
(
1
)
{
if
(Rev[
0
]==
0x68
&& Rev[
2
]==
0x69
)
{
if
(Rev[
3
]==
0x01
)
{
if
(Rev[
4
] ==
1
)
RELAY1 =
1
;
if
(Rev[
4
] ==
0
)
RELAY1 =
0
;
}
if
(Rev[
3
]==
0x02
)
{
if
(Rev[
4
] ==
1
)
RELAY2 =
1
;
if
(Rev[
4
] ==
0
)
RELAY2 =
0
;
}
}
}
return
0
;
}
void
UART2Init(
void
)
{
TRISCbits.TRISC5 =
1
;
TRISCbits.TRISC4 =
0
;
RPINR19bits.U2RXR =
21
;
RPOR10bits.RP20R =
5
;
U2MODEbits.BRGH =
1
;
U2BRG =
143
;
U2STAbits.UTXISEL0 =
0
;
U2STAbits.UTXISEL1 =
0
;
U2MODEbits.UARTEN =
1
;
SRbits.IPL =
3
;
IPC7bits.U2TXIP =
4
;
IEC1bits.U2TXIE =
1
;
IFS1bits.U2TXIF =
0
;
IPC7bits.U2RXIP=
5
;
IEC1bits.U2RXIE=
1
;
IFS1bits.U2RXIF=
0
;
}
void
__attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(
void
)
{
unsigned char temp;
IFS1bits.U2RXIF=
0
;
temp=U2RXREG;
if
(temp ==
0x68
)
Index =
0
;
if
(Index>=sizeof(Rev)) Index=
0
;
Rev[Index]=temp;
Index++;
}
void
__attribute__((interrupt, no_auto_psv)) _U2TXInterrupt(
void
)
{
IFS1bits.U2TXIF =
0
;
U2TXREG = Send[i] ;
while
(U2STAbits.TRMT ==
0
);
Nop();Nop();Nop();Nop();
i++;
if
(i==
10
)
{
i=
0
;
}
}
void
Delay(unsigned
int
t)
{
unsigned
int
i,j;
for
(i=t;i>
4
;i--)
for
(j=
1
;j<
10000
;j++);
}