原创 单片机DIY 【全程指导—图文并茂2 】

2008-7-24 14:18 2000 7 7 分类: MCU/ 嵌入式

点击下载里面有内容及图片


3.自制单片机之三-----AT89S51ISP下载线的制做<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />




最小系统板做好了,接下来就是做根ISP下载线了。否则程序怎么写到AT89S51芯片里呢?


在网上查了一下,ISP下载线的种类主要取决于PC端下载程序的种类。有并口的,有串口的,也有USB的。串口和USB的介绍较少而并口的介绍的很多,也比较简单。易于自己制做。并口的在网上也分为几类,原理都一样。主要是根据下载程序的不同。
1
.这是Easy Isp-2 的配合软件为Easy 51Pro v2.0宇宙版


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />



这是他的简化版:




在网上的制做思路几乎都是把74HC373放在并口头的小盒子内见下图:




但由于我的台式机放在桌子的下面,把74HC373放在接头盒内插在电脑机箱后面怎么调试呢。因此我没将它放在接头盒内而是另用个洞洞板做的,前面是一米的并行线,后面是约50cm的连接线。线路的焊接没什么问题,比较顺利。见下图:(因旧的已拆了,现在只是示意一下)




Easy 51Pro 2.0
的工作界面:




连上我的最小系统后,发现不能稳定工作。但可以读出89S51的特征字,说明线路是好的
反复试验,不断在电源间加去偶电容,没什么效果,后来发现把连接排线握成一团握在手心里,就能有80%的机率正确写入程序,跟并口线那边关系却不大。莫非我要在排线上挂块肉,就像以前黑白电视的天线?
结论:读写不可靠。放弃!
因为这个下载程序不支持win98,我的笔记本是98的不能用。因此这次我用了官方的下载线方案。配合软件为ISP-30a.




线路的原理还是差不多,焊接也没什么问题,这次可以支持笔记本,我省掉了并口线,将并口头直接焊在板子上。完工后的样子见下图。




现在它的并口端没有线了,直接插在了我的笔记本的并口上,启动程序,ISP30A界面见下图




状况同上一个下载线如出一辙,能读出特征字。读写也是几乎不成功,还是将排线揉成团握在手心里时,便能有八九十的读写正确率了。看来用哪个方案都是一样的,关键在布线上不同罢了。
我一不做二不休,狠狠剪短了排线,就剩下这么一点点引线,见下图:




再接上笔记本一试,你猜怎么着,正确读写率100%,成功了!
结论:各种方案都差不多,但在布线上,原来总是把元件装在并口盒内,而留一段连线到AT89S51板上的想法是错误的。应尽量把从HC373AT89S51板上的连线做短,最好HC373就做在板子上,因为HC373是三态输出,停用时OE端是高电平,输出是高阻抗的,对系统板的独立性是没有影响的。而留的线应该是从PC机到HC373的并口线,这样的下载线作为自制来说才能有点实用价值。


第二天我把那段并口线又再连上后,接上笔记本再试,读写正确率仍为100%。下载线见图



样子虽不好看,但它是个皮实且易于自制的方案,在论坛里有人跟我说,把下载板上元件做好布线和抗干扰也能把下载板至AT89S51板的引线做到1.5米。我非常相信。但我没有示波器及其它测量设备,只有一块万用表。有简单易行的方案为什么不用呢!


4.自制单片机之四----数码管电路的制做与驱动




数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。共阳管就是把各个发光管的正极接在一起,而共阴管就刚好相反。见下图:



一般来说大部分的逻辑IC的吸收电流要强于输出电流。因此,大家都爱使用共阴极的数码管,因为可选的IC多些。很可惜,我的这组数码管是共阳的,因此公共端我打算用三级管来驱动。



我的最小系统板:



我用最常用的S9012,首先我得计划好电路方式,就采用最常用的动态扫描显示。先搭建最简电路,调试出需采用元件的参数。



先不接上图的R274HC244,将数码管一个段直接接地。调节R1,测得S9012基极电流为0.21mA时集电极也就是数码管上已有40mA,说明放大倍数足够了。这时接上R274HC244,调节R2使数码管电流控制在15mA,这样当8个段一起点亮时三极管上得通过120mA的电流。而基极上需要0.6mA,为了减小三极管的负荷应使三极管过饱和,,调节R1使基极电流为2mA,此时测得集电极和漏极之间的电压约0.1V。好!此时R12KR2240欧姆。确定。



接下来就是确定电路。电路的接口与AT89S51间有三组接口:段码、位码和电源。为了让AT89S51独立出来这三级接口都采用插针做接口,用排线自由连接到AT89S51P1-P3口,电源用短路帽连接,完成后的板子见下图



反面:



说明:



