C语言开定时器做呼吸灯程序,[求助]呼吸灯的编程思路(C语言)

/***************************************************************

* 程序说明:使用P3.2和P3.4来控制P0端口的LED灯,达到手动调节渐亮或渐灭(也可一直按着),

到最亮或最暗时蜂鸣器发出提示声音;

晶振 11.0592M

* 利用定时器控制产生占空比可变的 PWM 波

* 按int0键,PWM值增加,则占空比减小,LED 灯渐暗。

* 按t0键,PWM值减小,则占空比增加,LED 灯渐亮。

什么是PWM技术?简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过计

数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然

是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。

电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即

是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟

值都可以使用PWM进行编码。

MCS-51系列单片机本身无PWM输出功能, 但可以采用定时器配合软件的方法对输出脉冲进行调

宽来模拟实现,对精度要求不是太高的场合是非常实用的。

****************************************************************/

#include  

#include  

sbit S1 =P3^2;  //定义P3.2为增加键

sbit S2 =P3^4;  //定义P3.3为减少键

sbit leds =P1^4;  //定义P3.3为减少键

sbit  BELL =P2^2;   //定义蜂鸣器

unsigned char PWM=0x7f; //PWM赋初值

void Bee();

void delayms(unsigned char ms);

void delay(unsigned char t);

/*--------------------------------------------------*/

void main() //主程序

{

leds =0;

P0=0xff;

TMOD=0x21;

TH0=0xfc;   //1ms延时常数

TL0=0x66;   //频率调节

TH1=PWM ;   //脉宽调节

TL1=0 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Bee();

}

while(S1==0);

do{

if(PWM!=0x02)

{PWM-- ;delayms(10);}

else Bee() ;

}

while(S2==0);

}

}

// ---------------------------定时器0中断服务程序

void timer0() interrupt 1

{

TR1=0;

TH0=0xfc;

TL0=0x66;

TH1=PWM;

TR1=1;

P0=0x7f ;   //启动输出

}

//---------------------------- 定时器1中断服务程序

void timer1() interrupt 3

{

TR1=0 ;

P0=0xff ;   //结束输出

}

//-------------------------------蜂鸣器子程序

void Bee()

{

unsigned char i  ;

for (i=0  ;i<100  ;i++)

{

delay(100)  ;

BELL=!BELL  ;//BeLL取反

}

BELL=1  ;                            //关闭蜂鸣器

delayms(100);

}

//-------------------------------- 延时子程序1

void delay(unsigned char t)

{

while(t--);

}

//--------------------------------- 延时子程序2

void delayms(unsigned char ms)

{

unsigned char i;

while(ms--)

{

for(i=0;i<120;i++);

}

}

关于呼吸灯C语言编程Options 1,0,0 // Target 'Target 1' Device (AT89C51) Vendor (Atmel) Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000)) FlashUt () StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code")) FlashDR () DevID (2976) Rgf (REGX51.H) Mem () C () A () RL () OH () DBC_IFX () DBC_CMS () DBC_AMS () DBC_LMS () UseEnv=0 EnvBin () EnvInc () EnvLib () EnvReg (Atmel\) OrgReg (Atmel\) TgStat=16 OutDir (.\) OutName (a9) GenApp=1 GenLib=0 GenHex=1 Debug=1 Browse=1 LstDir (.\) HexSel=0 MG32K=0 TGMORE=0 RunUsr 0 0 RunUsr 1 0 BrunUsr 0 0 BrunUsr 1 0 SVCSID MODEL5=0 RTOS5=0 ROMSZ5=2 DHOLD5=0 XHOLD5=0 T51FL=80 XT51FL=0 CBANKS5=0 XBANKS5=0 RCB51 { 0,0,0,0,0,0,0,1,0 } RXB51 { 0,0,0,0,0,0,0,0,0 } OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IRO51 { 1,0,0,0,0,0,16,0,0 } IRA51 { 0,0,0,0,0,128,0,0,0 } XRA51 { 0,0,0,0,0,0,0,0,0 } XRA512 { 0,0,0,0,0,0,0,0,0 } IROM512 { 0,0,0,0,0,0,0,0,0 } C51FL=21630224 C51VA=0 C51MSC () C51DEF () C51UDF () INCC5 () AX51FL=4 AX51MSC () AX51SET () AX51RST () INCA5 () PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IncBld=1 AlwaysBuild=0 GenAsm=0 AsmAsm=0 PublicsOnly=0 StopCode=3 CustArgs () LibMods () BankNo=65535 LX51FL=292 LX51OVL () LX51MSC () LX51DWN () LX51LFI () LX51ASN () LX51RES () LX51CCL () LX51UCL () LX51CSC () LX51UCS () LX51COB () LX51XDB () LX51PDB () LX51BIB () LX51DAB () LX51IDB () LX51PRC () LX51STK () LX51COS () LX51XDS () LX51BIS () LX51DAS () LX51IDS () OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51) OPTDBG 48125,-1,()()()()()()()()()() ()()()() FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 } FLASH2 () FLASH3 () FLASH4 () EndOpt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值