急求用51单片机(stc89c52)利用pwm控制led灯光亮度变化的c程序,电路图如下:

急求用51单片机(stc89c52)利用pwm控制led灯光亮度变化的c程序,电路图如下:,第1张

#include <reg52h>

#define uint unsigned int

#define uchar unsigned char

uchar count ,z;

sbit key_1 = P3^7;

sbit key_2 = P3^6;

sbit PWM = P2^0;

void key_control();

void init ();

void create_PWM(uchar);

void delay(uint);

void main ()

{

init ();

while(1);

{

key_control();

create_PWM(count);

}

}

void delay(uint z)

{

uint x,y;

for(x = z;x>0;x--)

for(y = 110;y>0;y--);

}

void init()

{

TMOD = 0x10;

TH1 = (65536-4608)/256;//50sm

TL1 = (65536-4608)%256;

TR1 = 1;

}

void create_PWM(uchar count)

{

static i;

if(TF1 == 1)

{

TF1 = 0;

TH1 = (65536-4608)/256;//50sm

TL1 = (65536-4608)%256;

i++;

if(i == 100) i=0;

if(i <= count) PWM = 1;

else PWM = 0;

}

}

void key_control()

{

if(key_1 ==0)

{

delay(10);

if(key_1 == 0)

{

count+= 5;

if(count >= 100)count = 0;

}

}

if(key_2 ==0)

{

delay(10);

if(key_2 ==0)

{

count-= 5;

if(count <= 0)count =100;

}

}

}

uchar pwm_dat1 = 0,pwm_dat2 = 128;

void PWM_change() interrupt 1

{

TH0 = 0xff;

TL0 = 0xa0;

pwm_dat1 = (pwm_dat1 + 1) % 255;

if(pwm_dat1 < pwm_dat2) PWM = 1;

else PWM = 0;

}

共两个:

/

程序名: 触控调光台灯

编写人: 杜洋

编写时间: 2009年 7月 25日

硬件支持: STC12C2052 12MHz

接口说明: P37(PWM0)用PWM控制LED,P15~P17接3路触摸键

修改日志:

NO1-20090725_0622 完成触控开关LED灯部分和PWM调光部分程序

NO2-20090725_0638 完成开关灯时的渐变亮度

/

说明:电路制作时需要将触摸键和VCC线放在一起,然后触摸时将手同时触摸按键引脚和VCC线。

//

#include <STC12C2052ADH> //STC12Cx052或STC12Cx052AD系列单片机头文件

sbit ON_OFF_Key = P1 ^ 7; //ON/OFF开关键

sbit Add_Key = P1 ^ 6; //加亮度(+)

sbit Doc_Key = P1 ^ 5; //减亮度(-)

//LED与P37(PWM0)连接

unsigned char Bright=0x88; //全局变量,亮度值

bit POWER=0; //LED灯开/关状态标志位

/

函数名:PWM初始化函数

调 用:PWM_init();

参 数:无

返回值:无

结 果:将PCA初始化为PWM模式,初始占空比为0

备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可

//

void PWM_init (void){

CMOD=0x02; //设置PCA定时器

CL=0x00;

CH=0x00;

CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)

CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同

CCAP0H=0x00; // PWM0初始时为0

CR=1; //启动PCA定时器

}

//

/

函数名:PWM0占空比设置函数

调 用:PWM0_set();

参 数:0x00~0xFF(亦可用0~255)

返回值:无

结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平

备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可

//

void PWM0_set (unsigned char a){

CCAP0L= a; //设置值直接写入CCAP0L

CCAP0H= a; //设置值直接写入CCAP0H

}

//

/

函数名:毫秒级CPU延时函数

调 用:DELAY_MS ();

参 数:1~65535(参数不可为0)

返回值:无

结 果:占用CPU方式延时与参数数值相同的毫秒时间

备 注:应用于1T单片机时i<600,应用于12T单片机时i<125

//

void DELAY_MS (unsigned int a){

unsigned int i;

while( --a != 0){

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

}

}

//

/

函数名:主函数

调 用:无

参 数:无

返回值:无

结 果:程序开始处,无限循环

备 注:

//

