大三实训 MP3 播放器 硬件 #
命名规范 #
驼峰命名法
一组单词表示函数、变量的实际作用
每个单词首字母大写
变量、函数:首字母小写
结构体、枚举:首字母大写
匈牙利命名法
- 显示框 – iSum
- 求和按钮 – btnSum
- int – i
- bool – b
- string – s
- * - - p
- const – c_
基于AVR的音乐播放器的设计与实现 #
- 团队协作 Team Building
- 项目开发流程
- 熟悉C、C语言单片机开发技术
团队建设 #
- 组长、经理
- 项目经理
- 项目组长
- 组员
- 产品
- 硬件开发
- 主板 - 电路设计人员 - PCB
- 硬盘
- SSD
- 英特尔
- 三星
- ……
- HHD
- SSD
- 硬盘
- 驱动开发人员 - BIOS
- 主板 - 电路设计人员 - PCB
- 软件开发
- 设计人员
- 设计产品的功能
- 设计产品的界面
- 完成文档
- 产品发布
- 8 ~ 9 人一组 10:15
- 9 - 12 2 - 5:30 3:30
- 6:30 - 8:30
- 3周
- C语言基础、单片机基础驱动、
- 项目搭建与实现:音频播放芯片、显示屏
- 项目逻辑实现:控制、播放
- 音乐播放器
- 评审、调研项目 - 项目确认
- 公司负责人
- 财务工作人员
- 技术总监
- 技术
- 成本
- 效益
- 开发团队
- 领导 - 经理、组长
- 产品
- 设计
- 需求确认
- 需求分析报告
- 功能
- 功能确认表/工作量
- 原型设计
- 需求分析报告
- 设计
- 数据设计
- 用例
- 编码
- 注释
- 接口的说明
- 参数,逐条说明:类型,作用,内存使用
- 返回值,类型,作用,内存使用
- 接口
- 规范
- 注释
- 测试
- 白盒测试
- 常规数据测试
- 边界数据 / 极限数据
- 黑盒测试
- 隐藏内部实现
- 功能测试
- 扩大测试范围
- 白盒测试
- 交付
- 运维
- 评审、调研项目 - 项目确认
音乐播放器 #
控制
控制方式
- 按键 - 6
- 红外遥控
- 串口
播放/暂停
- 播放
- 停止
- 暂停
歌曲切换
- 上一首
- 下一首
- 模式切换
- 单曲循环
- 随机循环
- 顺序循环
音量调节
- 音量增加
- 音量减少
- 静音
歌曲列表跳转
播放进度跳转
- 快进
- 快退
收藏歌曲
屏幕背光开关
显示
- 开机动画
- 播放列表
- 歌曲名称
- 歌手
- 时长
- 状态
- 当前正在播放的歌曲
- 名称
- 进度条
- 时间
- 歌词显示
- 运行状态
UVRT #
GPIO 输入输出I/O #
用途 #
UASRT GSM Wi-Fi 蓝牙 GPRS 窄带物联网
LCD GPIO(8位并行)
VS1003 SPI GPIO
红外
DDRxn寄存器 #
- 1 = 输出
- 0 = 输入
PORTxn寄存器 #
- 1 = 引脚输出高电平 上拉电阻使能
- 0 = 引脚输出低电平 上拉电阻去使能
PINxn #
- 读取引脚电平变化(输入状态)
//pc3输出高电平
DDRC |= 0x08;
PORTC |= 0x08;
//pc4输出低电平
PORTC &= 0xEF;
//pc0134输出高电平
DDRC |= (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4);
//pc2567输出低电平
DDRC &= ~((1 << 2) | (1 << 5) | (1 << 6) | (1 << 7));
//pc3输出高电平
DDRC |= 0x08;
PORTC |= 0x08;
//pc4输出低电平
PORTC &= 0xEF;
//pc0134输出高电平
DDRC |= (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4);
//pc2567输出低电平
DDRC &= ~((1 << 2) | (1 << 5) | (1 << 6) | (1 << 7));
模块 #
GPIO-LED : led.h/led.c
//Led初始化 void ledInit(); //Led亮 void ledOpen(); //Led灭 void ledClose();
//Led初始化 void ledInit(); //Led亮 void ledOpen(); //Led灭 void ledClose();
TOOL-DELAY : delay.h/delay.c
//按毫秒延时 //@param u16 time 要延时的毫秒数 void delay_ms(u16 time); //按微秒延时 //@param u16 time 要延时的微秒数 void delay_us(u16 time);
//按毫秒延时 //@param u16 time 要延时的毫秒数 void delay_ms(u16 time); //按微秒延时 //@param u16 time 要延时的微秒数 void delay_us(u16 time);
TOOL-SYSTEM : system.h
//char ---> s8 //short ---> s16 //long ---> s32 //unsigned char ---> u8 //unsigned short ---> u16 //unsigned long ---> u32
//char ---> s8 //short ---> s16 //long ---> s32 //unsigned char ---> u8 //unsigned short ---> u16 //unsigned long ---> u32
GPIO-KEY : key.h/key.c
//按键初始化 void keyInit(); //获取当前按键状态 //@return u8 S1~S6 对应0~5位 // 按下为1,抬起为0 u8 getKeyValue();
//按键初始化 void keyInit(); //获取当前按键状态 //@return u8 S1~S6 对应0~5位 // 按下为1,抬起为0 u8 getKeyValue();
USART : usart.h/usart.c
//串口初始化 //波特率、帧结构、功能开关 //@param ubrr 决定串口的波特率 void usartInit(u16 ubrr); //数据发送 //@param data 要发送的数据 void usartTransmit(u8 data); //通过串口发送字符串 void usartTransmitString(s8 * str); //通过串口发送数字 void usartTransmitNumber(s32 num); //接受中断服务函数 //ISR(USART_RXC_vect);
//串口初始化 //波特率、帧结构、功能开关 //@param ubrr 决定串口的波特率 void usartInit(u16 ubrr); //数据发送 //@param data 要发送的数据 void usartTransmit(u8 data); //通过串口发送字符串 void usartTransmitString(s8 * str); //通过串口发送数字 void usartTransmitNumber(s32 num); //接受中断服务函数 //ISR(USART_RXC_vect);
USART #
UCSRA = 0
UCSRB = 1 << RXCIE | 1 << RXEN | 1 << TXEN
UCSRC = 1 << URSEL | 1 << UCSZ1 | 1<< UCSZ0
UBRRH/UBRRL
u16 ubrr = 383
UBRRL = ubrr
UBRRH = ubrr >> 8
串口配置
- 波特率
- 帧结构
- 数据位 - 8
- 停止位 - 1
- 校验位 - 0
- 功能使能
发送、接受
LCD12864 #
- 128 x 64 像素
- 8 x 4 汉字
- 并行通信
- 通信内容
- 在第一行显示“你好”
- RS :
- 指令:L
- 坐标设置
- 数据:H
- 你好
- 指令:L
- RW :
- 写入:L
- 读取:H
- EN :
- 操作屏幕,使能
- 初始化
- 设置基本指令集
- 清空
- 显示打开
- 地址归位
- 写指令
- 等待LCD空闲
- RS_L
- RW_L
- EN_H
- 延时
- 指令写入
- EN_L
- 等待LCD空闲:
- RS_L
- RW_H
- EN_H
- 延时
- 读取BF状态
- EN_L
7/9任务 #
显示图片
LCD:void lcdDispProgrees(u8 pos);//进度条
界面设计
每个界面完成一个单独的接口
*name1 *name2 *name3 pos
完成静态
文档说明每个界面具体可以显示的内容
LCD模块 详细设计说明书
mp3步骤 #
- 初始化驱动
- 加载播放列表
- 功能选择
- 控制
6天 #
- 列表存储与加载
- 播放控制
- 进度条显示
- 串口同步
- 上下位机歌词显示
运行流程 #
- 初始化
- 硬件初始化
- 显示开机界面
- 挂载文件系统
- 加载播放列表
- 歌曲名字
- 歌曲总数
- 运行
- 功能选择
- 播放
- 浏览列表
- 播放
- 确定要播放的歌曲序号
- 顺序-0
- 根据序号获取歌曲名称
- 打开文件
- 播放
- 按键检测
- 判断跳转标记量
- 标记量清空
- break;
- 判断跳转标记量
- 向VS1003发送数据
- 判断歌曲是否结束
- next();
- 按键检测
- 确定要播放的歌曲序号
- 功能选择
控制模块 #
Control : control.h/control.c
//初始化
void init();
//运行
void start();
//初始化播放列表
//确定歌曲总数
void updatePlaylist();
//根据歌曲序号获取歌曲名称
void getMusicName(u16 musicIndex, u8 *musicName);
//memcpy();
//下一首
void next();
//上一首
void prev();
//按键检测
//getKeyValue()
//u8 temp = infValue;
//infValue = 0;
void keyCheck();
//初始化
void init();
//运行
void start();
//初始化播放列表
//确定歌曲总数
void updatePlaylist();
//根据歌曲序号获取歌曲名称
void getMusicName(u16 musicIndex, u8 *musicName);
//memcpy();
//下一首
void next();
//上一首
void prev();
//按键检测
//getKeyValue()
//u8 temp = infValue;
//infValue = 0;
void keyCheck();