【呼吸灯程序---小记】
本帖最后由 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;
}
摘记那个非常短小的呼吸灯程序链接:http://www.amobbs.com/forum.php?mod=viewthread&tid=5525360&highlight=%E5%91%BC%E5%90%B8%E7%81%AF 回去我也做一个谢谢分享 用单片机自带的PWM不是更好 看看怎样 一般都是用PWM做的 还可以啦,看到一个复杂的,是用查表弄的。 C写的还是比较容易的,汇编的稍微麻烦点 呼吸灯,听起来时尚的名字,就是让LED等逐渐变亮再逐渐变暗的循环着。最简单的方法调整占空比即可。 codeyear 发表于 2014-11-1 16:04
呼吸灯,听起来时尚的名字,就是让LED等逐渐变亮再逐渐变暗的循环着。最简单的方法调整占空比即可。 ...
对就是这样! lovecxm 发表于 2014-11-1 11:14
还可以啦,看到一个复杂的,是用查表弄的。
怎么查表了,可以贴上来交流一下! 本帖最后由 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的也可以的。
野火写的呼吸灯程序很好,是一个曲线函数 mark 呼吸灯! dz20062008 发表于 2014-11-2 01:38
我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于 ...
我用的是定时器中断处理,定时中断设置成200us 晨星 发表于 2014-11-2 01:54
野火写的呼吸灯程序很好,是一个曲线函数
方便的话,源码贴上来,学习一下! 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 mark 呼吸灯 来看看,谢谢分享! 楼主加油! 这个调节是线性的PWM波形,用起来感觉不是很平滑,正在像办法改善。。。不过谢谢楼主这么好的资源 hemingjing 发表于 2014-12-11 16:54
这个调节是线性的PWM波形,用起来感觉不是很平滑,正在像办法改善。。。不过谢谢楼主这么好的资源 ...
期待你的改进! dz20062008 发表于 2014-11-2 01:38
我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于 ...
看见汇编感觉特别亲切~~~~~~~~~~~~~~~~{:lol:} {:victory:} dz20062008 发表于 2014-11-2 01:38
我用6T的单片机24MHZ的晶体做实验还是一眨一眨的,太慢了吗???谁有1T的单片机试试?楼主晶振是多少?于 ...
F0标志位,你不是大牛也绝非小菜啊。能加个好友吗?我是小菜。 mark 呼吸灯 mark 下
页:
[1]