keil里的c或asm源代码,keil编译生成的文件,keil工程文件和相应的proteus工程文件都放在一个文件夹下,链接以zip包形式给出。
keil用的是uVersion4, Proteus用的是7.4 sp3
道客巴巴上的《89c51单片机入门》上的例子以及其中未提供源代码的练习,每个都在proteus上仿真过。
1.包含初期的很多简单的汇编程序,主要是led,按钮以及定时器/计数器相关的练习
http://files.cnblogs.com/PrajnaKit/FirstProteusProject.zip
2.通过蜂鸣器/扬声器播放音乐的练习。《89c51单片机入门》里提供的代码无法仿真,我又从网上找了个《兰花草》的音乐播放程序,可以成功仿真。
蜂鸣器/扬声器发声原理:通过改变通断之间的延时来改变发出的音调,通过重复这种通断的延时来达到控制发出声音的长短。
http://files.cnblogs.com/PrajnaKit/musicPlayer.zip
3.定时器/计数器的中断以及配合使用,外部时钟输入等
http://files.cnblogs.com/PrajnaKit/timer_counter.zip
正在做键盘的实验,花了一天时间才把键盘查表程序完成,主要是学到jmp @a+dptr的用法,还得继续。。。
【更新1】
键盘的软件去抖实验,以及用函数表去除冗余代码的改进;led流水灯控制实验,以及文中提到的可改进的几点。
这几个改进调试了我几天时间,因为几个低级的错误导致程序运行异常,看注释就知道了。
接下来要搞矩阵键盘了,开始前要把硬件去抖学习下。
【更新2】
这两个月不知道怎么搞的,累的要死,根本没有精神写代码。现在终于恢复过来了,把以前写的矩阵键盘代码草稿整理了一下,下一个就是数码管了!
不过这个矩阵键盘代码得来实在是不轻松。网上找到两份源码,不过代码的可读性很差,我都懒得分析他们的源码,于是就自己动手写,反正原理就是扫描呗。两个月前想写代码的时候,想到需要显示设备,就想到了七段数码管,一种最简单的显示设备。所以先写了个数码管的功能测试程序,等理解了数码管的工作原理后才开始写键盘程序。
一开始是写完了程序才开始调试,结果错误多的无从下手。今天早上对着写的程序草稿,写一点调试通过再往下写。虽然慢了点,但是很有效,原来那个草稿给我几天都说不定调不通。希望我的代码别人能看得懂,看起来舒服,这是对我最大的安慰,当然英文要过关。
http://files.cnblogs.com/PrajnaKit/matrixKeyboard.zip
【更新3】
数码管的程序,没有什么新鲜的东西,倒是有个问题需要注意一下:数码管动态显示的时候会看到闪烁,而矩阵键盘实验中的却没有,难道在真实硬件环境下就看不到闪烁了吗?这个以后再确认吧。
【更新4】
字符lcd显示器LM016L的实验,原始的程序是从一篇论文里找的。按着论文里的步骤仿真实验成功后,觉得还没有把44780控制器的全部功能展示出来,而且代码在同一个文件里,代码结构不合理。我先把测试代码和驱动分开到不同文件,delay也一样。然后又觉得用汇编传递参数不是很方便,用汇编写测试代码就更不方便了。因为改动可能会很大,所以装了mingw和git,把代码先扔到版本库中保存起来以防万一。
准备工作都做好后,就为驱动增加了一套C的接口方法,把用汇编写的测试代码全部用C来实现,因为有之前混合汇编的研究,代码改起来就很轻松了。接下来要做的就是把HD44780所有的功能都发挥出来。指令datasheet里都有,可是自己写的代码却总不能按自己预期的运行,是时候开始收集keil的调试方法了。首先单独的keil调试基本的都会,那能不能用printf打log呢?用了网上的方法也办到了。之前keil和proteus连调没搞起来,这回试了一下可以了。原来不能在proteus里单步调试,要到keil中单步调,这样在proteus里就能看到效果了。还有发现了一点就是,printf方法不会在连调的时候打印出来,这点要注意,不知道谁能解决这个问题。
但即使打印出地址和数据,我还是一头雾水。对lcd的工作机制还是不明白。我又仔细分析datasheet里的架构图,终于发现了线索,原来datasheet里就有,就是40segment和16common,datasheet的后半部分详细讲解了字符显示的原理,再往后看就发现了例子代码,哈哈。照着敲到keil里,都能顺利的仿真,也帮助我找到了之前不能按预期运行的原因:S位没设置而不能滚屏。因为延时太短导致看不到字符的滚动,于是把延时调到最大,字符动画出来了!
字符lcd驱动的探索就到此为止,基本上全部功能都比较清楚了,下一个是图形lcd咯,好激动!!!
http://files.cnblogs.com/PrajnaKit/CharLCDExperiment.zip
【更新5】
原始代码和proteus里的图都是网上找的,由于代码的可读性太差,加上只实现了T6963的少数功能,所以我自己根据datasheet写了驱动,再把网上找到的代码改造了一遍,这次先给出一个1.0的版本,后面会改bug以及添加完整的lcd控制器功能的测试代码。在写代码前认真思考了一下代码的组织结构,但由于一些编译器的限制,比如sbit不能在多个文件间共享,文件的层次无法做到完美,不过也不算太差。
http://files.cnblogs.com/PrajnaKit/GraphicLCD.zip
【更新6】
图形LCD的debug后的版本,主要是一个显存布局上的错误,会导致屏幕上有莫名其妙的方块符号,还有就是把字显示完整。显存布局的图画出来,bug的原因还是没找到,在尝试着修改认为不正确的代码后,终于试出来是因为字符内存分配的太少导致的诡异的显示问题,关键的地方加了详细的注释,理解起来应该不会困难了。
51单片机的学习要告个段落了,我的第一个AVR单片机例子已经完成了,用的是AVR Studio 5加proteus,入门依靠的是华东师范大学马潮老师的《AVR单片机嵌入式系统原理与应用实践》。之所以转向AVR,是由于我学单片机的目的本来就是制作游戏,而51单片机的配置实在是太低了,也能做简单的游戏,但实在是含有太少的游戏元素了,所以就想学配置更好一点的单片机。51无法做文件系统,spi接口要自己搭电路,游戏有很多图形文件,总不能全部放在内存里吧,基于这些考虑才做出的决定。网上有人说单片机入门从51-AVR-ARM是一条有效的途径,我自己体会下来觉得还是蛮有道理的。我将另外写avr studio 5 + proteus的源程序更新文章,相信不久后就会给出。