第 17 页 共 36 页
TFT彩屏原理图如图3.10。其中REG1117-3.3是电平转换芯片,作用是把5V的电平转换到3.3V后给74245八同相三态收发器及SD卡供安全电压。
图3.10 TFT彩屏原理图
第 18 页 共 36 页
4 软件设计
4.1 软件设计目标
最终能实现同时将四路模拟电压(0-5V)进行A/D转换,转换结果为十进制有效数字3位;要求每秒钟转换一次,并将结果转换为ASCII码形式;并将四路结果分别存储到SD卡预先建立好的CH1.txt、CH2.txt、CH3.txt、CH4.txt文档中。采集实时的4个通道电压值显示在TFT彩屏上;按S1按键进行采集及存储,再按S1按键暂停采集及存储,按S2键清除SD卡中的内容;按S按键系统进行复位。
4.2 设计环境
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面介绍Keil C51开发系统各部分功能和使用。
Keil C51单片机软件开发系统的整体结构:Uvision 与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ),目标文件可由LIB51创建生成库文文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。 ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
4.3 系统软件设计
设计主要在Keil环境下进行编程。 4.3.1 系统初始化
要让系统正常运行首先要对系统进行初始化,主要包括:定时器T0初始化、DS1302初始化、LCD初始化、SD卡初始化、文件系统初始化。其流程图如图4.1所示。
第 19 页 共 36 页
开始 定时器T0 初始化DS1302 初始化LCD 用背景色清屏 显示初始化状态 SD卡初始化 文件系统初始化 打开界面背景位图文件并显示 关闭背景 位图文件 显示通道 指示字符 返回
图4.1 系统始化流程图
4.3.2 SD卡初始化
对SD卡进行初始化,初始化的过程中设置SD卡工作在SPI模式,其流程图如图4.2所示。
在复位成功之后可以通过CMD55和ACMD41判断当前电压是否在工作范围内。主机还可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可获知卡容量,支持的命令集等重要
第 20 页 共 36 页
参数。具体程序见附录C。
开 始
接受SD卡响应 发送激活命令CMD1 进入SPI总线模式 发送复位命令CMD0 发送74个时钟周期 否 响应bit0=0? 结 束
图4.2 SD卡初始化流程图
4.3.3 数据块的读写
完成SD卡的初始化之后即可进行它的读写操作。SD卡的读写操作都是通过发送SD卡命令完成的。SPI总线模式支持单块(CMD24)和多块(CMD25)写操作,多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令CMD12才停止。单块写操作的数据块长度只能是512字节。单块写入时,命令为为CMD24,当应答为0时说明可以写入数据,大小为512字节。SD对每个发送给自己的数据块都通过一个应答命令确认,它为1个字节长,当低5位为00101时,表明数据块被正确写入SD卡。
可见,读写SD卡的操作都是在初始化后基于SD卡命令和响应完成操作的,写SD卡的程序流程图如图4.3所示。
第 21 页 共 36 页
开 始
发送写命令CMD24 否 响应全零吗? 返 回
接受SD卡响应 发送2字节CRC码 发送512字节数据 发送数据的起始标志 否 响应是0X5吗? 结 束
图4.3 写SD卡流程图
① 写单块
1):发送命令CMD24; 2):接收R1响应;
3):发送Data Tokens (Single Block Write: Oxfe); 4):发送一个block(一般为512个字节); 5):发送两个CRC16码;
6):循环接收数据,等待写完成,直到写完成接收到0xff。 ② 写多块
1):发送命令CMD25; 2):接收R1b响应;
3):发送Data Tokens (Single Block Write: 0xfe);