安卓手机与蓝牙模块联合调试(六)-- 编写自己的蓝牙控制界

2019-04-15 15:48发布

安卓手机与蓝牙模块联合调试(六)-- 编写自己的蓝牙控制界面控制单片机(下篇,STC单片机代码实现)

2018年09月18日 17:07:04 涛声依旧Cjt 阅读数:127 标签: 单片机蓝牙模块安卓蓝牙通讯安卓与单片机蓝牙通讯 更多 个人分类: Android -- 单片机和蓝牙 所属专栏: 安卓与蓝牙硬件 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010898329/article/details/82751120 (1)安卓手机与蓝牙模块联合调试(一)—— 蓝牙模块的串口通讯  (2)安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) (4)安卓手机与蓝牙模块联合调试(四)—— 单片机数据上传至蓝牙(STC89C52 + DS18b20) (5)安卓手机与蓝牙模块联合调试(五)-- 编写自己的蓝牙控制界面控制单片机(上篇,Android 代码实现)    本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机通过蓝牙与单片机通信-发送指令/接收数据
接着上篇继续,本篇主要是完善单片机端的代码部分。废话不多说,开始飙车了。 

1.看下初步的演示效果

 

2.主要代码部分,main.c

 (1)单片机端的代码主要是在之前的代码基础上做了修改,多增加了几条指令。  
  1. /****************************************
  2. ** 蓝牙串口接收数据
  3. **
  4. ** 作者:江涛
  5. ** 时间:2018/08/31
  6. ** 描述:串口发送数据兼用OLED显示
  7. ****************************************/
  8. #include "STC89C5xRC_RDP.h"
  9. #include "string.h" // 要使用字符串对比函数,需要引入该头文件
  10. #include "OLED.h" // OLED显示屏头文件
  11. #include "DS18b20.h"
  12.  
  13. // 定义系统时钟和串口波特率
  14. #define FOSC 11059200L // 系统时钟
  15. #define BAUD 9600 // 串口波特率
  16.  
  17. /******变量声明*********/
  18. char RECEIVED_CMD[10] ; // 暂定为10字节的指令
  19. char RECEIVED_INDEX ; // 数组指示索引,当接收到一个数据之后,索引会跟随增加
  20. unsigned char flag = 0 ; // 数据接收的标志位
  21. unsigned char power_flag = 0 ; // 电源开关的标志位
  22.  
  23. /******命令常量*******/
  24. code const char* LED_ON = "ON " ; // 电源开指令
  25. code const char* LED_OFF = "OFF " ; // 电源关指令
  26. code const char* LED_01_ON = "L1ON " ; // 灯组01开指令
  27. code const char* LED_01_OFF = "L1OFF " ; // 灯组01关指令
  28. code const char* LED_02_ON = "L2ON " ; // 灯组02开指令
  29. code const char* LED_02_OFF = "L2OFF " ; // 灯组02关指令
  30. code const char* FAN_ON = "FANON " ; // 风扇开指令,使用RGB灯循环来模拟风扇工作
  31. code const char* FAN_OFF = "FANOFF " ; // 风扇关指令
  32. code const char* FAILD = "power_off " ; // 返回失败原因,电源关闭了
  33.  
  34. extern unsigned int tvalue; //温度值
  35. extern unsigned char tflag; //温度正负标志
  36. unsigned char disdata[7]; // 温度数据,使用8字节数组来存储
  37.  
  38. char color_table[8][3] = { // 颜 {MOD}表
  39. {0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}
  40. };
  41.  
  42. /*******函数声明*********/
  43. void Init_UART(); // 初始化串口
  44. void UART_SendData(char dat); // 串口发送数据
  45. void UART_SendStr(char* str); // 串口发送字符串
  46. void RGB_Display(int index); // RGB灯显示
  47.  
  48. //void split(char str[],char delims[]); // 字符串截取函数
  49.  
  50. void ds1820disp(); // 温度显示
  51.  
  52. void test_Fan(char flag); // 模拟测试风扇运行
  53. void Delay1ms(); //@11.0592MHz
  54.  
  55. /***********端口定义*************/
  56. sbit LED_R = P0^0 ;
  57. sbit LED_G = P0^1 ;
  58. sbit LED_B = P0^2 ;
  59.  
  60. /*******程序入口*********/
  61. void main()
  62. {
  63.  
  64. unsigned int temperature , old ; // 保存温度数值
  65.  
  66. Init_UART(); // 串口初始化
  67.  
  68. LCD_Init(); // OLED 初始化
  69. LCD_CLS(); // 清屏
  70.  
  71. LCD_P8x16Str(0 , 0 , "TEMP:"); // 温度开始位置
  72.  
  73. temperature = ReadTemperature();
  74. old = temperature ;
  75. ds1820disp(); // 显示温度
  76. UART_SendStr(disdata); // 向串口发送数据
  77. LCD_P8x16Str(5*8 , 0 , disdata); // 显示温度
  78.  
  79. while(1)
  80. {
  81.  
  82. temperature=ReadTemperature(); // 读取一次新的温度
  83. if (temperature != old )
  84. {
  85. old = temperature;
  86. ds1820disp(); // 显示温度
  87. UART_SendStr(disdata); // 向串口发送数据
  88. LCD_P8x16Str(5*8 , 0 , disdata); // 显示温度
  89.  
  90. }
  91.  
  92. if(flag) // 接收数据完毕一次,就会进入中断一次
  93. {
  94. flag = 0 ; // 将标志位还原,使得串口又可以重新接收数据
  95.  
  96. if(strcmp(RECEIVED_CMD , LED_ON) == 0)
  97. {
  98. P2 = 0xFF ; // P2口全亮
  99. power_flag = 1 ; // 标志电源打开
  100. }
  101. else if(strcmp(RECEIVED_CMD , LED_OFF) == 0)
  102. {
  103. P2 = 0x00 ; // P2口全灭
  104. power_flag = 0 ;// 标志电源关闭
  105. }
  106. else if(strcmp(RECEIVED_CMD , LED_01_ON) == 0)
  107. {
  108. if(power_flag) // 如果电源开关是关闭的,就不执行以下操作
  109. P2 = 0x55 ; // ‭01010101‬ 为1位置的灯是亮着的
  110. else
  111. UART_SendStr(FAILD); // 向串口发送失败原因
  112. }
  113. else if(strcmp(RECEIVED_CMD , LED_01_OFF) == 0)
  114. {
  115. P2 = P2^0x55 ; // P2口01010101相应位置的灯要全灭,所以使用异或操作
  116. }
  117. else if(strcmp(RECEIVED_CMD , LED_02_ON) == 0)
  118. {
  119. if(power_flag) // 如果电源开关是关闭的,就不执行以下操作
  120. P2 = 0xAA ; // ‭10101010‬ 为1位置的灯是亮着的
  121. else
  122. UART_SendStr(FAILD); // 向串口发送失败原因
  123. }
  124. else if(strcmp(RECEIVED_CMD , LED_02_OFF) == 0)
  125. {
  126. P2 = P2^0xAA ; // P2口10101010相应位置的灯要全灭,所以使用异或操作
  127. }
  128. else if(strcmp(RECEIVED_CMD , FAN_ON) == 0)
  129. {
  130. test_Fan(1);
  131. }
  132. else if(strcmp(RECEIVED_CMD , FAN_OFF) == 0)
  133. {
  134. test_Fan(0);
  135. }
  136.  
  137.  
  138. // 用完之后要记得数组清零处理
  139. RECEIVED_INDEX = 0 ; // 数组指引复位
  140. memset(RECEIVED_CMD,0,10); // 清0数组
  141. }
  142. }
  143. }
  144.  
  145. /******************
  146. ** 初始化串口
  147. *******************/
  148. void Init_UART()
  149. {
  150. SCON = 0x50; //设置8位数据位
  151. TMOD = 0x20; //8位自动重载
  152. TH1 = TL1 = -(FOSC/12/32/BAUD); //设置重载值
  153. TR1 = 1; //使能时钟
  154. ES = 1; //使能串口中断
  155. EA = 1; //开中断开关
  156. }
  157.  
  158. /********************
  159. ** 串口中断处理
  160. *********************/
  161. void UART_Isr() interrupt 4 using 1
  162. {
  163. // 串口接收中断处理
  164. if(RI)
  165. {
  166. RI = 0 ; // 清除中断标志位
  167. RECEIVED_CMD[RECEIVED_INDEX] = SBUF ; // 保存串口接收的数据
  168. if(RECEIVED_CMD[RECEIVED_INDEX] == 0x0A ){ // 遇到了结束符号
  169. flag = 1 ; // 接收结束,到循环中处理接收的数据
  170. }else {
  171. RECEIVED_INDEX ++ ; // 继续接收数据
  172. }
  173. }
  174.  
  175. // 串口发送中断处理
  176. if(TI)
  177. {
  178. TI = 0 ; // 清发送中断标志位
  179. }
  180.  
  181. }
  182.  
  183. /**************************
  184. ** 通过串口发送一位数据
  185. ***************************/
  186. void UART_SendData(char dat)
  187. {
  188. ES = 0 ; // 串口工作的时候禁止中断
  189. SBUF = dat ; // 待发送的数据放到SBUF中
  190. while(!TI) ; // 等待发送完毕
  191. TI = 0 ; // 清TI中断
  192. ES = 1 ; // 打开中断
  193. }
  194.  
  195. /*****************************
  196. ** 通过串口发送字符串
  197. ******************************/
  198. void UART_SendStr(char *str)
  199. {
  200. do
  201. {
  202. UART_SendData(*str);
  203. }while(*str ++ != '