|
本项目是基于T5L1芯片设计的一款多功能物联领域的学习,测试,开发综合套件
板子上扩展了如下接口:
1.USB串口,用的ch340g芯片,接在T5L的串口1,用于在线烧录程序或者扩展esp wifi模块等
2.4.3寸的触摸液晶电容屏
3.SD卡接口,用于批量下载程序
4.音频喇叭接口
5.PWM信号接口
6.RGB彩灯接口
7.环境感知接口
8.时钟芯片接口
9.人体感应接口
10.wifi模块接口(也可以外带OV系列的摄像头)
11.ADC采样接口
12.温湿度传感器接口
13.独立按键接口
14.LED跑马灯
15.IR红外收发接口
16.继电器接口
17.蜂鸣器接口
18.直流电机接口
大概示意图如下所示:
板子的背面实物图如下:
其中外扩的wifi模块为esp32,可以支持外带一个OV系列摄像头的(比如OV2640等),原理图如下所示:
下面来看程序上的设计
用到了100多张图标素材,如下所示:
用到了50张图片素材,截取一部分如下所示:
仪器开机之后,是一段开机动画
接下来是部件自检流程
自检完后,进入到密码验证界面
密码验证成功后,就会进入到主界面,主界面是显示一些仪器的状态,比如wifi状态,以及还有菜单和外设俩大功能入口
我们先来看菜单界面,主要有6个菜单项,分别为wifi配网, 时钟设置, 密码修改, 版本信息, 恢复出厂, 通用设置
wifi配网界面如下:
主要是输入wifi名称,wifi密码,设备码等
然后是时钟设置界面,可以箭头设置也可以滚轮设置:
然后是密码修改界面:
然后是版本信息:
然后是恢复出厂设置功能:
最后一个菜单项是基本设置:
再接着进入外设应用功能看看,里面分为了"开关型", "数值型", "环境型", "媒体型"等四个tab选项卡页面
开关型如下,主要是操控蜂鸣器,LED灯,直流电机等开关型外设
数值型如下,主要是RGB彩灯,PWM调速, IR红外灯预留
环境型如下,主要是ADC电压, 光照, 温湿度曲线等预留
最后是媒体型,就是OV摄像头的预留
最后是一个空闲界面:
然后C51程序上的难点就是和wifi模块的交互了,以及获取jpg图片如何显示在迪文屏上
下面就是jpg图片显示的核心代码
void sys_draw_jpg(u16 vp,u8 *jpg_data,u32 data_len)
{
u32 i;
for(i=0;i<data_len;i++)
{
if((jpg_data==0xFF)&&(jpg_data[i+1]==0xD8))
break;
}
if(i==data_len)
return;
data_len = (data_len-i)/2+1;
sys_write_vp(vp+2,jpg_data+i,data_len);
data_len |= 0x5AA50000;
sys_write_vp(vp,(u8*)&data_len,2);
}
以及动态或者外设的模板接口
#define PERIPHERAL_TEMPLATE "[\
{\"icon\":\"led\",\"name\":\"LED1\",\"pid\":500},\
{\"icon\":\"relay\",\"name\":\"RELAY1\",\"pid\":501},\
{\"icon\":\"motor\",\"name\":\"MOTOR1\",\"pid\":502}]"
char * user_handler(u16 cmd,u8 * val)
{
char * respond = 0;
val = val;
if(cmd==USER_CMD_GET_TEMPLATE)
respond = PERIPHERAL_TEMPLATE;
return respond;
}
外设驱动上就以RGB彩灯为例:
void rgbled_send_zero()
{
u8 i;
RGBLED_SDA = 0;
for(i=0;i<32;i++)
{
RGBLED_SCL = 0;
sys_delay_about_us(200);
RGBLED_SCL = 1;
sys_delay_about_us(200);
}
}
u8 rgbled_reverse_data(u8 dat)
{
dat = ((~dat) & 0xC0) >> 6;
return dat;
}
void rgbled_send_data(u32 dat)
{
u8 i;
for(i=0;i<32;i++)
{
if(dat&0x80000000)
RGBLED_SDA = 1;
else
RGBLED_SDA = 0;
dat <<= 1;
RGBLED_SCL = 0;
sys_delay_about_us(200);
RGBLED_SCL = 1;
sys_delay_about_us(200);
}
}
//数据处理
void rgbled_process(u8 r,u8 g,u8 b)
{
u32 dat = 0;
dat |= (u32)0x03 << 30;
dat |= (u32)rgbled_reverse_data(b) << 28;
dat |= (u32)rgbled_reverse_data(g) << 26;
dat |= (u32)rgbled_reverse_data(r) << 24;
dat |= (u32)b << 16;
dat |= (u32)g << 8;
dat |= r;
rgbled_send_data(dat);
}
void rgbled_show(u8 r,u8 g,u8 b)
{
P2MDOUT |= 0x0C;
rgbled_send_zero();
rgbled_process(r, g, b);
rgbled_process(r, g, b);
}
void rgbled_init(void)
{
rgbled_show(0,0,0);
}
然后用到的iic协议驱动代码如下
#include "iic.h"
sbit IIC_SDA_PIN = P2^2;
sbit IIC_SCL_PIN = P2^3;
#define SDA_IN() P2MDOUT&=0xFB
#define SDA_OUT() P2MDOUT|=0x04
#define IIC_SCL IIC_SCL_PIN
#define IIC_SDA IIC_SDA_PIN
#define READ_SDA IIC_SDA_PIN
#define delay_us sys_delay_about_us
void IIC_Init(void)
{
P2MDOUT |= 0x0C;
IIC_SDA = 1;
IIC_SCL = 1;
}
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;
delay_us(4);
IIC_SCL=0;
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
delay_us(4);
IIC_SDA=1;
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
u8 IIC_Read_Byte(u8 ack)
{
u8 i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
视频演示地址: https://b23.tv/BXJYVgW
gui参考代码:
51参考代码:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|