请高手用51单片机定时器计数器编写一个PWM的渐变程序,

请高手用51单片机定时器计数器编写一个PWM的渐变程序,,第1张

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0

uint PWM=255//

void Timer_Init()

{

TMOD=0X12//t1工作在1模式,t0工作在8位自动重装初值模式

EA=1 //开总中断

ET1=1

TR1=1 //使能

ET0=1

TH1=-50000/256

TL1=-50000%256 //50ms定时

TH0=PWM

}

void main()

{

Timer_Init()

while(1)

{

PWM--//由暗变亮

if(PWM==0)

{PWM++; //由亮变暗

if(PWM==255)

PWM=255//重新开始

}

}

}

void t0_isr() interrupt 1 //t0控制占空比

{

led1=0;

TR0=0

}

void t1_isr() interrupt 3 //t1控制周期,这里以1s说明

{

uchar cnt;

cnt++

if(cnt==20) //1s到

{

cnt=0;

led1=1;

}

TR0=1

}

#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED0=P1^0// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号

void Delay(unsigned int t)//函数声明

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

主函数

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

void main (void)

{

unsigned int CYCLE=600,PWM_LOW=0//定义周期并赋值

while (1) //主循环

{

P1=0xff

Delay(60000) //特意加延时,可以看到熄灭的过程

for(PWM_LOW=1PWM_LOW<CYCLEPWM_LOW++){ //PWM_LOW表示低

//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次

P1=0x00 //点亮LED

Delay(PWM_LOW)//延时长度,600次循环中从1加至599

P1=0xff //熄灭LED

Delay(CYCLE-PWM_LOW)//延时长度,600次循环中从599减至1

}

P1=0x00

for(PWM_LOW=CYCLE-1PWM_LOW>0PWM_LOW--){ //与逐渐变亮相反的过程

P1=0x00

Delay(PWM_LOW)//变小

P1=0xff

Delay(CYCLE-PWM_LOW)//变大

}

//主循环中添加其他需要一直工作的程序

}

}

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

延时函数,含有输入参数 unsigned int t,无返回值

unsigned int 是定义无符号整形变量,其值的范围是

0~65535

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

void Delay(unsigned int t)

{

while(--t)

}


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

原文地址:https://54852.com/yw/11827682.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存