void main (void){

PWM_init(); //PWM初始化

P1M0 = 0xff; //将P1接口设置为高阻态输入

P1M1 = 0x00; //触摸按键启用

DELAY_MS (200); //延时等待I/O接口电平状态稳定

while(1){ //循环程序部分

unsigned char a; //临时变量

if(ON_OFF_Key == 1){ //开关键按下

if(POWER == 0){ //如果当前状态为关,则执行开灯程序

for(a=0;a<=Bright;a++){ //

PWM0_set(a);

DELAY_MS (20); //渐暗的时间间隔

}

PWM0_set(Bright); //达到存储的LED亮度

POWER = 1; //把状态标志位变成开

}else{ //如果当前状态为开,则执行关灯程序

for(a=Bright;a>0;a--){ //循环渐暗

PWM0_set(a);

DELAY_MS (20); //渐暗的时间间隔

}

PWM0_set(0); //关LED

POWER = 0; //把状态标志位变成关

}

while(ON_OFF_Key == 1); //等待按键放开

}

if(Add_Key == 1 && POWER == 1){ //加亮度键按下,同时在开灯状态下

Bright++; //亮度值加1

PWM0_set(Bright); //将值写入PWM控制LED亮度

if(Bright >= 0xFD){ //如果亮度值大于0xFD,则不再增加

Bright = 0xFD;

}

DELAY_MS (20); //渐变亮度的时间间隔

}

if(Doc_Key == 1 && POWER == 1){ //减亮度键按下,同时在开灯状态下

Bright--; //亮度值减1

PWM0_set(Bright); //将值写入PWM控制LED亮度

if(Bright < 0x08){ //如果亮度值小于0x08,则不再减少

Bright = 0x08;

}

DELAY_MS (20); //渐变亮度的时间间隔

}

}

}

//

/

杜洋工作室 DoYoung Studio

与电子爱好者同行 >

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit key =P2^5;

sbit key1=P2^4;

sbit key2=P2^3;

sbit key3=P2^2;

sbit pwm=P1^0;

uint pwm_value=1960;

uint count=0;

void timer0(void) interrupt 1 using 1

{

switch(count)

{

case 1:pwm=1;

TH0=-pwm_value/256;

TL0=-pwm_value%256;

break;

case 2: pwm=0;

TH0=-(2700-pwm_value)/256;

TL0=-(2700-pwm_value)%256;

break;

/case 3:pwm1=1;

TH0=-pwm_value/256;

TL0=-pwm_value%256;

break;

case 4: pwm1=0;

TH0=-(2700-pwm_value)/256;

TL0=-(2700-pwm_value)%256;

break;

case 5:pwm2=1;

TH0=-pwm_value/256;

TL0=-pwm_value%256;

break;

case 6: pwm2=0;

TH0=-(2700-pwm_value)/256;

TL0=-(2700-pwm_value)%256;

break;

case 7:pwm3=1;

TH0=-pwm_value/256;

TL0=-pwm_value%256;

break;

case 8: pwm3=0;

TH0=-(2700-pwm_value)/256;

TL0=-(2700-pwm_value)%256;

break;

case 9:pwm4=1;

TH0=-pwm_value/256;

TL0=-pwm_value%256;

break;

case 10: pwm4=0;

TH0=-(2700-pwm_value)/256;

TL0=-(2700-pwm_value)%256;

break;

case 11:pwm5=1;

TH0=-pwm_value/256;

TL0=-pwm_value%256;

break;

case 12: pwm5=0;

TH0=-(2700-pwm_value)/256;

TL0=-(2700-pwm_value)%256;

break;/

default: count=0;

}

count++;

}

void InitTimer0(void)

{

count=1;

TMOD=0x11;

TH0=-1500/256;

TL0=-1500%256;

EA=1;

ET0=1;

TR0=1;

}

void delay(void)

{

uint i=100;

while(i--);

}

void main(void)

{

InitTimer0();

while(1)

{

if(pwm_value<2200)

pwm_value+=2;

if(pwm_value>1000)

pwm_value-=2;

}

}

PWM调制脉冲宽不超过25MS,周期为20MS,所以一个周期内可以输出8个脉冲用于控制8路舵机,修改TH0和TL0可改变频率,修改pwm_value可以修改占空比,希望对您有所帮助,谢谢!

以上就是关于急求用51单片机(stc89c52)利用pwm控制led灯光亮度变化的c程序,电路图如下:全部的内容,包括:急求用51单片机(stc89c52)利用pwm控制led灯光亮度变化的c程序,电路图如下:、52单片机PWM法控制一个LED灯亮度,求原理图和C程序,最好附原理图及解释、求高人给我发几个关于C51单片机PWM的编程实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存