哈哈哈哈 发表于 2024-8-29 12:48:25

AI8051U, LCD12864, 播放BadApple 超简单

AI8051U, LCD12864, 播放BadApple 超简单

实现原理:
使用AIapp-ISP软件中的CDC/串口发送文件,将图片发送到单片机,单片机进行显示
代码
    while(1)
    {
      for(i=0;i<16;i++){
            USB_SendData("h",1);
            usb_OUT_done();      //接收
            while(!bUsbOutReady);//等接收数据
            memcpy(gImage_picture1 + (i * 64),UsbOutBuffer,OutNumber);//拷贝
      }
      LCDClear();
      DisplayImage(gImage_picture1);
    }import cv2

output_path = 'badapple_128_64.bin'# 输出文件的路径和文件名称
video_path = 'badapple_320240_xvid.mp4'# 视频
interval = 2# 帧率间隔 越大画面越流畅 所占内存越大

bytes_data = []

if __name__ == '__main__':

    video_capture = cv2.VideoCapture(video_path)# 读取视频文件
    video_capture.set(cv2.CAP_PROP_POS_FRAMES, 50 - 1)# 跳过开头50帧

    i = 0# 视频帧数
    j = 0# 截取帧数

    while True:

      success, frame = video_capture.read()

      if success:
            i += 1
            if i % interval == 0:# 判断帧率间隔保存帧
                j += 1
                print('正在处理第 %s 帧' % j)
                frame = cv2.resize(frame, (128, 64), interpolation=cv2.INTER_LINEAR)
                gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                _, binary_frame = cv2.threshold(gray_frame, 127, 255, cv2.THRESH_BINARY)

                # 将二值化图像转换为一维数组 从左到右 从上到下
                flat_binary = binary_frame.flatten()

                # 将像素值转换为一维的0和1序列
                binary_string = ''.join(['1' if pixel == 255 else '0' for pixel in flat_binary])

                for i in range(0, len(binary_string), 8):
                  byte = binary_string
                  bytes_data.append(int(byte, 2))
      else:
            print('转换成功,开始写入文件')
            # 将字节列表转换为字节对象
            binary_data = bytes(bytes_data)
            with open(output_path, 'wb') as f:
                f.write(binary_data)
                f.close()
            print('已生成%s帧' % j)
            break代码解释:
单片机通过虚拟串口接收一帧图像,为啥有个 for(i=0;i<16;i++) ?
因为官方给的串口有限制64字节
BYTE xdata UsbInBuffer;
BYTE xdata UsbOutBuffer;一帧1024字节,所以分成16次传输
Python代码作用就是取一帧画面,变成黑白的,然后从左到右,从上到下,白的是1,黑的是0,写到一个名为“badapple_128_64.bin”的文件。
这个文件用HEX编辑器打开就是这样


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

很简单,选好文件点发送就行


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


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




哈哈哈哈 发表于 2024-8-29 12:49:00

实际效果:

哈哈哈哈 发表于 2024-8-29 13:01:05

速度分析:
传一帧 + 清屏 + 显示花15*0.015 + 0.03 = 0.255
也就是255毫秒3.9帧

哈哈哈哈 发表于 2024-8-29 13:03:34

真么高的波特率,理论上应该不止3.9帧

Yim_Hom 发表于 2024-8-29 13:13:44

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

哈哈哈哈 发表于 2024-8-31 09:04:36

wnagming 发表于 2024-8-31 07:33
原来Python这么好用

写一下脚本很方便
页: [1]
查看完整版本: AI8051U, LCD12864, 播放BadApple 超简单