最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com
弄了几天的Proteus仿真,终于觉得自己想做的东西,已经全部用Proteus仿真过了,应该可以动手做了。于是先用Proteus画好原理图,再用ARES画好PCB板图——虽然我只是用洞洞板焊接,但是有个PCB板图做参照,连线会容易很多。花了两个小时,去中关村买了必要的原件,开始动手。
单片机用的是STC89C552RC,原因除了价廉物美之外,最大的原因是,STC的单片机可以直接使用串口往里面下程序,这样我可以直接焊接好板子,然后连接好串口,一边写一边调试,不用把单片机拿来拿去了。为了焊的好看些,把线基本都布在了反面,前前后后,修修改改,共焊了3天才弄好,搞得眼睛一闭上都是洞洞板的圈圈。
不过通过这次的实际制作,还真发现了不少Proteus仿真中不会想到的问题,现记录如下,希望以后再碰到时,可以作为参考。
碰到的第一个问题,就是程序怎么也下载不到单片机中去。在Proteus仿真的时候,并不需要往单片机中写程序,编译好后,程序就已经在单片机中了,但是实际制作时,就得编译一次程序,下载一次。结果我在下载时,发现提示“不能连接到串口”,让我实在是头疼不已。试着用“串口助手”往单片机发数据时,发现数据指示类会闪烁,说明线路是通了。百思不得其解之下,同事提醒我说,是不是你这两个数据传送指示灯有问题?虽然我觉得成分的不可能,可是试着把两个LED灯去掉之后,还真可以了……
这是先前的电路图(省略MAX232芯片)
结果串口在给单片机发数据的时候,灯是会闪烁的,让我坚定的以为,串口的通路是没问题的。后来把电路改成这样,串口不能通信,不能下载程序的问题就好了
终于把串口弄好了,程序下载到了单片机上,结果效果和proteus上模拟的完全不一样。Proteus上的话,1602显示器直接就显示数据了,结果到了现实,什么都没有……死命的调节对比度电阻,也还是什么都没有,真的感觉无从下手了。后来去群里问,群里的老大给了一个示例程序,用上去也还是不行,这让我真的是感觉要崩溃了。不过想想焊了这么多天,放弃实在是不甘心,于是把所有和液晶显示不相关的代码全注释掉了,突然发现莫名其妙的,液晶出现了色块——当时感觉是太开心了,一天了,终于液晶上有显示了!不过此时仍然不能设置显示字符,不过相比没有任何显示已经好太多了。
同样的代码,为什么这次可以了呢?仔细的分析了代码,发现这次的代码,唯一的不同,就是我为了少写几个字,延时函数用的是群里老大给的。这是唯一的不同之处。比对一下两个延时1毫秒的函数。
我自己的:
void delay(unsigned char ms)
{
unsigned char i,j;
for(i=0; i<ms; i++)
for(j=0; j<120; j++);
}
群里老大给的:
void delay(int ms)
{
int i,j;
for(i=0; i<ms; i++)
for(j=0; j<120; j++);
}
没错,两个函数唯一的区别,就是变量的类型,我写的时候,看变量都不会超过255,为了省点空间,定义的都是unsigned char,而一般的延时函数,用的是int类型,就是这两个变量类型的不同,导致了延时的不同,同样是想延时1毫秒,我的函数实际上只能延时0.4到0.5毫秒左右,就是这个的区别,让我在操作液晶时,各个时序的延时不够,给液晶的命令不能到达。后来修改后,再修改了一下程序其他地方,终于让液晶正确的显示了。
再说一个比较郁闷的事情,在Proteus里面,1602是这样显示的
买来实物后,我也理所当然的认为,有焊点的是下方(事实上我确实认为这样比较符合心理,哈哈)。结果程序写后好,一显示出来,全倒过来了…………
不管怎么说,今天总算让板子上的元件都工作正常了。明天开始改程序,实现具体功能。