amobbs.com 阿莫电子技术论坛

标题: 挑战极限(一)!小玩意,AT89C2051驱动彩显玩方块游戏 [打印本页]

作者: cowboy    时间: 2009-2-16 22:34
标题: 挑战极限(一)!小玩意,AT89C2051驱动彩显玩方块游戏
89C2051能干什么?这次我打算用它来做个方块游戏,用彩显来显示。
但2051那点速度,那点内存,做起来好不容易。
没有PWM输出,只能用软件模拟彩显的行,场同步信号。
仅128 BIT内存,其中112字节用作显示缓存,剩下给系统的只有16字节了。
硬件倒是简单,所以就连洞洞板也没焊,拿个IC座空中搭桥来测试。
程序还有些BUG,迟些改好后再上传。

(原文件名:图1.jpg)


(原文件名:图2.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_源码[89C4051].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)


(原文件名:成品图.jpg)


(原文件名:方块游戏框图.JPG)


(原文件名:Tetris.PNG)
作者: watercat    时间: 2009-2-16 22:38
如果楼主的东西是真货,就快赶上雅达利了……

不过话说回来,我可不太认为如今这年头这种说法是褒奖……
作者: gliet_su    时间: 2009-2-16 22:44
不顶不行啊
作者: hyz_avr    时间: 2009-2-16 22:51
不错.支持...
作者: cowboy    时间: 2009-2-16 22:58
补上电路图

(原文件名:图4.PNG)
作者: luckroll    时间: 2009-2-16 23:09
支持
作者: kyughanum    时间: 2009-2-16 23:28
不顶不行啊!LZ能共享一下程序吗?最好是C的,呵呵!谢谢了!
作者: tage    时间: 2009-2-16 23:35
能不能行了,太强了。
作者: chaojiang    时间: 2009-2-16 23:42
强烈要求置酷!强烈要求原程序!
作者: cowboy    时间: 2009-2-16 23:44
一定就不是C程序了,不用汇编达不到这样的速度。
现在焊上了开关,耳机插座,可以玩了,不过声音不太好听,有待改进。
想配一首开机音乐,不知用哪首好听。
程序仍在改进中,尽些再上传吧。
下面是加了ipod形式开的和在液晶屏上显示效果图。

(原文件名:图5.jpg)


(原文件名:图6.jpg)
作者: stm32f103c8    时间: 2009-2-16 23:50
太强了
作者: ntkz    时间: 2009-2-17 00:09
牛!拜下

学习学习!
作者: hhjhhj    时间: 2009-2-17 00:50
牛人,服
作者: xiaobendan    时间: 2009-2-17 07:47
五体投地了!
作者: lanshuitianxia    时间: 2009-2-17 08:10
这电路搭的有个性
作者: yakin    时间: 2009-2-17 08:14
这也行啊
作者: litchiate    时间: 2009-2-17 10:40
太,强悍了...  没话说了..
作者: zook0k    时间: 2009-2-17 10:50
潜力帖,顶.
作者: af00    时间: 2009-2-17 11:39
51 有强大的生命力
作者: lookavr    时间: 2009-2-17 11:43
太强了
作者: holged    时间: 2009-2-17 12:59
恢复后第一次顶帖.
作者: tkdr2001    时间: 2009-2-17 13:26
太强了啊,一定要顶,学习!!!
作者: tkdr2001    时间: 2009-2-17 13:36
有意思啊
作者: astankvai    时间: 2009-2-17 15:58
好东西啊,顶.
作者: hecat    时间: 2009-2-17 16:02
不错!顶一下!
作者: hnywx    时间: 2009-2-17 16:40
顶顶顶顶顶顶
作者: wfbaaa    时间: 2009-2-17 16:58
顶顶顶,好东东
作者: bg6agf    时间: 2009-2-17 17:03
强。。。。好强。。。
作者: lin28    时间: 2009-2-17 17:08
开眼界了
作者: linfeng286    时间: 2009-2-17 17:10
MARK 牛
作者: kenson    时间: 2009-2-17 17:33
这么厉害!OX!!
作者: superyongzhe    时间: 2009-2-17 19:28
真是不佩服都不行!
作者: zcllsn    时间: 2009-2-17 19:38
厉害~我顶你!
作者: dcss    时间: 2009-2-17 20:59
这个不顶不行啊,实在是牛人啊
作者: cowboy    时间: 2009-2-18 10:38
前两天没空,今天看了下存在的BUG,一时没有什么好的解决方法,请大家出点主意。
问题是如何判断不同形状的方块在移动时是否移出窗外。
试了好几种算法,都很复杂,简单的算法有些不正确,居然卡在这里。
具体情况是用一个8位变量L表示方块原点坐标(x,y),L的低3位表示x,范围0~7,L的bit3~bit6表示y,范围2~15.如何能用便捷的方法判定7种不同方块及4个不同的旋转角度在移动到某坐标时是否越界?
作者: flyunlimit    时间: 2009-2-18 13:09
焊工和编程能力都很了得。
作者: hyz_avr    时间: 2009-2-18 13:15
先移(或旋转)再判断..
作者: maidong    时间: 2009-2-18 13:28
以前也想过实现俄罗斯方块的游戏,VGA显示没用单片机做过,希望能得到源程序看一下。
作者: playboy11    时间: 2009-2-18 13:50

