【呼吸灯程序---小记】

2020-01-20 19:09发布

本帖最后由 leiyin 于 2014-10-31 13:37 编辑

看到论坛里边有个短小的呼吸灯程序,就尝试了尝试,我这边延时配置的不好,呼吸效果不是很好,就打算用定时器写个程序测试一下,学习单片机这么久了,一直也没写个呼吸灯程序。

呼吸灯,由暗渐变亮,再由亮渐变暗,类似呼吸。

查了一下,正常吸气1.5s 呼气 1.5s;正常人每分呼吸16-18次,儿童20次。

看代码吧,代码比较烂,发上来目的两个一是给自己来个小记,二是交流学习!

代码如下:

粘贴的是部分代码,其中LED是一个灯端口,变量有cnt,TG1,flag,led_t这些均为静态变量或者全局变量,这部分代码放在定时器里边,定时器中断设置成200us中断一次!

     1. 控制改变占空比的节奏,修改cnt可以调节快慢,调节TG1的上下范围即调节占空比
   

  1.        cnt++;
  2.         if(cnt>50)
  3.        {   
  4.             cnt=0;
  5.             if(flag)
  6.            {
  7.                 TG1++;
  8.                  if(TG1>=100)
  9.                  {
  10.                       flag = 0;
  11.                 }
  12.            }
  13.            else
  14.            {
  15.                  TG1--;
  16.                  if(TG1<=1)
  17.                 {
  18.                       flag = 1;
  19.                 }                       
  20.            }
  21.         }
复制代码

        2.控制的是占空比PWM   
      

  1.         led_t++;
  2.         if(led_t<TG1)
  3.         {
  4.                 LED = 1;                    
  5.         }
  6.         else if((led_t>=TG1)&&(led_t<100))
  7.         {
  8.                 LED = 0;
  9.         }
  10.         else
  11.         {
  12.             led_t = 0;
  13.         }
  14.         
复制代码
     
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
chengshuo
1楼-- · 2020-01-21 22:41
 精彩回答 2  元偷偷看……
codeyear
2楼-- · 2020-01-22 03:40
呼吸灯,听起来时尚的名字,就是让LED等逐渐变亮再逐渐变暗的循环着。最简单的方法调整占空比即可。
leiyin
3楼-- · 2020-01-22 04:21
codeyear 发表于 2014-11-1 16:04
呼吸灯,听起来时尚的名字,就是让LED等逐渐变亮再逐渐变暗的循环着。最简单的方法调整占空比即可。 ...

对就是这样!
leiyin
4楼-- · 2020-01-22 05:49
lovecxm 发表于 2014-11-1 11:14
还可以啦,看到一个复杂的,是用查表弄的。

怎么查表了,可以贴上来交流一下!
dz20062008
5楼-- · 2020-01-22 11:39
本帖最后由 dz20062008 于 2014-11-2 01:41 编辑

我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于是示波器看,是PWM波,但没注意是否调频了,在百毫秒的脉冲宽度啊,郁闷。


