搜索
bottom↓
回复: 49

[分享]51模拟PWM控制LED

[复制链接]

出0入0汤圆

发表于 2009-5-18 13:26:51 | 显示全部楼层 |阅读模式
看了论坛上的所发的51模拟PWM来控制LED亮度变化,现在自己整理一下调试通过,感觉效果不错,回报大家献上源码

如果有什么不好,请大家指教,并指出,谢谢!

#include"delay.h"
//#include"com.h"
#include"key.h"
#include"beep.h"

sfr  T2MOD = 0xC9;                // 定时器2

#define         PWM_COUST        10                                // PWM细分数
volatile unsigned char PWM_H;                         // PWM占空比调节
volatile unsigned char PWM_CNT = 0;                // PWM自增值

/***************************************************************
*                                                定时器2中断程序
***************************************************************/
void Timer2(void) interrupt 5 using 1
{
        if (PWM_CNT < PWM_H)                 // 预设占空比输出
        {
                P1 = 0x00;                // 开LED               
        }
        else
        {
                P1 = 0xFF;                // 关LED
        }

        if (PWM_CNT >= PWM_COUST)        // PWM计数清零
        {
                PWM_CNT = 0;
        }
        else
        {
                PWM_CNT ++;                // 自增值加1
        }       
}

/***************************************************************
*                                                定时器2初始化
***************************************************************/
#define MSB_reload_value 0xDB         // msb reload value exemple 高位重载值:延时10ms
#define LSB_reload_value 0xF0         // lsb reload value exemple 低位重载值
void Timer2Init(void)
{
        // T2OE=0;定时器2输出不允许  
        T2MOD = 0x01;        // DCEN=1;可以设置为向上/下计数:此程序中为向上达到0xff时溢出
        T2CON = 0;                // TF2 EXF2 RCLK TCLK EXEN2 TR2 C_T2 CP_RL2
        // EXF2=0;  reset flag 定时器2外部标志位清除
        // TCLK=0;RCLK=0;  disable baud rate generator 不用于波特率发生器
        // EXEN2=0; ignore events on T2EX 视T2EX(P1.1)端信号无效
        // C_T2=0; timer mode 定时模式
        // CP_RL2=0;  reload mode 重载模式
        TH2           = MSB_reload_value; // Init msb_value 填入初始化值
        TL2           = LSB_reload_value; // Init lsb_value  
        RCAP2H = MSB_reload_value; // reload msb_value重载值  
        RCAP2L = LSB_reload_value; // reload lsb_value  

        ET2 = 1;         // enable timer2 interrupt 允许T2中断
}


void Init(void)
{
        DelayMs(100);                // 等待系统稳定
       
        P0 = 0xFF;                        // 初始化IO
        P1 = 0xFF;
        P2 = 0xFF;
        P3 = 0xFF;
       
        //InitSerial();                // 串口初始化

        Timer2Init();                // 定时器2初始化
        EA  = 1;                    // 开总中断

        PWM_H         = 5;                // 初始占空比5
        PWM_CNT = 0;                // 初始化PWM自增值
}
       