作者: jaky80000    时间: 2009-2-18 16:05
强烈顶!
LZ是否能把它转成C,然后贴出来,供大家学习一下啊
作者: lyp103    时间: 2009-2-18 16:13
这么好的贴,很好看,很好玩,很有劲
作者: lyp103    时间: 2009-2-18 16:17
建议楼主先讲一下原理,而后大家在一起想办法解决问题
作者: skoo    时间: 2009-2-18 16:57
ding.....
作者: af00    时间: 2009-2-18 17:08
【34楼】 cowboy
查表应该可以
作者: cowboy    时间: 2009-2-18 17:22
呵呵,现在我也想到了查表,应该可以,就是多花点空间,晚上试试
作者: xian_heping    时间: 2009-2-18 17:54
牛人
作者: luojunzhou    时间: 2009-2-18 18:43
这个要顶一下
作者: lukeunderwood    时间: 2009-2-18 19:13
太强了,期待源码
作者: kewxke    时间: 2009-2-18 19:23
这个VGA接口的是怎么通讯的?
作者: h2feo4    时间: 2009-2-18 19:34
十分佩服,学习了
作者: xintrone    时间: 2009-2-18 19:40
强人,期待程序,汇编无所谓。
作者: zxttgg    时间: 2009-2-18 20:30
是4051
作者: zxttgg    时间: 2009-2-18 20:30
是4051
作者: cowboy    时间: 2009-2-18 22:51
回楼上,手头没有2051,所以用4051代着。目前代码编译后还不够1.5K,用2051完全可以装得下。
之前的越界判断算法,现在用查表基本解决了,正在测试中。
加了一首开机音乐,决定用阿牛的《桃花朵朵开》前奏。
加了一条记分级别状态条,在窗口左侧,分数高柱子就越高。
正打算做一个小图标在窗口右侧,用来提示下一个方块的形状。
作者: jaky80000    时间: 2009-2-19 08:19
【53楼】 cowboy
感兴趣的人,很多啊,是不是给大家讲讲思路啊,或是转成C的,把代码分享一下,大家换一个MCU就可以学习了....
作者: cowboy    时间: 2009-2-19 11:15
既然大家感兴趣,我就先简单地说一下思路,程序的要点是:
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)

(原文件名:方块游戏框图.JPG)
作者: honami520    时间: 2009-2-19 11:20
大哥,你这个我很感兴趣啊!可以详细说说VGA标准吗?我觉得这个很有玩头!!!!!!!
作者: bozai    时间: 2009-2-19 11:33
佩服,就冲2051这么点资源。。。。
作者: ivws    时间: 2009-2-19 12:07
应了那句话,没有单片机做不到,只有你想不到。
作者: sunmy    时间: 2009-2-19 12:27
牛!
支持!
作者: patrickwong    时间: 2009-2-19 15:33
楼主能力真强, 很佩服.

