STC12C5A60S2制作呼吸灯C语言程序怎么写

STC12C5A60S2制作呼吸灯C语言程序怎么写,第1张

呼吸灯的程序

       功能: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语言程序怎么写,不要用定时器,用延时程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9310697.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存