main()
{
        unsigned char ucKey;

        Init();                // 初始化

        TR2 = 1;        // 启动定时器2
        while(1)
        {
                ucKey = KeyScan();                // 读取键盘值

                if (ucKey != ValNull)        // 如果不为空
                {
                        if (ucKey == ValKey1)        // 如果等于key1
                        {
                                if (PWM_H <= PWM_COUST)  // 如果PWM_H在PWM范围内
                                {
                                        PWM_H ++;                         // 增加PWM_H
                                }
                                else
                                {
                                        BeepMs(5);                // 等于最大值报警
                                }
                        }
                        if (ucKey == ValKey2)         // 如果等于key2
                        {
                                if (PWM_H)                        // 如果PWM_H不等于0
                                {
                                        PWM_H --;            //  减少PWM_H
                                }
                                else
                                {
                                        BeepMs(1);                 // 等于最小值报警
                                }
                        }
                        //SendByte(PWM_H);        // 串口发送当前PWM_H
                }
                //_CLRWDT_        // 清看门口
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2009-5-18 13:33:09 | 显示全部楼层
进入论坛以来第一次做沙发,哈哈

出0入0汤圆

发表于 2009-5-18 15:31:18 | 显示全部楼层
板凳,麻烦楼主把几个头文件的代码也发一下!

出0入0汤圆

 楼主| 发表于 2009-5-18 15:40:59 | 显示全部楼层
点击此处下载 ourdev_445805.rar(文件大小:137K) (原文件名:PWM控制等亮度.rar)

出0入0汤圆

发表于 2009-5-18 16:05:03 | 显示全部楼层
能附上个原理图么?否则搞不清楚输出的管脚。

出0入0汤圆

 楼主| 发表于 2009-5-18 17:01:17 | 显示全部楼层
4×4键盘
sbit Hor1 = P2^7;                        // 水平第一行
sbit Hor2 = P2^6;
sbit Hor3 = P2^5;
sbit Hor4 = P2^4;
sbit Ver1 = P2^3;                        // 垂直第一列               
sbit Ver2 = P2^2;       
sbit Ver3 = P2^1;               
sbit Ver4 = P2^0;               
               
/********************************************************
        Ver1           Ver2            Ver3             Ver4
          ↓            ↓         ↓              ↓
Hor1 →        ValKey1   ValKey2    ValKey3   ValKey4

Hor2 →        ValKey5   ValKey6         ValKey7           ValKey8
         
Hor3 →        ValKey9         ValKey10         ValKey11   ValKey12

Hor4 →        ValKey13  ValKey14         ValKey15           ValKey16


P1 为发光二极管
P3^5为蜂鸣器

这些程序里应该都有的吧,仔细看看吧

出0入0汤圆

发表于 2009-12-15 01:17:10 | 显示全部楼层
mark~

出0入0汤圆

发表于 2010-1-12 19:17:39 | 显示全部楼层
记号下。

出0入0汤圆

发表于 2010-1-12 19:23:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-27 17:57:29 | 显示全部楼层
这个( ^_^ )不错嘛

出0入0汤圆

发表于 2010-1-30 12:35:07 | 显示全部楼层
这是通过延时来模拟控制PWM的吧?像一般的51好像是没有PWM控制的.

出0入0汤圆

发表于 2010-5-21 10:34:26 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-7-10 23:02:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-11 10:27:20 | 显示全部楼层
学习!

出0入0汤圆

发表于 2010-7-11 21:40:33 | 显示全部楼层
向楼主学习

出0入0汤圆

发表于 2010-7-12 11:15:15 | 显示全部楼层
新手,学习

出0入0汤圆

发表于 2010-7-12 12:32:30 | 显示全部楼层
这个要顶!

出0入0汤圆

发表于 2010-7-12 13:05:56 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-8-10 10:28:47 | 显示全部楼层
标记学习

出0入0汤圆

发表于 2010-8-13 21:00:13 | 显示全部楼层
学习了......

出0入0汤圆

发表于 2010-8-13 21:22:34 | 显示全部楼层
谢谢楼主!学习了

出0入0汤圆

发表于 2010-8-13 21:37:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-2 21:16:50 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-1-15 22:51:25 | 显示全部楼层
还是不懂啊

出0入0汤圆

发表于 2011-1-21 00:31:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-27 00:38:18 | 显示全部楼层
学习一下!
头像被屏蔽

出0入0汤圆

发表于 2011-7-5 17:13:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-7-6 09:05:31 | 显示全部楼层
51的PWM没有这么强吧,而且一旦主频率达不到,很难形成稳定的PWM,这个程序还是蛮好的,谢谢分享

出0入0汤圆

发表于 2011-7-20 15:09:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-20 21:26:33 | 显示全部楼层

出0入0汤圆

发表于 2011-7-20 21:53:28 | 显示全部楼层
标记学习

出0入0汤圆

发表于 2011-7-21 12:39:26 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-7-21 21:00:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-21 22:23:15 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-7-21 23:05:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-21 23:20:26 | 显示全部楼层
ding

出0入0汤圆

发表于 2011-8-29 16:26:22 | 显示全部楼层
回复【楼主位】seawind319
-----------------------------------------------------------------------

mark

出0入0汤圆

发表于 2011-8-29 18:16:31 | 显示全部楼层
谢谢分享呀,

出0入0汤圆

发表于 2011-8-29 20:31:12 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2011-8-29 20:53:13 | 显示全部楼层
初学单片机,看到帖想起了杜洋老师的“呼吸灯”,是用频率控制的,楼主这个程序可以实现吗?初学莫笑,求知识。

出0入0汤圆

发表于 2011-8-30 17:05:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-30 21:29:21 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-1-30 22:19:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-3 19:37:12 | 显示全部楼层
楼主要是能画出流程图就好了,因为重要的是编程思路,不是程序本身

出0入0汤圆

发表于 2012-4-20 16:12:52 | 显示全部楼层
正在学习中

出0入0汤圆

发表于 2012-4-20 16:16:59 | 显示全部楼层
顶一个,下来看看.

出0入0汤圆

发表于 2012-4-20 18:33:43 | 显示全部楼层
我一般是用100Hz,随便哪个IO都可以,亮度可调100级

出0入0汤圆

发表于 2012-4-20 20:26:04 | 显示全部楼层
唉~~~~~~~~~~~~可惜我只会汇编

出0入0汤圆

发表于 2017-11-9 11:04:55 | 显示全部楼层
路过,顶一个
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 23:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表