|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机是stc89c52,晶振是11.0592M,用的是蓝牙hc05,硬件连好后发送命令,问题在于发送前两次命令正常,但第三次收到消息不对,并且之后发命令像死机一样无反应怎么解决,已测任何命令发送都成功过,大部分都在第三次时候出现,顺便问下hc05模块en脚和state脚要接么,我没接悬空了。代码如下:: ?3 l) y2 W! i! S& }6 W) h
#include<reg52.h>9 @1 k; y- U; H2 p6 w: w' {* y
#include "intrins.h"3 U, c) v( @9 b0 l* d, [
#include "stdio.h"- o: o$ b2 \- |/ b9 ]0 k3 `
#define uchar unsigned char' a! _% A4 Z0 S# I. t/ s
#define uint unsigned int
3 s, x2 D2 j9 J& M; C! Z7 X
9 D2 {: l( U( B/ s% y2 L' i" \8 Suchar date;
3 `/ _! O8 R% p( K! A/ W3 @uint cmd;
a: j7 j* P% i9 w: Ksbit a=P2^0;
% c/ y8 r _, k( @; y/ Msbit b=P2^1;( q v4 n! i% Q, e! w/ j8 g7 B5 [
sbit c=P2^2;2 y" W3 s: p" ]3 M- x. ~
sbit d=P2^3;
) P2 x. r1 |- Fuchar code at[]="get a";4 D8 @8 q, S& f
uchar code bt[]="get b";. k+ J& \1 _ D4 q4 n3 @
uchar code ct[]="get c";( m8 C0 {, m3 r4 T* B- W- f
uchar code dt[]="get d";7 @* H( y/ M. \
v2 ^9 l4 d h. @% U* m0 a3 M; I//------------------------------BLE---------------------------------------
4 C8 }2 l' b4 Cvoid UartConfiguration() //串口初始化3 R$ s1 ~3 ]6 S/ t/ }- _. f; k
{
) H5 ? F: i4 y1 ~4 g/ ^: u- p TMOD=0x20; //定时器工作在模式2,8位自动重装模式
6 d. r {2 x# x TH1=0xfd; # D, C6 X. \! N! p; W
TL1=0xfd;
# P: ^+ {- M- {0 x6 O K6 v! ? PCON=0x00; //串口波特率,SMOD=0
- g. [1 C" R/ } SCON=0x50; //串口工作在模式1 10uart
3 }9 c/ U' V, C X7 ?$ B EA=1; //总开关开
& l9 c( Y2 R! {+ Q ES=1;
- p& o& o: ?" m* S: R, Y1 f; H TR1=1; //计数器开5 }9 `0 G; |, y6 _1 p/ f$ ` W1 B
' `1 G% U+ s7 T( \ n, z% J3 Y, ?1 B
}/ J* g! y: E/ R J0 L
5 c' X! L. e( e! V0 ? Avoid sendDate(uchar buf) //发送字符
0 g/ [* y9 L; ~{7 E2 q4 ]% N8 s& X8 {6 k
SBUF=buf;( V# Y, i: y0 J3 C
while(!TI);
/ S+ f5 l' Q9 g. @) p& m TI=0;+ c" S! v% e6 j \
}, n; H x- v+ q/ d6 H
void SendString(uchar *p) //发送字符串3 W7 e: ]1 y% {
{ $ K3 {) K$ M* L
while(*p)0 R- Q8 j/ q0 s f c' ?, w, ]
{) y/ y+ Z( V+ o, `4 h
sendDate(*p);
% N2 N; g. n2 g: x& A; M0 X p++; J1 Z3 k: c+ ]
}/ ^) n8 r5 t5 @0 M+ l8 z
}7 n$ r+ d. r( _2 D( k5 d, \
void Iscmd()
3 p) t( S$ j2 T- T{
2 K5 L- Q) S8 n$ ?0 D if(date=='a'||date=='b'||date=='c'||date=='d')cmd=1; //判断是否为命令
8 p" m3 h0 S1 q7 \8 C) A0 \}( n$ g0 v; W4 n5 v' v5 R
- h3 t# c/ X# c. H% ~5 d5 X. P+ Svoid Uart() interrupt 4 //串口判断是否有收到或发送完毕$ f, m& z( Y& W. `# ]
{6 e0 Y' L; P( M0 k0 R9 X3 [) l! R, R
if(RI==1){date=SBUF;RI=0;Iscmd();} //获取收到数据,RI置0,判断是否是命令
w Y' D; j/ u0 u; r& Z' _) k if(TI==1){TI=0;} //发送完毕置0! {. [/ x% u8 g& ]" F
}
5 A2 o% M# p- H2 Q3 S//----------------------------------------------------------------
# f! {4 W& I8 S4 ]) B- @
) ^0 t3 f* n9 k) D5 e3 z, D0 r0 a$ @; Q3 m) i3 ?
void main()
6 b0 F7 v" E; Q+ r6 {! b{ d3 o" R* T: X( h: r7 _2 P* }" V
UartConfiguration(); //蓝牙初始化% `% T% b. i0 t3 T2 J, A! S
while(1)
3 V5 \& Q; W4 D" z) b/ I7 B {
- @1 H8 I8 z3 C$ v8 I/ w if(cmd) //命令判断' J+ ] q2 v7 s; I9 {3 H1 L
{4 e3 A9 I A, H0 c8 V @5 r9 O
switch(date){ //根据命令选择
J$ w% \3 X4 G case 'a':SendString(at);a=0;break;. W6 u& P8 s U
case 'b':SendString(bt);b=0;break;9 r3 ^* Q! q- ^6 w
case 'c':SendString(ct);c=0;break;
9 H; L- m1 R3 c- G4 `: C case 'd':SendString(dt);d=0;break;
! S# \$ Q5 w. ^+ f default:break;
3 r( _4 F( i r5 u* O6 b3 r; S } G& w/ ?7 Z1 V# ~, k. P+ H
cmd=0; //命令标志置0) k( G6 W6 A6 g; o; y8 {: ]
}1 g) {& q; w6 w3 m" v
}
. c4 u: H/ Y& L5 ~}
5 O+ D* C; S: t- z$ ?9 F, e, b2 g0 m8 k. C! U
|
|