amobbs 东莞阿莫电子网站/东莞南城健逸电子贸易商行网站

 找回密码
 注册
bottom↓
查看: 756|回复: 24

stc单片机问题请教

[复制链接]
发表于 2012-8-31 09:31:13 | 显示全部楼层 |阅读模式
最近在用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,但是下载程序时能够成功的
发表于 2012-8-31 09:34:10 来自手机 | 显示全部楼层
延时写没?亮灭之间
发表于 2012-8-31 09:52:51 | 显示全部楼层
肯定你的延时程序错了

延时1秒,,,看看你的Delay里面参数是不是超限了,比如形参用的是 char  型 256,     你却来个 1000.死在那出不来
 楼主| 发表于 2012-8-31 09:54:15 | 显示全部楼层
linucos 发表于 2012-8-31 09:34
延时写没?亮灭之间

写了,时间是一秒,这个时间肯定是没问题,保证是在1秒左右,不会是特别小而出现在人眼暂留效应之内
发表于 2012-8-31 10:19:32 | 显示全部楼层
贴程序出来呀,不然原因就多了去了!!
发表于 2012-8-31 10:27:10 | 显示全部楼层
a_2012_m 发表于 2012-8-31 09:54
写了,时间是一秒,这个时间肯定是没问题,保证是在1秒左右,不会是特别小而出现在人眼暂留效应之内 ...

嗯,对,上代码瞧瞧!
 楼主| 发表于 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_();
    }
}
发表于 2012-8-31 12:02:47 | 显示全部楼层
楼主在n = 500*T,T是2字节,再乘2字节,,这里n也是2字节的,,应该不对吧
 楼主| 发表于 2012-8-31 13:19:25 | 显示全部楼层
变量T是延时的ms数,例如4ms延时,T就取4
虽然T和n都是2字节,只要500*T的结果不溢出,就不会有问题
发表于 2012-8-31 13:54:04 | 显示全部楼层
本帖最后由 BXAK 于 2012-8-31 13:56 编辑

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

#define  CPU_FOSC  12000000UL  //不同晶振修改此处,延时函数会自动适应,允许晶振范围: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 );
}
发表于 2012-8-31 14:11:28 | 显示全部楼层
原因就是,延时不够,在LED=0或者LED=1还没看到效果时。LED又被置位,所以你一直看到的是while(1)进去后的第一个状态(亮或者灭)
 楼主| 发表于 2012-8-31 14:25:48 | 显示全部楼层
parkdom 发表于 2012-8-31 14:11
原因就是,延时不够,在LED=0或者LED=1还没看到效果时。LED又被置位,所以你一直看到的是while(1)进去后的 ...


之前我用定时器做延时,也会出现同样的问题,很难说是延时不够的原因,你也可以看看我上面给出的延时函数,延时应该是够的,我单片机使用的是内部晶振22.1184M
发表于 2012-8-31 14:49:32 | 显示全部楼层
a_2012_m 发表于 2012-8-31 14:25
之前我用定时器做延时,也会出现同样的问题,很难说是延时不够的原因,你也可以看看我上面给出的延时函数 ...

多改下代码测试就知道了,考虑晶振~    不是啥大问题
发表于 2012-8-31 15:32:20 | 显示全部楼层
我刚试了,这个程序没有问题的
 楼主| 发表于 2012-8-31 15:37:44 | 显示全部楼层
zbm2007 发表于 2012-8-31 15:32
我刚试了,这个程序没有问题的

你用的是哪款单片机试的?
发表于 2012-8-31 15:42:09 | 显示全部楼层
STC12C5A60S2   12M晶振
 楼主| 发表于 2012-8-31 15:54:00 | 显示全部楼层
zbm2007 发表于 2012-8-31 15:42
STC12C5A60S2   12M晶振

我是在stc15l204ea单片机上试的,没有达到预期效果,这就说明不是程序问题,是单片机问题了
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs 东莞阿莫电子网站/东莞南城健逸电子贸易商行网站 ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2020-3-31 17:38

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表