挑战极限(一)!小玩意,AT89C2051驱动彩显玩方块游戏
89C2051能干什么?这次我打算用它来做个方块游戏,用彩显来显示。但2051那点速度,那点内存,做起来好不容易。
没有PWM输出,只能用软件模拟彩显的行,场同步信号。
仅128 BIT内存,其中112字节用作显示缓存,剩下给系统的只有16字节了。
硬件倒是简单,所以就连洞洞板也没焊,拿个IC座空中搭桥来测试。
程序还有些BUG,迟些改好后再上传。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418481.jpg
(原文件名:图1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418482.jpg
(原文件名:图2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418484.jpg
(原文件名:图3.jpg)
以下蓝色文字由版主:xuyiyi 于:2009-08-18,13:08:51 加入。
呵呵,终于做好了,并加了个动感的开机动画,先上视频。
点击此处下载 ourdev_421910.rar(文件大小:2.53M) (原文件名:Tetris.rar)
最新版原理图及 PCB图,终结完美版。
点击此处下载 ourdev_433410.rar(文件大小:49K) (原文件名:终结版VGA_3.rar)
俄罗斯方块游戏源码:
点击此处下载 ourdev_433333.rar(文件大小:12K) (原文件名:俄罗斯方块游戏_V33_源码.rar)
俄罗斯方块游戏Hex码:
点击此处下载 ourdev_472211.rar(文件大小:3K) (原文件名:Tetris33 4051 hex file.rar)
网友 cowboy 设计总结:
整板测试完毕,基本满意。还有一些小毛病:
1、显示网格信号时,发现有轻微拖尾现象,发现是下拉电阻R13(3.3K)过大所致,改为1K后正常。
2、三极管封装丝印画反了,所有三极管全部转 180度安装才正确,即将 C, E 引脚对换。
切记不要按丝印的那个“D”形来安装,要转180度才正确。
3、电源退耦电容小了点,当扬声器阻抗较低,且电源内阻大时,画面有些干扰。
----------------------------------------------------------------------------------------------
网友 xiaozhiyong 测试 LS2051 总结:
LS2051测试成功了。
关于LS2051每运行一条语句只用一个机器周期,所以在AT2051里的双周期语句后都得加NOP。我改了以后试了下发现能用,现在先发个暂时看着能用的程序。以下是测试程序:
点击此处下载 ourdev_433306.rar(文件大小:2K) (原文件名:LS2051test.rar)
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_454451.jpg
(原文件名:成品图.jpg)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_420123.JPG
(原文件名:方块游戏框图.JPG)
http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_425639.PNG
(原文件名:Tetris.PNG) 如果楼主的东西是真货,就快赶上雅达利了……
不过话说回来,我可不太认为如今这年头这种说法是褒奖…… 不顶不行啊 不错.支持... 补上电路图
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418501.PNG
(原文件名:图4.PNG) 支持 不顶不行啊!LZ能共享一下程序吗?最好是C的,呵呵!谢谢了! 能不能行了,太强了。 强烈要求置酷!强烈要求原程序! 一定就不是C程序了,不用汇编达不到这样的速度。
现在焊上了开关,耳机插座,可以玩了,不过声音不太好听,有待改进。
想配一首开机音乐,不知用哪首好听。
程序仍在改进中,尽些再上传吧。
下面是加了ipod形式开的和在液晶屏上显示效果图。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418539.jpg
(原文件名:图5.jpg)
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418540.jpg
(原文件名:图6.jpg) 太强了 牛!拜下
学习学习! 牛人,服 五体投地了! 这电路搭的有个性 这也行啊./emotion/em052.gif 太,强悍了...没话说了.. 潜力帖,顶. 51 有强大的生命力 太强了 恢复后第一次顶帖. 太强了啊,一定要顶,学习!!! 有意思啊 好东西啊,顶. 不错!顶一下! 顶顶顶顶顶顶 顶顶顶,好东东 强。。。。好强。。。 开眼界了 MARK 牛 这么厉害!OX!! 真是不佩服都不行! 厉害~我顶你! 这个不顶不行啊,实在是牛人啊 前两天没空,今天看了下存在的BUG,一时没有什么好的解决方法,请大家出点主意。
问题是如何判断不同形状的方块在移动时是否移出窗外。
试了好几种算法,都很复杂,简单的算法有些不正确,居然卡在这里。
具体情况是用一个8位变量L表示方块原点坐标(x,y),L的低3位表示x,范围0~7,L的bit3~bit6表示y,范围2~15.如何能用便捷的方法判定7种不同方块及4个不同的旋转角度在移动到某坐标时是否越界? 焊工和编程能力都很了得。 先移(或旋转)再判断.. 以前也想过实现俄罗斯方块的游戏,VGA显示没用单片机做过,希望能得到源程序看一下。 顶 强烈顶!
LZ是否能把它转成C,然后贴出来,供大家学习一下啊 这么好的贴,很好看,很好玩,很有劲 建议楼主先讲一下原理,而后大家在一起想办法解决问题 ding..... 【34楼】 cowboy
查表应该可以 呵呵,现在我也想到了查表,应该可以,就是多花点空间,晚上试试 牛人 这个要顶一下 太强了,期待源码 这个VGA接口的是怎么通讯的? 十分佩服,学习了 强人,期待程序,汇编无所谓。 是4051 是4051 回楼上,手头没有2051,所以用4051代着。目前代码编译后还不够1.5K,用2051完全可以装得下。
之前的越界判断算法,现在用查表基本解决了,正在测试中。
加了一首开机音乐,决定用阿牛的《桃花朵朵开》前奏。
加了一条记分级别状态条,在窗口左侧,分数高柱子就越高。
正打算做一个小图标在窗口右侧,用来提示下一个方块的形状。 【53楼】 cowboy
感兴趣的人,很多啊,是不是给大家讲讲思路啊,或是转成C的,把代码分享一下,大家换一个MCU就可以学习了.... 既然大家感兴趣,我就先简单地说一下思路,程序的要点是:
1 产生精准的VGA信号时序
受速度限制,VGA显示模式用最低的640*480@60Hz,这时行频是31.46875K,场频率是59.94Hz.如果单片机有硬件PWM,则行场同步信号可以轻易用PWM实现.由于2051没有PWM,只能用软件模拟,并且不能用定时中断的方式,因为要求速度太高,中断响应速度不够快,且响应时间也不一致,所以本程序中都是把行同步信号穿插在程序的各个适当位置,类似于双线程并行执行,主振也选用2051能承受的最高频率24MHz.
2 合理分配内存.
2051只有128字节内存,要储存一幅画面,显示缓存就需占大部分.主窗口内的面积越大,占用内存就越多.经估算窗口内用14行*8列比较合适.此时显示缓冲占用112字节.余下的16字节用于程序中的工作寄器5字节, 堆栈2字节,其它为全局量.
3 协调各个功能模块之间的工作配合
系统的任务不算多,主要的有显示处理,同步处理,音效处理,按键处理,游戏规则处理(包括方块移动,定时下落,重叠检测,越界检测,得分计数,速度升级).各任务之间协调用类似于状态机的方法,但又不完全等同.由于是用汇编,在很多情况下充分利用汇编的灵活性,使程序的模块化不是很明显.系统的主循环选用显示一帧的时间约16.66MS(60Hz),所有任务必须在这时间内处理完成.
由于程序还在完善中,先发一个临时的版本,大家一起来改进.不是正式版本,注释较少,如果不明之处再单独讨论吧.
点击此处下载 ourdev_420122.rar(文件大小:5K) (原文件名:Tetris11.rar)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_420123.JPG
(原文件名:方块游戏框图.JPG) 大哥,你这个我很感兴趣啊!可以详细说说VGA标准吗?我觉得这个很有玩头!!!!!!! 佩服,就冲2051这么点资源。。。。 应了那句话,没有单片机做不到,只有你想不到。 牛!
支持! 楼主能力真强, 很佩服.
早阵子我跟著一个外国的开源CPU项目搞了个硬件,蛮好玩的. 不过作者弄的VGA部份比较占空间(六块PCB),我就想可不可以接一片ISA总线的VGA卡来显示. 应该是可行的, 这个网站 (http://tinyvga.com/avr-isa-vga) 有用单片机接VGA卡的实例. 不过她本身的设计是用ATMega128的, 我想学习移到51上实验一下, 不过汇编部份搞不懂就暂时搁置了.
楼主若有时间及兴趣可否提点一下?
大家若对开源CPU项目有兴趣可到他的网页浏览一下, http://www.mycpu.eu/, 作者也不赖的, 除了CPU外也弄了个实时操作系统. 简直是把51玩到炉火纯青的地步了,用软件模拟VGA信号!强!很强! 等楼主这个项目搞定了,是不是指导大家做个VGA的信号发生器,方便我们修显示器的时候用! 顶一下,楼主的钻研精神值得我们学习 太强了,强烈支持! 佩服。。。。。。 牛!
支持! 很强悍...51就要用asm才够速度,,,那么用片avr,用c编程速度够了吧!!!!!!!!
另外换1T的51,比如stc10/11 F系列,估计用c页可以了,,,,
看能否移植一下... 佩服佩服 建议:【55楼】 cowboy
你去stc申请6片,stc新版1T的mcu吧(免费),发个传真就有了......
这样你可以试试用c编译..... 非常不错,顶牛人! 只要有硬件PWM的MCU,都能产生VGA时序,其它的功能都可以用一般编程的方法,用C来编。AT的2051能行的,STC的也行,AVR也行。
游戏程序也不算难,只是要多花点时间和心思。我也曾用ARM做过方块程序,由于资源丰富,编程容易多了。用2051来做,只是想求证一下低档MCU的极限能力有多强。
转个关于VGA时序的文章,希望对大家有所帮助,http://www.eda121.com/arm/yyarnm/200709/698.html
55楼的程序还有些BUG,程序仍在完善中... 顺便提一下,电路中晶体标识为24MHz,实际要用用24.1680 MHz才能符合标准。用24MHz晶体,可能有某些显示器不接受。 相当牛!! 牛人,佩服佩服! 这个太牛了 【71楼】 cowboy
虽然能看懂汇编,但还是不太容易,强烈建议LZ把他转成C,让大家理解下,我非常想来试验下.(我都跟了好几帖了 :))谢谢! 顶一个 这个一定要做出来看一下。。。
VGA一定要研究一下,想用M8+C实现,不知速度可以吗用8M的晶振.. 【76楼】 jaky80000,没有C来编是因为C的效率达不到,汇编中的一些技巧也是C不能实现的,所以即使转换成C也不能正常运行了。按贴子上所提供的资料,用其它高性能的MCU来实现,我想大多数的朋友都能编出来。 AVR不是速度比51快吗??用C之后,慢一点应该问题不大吧,因为它的整体速度比51快。。。
?? 楼主实在是强人呀!
按照楼主的思路用不了C的,没有办法控制代码的(长度)执行时间,估计AVR的芯片用硬件来产生行频和场频也许有些可行,但是估计用C问题很多(或者不可行)! 【79楼】 cowboy
这个我了解,C用在2051上肯定是不行的,我们可选择更高级一些的单片机来做的,就是因为没有搞过VGA,所以没有什么头绪,相信很多人都看到了你这个帖都很有兴趣用更高级的MCU,用C来实现它,这样大家就能更好的立即驱动VGA的时序了。
谢谢! 请问楼主,对于VGA接口的数据线,应该怎么接,我指的是那些除你的电路图上标出的以外的那些线,如red ground ,green ground ,blue ground,sync ground,...等等,希望你能给我一点指点,希望你能给出所有的线都应该如何接,没有接的也说明,,谢谢,我打算明天也做一下你那个实验。。。。
请求指点呀。。
Pin
Name
Dir
Description
1
RED
Red Video (75 ohm, 0.7 V p-p)
2
GREEN
Green Video (75 ohm, 0.7 V p-p)
3
BLUE
Blue Video (75 ohm, 0.7 V p-p)
4
ID2
Monitor ID Bit 2
5
GND
Ground
6
RGND
Red Ground
7
GGND
Green Ground
8
BGND
Blue Ground
9
KEY
-
Key (No pin)
10
SGND
Sync Ground
11
ID0
Monitor ID Bit 0
12
ID1 or SDA
Monitor ID Bit 1
13
HSYNC or CSYNC
Horizontal Sync (or Composite Sync)
14
VSYNC
Vertical Sync
15
ID3 or SCL
Monitor ID Bit 3
管脚 定义
1 红基色 red
2 绿基色 green
3 蓝基色 blue
4 地址码 ID Bit
5 自测试 ( 各家定义不同 )
6 红地
7 绿地
8 蓝地
9 保留 ( 各家定义不同 )
10 数字地
11 地址码
12 地址码
13行同步
14场同步
15地址码 ( 各家定义不同 ) 所有的地连在一起统一接地,其它的不用接。 marker 这么好的贴子,顶!同时严重批评自己开了争议贴。 晶体实际要用24.1680 MHz才能符合标准
那么用24.576,或者24.5M、30M、可以么???(手上只有那么3种)。。。 再问cowboy:那个P1.5和P1.3为什么要那样接,难道是一个简单的数模转化?那P1.4和P1.2为什么不也接一个呢???
正在分析你的电路图,请指点。。万分感谢。。 这是我在P1.3口看到的波形,好像是有负电压的成分,是那个P1.5产生的吗?这是不是就是我说的一个简单数模转化。。
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421197.jpg
(原文件名:clip_image002.jpg)
如果是这样的话,我要显示一张图(RGB全色)是不是就得给其它的两个通道也加一个这样的电路呢???
期待指点中。。。 P1.5是一亮度控制引脚,和P1.3(绿色信号)连接,可以产生高亮绿色和墨绿色。在方块主窗口的边框中使用墨绿色,使其避免与绿色的方块混在一起。我新版程序中将还要利用其产生一个橙色的计分柱。至于P1.2(红),P1.4(蓝)为何也不加一个,是因为MCU处理能力有限,不要搞得太复杂。当然用其它MCU,更可以产生更多种绚丽的色彩。 RE:【87楼】 zaixian 来来,晶体频率最好不要偏离太远,我目前用的是24.166MHz,在三台不同彩显上测试都能正常显示。一般来说CTR显示器的适应范围可能较强,LCD显示器可能对频率要求较严谨。 RE:【82楼】 jaky80000,要转成C程序可能有点困难,抱歉我C的功底不深,有些处理在C里实在不知如何表达,只能在新版程序中多加点注释了,再配合框图和上面的VGA资料,可能不会太难了吧。个别细节的地方,可以跟贴单独来讨论。 di好贴,
mark 哈哈,我的也成功显示,接下来想好好研究一下楼主的程序。。。
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421257.jpg
(原文件名:IMG0410A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421258.jpg
(原文件名:IMG0411A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421259.jpg
(原文件名:IMG0412A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421260.jpg
(原文件名:IMG0413A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421261.jpg
(原文件名:IMG0414A.jpg) KAO.理论上不可能滴.行场色差你用12.5M的2051去搞... 呵呵,94楼这么快呀!红蓝信号线对调了 是吗,我再检查检查。。。可能插反了。
对了,我还是想问一下,对于一幅画面的显示,我还是有点不明白。能不能把一幅画显示的时序,画来看看呀。
下面这个时序的数据如何传呀,有大小吗,如红色60%。。之类
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421285.jpg
(原文件名:20070919170420847.jpg) 不好意思是我电路图的BLUE和RED标反了。
VGA传送的是模拟信号,幅度为0~0.75V,如红色60%,就是在红色信号线上加0.45V. 如何加0.45V,,上面的电路能实现吗??