基于51单片机的pwm调光程序
时间: 2023-09-03 12:09:17 浏览: 257
下面是一个基于51单片机的PWM调光程序的简单实现:
```
#include <reg51.h>
unsigned char duty;
void delay(unsigned int t)
{
while(t--);
}
void PWM_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0_Interrupt() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;
if(duty == 0)
{
P1 = 0xFF;
}
else
{
P1 = ~duty;
}
}
void main()
{
PWM_Init();
while(1)
{
for(duty = 0; duty < 256; duty++)
{
delay(1000);
}
}
}
```
在这个程序中,我们使用了51单片机的定时器0,并在定时器中断函数中实现了PWM调光的功能。调光的步长由`duty`变量控制,每次循环都会把`duty`的值增加1,从而实现了PWM调光的效果。
相关问题
51单片机pwm按键调光程序以及原理图
以下是51单片机基于按键实现PWM调光的程序代码及原理图:
程序代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LED P2
sbit S1 = P1^0;
sbit S2 = P1^1;
uchar pwm = 0;
void delay(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void pwm_out() //PWM输出函数
{
uchar i;
for(i=0;i<100;i++) //循环100次,控制占空比
{
if(i < pwm)
LED = 0;
else
LED = 1;
delay(1); //延时1ms
}
}
void main()
{
S1 = 1;
S2 = 1;
while(1)
{
if(S1 == 0) //按下S1
{
delay(10); //延时10ms
if(S1 == 0) //再次检测S1是否按下
{
pwm++; //占空比加1
if(pwm > 99) //占空比不能大于99
pwm = 99;
}
while(!S1); //等待S1释放
}
if(S2 == 0) //按下S2
{
delay(10); //延时10ms
if(S2 == 0) //再次检测S2是否按下
{
pwm--; //占空比减1
if(pwm < 0) //占空比不能小于0
pwm = 0;
}
while(!S2); //等待S2释放
}
pwm_out(); //PWM输出
}
}
```
原理图:
![51单片机pwm按键调光原理图](https://img-blog.csdn.net/20180418195102575?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xlZmVudG9u/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
阅读全文