以前上传的附件传错了,传了个半成品现在才发现,咋就没人留言告诉我一声呢,实在不好意思了,现在改过来了,如果你用的是新华龙的IDE直接点击文件夹的工程就行,否则直接点击看里面的.C文件即可。不用登陆即可下载
////////////////////////////////////////////////////////////////////////////////
这篇文章其实十月份就写过了,只是刚写完就发生了一件比较郁闷的事情,由于我是在网页上写的,写完了点错了一个键造成几千字就OVER了,接下来的就开始忙功课了,一直拖到最近考完试,今天下午最后一门课程设计结束,我想赶在这09年的尾巴上把SD卡再总结一下。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
上一篇写完后有许多朋友给我来信加我QQ,也提出了很多问题,由于水平有限我能提供的帮助实在不多,这里我就说几个我印象比较深的吧,
首先要明确的是我发的SD开发包里的程序是我自己东拼西凑加上自己编的程序,所以程序不够简洁,有许多冗余变量实现思想是娱乐级别的,由于诸位大侠大多是给老板搞产品的,所以这些程序只能给你个参考,这个程序没狗,到时候跑飞了别怪我哦,不过我的程序在我的020上很听话,我后面说的电子书就是建立在这个程序的基础上的,附件里有电子书的程序,有兴趣的可以和以前的程序比较一下,SD开发包太大了,要的联系上一篇留言的留下邮箱的各位大侠,也可以给我发邮件,只是马上要考研了,如果不能及时回复还请原谅
1》初始化
有人说初始化总是收不到应答,这个我建议你检查硬件电路,这本来是句废话,但是我再次恳求你检查你的SD卡座和单片机的连接电路,只有硬件没问题你才能安心调程序
有人说初始化发CMD1回应是0X05,开始我也不知道是咋回事,后来他说后面都没问题,我估计就是厂家问题,不同厂家可能应答不一样吧,虽然大多数是一样的,所以如果你收到的应答数据和PDF上不一样时你不要郁闷就继续往下做看下一步是否正常。
2》FAT
有人说要建立的文件长度未知,也就是想把单片机采集的数据装到一个文件里,这个我没实现过,但是有一点可以明确,电脑上的操作系统可以实现的你用单片机按照规则操作一样能实现,这个也有替代方法,可以建立多个长度一定的文件,一旦溢出就建立个新的文件,并且将数据存到下一个文件里。
有人做产品提到了读取速度问题,由于我是做着玩,程序里没有对时钟位操作,也就是说我用的是020默认的2M晶振,建个文件由于要动几百兆的FAT表所以要几十秒的时间,所以是比较慢的,020的内部晶振误差比较大,做产品的要注意,我没用外部告诉晶振的原因是第一次做怕跑快了影响程序的稳定性,菜鸟嘛还请大侠们原谅
还有做到FAT的时候一定要用WINHEX软件看SD的扇区具体操作上一篇博客说了,有些问题PDF里可能没有提到,这些就需要你做的时候具体问题具体对待,对照着来操作SD卡
还有一些我都不记得了,复习了这么长时间的高频电子和电磁场与波,我都要被洗脑了,看到电灯一亮我就想到电的传播,光速,坡印亭矢量等等,还有什么克拉泼弥勒振荡器,不知道以后是不是还能见到,但愿不要再见到了。
我用的SD卡:
我的作品,简陋了一点,自娱自乐嘛,还有美女看哦!哈哈!
这一张背景是天蝎座的
最后时间不够了最终还是没有投板
推荐一本书,如果你还想深入的研究,而且做产品,不妨看看这本书,比较难,尽管我没用到上面的东西,但是可以帮助你深入理解SD卡的协议。还有AVR论坛上章其波的那个做MP3的程序都是不错的做产品的程序,由于担心权益问题我没有把那个程序放在发给你们的SD开发包里,大家自己搜一下吧,很好找的
八月初搞完SD的,可以用单片机在上面建立TXT文件,九月底到十月初我用这个为基础,做了个电子书,也算是一个应用吧,为了不浪费大家时间,下面我先说重点
硬件部分
一块128*64(ST7920)液晶(80元左右),SD卡驱动电路,一块C8051F020开发板(板子130元,仿真器90元),本来打算画个板的,但是赶着学校的小比赛所以就直接用开发板了。
硬件部分很简单,与暑假完成的电路相比只增加了液晶驱动部分。
软件部分
总体的思路就是用单片机将SD卡上的TXT文件读出并且显示到液晶屏幕上,但是单片机的容量有限,你不可能一次读完,这就需要设个数组我的是512长度,有的单片机可能RAM有限那你就根据实际情况定大小吧。128*64的屏一次可以显示32个汉字共64字节,也就是说我读一次就够显示8页的,8页显示完数组清零再读取下一个8页
最麻烦的是要编写菜单,以前也没弄过,上次和 深圳的冲击波(QQ907153057) 前辈交流了一下,有了个模糊地思路,到具体写程序的时候又纠结了好长时间,我最初的设想是要能实现:前翻页,后翻页,确定,退出,删除,创建目录文件,六个功能。
菜单分级》 这里我的领会就是先确定菜单的级数,我的只有两级,一级是目录,二级是文件内容,这个可以定义标志变量实现,在进入各级菜单之前对各个标志位进行清零置数。
各个按键在不同级菜单里功能是不一样的,各个按键的扫描都放在放在主函数的while(1)循环里,扫描到有键按下后再通过标志位判断当前所在菜单级数,进而执行相应的功能函数.。
错误约束》 菜单是一个人机互动的过程,单片机通过读入键盘指令来确定所执行的命令,这就要编者考虑到所有可能输入的情况,比如条目越界,明明目录只有三个文件名条目,你翻到第三个再往下翻就要有报错提示了,还有页码越界,目录条目只有8个,也就是只够显示两页的,你翻到第二页第4条再翻就越界了,有些情况在编写的时候很难考虑到,需要用的时候多用根据发现的问题再修改程序,做到这里我突然明白的有些产品厂家为什么要定期对产品的操作软件进行升级了。
界面友好》 这条包括了上面的那条,将所有的错误约束产生的报错项反馈给用户,并采取相应的补救措施这样的系统才稳定,我将所有的提示函数放在一起编写,有空卡提示函数,无卡提示函数,越界提示函数,删除提示函数等等,每一种情况的出现都有提示,在相应的提示后都有默认的解决程序段,这里我觉得最简单的默认解决方法就是两个字“刷新”就是用户的操作让非法后直接让系统回到最原始的状态,这个很容易能办到。
执行过程
上电后单片机初始化SD卡,若初始化失败指示灯长亮,屏幕提示“请插入SD卡”,这个时候用while做个死等待,也就是不停地初始化,直到你把SD卡插进去初始化成功为止。
随后初始化液晶,将SD卡根目录的文件名(每个文件名不能超过8个字节)读到一个数组Name_creat[128]里,我设的128长度的数组,也就是说我的程序最多支持128/8=16个文件名,当然你也可以设长一点的数组满足更多的需要。将文件名显示在屏幕上,这就是一级菜单的内容。
在一级菜单下,前翻页和后翻页的按键功能是一条一条的上下移动的,当前后越界的时候会有函数提示已是最(前)后一页并停在当前页,这就需要设置标志位,通过按键来控制标志位的增减,标志位的大小反映了光标所在的位置,以及当前光标所映射的文件,还有决定是否要翻到下一页。
在一级菜单下,按确定键会将光标此时所对应项的文件内容的前512个字节读到数组里并且将数组的前64个字节的内容显示在屏幕上,此时菜单级数标志位变成第二级菜单,此时删除键无效,前翻页和后翻页键将会成页的翻,翻到第8页再往后翻将会再读512个字节到数组里,当然你从第9页翻到第8页会将文件前512个字节的内容再读到数组里,文件可以读无限长,唯一缺点就是我无法设后翻页越界限制,如果要设置还要计算文件大小,我就偷了回懒,反正是学校的小比赛嘛,老师也看不出来,嘿嘿。
在一级菜单下,按删除键将会删除此条目的文件,删除功能函数暑假的程序里就有,直接拿来用就行了,删除完了之后对单片机进行软件复位即可
至于创建目录文件的这个按键我本来是想做个书签的,后来没时间了,我以为做个菜单很EASY的,结果居然那么纠结,编写是没用太长时间,只是后来优化用了很长时间,我最终没敢加书签功能,怕程序跑乱了我这个菜鸟就扛不住了,其实书签的实现我也有个基本思路,即便是没有E方ROM我可以将上一次读写文件的的位置以TXT文件的形式存在SD卡里,随便说说我也没验证过哦。
以上就是我的一点心得,由于时间比较久了,有些都不记得了,不足之处还请大侠们指教,就要准备考研了,对于考研我是一无所知,迫切希望得到前辈们的指点,豌豆恳请前辈们来信赐教!
wandou16@126.com
豌豆
2009年12月31号
用户1078219 2014-8-18 17:20
用户1409585 2014-6-6 13:53
用户439442 2013-9-10 10:19
用户1671410 2012-10-6 19:31
用户377235 2012-6-20 16:16
用户1619739 2012-4-9 22:30
用户85039 2011-12-1 20:02
用户1122030 2011-11-12 18:16
用户327900 2011-5-5 11:22
用户296596 2010-6-4 14:21