青岛大学本科生毕业论文(设计)
3.8 电源模块原理图
电源部分是一个产品设计的关键,对系统工作的稳定性至关重要,本设计电源从电脑USB口取电(其他5V直流电源也可),经过REG1117-3.3V电压芯片转换,可以输出5V或3.3V两种规格电压。其中10μF和470μF电容为高、低频滤波电容。
图3.8 电源模块原理图
21
青岛大学本科生毕业论文(设计)
第4章 软件设计
4.1 开发环境简介
本设计采用C51语言编写程序,实现单片机对各种功能模块的控制。在单片机早期开发的时候,汇编语言比较很流行,由于介于高级语言和机器语言之间,它可以直接操作硬件,而且指令的执行速度虽然很快,对于早期资源贫乏的单片机来说,是比较理想的开发语言。但其指令格式比较难记忆,编写的程序晦涩难懂,不便于调试、维护和移植,而且受硬件系统的限制比较大,目前已经很少使用。现在单片机硬件运算性能较过去有了显著的提高,单片机的执行速度已经不是首要因素,如今单片机应用的开发过程中时,需要更好的移植和维护,更加注重程序本身的编写效率,所以C51已成为目前主流的单片机开发软件工具[11]。
本设计开发环境采用美国Keil Software公司出品的Keil uVision4,Keil uVision4软件提供了丰富且功能强大的库函数,并且集编辑、编译、连接、调试、仿真等完整的开发流程于一体。编程者仅使用该工具即可完成整个开发过程。具体开发流程如下:
(1)创建一个新工程( Project),并设置工程环境; (2)在该工程下创建C源文件,编写C51程序;
(3)编译、链接程序,按照编译器提示找出错误进行修改,; (4)调试、仿真,检查无误后最后生成.hex文件;
(5)下载单片机可运行目标代码到单片机上的程序ROM中。
4.2 模块化程序设计
整个系统设计较为复杂,因此采用模块化编程思想,具体分为以下几个模块:FAT32文件系统底层驱动、12864液晶驱动、VS1003驱动、SD卡驱动、串口驱动、DS1302和DS18B20驱动、以及其他功能子函数等。
22
青岛大学本科生毕业论文(设计)
LCD12864DS1302 VS1003 按 键 MCU DS18B20 串口调试 STC12C5A60S2 用户接口 FAT32文件系统 底层接口驱动 存储介质:SD卡
图4.1 程序模块设计
4.2.1 FAT32文件系统
FAT32文件系统是WINDOWS操作系统中常用的一种文件系统,由于FAT32文件系统在8位单片机上实现过程较为复杂,这里就不用大篇幅讲述底层接口驱动,因此罗列几个用户接口函数如下[12]:
void FAT32_Device_Init()
//SD卡设备初始化
void FAT32_Init(void) //文件系统初始化
UINT32 FAT32_Get_Total_Size(void); //获取总容量 UINT32 FAT32_Get_Remain_Cap(void);
//获取剩余容量
UINT32 FAT32_Enter_Dir(CONST INT8 *path); //进入目录
UINT8 FAT32_Open_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT32 item,UINT8 is_file);
//打开文件,支持通配
UINT8 FAT32_Seek_File(struct FileInfoStruct *pfi,UINT32 offset); //文件定位
UINT32 FAT32_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf);
//读取文件数据
UINT32 FAT32_Read_FileX(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,void (*pfun)(UINT8));
//读取文件数据并进行数据处理
23
青岛大学本科生毕业论文(设计)
UINT32 FAT32_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf); //向文件追加数据
UINT8 FAT32_Create_Dir(CONST INT8 *dirpath,UINT8 *ptd); //创建目录,支持创建时间 UINT8 FAT32_Create_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT8 *ptd); //创建文件,支持创建时间
UINT8 FAT32_Del_File(CONST INT8 *filepath); *pArg2,CONST
INT8
*sfilename,CONST
INT8
//删除文件 *tfilename,UINT8
*file_buf,UINT32
unsigned char FAT32_XCopy_File(struct FAT32_Init_Arg *pArg1,struct FAT32_Init_Arg buf_size,unsigned char *pt); //文件拷贝,支持多设备中文件互拷
UINT8 FAT32_File_Close(struct FileInfoStruct *pfi); //文件关闭
UINT8 FAT32_Rename_File(CONST INT8 *filename,CONST INT8 *newfilename); 重命名
//文件
4.2.2 12864液晶驱动
//检查忙位 void chk_busy()
//写指令到LCD
void write_com1(uchar cmdcode)
//写数据到LCDvoid write_data(uchar Dispdata) //向液晶发送一个字符串,长度64字符之内 void lcm_w_word(uchar *s)
//清屏函数 void lcm_clr(void)
//初始化LCD屏 void lcm_init()
//使用绘图的方法让一个16*16的汉字符反白 //形式参数:uchar x,uchar y,uchar wide,uchar bkcor
24
青岛大学本科生毕业论文(设计)
//行参说明:坐标水平位置,坐标垂直位置,反白行数,要反白还是清除(1:反白,0:清除) void write1616GDRAM(uchar x,uchar y,uchar sign,uchar *bmp)
//函数功能:显示16X16图形
void set1616pic(uchar x,uchar y,uchar sign,uchar tt)
//函数功能:显示16X32图形
void write1632GDRAM(uchar x,uchar y,uchar *bmp)
//函数功能: 在程写GDRAM时序初始化 void init_12864_GDRAM()
//函数功能:清屏函数
void Clean_12864_GDRAM(void)[13]
4.2.3 VS1003驱动
//写入两个字节(从高位先写)到VS1003B的功能寄存器
void VS_Write_Reg(unsigned char addr,unsigned char hdat,unsigned char ldat)
//读取两个字节(从高位先读)从VS1003B的功能寄存器 unsigned int VS_Read_Reg(unsigned char addr)
//软复位及初始化VS100B(设置时钟频率及音量等) void VS_Reset()
//写入播放的数据,即写入一字节的音频数据到VS1003B void VS_Send_Dat(unsigned char dat)
//清空VS1003B的数据缓冲区,即向VS1003B写入2048个0 void VS_Flush_Buffer()
//正弦音测试,测试VS1003B芯片是否正常
25