找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1572|回复: 11
收起左侧

ht66f70a单片机led灯的闪烁,求大神指教

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:499479 发表于 2019-9-20 18:22 | 显示全部楼层 |阅读模式
代码如下:
#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灯的闪烁。
但是我无论怎么该延迟函数这个灯都闪的很快(亮的时间很长,暗的时间几乎看不到),之前也用这个芯片做步进电机的实验,步进电机也是只震动不转,而且震动的频率也是固定的。求解。。。。
回复

使用道具 举报

ID:401564 发表于 2019-9-20 20:44 | 显示全部楼层
_pa0=~_pa0;
这语句放到两个延时的中间
而不是放到最后
回复

使用道具 举报

ID:275826 发表于 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++);

}
回复

使用道具 举报

ID:499479 发表于 2019-9-20 21:57 | 显示全部楼层
Y_G_G 发表于 2019-9-20 20:44
_pa0=~_pa0;
这语句放到两个延时的中间
而不是放到最后

一样的结果,我有个while死循环,根本不是你说的那样
回复

使用道具 举报

ID:67199 发表于 2019-9-20 22:18 | 显示全部楼层
楼上正解。
回复

使用道具 举报

ID:395176 发表于 2019-9-21 08:38 | 显示全部楼层
合泰单片机,我记得要把看门狗关闭的啊
回复

使用道具 举报

ID:123289 发表于 2019-9-21 08:39 | 显示全部楼层
两个:
for(i=0;i<dly;i++)
for(i=0;i<dly;i++);
将其中的一个改成 j 试试         
回复

使用道具 举报

ID:213173 发表于 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++);
}
回复

使用道具 举报

ID:452974 发表于 2019-9-21 13:26 | 显示全部楼层
感觉是不是电路连接上面的问题,延时函数变量命名习惯个人感觉很差,但第二个 for 循环,会首先将 i 重置0,语法角度是没错的。不过建议该有的大括号,还有重命名弄好一点。

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

按照题主的说法是暗的时间几乎没有,那就是有暗的时间了,那调试的时候不先试试先将开关量置1?如果结果相反的话,这个代码加几行相反代码就好了。
回复

使用道具 举报

ID:614442 发表于 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++);  }
回复

使用道具 举报

ID:401564 发表于 2019-9-21 16:49 | 显示全部楼层
在烧录界面看一下,好像是有关闭看门狗和低电压复位的
合泰的指令和8051是不一样的,你把语句改了之后,延时加长几看一下

顺便说一下,虽然现在C是主流,但合泰这种低端单片机,最好还是用汇编,几乎所以的台系的单片机数据手册都会推荐用汇编的
回复

使用道具 举报

ID:499479 发表于 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")无关
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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