然后就是写程序。先写个查询方式的吧!
//
六位管码管在以0.3秒的间隔在闪烁,这是采用查询方式的,比较占CUP资源
/********************************************************************
定义管脚:P2_0-------上横 a               P3_0-------个位
                  P2_1-----
右上竖 b               P3_1-------十位
                  P2_2-----
右下竖 c               P3_2-------百位
                  P2_3-----     
下横 d             P3_3-------千位
                  P2_4-----
左下竖 e               P3_4-------万位
                  P2_5-----
左上竖 f                P3_5-------十万位
                  P2_6-----
中间横 g
                  P2_7-----
小数点 H
*********************************************************************/
# include <AT89X51.h>
typedef unsigned char uchar;
uchar code bit_num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//
位码值表:0,1,2,3,4,5
uchar code meg_val[]={0x03,0x9f,0x25,0x0d,0x99,0x49};//
段码值表:0,1,2,3,4,5
uchar code hello[]={0x03,0xe3,0xe3,0x61,0x91,0xff};      //HELLO
uchar code beybey[]={0x89,0x61,0xc1,0x89,0x61,0xc1};//beybey
uchar code ab6789[]={0xc1,0x11,0x09,0x01,0x1f,0x41};//ab6789
void delay(int n);
void main(void)
{
       uchar i,m;
       P2=0xff;      //
先将段码关闭
       P3=0xff;      //
将位码关闭
       delay(20);//
等待一会
       while(1)
        {
          for (m=30;m>0;m--)      //
显示30次约0.3
{
        for(i=0;i<=5;i++)
               {
                P2=0xff;
                P3=bit_num;      //
输出位码到P3
                P2=ab6789;      //
输出段码到P2
                delay(5);
        }
      }
          P2=0xff;         //
关闭段码
          P3=0xff;         //
关闭位码
          delay(1000);      //
等待0.3
         }
}


void delay(int n)      //子程序
{
       int j;
       uchar k;
       for(j=0;j<n;j++)
        {
          for(k=255;k>0;k--);
        }
}
======================================
当我插把程序写入片子,插上电运行时,是乱码。你猜怎么回事?
原来那个P2口方向是反的,您注意过没有,在AT89S51管脚排列上,P0--P1P3都是上方为PX_0。而唯独P2口管脚排列是下方为P2_0。方向则好是反的。既然反了,我就把段码表重写一下。再试,一切正常。
在这里我说一下段码的排列,好多人问数码管段码是如何排列的,我也在网上查了,好像没有什么标准的排法,随自己的接法而定,这也是导致为什么在网上下载的一些数码管程序在自己的板子上不能正常显示的原因。就普遍而言我最上面的那张图示的标法最多,在上面程序里原打算也是P2_0对应段码a(也就是上面的横)。一直到P2_7对应段为h(就是小数点)。结果哪知道P2口刚好是反的。这样一来也就是倒过来了,P2_0对应段h(小数点了)。例如我原先定义的数码管显示“2”段码为10100100B的,一接反了就不再是“2”了。而要想再显示“2”那就把段码的高低位倒过来。改为00100101BOK了。



下面再写个用中断来显示的:


//这是采用中断方式的,也是带闪烁的。
/********************************************************************
定义管脚:P2_0------小数点        P3_0------个位  
                  P2_1------
中横            P3_1------十位
                  P2_2------
左上竖        P3_2------百位
                  P2_3------
左下竖        P3_3------千位
                  P2_4------
下横           P3_4------万位
                  P2_5------
右下竖        P3_5------十万位
                  P2_6------
右上竖
                  P2_7------
上横
*********************************************************************/
# include <AT89X51.h>
typedef unsigned char uchar;
uchar code bit_num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//
位码:0,1,2,3,4,5
uchar code meg_val[]={0x49,0x99,0x0d,0x25,0x9f,0x03};//
段码:0,1,2,3,4,5
uchar i,aa; //
定义全局变量
bit fg;        //
定义一个亮起和熄灭标志


void timer0(void) interrupt 1 using 1      //中断程序
{
      if (fg)        //
fg1时点亮6位数码管
       {      P2=0xff;
         if (i>=6)
           {
             i="0";
            }
         else
           {
             P3=bit_num;      //
输出位码到P3
             P2=meg_val;      //
输出段码到P2
             i++;
            }
       }
      else                 //
fg0时熄灭数码管
        {
           if(aa==0)
         {
           P3=0xff;
           P2=0xff;
                }
         }
       aa++;
       if (aa>=254) //
aa值累加至254fg标志翻转。
         {
           fg=~fg;
           aa="0";
}
       TH0=0xf8; //
重装定时器初值,2ms,值为65536-2000
       TL0=0x30;
}



void main(void)
{
       P2=0xff;      //
先将段码关闭
       P3=0xff;      //
将位码关闭
       TMOD="0x01";//
设置T0为模式1
       TH0=0xf8; //
装入计数初值高位
       TL0=0x30; //
装入计数初值低位
       EA="1";      //
总充许
       ET0=1; //T0
充许
       fg="1";       //
将亮、灭标志设置为亮
       TR0=1;      //
启动中断
       while(1);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条