|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机是stc89c52,晶振是11.0592M,用的是蓝牙hc05,硬件连好后发送命令,问题在于发送前两次命令正常,但第三次收到消息不对,并且之后发命令像死机一样无反应怎么解决,已测任何命令发送都成功过,大部分都在第三次时候出现,顺便问下hc05模块en脚和state脚要接么,我没接悬空了。代码如下:+ _+ ~3 r0 e1 K+ W+ l
#include<reg52.h>& a5 w' p" R8 v' C. d% L
#include "intrins.h"
6 e& r( w* F0 n3 l$ P#include "stdio.h"
7 m" }% J. t; z#define uchar unsigned char
9 U2 m+ f! r0 A9 @' e ?/ o, N#define uint unsigned int5 n0 j- w: L2 M8 C+ M1 h
/ w0 i3 }' p# p6 c
uchar date; % i' @/ B2 a3 D' q
uint cmd;; j9 h/ ^' x' s9 P b
sbit a=P2^0;" \. h0 g0 Q% z$ L% J" u
sbit b=P2^1;( g6 d; h1 I8 T2 _4 ]; ]
sbit c=P2^2;
$ k6 C/ L( x. c. wsbit d=P2^3;; c7 T0 r1 G/ @) Y9 O! c r; {
uchar code at[]="get a";% E8 ?) R8 B ]$ _# p' @
uchar code bt[]="get b";! ^ C5 d1 b5 G, j# J3 M3 [3 a3 g
uchar code ct[]="get c";7 J4 K2 i4 M m; K6 T. o
uchar code dt[]="get d";5 w* d# b0 E3 D2 |+ K+ H
: O$ v, B! a8 U% y7 V, E& d
//------------------------------BLE---------------------------------------
/ u4 |8 L; u$ b4 vvoid UartConfiguration() //串口初始化* W( J) Q# I' h: V' u
{
P6 C7 c$ \0 Q! u2 s- L7 J9 m TMOD=0x20; //定时器工作在模式2,8位自动重装模式8 U% p: Q: M0 J- w
TH1=0xfd;
% M) q, g# S9 R7 A7 M TL1=0xfd;; p2 G S0 y/ W) K. V$ |3 N
PCON=0x00; //串口波特率,SMOD=08 `4 S, G1 v) S9 Z* o
SCON=0x50; //串口工作在模式1 10uart6 |3 n- L+ ?; ?& C2 `! f0 Q
EA=1; //总开关开
( ?% q* _$ j. i9 @% i) W) `+ b ES=1;
: k) d2 e& H" h1 Q& D* ^2 |6 ?$ c) E9 L TR1=1; //计数器开6 `* B$ A/ @% K
; v) c* ?, P. V/ I0 l}
1 f& @* q O+ f. P; N7 d+ x8 H/ B; d6 |. b9 l! t
void sendDate(uchar buf) //发送字符
8 a! i' G/ U* }5 b{
8 U$ P# T/ k- |2 O9 o6 a; s8 u SBUF=buf;+ [: ^7 v4 x" j& |4 x, K: \+ `
while(!TI);
; \) R; S- s. I( }7 K& X5 e TI=0;
/ s5 y& h6 y T5 g( {* s; q}% y9 {& r8 P. N# P0 m' a
void SendString(uchar *p) //发送字符串
. Y# e' l E4 v0 s{ - T0 V; m. h% T0 z+ S' G
while(*p)7 _- }/ g8 ~' u- w0 ^2 u; K
{8 W9 w- D6 }5 X7 W S: _& p4 ~
sendDate(*p);
; w+ b$ F( H/ o5 z$ O0 ] p++;& x7 J# Y: m9 p( H/ P' \* g$ ~
}
6 j! I9 c* p, t1 @: Z}7 s- \/ k x; L/ m
void Iscmd()& J+ Y( s8 @( F# R; l
{
9 `7 W, ^& I) f& t0 Q0 ` if(date=='a'||date=='b'||date=='c'||date=='d')cmd=1; //判断是否为命令
4 A! R% D* n4 C9 a" ?6 G& P}
7 r* E$ b" v& o6 a% @- |8 V) b# g6 F
% U: ?, {; ?& x( _1 C& fvoid Uart() interrupt 4 //串口判断是否有收到或发送完毕
8 Y/ W5 M! c" b0 o, G{/ s5 }6 X: Y3 Q9 V! t: y& H
if(RI==1){date=SBUF;RI=0;Iscmd();} //获取收到数据,RI置0,判断是否是命令4 G% C, ^$ P5 u" i5 T- g
if(TI==1){TI=0;} //发送完毕置0! H, \2 h ?. A7 g! z7 {' W$ F2 x
}/ F% k9 F" Y& N. B2 I
//----------------------------------------------------------------, u+ O6 ?4 v& }
- M: T& e" C- w0 r% D1 K- I; k
; w$ Y# f8 V/ ~: g8 m4 yvoid main()
6 P, H9 T3 U9 Y Z, W m{7 I9 U( @, U, P1 F
UartConfiguration(); //蓝牙初始化5 t# r$ {8 @: C
while(1)' \: X6 c8 q, ^0 ^
{ ) U: I$ A9 w4 h+ Z/ w
if(cmd) //命令判断/ i& _+ J9 s/ y; U* b
{
" Z$ h8 J- F6 ~1 V2 `9 b switch(date){ //根据命令选择' `7 C2 a: X" Z6 v' t! J
case 'a':SendString(at);a=0;break;
: u$ |$ N c: f' |- h% w case 'b':SendString(bt);b=0;break;
% \( S4 I R9 Z6 f' T case 'c':SendString(ct);c=0;break;
0 I) `/ |1 o1 `, {, C' J$ t case 'd':SendString(dt);d=0;break;
" h) M; T" n4 m1 R default:break;
" V. U! z, w' |2 [ }
7 |& m. {1 U2 c$ k$ ^ cmd=0; //命令标志置0
" ]$ B. E9 N1 ^3 C5 F }
7 m. c: E# K; y1 y0 N }
B: V5 `0 P/ s" ]& ^7 p}. J# l V8 L4 C- X
* K" F7 ]& S! y- k, Z+ u
|
|