
/
功能:LED灯慢慢变暗,再慢慢变亮。
用定时器模拟的PWM调制。
单片机:AT89S52
/
#include <reg52h>
#define V_TH0 0XFF //设定定时器0,高8位的初值
#define V_TL0 0XF6 //设定定时器0,低8位的初值
#define V_TMOD 0X01 //设定定时器0的工作方式为:方式1(计数位数是16位 //,由TL0作为低8位、TH0作为高8位)
#define uchar unsigned char
#define uint unsigned int
void init_sys(); //系统初始化函数
void delay(uint); //延时函数
unsigned char ZKB; //占空比
void main (void)
{
init_sys(); //初始化
while(1)
{
for(ZKB=5;ZKB<40;ZKB=ZKB+2) //每调节一次占空比,就延时大概8ms左右,这使得LED现象更明显
{
delay(8);
}
for(ZKB=40;ZKB>5;ZKB=ZKB-2)
{
delay(8);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void init_sys() /系统初始化函数/
{
/定时器初始化/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
void timer0(void) interrupt 1 using 2
{
static uchar click=0; //中断次数计数器变量
TH0=V_TH0; //重新恢复定时器初始值
TL0=V_TL0;
++click; //每计数10次,产生一个中断,并且click增加一个
if (click>=100)
click=0; //计满一百次,这重新计数。
/因为计一次数的时间是1us,10次产生一个中断,也就是一个中断10us。100个中断为1ms。
则,可以在这100个数中随便取值,用于表示占空比的多少,占空比的范围为(1~100)/
if (click<=ZKB) //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整
P1=0x00; //P1口接的是LED灯
else
P1=0xff;
}
此程序的总中断时间为100ms,即频率为:100KHZ,占空比从5 变为40(即5%~25%)。
因为我不知道你这个板子的硬件,我就假设一下吧,你自己对照着看看,关键是流程
假设如下这八个灯依次接在P0口的八个口上,高电平为灯亮,低电平为灯灭,程序如下
ORG 0000H
AJMP START
START:MOV P0,#01H;()只有第一个灯亮
ACALL DELAY;延迟,不加延迟的话 你根本看不起清到底那个灯亮的
MOV P0,#02H;()只有第二个灯亮
ACALL DELAY
MOV P0,#04H;()只有第三个灯亮
ACALL DELAY
MOV P0,#08H;()只有第四个灯亮
ACALL DELAY
MOV P0,#10H;()只有第五个灯亮
ACALL DELAY
MOV P0,#20H;()只有第六个灯亮
ACALL DELAY
MOV P0,#40H;()只有第七个灯亮
ACALL DELAY
MOV P0,#80H;()只有第八个灯亮
ACALL DELAY
AJMP START;周而复始
DELAY: MOV R6,#40;延迟程序,晶振为357MHZ时大概是01S
01SL1: MOV R5,#246
01SL2: NOP
DJNZ R5,01SL2
DJNZ R6,01SL1
RET
END
一51没有这样的功能,STC12单片机才有这样的功能,不过你可以用延时函数来产生PWM波形,但比较浪费CPU时间。二还有一种方法可以用51来实现,但要消耗两个定时器,一个T0定时器控制PWM周期,另一个T1定时器控制PWM占空比。(T0装的初值要大于T1的初值)在定时器中断的时候都是对I/O口进行取反就可以了。一个定时器产生PWM波形,做不出来,要两个的(不过只赏0分太少了吧!!!)
其实通俗一点去理解是这样子的,你可以理解为:PWM的占空比越大,那么释放的能量越高,反之释放的能量越低,这样就会使得LED的亮度变亮或者变暗,PWM的占空比是可以持续调节的,0-100%连续调节,这样LED就会逐渐变亮或者变暗,通过控制PWM占空比调节的时间间隔就可以实现呼吸灯的效果!时间间隔越大LED的变化就慢,反之就快!
PWM波的频率是某一个固定的值,但是高低电平所占比例(占空比)会根据用户设定而变化。假设高电平灯点亮,低电平熄灭,那么在PWM波一个周期内灯点亮的时间就等于周期占空比。调整占空比,就可以控制LED在一个周期内的点亮时间。
由于PWM波频率很高,超出人眼分辨速度,那么在人眼中就是连续的灯光,按照渐变占空比变化,在人眼中就可以表现为亮度的变化。
PS:你也可以理解为高电平所占面积变化,类似于平均功率的概念。
以上就是关于STC12C5A60S2制作呼吸灯C语言程序怎么写全部的内容,包括:STC12C5A60S2制作呼吸灯C语言程序怎么写、51单片机用汇编语言如何设计8个轮流呼吸的呼吸灯、呼吸灯延时程序C语言单片机制作呼吸灯的C语言程序怎么写,不要用定时器,用延时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)