打印

请教高手!!准备使用AT89S51的同仁也应看看

[复制链接]
3701|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wtt1314|  楼主 | 2007-3-7 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 之前我写了一段程序,用仿真器仿真都已经没有问题了,然后我把程序烧入AT89S51的片子内,结果没有与其的效果,莫非是我硬件的原因,我一个一个的排查均是正常的。然道是我程序的原因,我觉得很奇怪啊,在仿真器的环境下一切正常,然后我就加进去测试程序,一点一点的走,还是没发现什么问题,就发现在定时器中断的地方程序就不走了,折腾了我一个星期,最后没办法,找了一块AT89C51的片子,把程序写进去一切正常。
 后来我急上网寻找S51和C51的区别,都说是完全可以兼容的。
 最后我终于发现了,原来有很多人和我一样遇见这个问题了,就是S51的芯片对采用定时器中断根本就不反应,原因为
两种不同架构的MCU
89C51属于复杂指令系统架构(CISC),而89S51为简单指令系统(RISC)的AVR系列MCU。
一、实际的端口驱动能力
有不同的地方。
一、实际的端口驱动能力不足的要加上拉4.7K
二、端口在变化时的edge的斜率不同。
我现在知道原因了,但是我不知道如何解决定时器中断的这个办法,很急,有没有高手能够帮我出点主意,帮我解决一下这个燃眉之急。小女子在此拜谢各位!

相关帖子

沙发
wtt1314|  楼主 | 2007-3-7 09:23 | 只看该作者

在线等候,燃眉......

使用特权

评论回复
板凳
fish1983| | 2007-3-7 09:50 | 只看该作者

不可能

中断不可能这样啊。要是真的话早发现了

使用特权

评论回复
地板
wtt1314|  楼主 | 2007-3-7 10:14 | 只看该作者

事实上就是这样的

我还让我一些做单片机的朋友也试过,不信的话请大家讲下面程序烧一下试试,用C51和S51的分别试试,就会发现问题。

#include "reg51.h"
sbit P10=P1^0;
unsigned char t0fg = 0;

unsigned int  n;

main()
{    
       
        TMOD = 0x21;
    TCON = 0x11;
    ET0 = 1;
    
    ES =1;    
    EA=1;

    
    while(1)
    {
        if (t0fg==1)
            {
              P10=0;//在P1.0口点一个发光二极管

              for(n=0;n<20000;n++);
              P10=1;
              for(n=0;n<20000;n++);

        }
}
}
//定时器中断
  void t0_int() interrupt 3
{
       
        t0fg=1;
        
                         
}

使用特权

评论回复
5
lyjian| | 2007-3-7 10:22 | 只看该作者

第一次听说这样的问题

1、89S51不是RISC的AVR系列MCU,是和89C51一样架构的MCU。S51只是在C51基础上了个ISP,另外增加一点增强功能(如WDT、双DPTR等)而已。
2、如果真有你说的这种问题,你要找的是厂家:可以向厂家索赔了!

使用特权

评论回复
6
liqimcu| | 2007-3-7 10:28 | 只看该作者

T0应该是interrupt 1吧。

T0应该是interrupt 1吧。

使用特权

评论回复
7
lyjian| | 2007-3-7 10:30 | 只看该作者

晕interrupt 3是T1中断interrupt 1才是T0中断

interrupt 3

使用特权

评论回复
8
wtt1314|  楼主 | 2007-3-7 10:34 | 只看该作者

我知道T0是1

我程序里面的3是在1没有响应以后改的,大家可以把它改成1,其实无论是T0还是T1都没有区别,都没反应

使用特权

评论回复
9
wtt1314|  楼主 | 2007-3-7 10:36 | 只看该作者

我还打电话给代理商过

结果他叫我去找卖家,他还以为是质量问题,很郁闷的,我换了不止十片芯片了

使用特权

评论回复
10
liqimcu| | 2007-3-7 10:48 | 只看该作者

晕倒。

使用特权

评论回复
11
huweiping| | 2007-3-7 11:25 | 只看该作者

我同意liqimcu 说法

我现在用的也是S51,但是还用C51的方法和格式.以前的代码不还是能在S51上正常运行的(定时串行中断都有用到)

使用特权

评论回复
12
turmary| | 2007-3-7 12:07 | 只看该作者

没问题

这个程序我写进了89S52,P1.0一开机就闪光了

使用特权

评论回复
13
HWM| | 2007-3-7 12:23 | 只看该作者

奇闻!!!

使用特权

评论回复
14
wtt1314|  楼主 | 2007-3-7 12:48 | 只看该作者

我记得我也用过S52的

当时也是不闪的,我再试试

使用特权

评论回复
15
wtt1314|  楼主 | 2007-3-7 12:59 | 只看该作者

根本就没闪嘛

我用S52的没闪嘛,不知道是怎么让它闪的,还有一个问题,我用的是直插式的芯片,不知道有没有这个原因的影响?拜托哪个高手亲自烧一下试试看,我们都是做技术的,要按照事实说话。

使用特权

评论回复
16
ayb_ice| | 2007-3-7 13:58 | 只看该作者

随便说说

  5楼说的是对的.
  建议仔细看看DATASHEET.
  另外你的TR0没有打开,不可能产生T0中断.
    TMOD = 0x21;
    TCON = 0x11;
    ET0 = 1;

    ES = 1;
    EA = 1;
    TR0 = 1;  // 注意
void t0_int() interrupt 1  // 注意
{
    t0fg=1;        
}

使用特权

评论回复
17
zhaoyu2005| | 2007-3-7 15:54 | 只看该作者

换个烧写器(编程器)吧

估计是你的烧写器有问题,我就发现有的烧写器对S51/2支持不是很好,新片子能烧,然后就不能烧了,还有能烧到S52商业级(好像后缀是I)的正常,但是烧到工业级(好像后缀是P)有的就不正常

使用特权

评论回复
18
loggerjy| | 2007-3-7 16:11 | 只看该作者

->>>>>>

1、写个不用定时器的闪烁程序用同一个编程器写看正常与否;2、换个编程器;3、再次检查程序

使用特权

评论回复
19
wtt1314|  楼主 | 2007-3-7 16:33 | 只看该作者

TR0的设置在TCON内已经设置了

使用特权

评论回复
20
wtt1314|  楼主 | 2007-3-7 16:37 | 只看该作者

致loggerjy

你说的这个我已经试过了,用的是这个程序:
#include "reg51.h"
#define unit unsigned int;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;


unit n;

void main(void)
{
   
   while(1)

        P10=0;
        for(n=0;n<20000;n++);
        P10=1;
        for(n=0;n<20000;n++);

P11=0;
        for(n=0;n<20000;n++);
        P11=1;
        for(n=0;n<20000;n++);

P12=0;
        for(n=0;n<20000;n++);
        P12=1;
        for(n=0;n<20000;n++);

P13=0;
        for(n=0;n<20000;n++);
        P13=1;
        for(n=0;n<20000;n++);





    }
}

结果是在什么片子都好使,S51,C51,S52的,只要是加上定时器中断的,只有C51好用了,我用的编程器是西尔特的Z系列

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

75

帖子

0

粉丝