找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9892|回复: 1
打印 上一主题 下一主题
收起左侧

呼吸灯程序,51单片机模拟PWM输出

[复制链接]
跳转到指定楼层
楼主
前段时间写了一个使用51单片机对SG90玩具舵机的连续旋转控制程序。今天突发奇想,将该程序稍作调整,改为呼吸灯控制程序,分享一下,大家可以根据这个程序再做改动,使其更加完善。
呼吸灯的PWM输出引脚为51单片机的P0.0引脚,接发光二极管正极。


单片机源程序如下:
  1. // 呼吸灯程序,51单片机模拟PWM输出
  2. // 使用单片机STC89C51
  3. // 晶振:11.0592M
  4. // 编译环境 Keil uVision2
  5. ////////////////////////////////////////////////
  6. #include <reg52.h>
  7. #define uint unsigned int
  8. uint count,i,j;
  9. sbit pwm=P0^0 ;                  //信号输出引脚P00
  10. void pwm100us(uint);  //20ms周期pwm模型函数,函数变量是0.1ms高电平的整数倍
  11. void delay100ms();
  12. ////////////////////////////////////////////////
  13. void main()
  14. {
  15.    EA=1;                             //打开总中断
  16.    TMOD=0x10;                     //定时器工作方式寄存器初始化TMOD=0001 0000B(T1为16位计时模式)
  17.    while(1)
  18.       {
  19.              i=0;
  20.                  j=199;
  21.                  for(i=0;i<199;i++)          //占空比从100%递减至0
  22.                     {
  23.                             pwm100us(i);
  24.                         }
  25.                  pwm=1;
  26.                  delay100ms();
  27.                  for(j=199;j>0;j--)          //占空比从100%递减至0
  28.                     {
  29.                             pwm100us(j);
  30.                         }
  31.                  pwm=0;
  32.                  delay100ms();
  33.           }
  34. }
  35. //////////////////////////////////////////////
  36. void pwm100us(uint x)
  37. { uint y;
  38.   pwm=1;                          //输出信号高电平
  39.   while(count<x)           //下面是单次100us的计时,利用循环函数产生100*x us的高电平
  40.   {
  41.       TF1=0;                   //初始化定时器1溢出标记位
  42.           TH1=0xff;                   //初始化定时器1高位寄存器
  43.       TL1=0xa4;                   //初始化定时器1低位寄存器
  44.       TR1=1;                   //定时器1开始计时
  45.       while(TF1==0);        //等待定时器1溢出
  46.       count++;     
  47.   }
  48.   count=0;
  49.   y=(200-x);                  //给出y与x的关系
  50.   pwm=0;                          //输出信号低电平
  51.   while(count<y)         
  52.   {
  53.       TF1=0;
  54.           TH1=0xff;
  55.       TL1=0xa4;
  56.       TR1=1;
  57.       while(TF1==0);
  58.       count++;     
  59.   }
  60.   count=0;
  61. }
  62. /////////////////////////////////////////////
  63. void delay100ms()
  64. {
  65.     unsigned char a,b;
  66.     for(b=221;b>0;b--)
  67.         for(a=207;a>0;a--);
  68. }
复制代码

所有资料51hei提供下载:
呼吸灯hex文件和C程序.zip (1.36 KB, 下载次数: 63)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:609652 发表于 2019-9-9 18:54 | 只看该作者
能发一下仿真图吗?谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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