51呼吸灯源码(PWM调制)

在这里插入图片描述
在这里插入图片描述

图2中 LED灯阳极3需连接到图1射极跟随器电路输出DAOUT。

#include <reg52.h>
sfr P4 = 0xe8; /C语言中声明P4口特殊功能寄存器地址/
sbit DAC_DATA = P4^4;//DA数据口
unsigned char DAC_VAL;//占空比参数 模拟8位DA输出,取值范围0-255
unsigned char pwm_t;//周期

#define MAIN_Fosc 11059200UL //宏定义主时钟HZ
typedef unsigned int INT16U;

/====================================
函数名 :void delay(INT16U ms)
参数 :ms,毫秒延时形参
返回值 :无
描述 :12T 51单片机自适应主时钟毫秒级延时函数
====================================
/
void delay(INT16U ms)
{
INT16U i;
do{
i = MAIN_Fosc / 96000;
while(–i); //96T per loop
}while(–ms);
}
//定时器0中断
void timer0() interrupt 1
{
pwm_t++;//周期自加到255溢出后自动归零
if(pwm_t <= DAC_VAL)// 设置占空比
DAC_DATA = 1;
else
DAC_DATA = 0;
}
void main()
{
bit flag = 0;
TMOD |= 0x02;//8位自动重装模块
TH0 = 220;
TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ
TR0 = 1;//启动定时器0
ET0 = 1;//允许定时器0中断
EA = 1;//总中断允许
DAC_VAL = 80;//LED10灯点亮最低电压
while(1)
{
delay(5);
if(DAC_VAL == 255)
flag = 1;
else if(DAC_VAL == 80)
flag = 0;
if((DAC_VAL < 255) && (flag == 0))
DAC_VAL++;
else if((DAC_VAL > 80) && (flag == 1))
DAC_VAL–;

}

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机呼吸的实现是通过PWM(脉宽调制)技术来实现的[^1]。下面是配置51单片机呼吸PWM的步骤: 1. 配置P_SW2寄存器:将最高位EAXFR置1,允许访问XFR寄存器。 2. 选择PWM0的时钟为系统时钟:通过设置PWM0T1寄存器的CLKDIV位来选择时钟。 3. 初始化PWM0模块:设置PWM0T1寄存器的PWM0T1EN位为1,使得可以驱动PWM0模块。 4. 配置PWM0的工作模式:设置PWM0T1寄存器的PWM0T1MD位来选择工作模式,例如选择自动重载模式。 5. 配置PWM0的周期和占空比:设置PWM0T1寄存器的PWM0T1PR和PWM0T1DR位来设置周期和占空比的值。 6. 启动PWM0:设置PWM0T1寄存器的PWM0T1RUN位为1,启动PWM0。 下面是一个示例代码,演示了如何在51单片机上实现呼吸效果的PWM控制: ```c #include <reg52.h> sbit PWM0 = P1^0; // PWM0输出引脚 void delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } void main() { unsigned int i; P_SW2 = 0x80; // 配置P_SW2寄存器,允许访问XFR寄存器 PWM0T1 = 0x00; // 选择PWM0的时钟为系统时钟 PWM0T1 |= 0x01; // 初始化PWM0模块 PWM0T1 |= 0x10; // 配置PWM0的工作模式为自动重载模式 while(1) { for(i = 0; i < 100; i++) // 呼吸效果,占空比从0增加到100 { PWM0T1DR = i; // 设置PWM0的占空比 delay(10); // 延时 } for(i = 100; i > 0; i--) // 呼吸效果,占空比从100减小到0 { PWM0T1DR = i; // 设置PWM0的占空比 delay(10); // 延时 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值