早阵子我跟著一个外国的开源CPU项目搞了个硬件,蛮好玩的. 不过作者弄的VGA部份比较占空间(六块PCB),我就想可不可以接一片ISA总线的VGA卡来显示. 应该是可行的, 这个网站 (http://tinyvga.com/avr-isa-vga) 有用单片机接VGA卡的实例. 不过她本身的设计是用ATMega128的, 我想学习移到51上实验一下, 不过汇编部份搞不懂就暂时搁置了.

楼主若有时间及兴趣可否提点一下?

大家若对开源CPU项目有兴趣可到他的网页浏览一下, http://www.mycpu.eu/, 作者也不赖的, 除了CPU外也弄了个实时操作系统.
作者: boat030    时间: 2009-2-19 21:12
简直是把51玩到炉火纯青的地步了,用软件模拟VGA信号!强!很强!
作者: srygg    时间: 2009-2-19 21:27
等楼主这个项目搞定了,是不是指导大家做个VGA的信号发生器,方便我们修显示器的时候用!
作者: 51mcu51    时间: 2009-2-19 22:06
顶一下,楼主的钻研精神值得我们学习
作者: qzzz    时间: 2009-2-20 00:43
太强了,强烈支持!
作者: haomaiggq    时间: 2009-2-20 08:08
佩服。。。。。。
作者: yeyu1234    时间: 2009-2-20 09:40
牛!
支持!
作者: zaixian    时间: 2009-2-20 09:58
很强悍...51就要用asm才够速度,,,那么用片avr,用c编程速度够了吧!!!!!!!!
另外换1T的51,比如stc10/11 F系列,估计用c页可以了,,,,

看能否移植一下...
作者: 418425051    时间: 2009-2-20 09:59
佩服佩服
作者: zaixian    时间: 2009-2-20 10:03
建议:【55楼】 cowboy

你去stc申请6片,stc新版1T的mcu吧(免费),发个传真就有了......
这样你可以试试用c编译.....
作者: 37150839    时间: 2009-2-20 10:12
非常不错,顶牛人!
作者: cowboy    时间: 2009-2-20 10:29
只要有硬件PWM的MCU,都能产生VGA时序,其它的功能都可以用一般编程的方法,用C来编。AT的2051能行的,STC的也行,AVR也行。
游戏程序也不算难,只是要多花点时间和心思。我也曾用ARM做过方块程序,由于资源丰富,编程容易多了。用2051来做,只是想求证一下低档MCU的极限能力有多强。
转个关于VGA时序的文章,希望对大家有所帮助,http://www.eda121.com/arm/yyarnm/200709/698.html
55楼的程序还有些BUG,程序仍在完善中...
作者: cowboy    时间: 2009-2-20 10:39
顺便提一下,电路中晶体标识为24MHz,实际要用用24.1680 MHz才能符合标准。用24MHz晶体,可能有某些显示器不接受。
作者: liulwn    时间: 2009-2-20 11:16
相当牛!!
作者: KMZHH    时间: 2009-2-20 11:19
牛人,佩服佩服!
作者: zrx737    时间: 2009-2-20 11:26
这个太牛了
作者: jaky80000    时间: 2009-2-20 12:14
【71楼】 cowboy
虽然能看懂汇编,但还是不太容易,强烈建议LZ把他转成C,让大家理解下,我非常想来试验下.(我都跟了好几帖了 :))谢谢!
作者: gzcc    时间: 2009-2-20 12:19
顶一个
作者: xiaozhiyong    时间: 2009-2-20 15:12
这个一定要做出来看一下。。。

VGA一定要研究一下,想用M8+C实现,不知速度可以吗用8M的晶振..
作者: cowboy    时间: 2009-2-20 16:05
【76楼】 jaky80000,没有C来编是因为C的效率达不到,汇编中的一些技巧也是C不能实现的,所以即使转换成C也不能正常运行了。按贴子上所提供的资料,用其它高性能的MCU来实现,我想大多数的朋友都能编出来。
作者: xiaozhiyong    时间: 2009-2-20 16:54
AVR不是速度比51快吗??用C之后,慢一点应该问题不大吧,因为它的整体速度比51快。。。

??
作者: guaibaobao    时间: 2009-2-20 20:21
楼主实在是强人呀!

