leiyin 发表于 2014-10-31 13:29:17

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

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

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

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

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

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

代码如下:

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

   1. 控制改变占空比的节奏,修改cnt可以调节快慢,调节TG1的上下范围即调节占空比
   
       cnt++;
        if(cnt>50)
       {   
          cnt=0;
            if(flag)
           {
                TG1++;
               if(TG1>=100)
               {
                      flag = 0;
                }
           }
         else
           {
                 TG1--;
               if(TG1<=1)
                {
                      flag = 1;
                }                       
           }
        }

        2.控制的是占空比PWM   
      
      led_t++;
        if(led_t<TG1)
        {
                LED = 1;                  
        }
        else if((led_t>=TG1)&&(led_t<100))
        {
                LED = 0;
        }
        else
        {
          led_t = 0;
        }
      
   

leiyin 发表于 2014-10-31 13:38:23

摘记那个非常短小的呼吸灯程序链接:http://www.amobbs.com/forum.php?mod=viewthread&tid=5525360&highlight=%E5%91%BC%E5%90%B8%E7%81%AF

wt3333 发表于 2014-10-31 13:49:57

回去我也做一个谢谢分享

机器人天空 发表于 2014-10-31 14:02:46

用单片机自带的PWM不是更好

我要你的目光 发表于 2014-10-31 23:51:34

看看怎样

gdoujiajia 发表于 2014-11-1 01:43:18

一般都是用PWM做的

lovecxm 发表于 2014-11-1 11:14:01

还可以啦,看到一个复杂的,是用查表弄的。

chengshuo 发表于 2014-11-1 14:52:04

C写的还是比较容易的,汇编的稍微麻烦点

codeyear 发表于 2014-11-1 16:04:14

呼吸灯,听起来时尚的名字,就是让LED等逐渐变亮再逐渐变暗的循环着。最简单的方法调整占空比即可。

leiyin 发表于 2014-11-1 16:17:36

codeyear 发表于 2014-11-1 16:04
呼吸灯,听起来时尚的名字,就是让LED等逐渐变亮再逐渐变暗的循环着。最简单的方法调整占空比即可。 ...

对就是这样!

leiyin 发表于 2014-11-1 16:18:16

lovecxm 发表于 2014-11-1 11:14
还可以啦,看到一个复杂的,是用查表弄的。

怎么查表了,可以贴上来交流一下!

dz20062008 发表于 2014-11-2 01:38:13

本帖最后由 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_NEQU 20H                                 ;存PWM负半周中间变量
   TEMP_PEQU 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
   
   CLRPWM_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的也可以的。

晨星 发表于 2014-11-2 01:54:11

野火写的呼吸灯程序很好,是一个曲线函数

luolj 发表于 2014-11-2 02:16:46

mark 呼吸灯!

leiyin 发表于 2014-11-2 16:11:59

dz20062008 发表于 2014-11-2 01:38
我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于 ...

我用的是定时器中断处理,定时中断设置成200us

leiyin 发表于 2014-11-2 16:13:15

晨星 发表于 2014-11-2 01:54
野火写的呼吸灯程序很好,是一个曲线函数

方便的话,源码贴上来,学习一下!

dz20062008 发表于 2014-11-2 16:43:33

leiyin 发表于 2014-11-2 16:11
我用的是定时器中断处理,定时中断设置成200us

我的是定频PWM,定时器控制了呼吸灯的亮暗变化速度与曲线,我这是匀速的变化。延时函数也就是PWM最小因子,决定了PWM的最小时间长度。我不断匀速的调节1到129的比值又调回来,这样就实现了占空比的调节。PWM的频率等于最小因子乘以130就是PWM的周期。这样就实现了定频PWM。1S/(100US*130)约等于77HZ    20MS中断一次(我上面的代码备注是50MS那是我一开始设置的值发现有跳动,实际20MS备注没修改)用来改变PWM比值,同时也是控制亮暗的方向。频率是50HZ

voidwalker2012 发表于 2014-11-2 19:38:41

mark 呼吸灯

zsg211550 发表于 2014-11-2 19:42:14

来看看,谢谢分享!

suda2008wuli 发表于 2014-11-2 21:24:56

楼主加油!

hemingjing 发表于 2014-12-11 16:54:37

这个调节是线性的PWM波形,用起来感觉不是很平滑,正在像办法改善。。。不过谢谢楼主这么好的资源

leiyin 发表于 2014-12-11 22:33:07

hemingjing 发表于 2014-12-11 16:54
这个调节是线性的PWM波形,用起来感觉不是很平滑,正在像办法改善。。。不过谢谢楼主这么好的资源 ...

期待你的改进!

lxa0 发表于 2014-12-12 10:35:58

dz20062008 发表于 2014-11-2 01:38
我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于 ...

看见汇编感觉特别亲切~~~~~~~~~~~~~~~~{:lol:} {:victory:}

sidu320 发表于 2015-3-16 15:38:05

dz20062008 发表于 2014-11-2 01:38
我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于 ...

F0标志位,你不是大牛也绝非小菜啊。能加个好友吗?我是小菜。

llww30402048 发表于 2020-10-9 21:22:28

mark 呼吸灯 mark 下
页: [1]
查看完整版本: 【呼吸灯程序---小记】