这是我做的玩艺,心型LED火红呼吸灯。自我感觉过度很好,发给大家看看。而且代码的精简也不错的。Program Size: data=8.0 xdata=0 code=168楼主位的是Program Size: data=11.0 xdata=0 code=183而且没有进过优化过的。
楼主的代码的思路的却很不错/
/* 目的:心型矩阵PWM定频呼吸灯,PWM口是P3.7
   材料:AT89S52,12M晶振
*/


   PWM_OUT EQU P3.7

   TEMP_N  EQU 20H                                   ;存PWM负半周中间变量
   TEMP_P  EQU 21H                                   ;存PWM正半周中间变量
   TEMP_NN EQU 22H                                   ;存PWM负半周最终波形变量
   TEMP_PP EQU 23H                                   ;存PWM正半周最终波形变量



   ORG 0000H
   SJMP START

   ORG 000BH
   LJMP INT
   RETI

   ORG 0030H
   START:
  /* LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS
   LCALL DELAY300MS                                   ;运行等待

   MOV P0,#00H                               ;初始化心型矩阵花型为全亮
   MOV P1,#00H

   CLR P2.0
   CLR P2.1
   CLR P2.2
   CLR P2.3
   CLR P2.4

   CLR P2.5
   CLR P2.6

   CLR p3.0         
   CLR p3.1
   CLR p3.2
   CLR p3.3
   CLR P3.4          */

   CLR PWM_OUT                               ;初始化PWM输出为关

   SETB F0                                                   ;初始化明暗调节方向控制位,1为变量,0为变暗

   MOV TEMP_N,#1D                               ;初始化PWM中间变量,最暗
   MOV TEMP_P,#129D

   MOV TMOD,#01H                                   ;初始化定时器0工作在模式1,50毫秒一次中断
   MOV TH0,#0B1H
   MOV TL0,#0E0H
   SETB EA
   SETB ET0
   SETB TR0

   MAIN:
   MOV TEMP_NN,TEMP_N                           ;把PWM中间变量的值传递给最终变量
   MOV TEMP_PP,TEMP_P
   
   CLR  PWM_OUT                                       ;输出低电平,小灯点亮
   M_LOOP1:                                                   ;通过最终变量的值控制输出低电平时间
   LCALL DELAY100US
   DJNZ TEMP_NN,M_LOOP1

   SETB PWM_OUT                                           ;输出高电平,小灯熄灭
   M_LOOP2:                                                   ;通过最终变量的值控制输出高电平时间
   LCALL DELAY100US
   DJNZ TEMP_PP,M_LOOP2

   LJMP MAIN                                           ;进入大循环

   INT:                                                           ;中断子程序
   CLR EA                                                   ;关中断
   MOV TH0,#0B1H                                   ;重新装入定时初值
   MOV TL0,#0E0H

   JNB F0,BA                                           ;判断调节方向
   MOV A,TEMP_N
   CJNE A,#129D,L                                   ;最亮了吗?
   CLR F0                                                   ;切换为由亮变暗
   ;LCALL DELAY300MS                                   ;决定由亮变暗的等待时间
   ;LCALL DELAY300MS
   ;LCALL DELAY300MS
   ;LCALL DELAY300MS
   ;LCALL DELAY300MS
   SETB EA                                                   ;开中断                                          
   RETI
   L:
   INC TEMP_N                                           ;由暗变量的过度
   DEC TEMP_P
   SETB EA
   RETI

   BA:                                                           ;开始变暗
   MOV A,TEMP_P
   CJNE A,#129D,LL                                   ;判断是不是最暗了
   SETB F0                                                   ;最暗了切换调节方向
   LCALL DELAY300MS                                   ;设定由暗变量的等待时间 ////////////
   SETB EA                                                   ;开中断
   RETI
   LL:
   DEC TEMP_N                                           ;由亮变暗的过程
   INC TEMP_P
   SETB EA
   RETI

   DELAY100US:                                      ;pwm最小长度因子   
   MOV R6,#01H
   DL0:
   MOV R5,#2FH
   DJNZ R5,$
   DJNZ R6,DL0
   RET

   DELAY300MS:                                     ;亮暗切换等待延时函数
   MOV R7,#7BH
   DL11:
   MOV R6,#74H
   DL00:
   MOV R5,#09H
   DJNZ R5,$
   DJNZ R6,DL00
   DJNZ R7,DL11
   RET

   END                                                           ;程序结束

PS:我回帖错了,回到了楼上说说的帖子了。这是我的,楼主试试吧
编辑理由:加入目标程序代码,避免重复编译浪费时间。端口是P3.7     最好是12M晶体12T的单片机,24M的也可以的。
心型呼吸灯.rar (320 Bytes, 下载次数: 2) 2014-11-2 01:41 上传 点击文件名下载附件
晨星
6楼-- · 2020-01-22 14:30
 精彩回答 2  元偷偷看……

一周热门 更多>