2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 单片机自动调光C语言 51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序

单片机自动调光C语言 51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序

时间:2023-04-11 21:34:50

相关推荐

单片机自动调光C语言 51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序

PWM控制led灯渐亮渐灭程序

适用ME500开发系统

短接JP41-2选用8个LED灯

PWM—PulseWidthModulation(脉冲宽度调制)

PWM足?种周期?走而高低电平的rV空比可以调制的方波信兮.

按K2—下,PWM值减小,则占空比增加。

兗度逐渐增加,直到8个LED灯达到高亮,蜂鸣器响。

按K1—下,PWM值增加,则占空比减小。

立度逐渐减弱,直到8个LED灯达到最峭,蜂鸣器响。

单片机汇编语言源程序如下:

; PWM 控制 LED 灯渐亮渐灭程序

; 适用 ME500 开发系统

; 晶振为11.0592M

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

; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。

; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。

; 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

;----------------------------

PWM EQU 7FH;PWM赋初始值

OUT EQU P0;8个LED灯的接口

INCKEY EQU P1.4;K1,PWM值增加键。

DECKEY EQU P1.5;K2,PWM值减小键。

BEEP EQU P3.7

;----------------------------

ORG 0000H

SJMP START

ORG 000BH

SJMP INTT0

ORG 001BH

SJMP INTT1

ORG 0030H

;----------------------------

;主程序

;定时器0工作在模式1,定时器1工作在模式2。

;----------------------------

START:

MOV SP,#30H

MOV TMOD,#21H

MOV TH1,PWM ;脉宽调节

MOV TL1,#00H

MOV TH0,#0FCH;1ms延时常数

MOV TL0,#066H;频率调节

SETB EA

SETB ET0

SETB ET1

SETB TR0

LOOP: MOV A,PWM ;

JB INCKEY,LOOP1;增加键是否按下?

CALL DELAY ;延时去抖动

JB INCKEY,LOOP1

CJNE A,#0FFH,PWMINC ;是否到最大值?

CALL BEEP_BL;是,蜂鸣器报警。

SJMP LOOP

PWMINC:

INC PWM ;调节脉宽(脉宽减小)

SJMP LOOP

LOOP1: JB DECKEY,LOOP2;减小键是否按下?

CALL DELAY ;延时去抖动

JB DECKEY,LOOP2

CJNE A,#02H,PWMDEC ;是否到最小值?

CALL BEEP_BL;是,蜂鸣器报警。

SJMP LOOP

PWMDEC:

DEC PWM ;调节脉宽(脉宽增加)

LOOP2: SJMP LOOP

;------------------------------

;T0中断服务子程序 (频率)

;控制定时器1中断

;------------------------------

INTT0:

CLR TR1

MOV TH0,#0FCH;1ms延时常数

MOV TL0,#066H ;频率调节

MOV TH1,PWM

SETB TR1

MOV OUT,#00H;启动输出

RETI

;------------------------------

;T1中断服务子程序 (脉宽)

;控制PWM脉冲宽度

;------------------------------

INTT1:

CLR TR1 ;脉宽调节结束

MOV OUT,#0FFH ;结束输出

RETI

;------------------------------

;10ms延时子程序

;------------------------------

DELAY:

MOV R6,#50

DELAY1:

MOV R7,#100

DJNZ R7,$

DJNZ R6,DELAY1

RET

;-----------------------------------------------

;蜂鸣器响一声子程序

;-----------------------------------------------

BEEP_BL:

MOV R6,#100

BL1: CALL BL2

CPL BEEP

DJNZ R6,BL1

MOV R5,#25

CALL DELAY2

RET

BL2: MOV R7,#180

BL3: NOP

DJNZ R7,BL3

RET

DELAY2:;延时R5×10MS

MOV R6,#50

BL4: MOV R7,#100

BL5: DJNZ R7,BL5

DJNZ R6,BL4

DJNZ R5,DELAY2

RET

;---------------------------------------------------

END

C语言版本:

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

#include#includeunsigned int PWM=0xff70 ; //赋初值

void delayms(unsigned char ms);

void delay(unsigned char t);

sbit k1=P3^0;

sbit k2=P1^0;

sbit k3=P1^1;

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

void main()

{

int a,b;

int temp;

temp=a^b;

TMOD=0x11 ;

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

TL0=0xcd ;//频率调节

TH1=PWM/256 ;//脉宽调节

TL1=PWM%256 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

if(k2==0)

{

PWM=PWM+0x01;

while(k2==0);

}

if(k3==0)

{

PWM=PWM-0x01;

while(k3==0);

}

}

}

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

// 定时器0中断服务程序 (频率)

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

void timer0() interrupt 1

{

TR1=0 ;

TH0=0xfe;

TL0=0xcd ;

TR0=0 ;

TH1=PWM/256 ;//脉宽调节

TL1=PWM%256 ;

TR1=1 ;

TR0=1 ;

k1=0; //启动输出

}

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

// 定时器1中断服务程序 (脉宽)

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

void timer1() interrupt 3

{

TR1=0 ;

k1=1; //结束输出

}

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

//蜂鸣器子程序

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

/*void Beep()

{

unsigned char i ;

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

{

delay(100) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

}

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

// 延时子程序

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

void delay(unsigned char t)

{

unsigned char i;

while(t--)

{

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

{

delayms(100);

}

}

}

……………………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。