按照楼主的思路用不了C的,没有办法控制代码的(长度)执行时间,估计AVR的芯片用硬件来产生行频和场频也许有些可行,但是估计用C问题很多(或者不可行)!
作者: jaky80000    时间: 2009-2-20 21:38
【79楼】 cowboy
这个我了解,C用在2051上肯定是不行的,我们可选择更高级一些的单片机来做的,就是因为没有搞过VGA,所以没有什么头绪,相信很多人都看到了你这个帖都很有兴趣用更高级的MCU,用C来实现它,这样大家就能更好的立即驱动VGA的时序了。
谢谢!
作者: xiaozhiyong    时间: 2009-2-20 22:02
请问楼主,对于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地址码 ( 各家定义不同 )
作者: cowboy    时间: 2009-2-20 22:14
所有的地连在一起统一接地,其它的不用接。
作者: snn_snn    时间: 2009-2-21 01:10
marker
作者: zajia    时间: 2009-2-21 01:22
这么好的贴子,顶!同时严重批评自己开了争议贴。
作者: zaixian    时间: 2009-2-21 08:27
晶体实际要用24.1680 MHz才能符合标准

那么用24.576,或者24.5M、30M、可以么???(手上只有那么3种)。。。
作者: xiaozhiyong    时间: 2009-2-21 10:17
再问cowboy:那个P1.5和P1.3为什么要那样接,难道是一个简单的数模转化?那P1.4和P1.2为什么不也接一个呢???

正在分析你的电路图,请指点。。万分感谢。。
作者: xiaozhiyong    时间: 2009-2-21 10:34
这是我在P1.3口看到的波形,好像是有负电压的成分,是那个P1.5产生的吗?这是不是就是我说的一个简单数模转化。。


(原文件名:clip_image002.jpg)

如果是这样的话,我要显示一张图(RGB全色)是不是就得给其它的两个通道也加一个这样的电路呢???

期待指点中。。。
作者: cowboy    时间: 2009-2-21 10:39
P1.5是一亮度控制引脚,和P1.3(绿色信号)连接,可以产生高亮绿色和墨绿色。在方块主窗口的边框中使用墨绿色,使其避免与绿色的方块混在一起。我新版程序中将还要利用其产生一个橙色的计分柱。至于P1.2(红),P1.4(蓝)为何也不加一个,是因为MCU处理能力有限,不要搞得太复杂。当然用其它MCU,更可以产生更多种绚丽的色彩。
作者: cowboy    时间: 2009-2-21 10:45
RE:【87楼】 zaixian 来来,晶体频率最好不要偏离太远,我目前用的是24.166MHz,在三台不同彩显上测试都能正常显示。一般来说CTR显示器的适应范围可能较强,LCD显示器可能对频率要求较严谨。
作者: cowboy    时间: 2009-2-21 10:53
RE:【82楼】 jaky80000,要转成C程序可能有点困难,抱歉我C的功底不深,有些处理在C里实在不知如何表达,只能在新版程序中多加点注释了,再配合框图和上面的VGA资料,可能不会太难了吧。个别细节的地方,可以跟贴单独来讨论。
作者: edonkey    时间: 2009-2-21 12:02
di好贴,
mark
作者: xiaozhiyong    时间: 2009-2-21 14:58
哈哈,我的也成功显示,接下来想好好研究一下楼主的程序。。。


(原文件名:IMG0410A.jpg)


(原文件名:IMG0411A.jpg)


(原文件名:IMG0412A.jpg)


(原文件名:IMG0413A.jpg)


(原文件名:IMG0414A.jpg)
作者: micmk    时间: 2009-2-21 15:08
KAO.理论上不可能滴.行场色差你用12.5M的2051去搞...
作者: cowboy    时间: 2009-2-21 15:33
呵呵,94楼这么快呀!红蓝信号线对调了
作者: xiaozhiyong    时间: 2009-2-21 16:57
是吗,我再检查检查。。。可能插反了。

对了,我还是想问一下,对于一幅画面的显示,我还是有点不明白。能不能把一幅画显示的时序,画来看看呀。

下面这个时序的数据如何传呀,有大小吗,如红色60%。。之类


(原文件名:20070919170420847.jpg)
作者: cowboy    时间: 2009-2-21 17:07
不好意思是我电路图的BLUE和RED标反了。
VGA传送的是模拟信号,幅度为0~0.75V,如红色60%,就是在红色信号线上加0.45V.
作者: xiaozhiyong    时间: 2009-2-21 18:08
如何加0.45V,,上面的电路能实现吗??




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4