单片机论坛

标题: ht66f70a单片机led灯的闪烁,求大神指教 [打印本页]

作者: 123000.。    时间: 2019-9-20 18:22
标题: ht66f70a单片机led灯的闪烁,求大神指教
代码如下:
#include "HT66F70A.H"
void Delay_ms(unsigned int dly)//延时dly ms的子程序
{
unsigned int i;
for(i=0;i<dly;i++)
for(i=0;i<dly;i++);

}
void main()
{
_pa=0;
_pac=0;//pa设置为输出
_pa0=0;
while(1)
{Delay_ms(500);
Delay_ms(500);//延时500ms,即0.5s
_pa0=~_pa0;
}
}

功能是实现led灯的闪烁。
但是我无论怎么该延迟函数这个灯都闪的很快(亮的时间很长,暗的时间几乎看不到),之前也用这个芯片做步进电机的实验,步进电机也是只震动不转,而且震动的频率也是固定的。求解。。。。

作者: Y_G_G    时间: 2019-9-20 20:44
_pa0=~_pa0;
这语句放到两个延时的中间
而不是放到最后
作者: tyrl800    时间: 2019-9-20 21:15
延时函数错误,改成
void Delay_ms(unsigned int dly)//延时dly ms的子程序
{
unsigned int i,j;
for(i=0;i<dly;i++)
for(j=0;j<dly;j++);

}
作者: 123000.。    时间: 2019-9-20 21:57
Y_G_G 发表于 2019-9-20 20:44
_pa0=~_pa0;
这语句放到两个延时的中间
而不是放到最后

一样的结果,我有个while死循环,根本不是你说的那样
作者: lyxing    时间: 2019-9-20 22:18
楼上正解。
作者: 飞机翻筋斗    时间: 2019-9-21 08:38
合泰单片机,我记得要把看门狗关闭的啊
作者: yzwzfyz    时间: 2019-9-21 08:39
两个:
for(i=0;i<dly;i++)
for(i=0;i<dly;i++);
将其中的一个改成 j 试试         
作者: wulin    时间: 2019-9-21 08:40
楼主的延时函数是错误的,Delay_ms(500);只能得到约6ms延时,肉眼哪能看得出来?
正确写法:
void Delay_ms(unsigned int dly)//延时dly ms的子程序
{
        unsigned int i,j;
        for(i=0;i<dly;i++)
                for(j=0;j<125;j++);
}
作者: 51_hei    时间: 2019-9-21 13:26
感觉是不是电路连接上面的问题,延时函数变量命名习惯个人感觉很差,但第二个 for 循环,会首先将 i 重置0,语法角度是没错的。不过建议该有的大括号,还有重命名弄好一点。

建议题主把电路图也顺便贴出来,一个软硬结合的东西,只拿代码说有可能布线的锅,帮不得的。

按照题主的说法是暗的时间几乎没有,那就是有暗的时间了,那调试的时候不先试试先将开关量置1?如果结果相反的话,这个代码加几行相反代码就好了。
作者: sgw182    时间: 2019-9-21 16:07
void Delay_ms(unsigned int dly)//延时dly ms的子程序 { unsigned int i,j; for(i=0;i<dly;i++) for(j=0;j<dly;j++);  }
作者: Y_G_G    时间: 2019-9-21 16:49
在烧录界面看一下,好像是有关闭看门狗和低电压复位的
合泰的指令和8051是不一样的,你把语句改了之后,延时加长几看一下

顺便说一下,虽然现在C是主流,但合泰这种低端单片机,最好还是用汇编,几乎所以的台系的单片机数据手册都会推荐用汇编的
作者: 123000.。    时间: 2019-9-21 21:34
问题已经解决了,今天重新吧延迟函数换了下,但同样的代码我烧录几遍,有时候正常有时候有问题,估计是硬件的问题
#include <HT66F70A.H>
void delay(unsigned int);//延时dly ms的子程序
void main()
{
_pa=0;
_pac=0;//pa设置为输出
_pa0=0;
while(1)
{delay(5000);
  _pa0=~_pa0;
delay(5000);
delay(5000);
delay(5000);//延时500ms,即0.5s

}
}
void delay(unsigned int count)
{
    volatile unsigned int i;
    for(i=0;i<count;i++)
        asm("nop");
}
注:跟这个volatile和 asm("nop")无关




欢迎光临 单片机论坛 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1