搜索
bottom↓
回复: 24

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

[复制链接]

出0入0汤圆

发表于 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的上下范围即调节占空比
   

  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.         
复制代码

     

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-10-31 13:38:23 | 显示全部楼层
摘记那个非常短小的呼吸灯程序链接:http://www.amobbs.com/forum.php? ... C%E5%90%B8%E7%81%AF

出5入8汤圆

发表于 2014-10-31 13:49:57 | 显示全部楼层
回去我也做一个  谢谢分享

出0入0汤圆

发表于 2014-10-31 14:02:46 | 显示全部楼层
用单片机自带的PWM不是更好

出0入0汤圆

发表于 2014-10-31 23:51:34 | 显示全部楼层
看看怎样

出0入4汤圆

发表于 2014-11-1 01:43:18 | 显示全部楼层
一般都是用PWM做的

出0入0汤圆

发表于 2014-11-1 11:14:01 | 显示全部楼层
还可以啦,看到一个复杂的,是用查表弄的。

出0入0汤圆

发表于 2014-11-1 14:52:04 | 显示全部楼层
C写的还是比较容易的,汇编的稍微麻烦点

出0入0汤圆

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

出0入0汤圆

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

对就是这样!

出0入0汤圆

 楼主| 发表于 2014-11-1 16:18:16 | 显示全部楼层
lovecxm 发表于 2014-11-1 11:14
还可以啦,看到一个复杂的,是用查表弄的。

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

出145入215汤圆

发表于 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_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的也可以的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-2 01:54:11 来自手机 | 显示全部楼层
野火写的呼吸灯程序很好,是一个曲线函数

出0入0汤圆

发表于 2014-11-2 02:16:46 | 显示全部楼层
mark 呼吸灯!

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2014-11-2 16:13:15 | 显示全部楼层
晨星 发表于 2014-11-2 01:54
野火写的呼吸灯程序很好,是一个曲线函数

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

出145入215汤圆

发表于 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

出0入0汤圆

发表于 2014-11-2 19:38:41 | 显示全部楼层
mark 呼吸灯

出0入0汤圆

发表于 2014-11-2 19:42:14 | 显示全部楼层
来看看,谢谢分享!

出0入0汤圆

发表于 2014-11-2 21:24:56 | 显示全部楼层
楼主加油!

出0入4汤圆

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

出0入0汤圆

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

期待你的改进!

出0入0汤圆

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

看见汇编感觉特别亲切~~~~~~~~~~~~~~~~

出0入0汤圆

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

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

出0入0汤圆

发表于 2020-10-9 21:22:28 | 显示全部楼层
mark 呼吸灯 mark 下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 22:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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