本帖最后由 good 于 2023-11-29 18:21 编辑
一.简介
首先本项目分为俩个部分组成,即上位机,和下位机,首先对上位机和下位机做个说明.
上位机:即安卓手机App应用程序,必须在安卓手机上运行,不能在电脑上运行,用Eclipse软件开发,所用语言为java语言,在本项目中主要是利用到了手机的蓝牙模块功能(用程序描述也就是BluetootthAdapter类)。 下位机:我想这个大家都应该了解,即单片机模块,在我们的这个项目中所用的就是T5L芯片的迪文屏。 本项目所要实现的功能为通过安卓手机上的App中蓝牙功能和迪文屏进行无延时的数据收发,支持Ascii码, Char, GBK, UNICODE等多种编码格式,还支持数据回显(透明,自定义内容等),支持多设备并行通信, 支持导出文件和导入文件,更有意思的是实现了16*16 LED点阵广告屏的功能,在点阵屏功能中支持二次画布编辑,可以进行顺序或者逆序取模等多种功能
二.硬件需求 基于安卓系统的智能手机一部(一般现在的智能手机都自带蓝牙功能),T5L迪文屏一块,HC-05或者HC-06(带底盘的,这样方便连线)从机蓝牙模块一个(接在T5L迪文屏串口上) HC-05或者HC-06主要引出四个引脚,分别为GND,VCC,RXD,TXD, 其连接很简单GND和VCC分别连到迪文屏的VCC和GND,而RXD接到迪文屏的TXD2引脚,而TXD连到迪文屏的RXD上
三.GUI工程设计
图片素材如下 主界面的截图如下
三.C51工程设计
#if(1) #define MODBUS_RECV_TIMEOUT 50 static bit is_modbus_recv_complete = 0; static u8 modbus_recv_buff[1024]; static u16 modbus_recv_len = 0; static u8 modbus_recv_timeout = 0;
void modbus_recv_byte(u8 byte) { if(is_modbus_recv_complete) return; if(modbus_recv_len<sizeof(modbus_recv_buff)) modbus_recv_buff[modbus_recv_len++] = byte; modbus_recv_timeout = MODBUS_RECV_TIMEOUT; }
void modbus_check_recv_timeout() { if(modbus_recv_timeout) { modbus_recv_timeout--; if(modbus_recv_timeout==0) { is_modbus_recv_complete = 1; } } }
void uart2_isr() interrupt 4 { if(RI0) { RI0 = 0; modbus_recv_byte(SBUF0); } } #endif
void uart2_init(u32 baud) { MUX_SEL |= 0x40; P0MDOUT &= 0xCF; P0MDOUT |= 0x10; ADCON = 0x80; SCON0 = 0x50; PCON &= 0x7F;
baud = 1024-(u16)(3225600.0f/baud); SREL0H = (baud>>8)&0xff; SREL0L = baud&0xff;
#if(1) ES0 = 1; EA = 1;
#else ES0 = 0; #endif
}
void uart2_send_byte(u8 byte) { ES0 = 0; SBUF0 = byte; while(!TI0); TI0 = 0; #if(1) ES0 = 1; #endif }
void uart2_send_bytes(u8 *bytes,u16 len) { u16 i;
ES0 = 0; for(i=0;i<len;i++) { SBUF0 = bytes; while(!TI0); TI0 = 0; } #if(1) ES0 = 1; #endif }
char putchar(char c) { uart2_send_byte(c);
return c; }
发送数据给安卓APP的局部代码如下: u8 buff[200]; void get_str(u8 *val,u8 len) { u8 i;
for(i=0;i<len;i++) { if(val==0xff) { val = 0x00; val[i+1] = 0x00; return; } } } void start_win_btn_click_handler(u16 btn_val) { if(btn_val==0x01) { sys_read_vp(0x2100, buff, 50); get_str(buff,100); uart2_send_bytes(buff, strlen(buff)); } }
接受安卓APP的局部代码如下: void uart2_handler() { if(is_modbus_recv_complete) { if(modbus_recv_len==33) { disp_16x16_char(modbus_recv_buff+1); }else { modbus_recv_buff[modbus_recv_len++] = 0; modbus_recv_buff[modbus_recv_len++] = 0; sys_write_vp(0x2000, modbus_recv_buff, modbus_recv_len/2+2); } modbus_recv_len = 0; is_modbus_recv_complete = 0; } }
16*16点阵屏显示的局部代码如下:
void disp_16x16_char(u8 *buff)
{
u8 i,j;
u16 val;
u16 pos = 0;
for(i=0;i<32;i++)
{
j = 8;
while(j--)
{
val = (buff>>j)&0x01;
sys_write_vp(0x3000+pos, (u8*)&val, 1);
pos++;
}
}
}
四.安卓APP
工程结构图例如下:
从上面我们可以看出,一个项目下有多个子目录 Src:为源文件目录,即代码文件存放在这里 Gen:在开发项目时,该目录下的R.java文件里内容会动态的变化,主要存放各种资源id bin:该目录下主要存放一下项目编译过后的文件,即包括啦.apk的安装包 Res:该目录主要存放各种资源,报货图片,音频,字符,颜色....等等 AndroidMenifest.xml:该文件主要是一个对此项目中含有那些组件描述的文件并且还可以在这里改变组件的属性,比如改变我们的应用的名字,以及图标,这里还存放权限等一些重要的东西
桌面界面效果如下:
入口界面如下:
数据收发界面效果如下:
16*16点阵广告屏界面如下:
五.视频演示效果和资料
|