找回密码
 立即注册
查看: 390|回复: 5

AI8051U, LCD12864, 播放BadApple 超简单

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-8-29 12:48:25 | 显示全部楼层 |阅读模式
AI8051U, LCD12864, 播放BadApple 超简单

实现原理:
使用AIapp-ISP软件中的CDC/串口发送文件,将图片发送到单片机,单片机进行显示
代码
  1.     while(1)
  2.     {
  3.         for(i=0;i<16;i++){
  4.             USB_SendData("h",1);
  5.             usb_OUT_done();      //接收
  6.             while(!bUsbOutReady);//等接收数据
  7.             memcpy(gImage_picture1 + (i * 64),UsbOutBuffer,OutNumber);//拷贝
  8.         }
  9.         LCDClear();
  10.         DisplayImage(gImage_picture1);
  11.     }
复制代码
  1. import cv2
  2. output_path = 'badapple_128_64.bin'  # 输出文件的路径和文件名称
  3. video_path = 'badapple_320240_xvid.mp4'  # 视频
  4. interval = 2  # 帧率间隔 越大画面越流畅 所占内存越大
  5. bytes_data = []
  6. if __name__ == '__main__':
  7.     video_capture = cv2.VideoCapture(video_path)  # 读取视频文件
  8.     video_capture.set(cv2.CAP_PROP_POS_FRAMES, 50 - 1)  # 跳过开头50帧
  9.     i = 0  # 视频帧数
  10.     j = 0  # 截取帧数
  11.     while True:
  12.         success, frame = video_capture.read()
  13.         if success:
  14.             i += 1
  15.             if i % interval == 0:  # 判断帧率间隔保存帧
  16.                 j += 1
  17.                 print('正在处理第 %s 帧' % j)
  18.                 frame = cv2.resize(frame, (128, 64), interpolation=cv2.INTER_LINEAR)
  19.                 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  20.                 _, binary_frame = cv2.threshold(gray_frame, 127, 255, cv2.THRESH_BINARY)
  21.                 # 将二值化图像转换为一维数组 从左到右 从上到下
  22.                 flat_binary = binary_frame.flatten()
  23.                 # 将像素值转换为一维的0和1序列
  24.                 binary_string = ''.join(['1' if pixel == 255 else '0' for pixel in flat_binary])
  25.                 for i in range(0, len(binary_string), 8):
  26.                     byte = binary_string[i:i + 8]
  27.                     bytes_data.append(int(byte, 2))
  28.         else:
  29.             print('转换成功,开始写入文件')
  30.             # 将字节列表转换为字节对象
  31.             binary_data = bytes(bytes_data)
  32.             with open(output_path, 'wb') as f:
  33.                 f.write(binary_data)
  34.                 f.close()
  35.             print('已生成%s帧' % j)
  36.             break
复制代码
代码解释:
单片机通过虚拟串口接收一帧图像,为啥有个 for(i=0;i<16;i++) ?
因为官方给的串口有限制64字节
  1. BYTE xdata UsbInBuffer[64];
  2. BYTE xdata UsbOutBuffer[64];
复制代码
一帧1024字节,所以分成16次传输
Python代码作用就是取一帧画面,变成黑白的,然后从左到右,从上到下,白的是1,黑的是0,写到一个名为“badapple_128_64.bin”的文件
这个文件用HEX编辑器打开就是这样
截图202408291237475994.jpg

CDC/串口发送文件如何用?

很简单,选好文件点发送就行
截图202408291240551659.jpg

我们使用应答发送,就是单片机发个68,电脑就发64个字节的数据
也就是 68 是数据请求命令     64 是每个数据包的大小(字节)
截图202408291244032795.jpg

然后串口波特率自己看着选 没事 我选10000000都能用
实际效果:




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-8-29 12:49:00 | 显示全部楼层
实际效果:

VID_20240829122522.mp4

47.88 MB, 下载次数: 40

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-8-29 13:01:05 | 显示全部楼层
速度分析:
传一帧 + 清屏 + 显示  花  15*0.015 + 0.03 = 0.255
也就是  255毫秒  3.9帧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-8-29 13:03:34 | 显示全部楼层
真么高的波特率,理论上应该不止3.9帧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:215
  • 最近打卡:2025-05-03 00:37:12
已绑定手机

36

主题

561

回帖

1942

积分

荣誉版主

积分
1942
发表于 2024-8-29 13:13:44 | 显示全部楼层

用stc15配合st7567玩过这个,波特率到961200
但是没您这个这么复杂,bin文件直接串口发,发了就不用管了
程序内部串口接收一次1024就显示,不做任何判断也成功了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-8-31 09:04:36 | 显示全部楼层
wnag*** 发表于 2024-8-31 07:33
原来Python这么好用

写一下脚本很方便
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 03:00 , Processed in 0.164376 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表