找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3444|回复: 4
收起左侧

不使用定时器的简易单片机呼吸灯代码

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 20%)
ID:404720 发表于 2018-11-27 09:47 | 显示全部楼层 |阅读模式
没有用到定时器,代码简易,效果也还行。
使用的是atc89c52RC,P1^1口接led,P1^1口位高电平小灯亮起,代码如下:
  1. #include "reg52.h"
  2. void delay(int t)
  3. {
  4. while(t--);
  5. }
  6. int main(void)
  7. {
  8. int c=400;//定义周期
  9. int h,l;//定义高电平低电平highlow
  10. while(1)
  11. {
  12. for(h=1;h<=c;h++)
  13. {
  14. P1=0x01;
  15. delay(h);
  16. P1=0x00;
  17. l=c-h;
  18. delay(l);
  19. }//高电平逐渐增加
  20. for(l=1;l<=c;l++)
  21. {
  22. P1=0x00;
  23. delay(l);
  24. P1=0x01;
  25. h=c-l;
  26. delay(h);
  27. }//低电平逐渐增加
  28. }
  29. }
复制代码
我也是偶然看到这个方法的,感觉还行分享出来。
首先我们定义了一个delay,接着是main主函数,在主函数里定义死循环,while里面用了for循环,目的是为了增加占空比,先让小灯置位高电平,延时h秒,接着低电平,延时L秒,就这样模拟了PWM的占空比,就有了高电平比例逐渐上升又逐渐下降的效果。
不喜勿喷,还是新手。
管理员求黑币!!!

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:354168 发表于 2018-12-14 11:14 | 显示全部楼层
你好,我想问一下这个延时函数为什么这样写啊?我有这样的延时函数void delay (uint ms) {uchar us;  while(ms--)  {for(us=124;us>0;us--);}  }小灯就一直亮不会出现呼吸的效果
回复

使用道具 举报

ID:335647 发表于 2019-1-8 16:06 | 显示全部楼层
牧阿木 发表于 2018-12-14 11:14
你好,我想问一下这个延时函数为什么这样写啊?我有这样的延时函数void delay (uint ms) {uchar us;  while ...

你的灯不是不呼吸。只是你的延时写的时间写的比较长。
回复

使用道具 举报

ID:335647 发表于 2019-1-8 16:07 | 显示全部楼层
牧阿木 发表于 2018-12-14 11:14
你好,我想问一下这个延时函数为什么这样写啊?我有这样的延时函数void delay (uint ms) {uchar us;  while ...

void delay10us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}
回复

使用道具 举报

ID:444602 发表于 2019-1-8 19:12 | 显示全部楼层
厉害了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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