找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15f2k60s2单片机PWM呼吸灯代码(带详细注释)

  [复制链接]
跳转到指定楼层
楼主
ID:407568 发表于 2018-10-10 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include <stc15f2k60s2.h>

  2. sbit ADDR0 = P1^0;   //如果是自己搭的电路,可以无视下面这几行
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;

  7. sbit PWMOUTLED = P0^0;//用于PWM控制输出

  8. unsigned char heighHR0, heighLR0;//PWM一个周期中高电平高字节和低字节重载值
  9. unsigned char lowHR0, lowLR0;//PWM一个机器周期中低电平时高字节和低字节重载值

  10. void Initial();
  11. void ConfigPWM(unsigned int fr, unsigned char dc);
  12. void ClosePWM();

  13. void main(void)
  14. {
  15.     unsigned int i;
  16.     Initial();
  17.    
  18.     while (1)     //呼吸灯效果
  19.    {
  20. //LED亮->暗
  21.     ConfigPWM(60, 10);//配置PWM频率为100HZ,占空比为10%
  22.    for (i = 0; i < 30; i++); //软件测试延时大约76ms
  23.     ConfigPWM(60, 20);//配置PWM频率为100HZ,占空比为20%
  24.    for (i = 0; i < 30; i++);
  25.    ConfigPWM(60, 30);//配置PWM频率为100HZ,占空比为30%
  26.    for (i = 0; i < 30; i++);
  27.    ConfigPWM(60, 40);//配置PWM频率为100HZ,占空比为40%
  28. for (i = 0; i < 30; i++);
  29. ConfigPWM(60, 50);//配置PWM频率为100HZ,占空比为50%
  30. for (i = 0; i < 30; i++);
  31. ConfigPWM(60, 60);//配置PWM频率为100HZ,占空比为60%
  32. for (i = 0; i < 30; i++);
  33. ConfigPWM(60, 70);//配置PWM频率为100HZ,占空比为70%
  34. for (i = 0; i < 30; i++);
  35. ConfigPWM(60, 80);//配置PWM频率为100HZ,占空比为80%
  36. for (i = 0; i < 30; i++);
  37. ConfigPWM(60, 90);//配置PWM频率为100HZ,占空比为90%
  38. for (i = 0; i < 30; i++);
  39. ConfigPWM(60, 95);//配置PWM频率为100HZ,占空比为95%
  40. for (i = 0; i < 60000; i++);
  41. //LED暗->亮
  42. ConfigPWM(60, 90);//配置PWM频率为100HZ,占空比为10%
  43. for (i = 0; i < 60000; i++);
  44. ConfigPWM(60, 80);//配置PWM频率为100HZ,占空比为20%
  45. for (i = 0; i < 60000; i++);
  46. ConfigPWM(60, 70);//配置PWM频率为100HZ,占空比为30%
  47. for (i = 0; i < 60000; i++);
  48. ConfigPWM(60, 60);//配置PWM频率为100HZ,占空比为40%
  49. for (i = 0; i < 60000; i++);
  50. ConfigPWM(60, 50);//配置PWM频率为100HZ,占空比为50%
  51. for (i = 0; i < 60000; i++);
  52. ConfigPWM(60, 40);//配置PWM频率为100HZ,占空比为60%
  53. for (i = 0; i < 60000; i++);
  54. ConfigPWM(60, 30);//配置PWM频率为100HZ,占空比为70%
  55. for (i = 0; i < 60000; i++);
  56. ConfigPWM(60, 20);//配置PWM频率为100HZ,占空比为80%
  57. for (i = 0; i < 60000; i++);
  58. ConfigPWM(60, 10);//配置PWM频率为100HZ,占空比为90%
  59. for (i = 0; i < 60000; i++);
  60. ClosePWM();
  61. }
  62. }

  63. /*初始化*/
  64. void Initial()
  65. {
  66. ADDR3 = 1;
  67. ENLED = 0;//选择U3,即LED
  68. ADDR2 = 1;
  69. ADDR1 = 1;
  70. ADDR0 = 0;//LEDS6=0
  71. }

  72. /*使用T0配置PWM高低电平的频率*/
  73. void ConfigPWM(unsigned int fr, unsigned char dc)  //fr为PWM的频率,100HZ无闪烁,dc是PWM的占空比(高电平占的百分比)
  74. {
  75.    unsigned long tmp;
  76.    unsigned int heigh, low;

  77.    tmp = 12000000/12;//一个机器周期频率
  78.     tmp = tmp / fr;  //一个机器周期中fr的频率所需计数值(包括高电平和低电平)
  79.    heigh = (tmp * dc) / 100;//高电平占dc%,所需计数值
  80.    low   = tmp - heigh;//低电平所需计数值
  81.    heigh = 65536-heigh;//高电平计数初值
  82.    low   = 65536-low;//低电平计数初值

  83. heighHR0 = (unsigned char)(heigh >> 8);//高电平装入初值的高字节
  84. heighLR0 = (unsigned char)heigh;    //高电平装入初值的低字节
  85. lowHR0   = (unsigned char)(low >> 8);  //低电平装入初值的高字节
  86. lowLR0   = (unsigned char)low;    //低电平装入初值的低字节

  87.   TMOD &= 0xF0;//清零T0控制位
  88. TMOD |= 0x01;//设定T0工作方式1,16位可设定时器
  89. TH0 = heighHR0;
  90. TL0 = heighLR0;//装入高电平计数初值
  91. PWMOUTLED = 1;//开始时PWM输出高电平
  92. TR0 = 1;
  93. ET0 = 1;
  94. EA  = 1;
  95. }

  96. /*关闭PWM*/
  97. void ClosePWM()
  98. {
  99. TR0 = 0;//关闭Timer0
  100. ET0 = 0;//关闭T0中断
  101. PWMOUTLED = 1;//PWM输出高电平
  102. }

  103. /*定时器T0中断服务*/
  104. void Timer0_ISP() interrupt 1
  105. {
  106. //判断PWM现在输出的是高电平还是低电平
  107.    if (PWMOUTLED)
  108.    {
  109.     TH0 = lowHR0;
  110.     TL0 = lowLR0;//装载低电平计数初值
  111.     PWMOUTLED = 0;//PWM输出低电平
  112.    }
  113.    else
  114.    {
  115.     TH0 = heighHR0;
  116.     TL0 = heighLR0;//重装装载高电平计数初值
  117.     PWMOUTLED = 1;//PWM输出高电平
  118.    }
  119. }
复制代码



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

使用道具 举报

沙发
ID:358930 发表于 2018-11-27 22:52 | 只看该作者
帮你上个源代码工程文件

STC15F2K60S2的PWM小灯.zip

37.6 KB, 下载次数: 76, 下载积分: 黑币 -5

回复

使用道具 举报

板凳
ID:880867 发表于 2021-2-18 16:14 | 只看该作者
heighHR0 = (unsigned char)(heigh >> 8);//高电平装入初值的高字节
heighLR0 = (unsigned char)heigh;    //高电平装入初值的低字节

想问一下这个过程是怎么实现的就像装入初值的低字节
回复

使用道具 举报

地板
ID:230742 发表于 2021-2-19 13:55 | 只看该作者
这是适合金沙滩宋师傅的开发板开发的程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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