a_2012_m 发表于 2012-8-31 09:31:13

stc单片机问题请教

最近在用STC12L204EA单片机做个小项目,遇到一个奇怪的问题,目前还没有解决,请知道解决办法的指导一下,谢谢!
问题是这样的:我写了一个简单的测试led显示的程序,向单片机的io口每隔1秒,置1,再置0,原理上led应该是每隔1秒闪烁一次
可实际上是如果程序中我先置1,再置0,上电led就一直亮;如果如果程序中我先置0,再置1,上电led就一直灭,如何解释?

1、程序我是放在while(1){.....   }中执行的
2、该单片机是3.3v工作电压
3、下载程序我用的是usb转串口下载器,下载器和单片机接口相连的RXD,TXD下载时电平可能会达到5v,因为usb转串口下载器
    用的是电脑USB接口供电,电压是5v,但是下载程序时能够成功的

linucos 发表于 2012-8-31 09:34:10

延时写没?亮灭之间

zuu0 发表于 2012-8-31 09:52:51

肯定你的延时程序错了

延时1秒,,,看看你的Delay里面参数是不是超限了,比如形参用的是 char型 256,   你却来个 1000.死在那出不来

a_2012_m 发表于 2012-8-31 09:54:15

linucos 发表于 2012-8-31 09:34 static/image/common/back.gif
延时写没?亮灭之间

写了,时间是一秒,这个时间肯定是没问题,保证是在1秒左右,不会是特别小而出现在人眼暂留效应之内

nanning2011 发表于 2012-8-31 10:19:32

贴程序出来呀,不然原因就多了去了!!

linucos 发表于 2012-8-31 10:27:10

a_2012_m 发表于 2012-8-31 09:54 static/image/common/back.gif
写了,时间是一秒,这个时间肯定是没问题,保证是在1秒左右,不会是特别小而出现在人眼暂留效应之内 ...

嗯,对,上代码瞧瞧!

a_2012_m 发表于 2012-8-31 10:39:35

本帖最后由 a_2012_m 于 2012-8-31 10:43 编辑

函数如下

while(1)
        {
//                if(int_cnt>500)
//                {
//                       LED=0;
//                        int_cnt=0;
//                }
//                else if(int_cnt>250)
//                {
//                       LED=1;
//                }
//                else
//                {
//                        LED=0;
//                }
      LED=1;
                for(i=0;i<250;i++)
                {
//                   LED=1;
                   Delayms(4);
                }
                LED=0;
                for(i=0;i<250;i++)
                {
//                   LED=0;
                   Delayms(4);
                }
        }


延时函数
void Delayms(unsigned int T)
{
    unsigned int n = 500;
        n=500*T;
    while (n--)
    {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
    }
}

lg88 发表于 2012-8-31 12:02:47

楼主在n = 500*T,T是2字节,再乘2字节,,这里n也是2字节的,,应该不对吧

a_2012_m 发表于 2012-8-31 13:19:25

变量T是延时的ms数,例如4ms延时,T就取4
虽然T和n都是2字节,只要500*T的结果不溢出,就不会有问题

BXAK 发表于 2012-8-31 13:54:04

本帖最后由 BXAK 于 2012-8-31 13:56 编辑

送你一个STC 1T系列自适应延时函数

#defineCPU_FOSC12000000UL//不同晶振修改此处,延时函数会自动适应,允许晶振范围:1MHz ~ 45MHz

/*****************************************************
函数: STC 1T系列延时ms毫秒(STC 1T系列自适应 1MHz ~ 45MHz )
*****************************************************/
void ys_ms( unsigned int ms )
{
    unsigned int n;
      
    do{
      n = CPU_FOSC*64/896750;
      while( --n );   
    }while( --ms );
}

parkdom 发表于 2012-8-31 14:11:28

原因就是,延时不够,在LED=0或者LED=1还没看到效果时。LED又被置位,所以你一直看到的是while(1)进去后的第一个状态(亮或者灭)

a_2012_m 发表于 2012-8-31 14:25:48

parkdom 发表于 2012-8-31 14:11 static/image/common/back.gif
原因就是,延时不够,在LED=0或者LED=1还没看到效果时。LED又被置位,所以你一直看到的是while(1)进去后的 ...

之前我用定时器做延时,也会出现同样的问题,很难说是延时不够的原因,你也可以看看我上面给出的延时函数,延时应该是够的,我单片机使用的是内部晶振22.1184M

parkdom 发表于 2012-8-31 14:49:32

a_2012_m 发表于 2012-8-31 14:25 static/image/common/back.gif
之前我用定时器做延时,也会出现同样的问题,很难说是延时不够的原因,你也可以看看我上面给出的延时函数 ...

多改下代码测试就知道了,考虑晶振~    不是啥大问题

zbm2007 发表于 2012-8-31 15:32:20

我刚试了,这个程序没有问题的

a_2012_m 发表于 2012-8-31 15:37:44

zbm2007 发表于 2012-8-31 15:32 static/image/common/back.gif
我刚试了,这个程序没有问题的

你用的是哪款单片机试的?

zbm2007 发表于 2012-8-31 15:42:09

STC12C5A60S2   12M晶振

a_2012_m 发表于 2012-8-31 15:54:00

zbm2007 发表于 2012-8-31 15:42 static/image/common/back.gif
STC12C5A60S2   12M晶振

我是在stc15l204ea单片机上试的,没有达到预期效果,这就说明不是程序问题,是单片机问题了
页: [1]
查看完整版本: stc单片机问题请教