• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

用单片机控制(软件产生PWM)LED的亮度

//引入头文件*********************************************************
#include          "delay.h"
#include          "delay.c"
#include      

//脚位定义***********************************************************  
#define       key       RA3                                //按键输入  
#define       led       RB0                                //输出指示  

//开关标志***********************************************************
     persistent bit Sign;                                  //开关标志    
    
//占空比数据*********************************************************
     persistent unsigned char data;                        //占空表值

     const unsigned char PwmDat[10] = {0x19, 0x32, 0x4b, 0x64, 0x7d,  
                                       0x96, 0xaf, 0xc8, 0xe1, 0xfa};
  
//*******************************************************************  
//函数名称:PortInit();  
//输入参数:无  
//输出参数:无  
//功能描述:端口设置  
//建造日期:2008.06.06  
//*****************************************************************  
void PortInit(void)  
{  
     PORTA = 0xfd;                                         //    
     TRISA = 0xfd;                                         //A 口设置    
      
     PORTB = 0x00;                                         //  
     TRISB = 0x00;                                         //B 口设置  
}  
  
//*******************************************************************  
//函数名称:KeyInt();  
//输入参数:无
//输出参数:无  
//功能描述:按键处理函数  
//建造日期:2008.06.06  
//*******************************************************************  
void KeyInt(void)  
{    
     static unsigned char count = 0;                       //长按计数
     static bit valid = 0;                                 //有效标志  
     static bit reach = 0;                                 //长按标志  
      
     if (valid == 1)  
      {  
       if (key == 0)                                       //按键有效
        {  
         count++;                                          //增加计数    

         if (count == 50)                              
          {
           count = 25;                                     //长按加速
           reach = 1;                                      //长按置位  
           data++;                                         //查表增加
            
           if (data > 9) data = 0;                         //循环查表    
          }            
        }  
      
       else  
        {
         if (reach == 0) Sign = !Sign;                     //取反状态
          
         count = 0;                                        //计数清零    
         valid = 0;                                        //有效清零  
         reach = 0;                                        //长按清零  
        }    
      }  
        
     else  
      {  
       if (key == 0) valid = 1;                            //有效置位  
      }  
}  

//*******************************************************************  
//函数名称:LedPwm();  
//输入参数:无
//输出参数:无  
//功能描述:led 脉冲调宽输出  
//建造日期:2008.06.06  
//*******************************************************************  
void LedPwm(void)  
{  
     unsigned char PwmH, PwmL;  
     unsigned char i,Pwm;  
      
     Pwm = PwmDat[data];                                   //占空查表
      
     if(Sign == 1)                                         //是否开机
      {    
       for (i = 0; i < 20; i++)  
        {  
         PwmH = Pwm;                                       //脉冲高位  
         PwmL = 250 - PwmH;                                //脉冲低位  

         led = 1;                                          //  
         while (PwmH--);                                   //高位输出  
      
         led = 0;                                          //  
         while (PwmL--);                                   //低位输出  
        }  
      }

     else    
      {
       DelayMs(20);                                        //关机延时  
      }      
}  

//*******************************************************************  
//函数名称:main();  
//输入参数:无  
//输出参数:无  
//功能描述:主要程序  
//建造日期:2008.06.06  
//*******************************************************************  
void main(void)                                            //  
{      
     PortInit();                                           //脚位设置  
      
     if (data > 9) data = 0;                               //是否越阶
      
     while (1)  
      {  
       KeyInt();                                           //按键处理  
       LedPwm();                                           //脉冲输出  
      }    
}  


可以实现短按开关机(按键 < 1S),长按凋光(按键 >1S),以10%占空比步进.占空比为 10% -100% (在关机时长按无效)
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/70/1073571224733313.jpg?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg,t_20');}" onmousewheel="return imgzoom(this);">
全部回复(22)
正序查看
倒序查看
2008-10-23 11:45
该程序比较精简....可以移值到PIC12C508A单片机上...
也可以改成三路输出按制RGB LED ...

用内部RC振荡..可以实现低成本方案...
0
回复
niquanwei
LV.5
3
2008-10-23 14:15
@点点滴滴
该程序比较精简....可以移值到PIC12C508A单片机上...也可以改成三路输出按制RGBLED...用内部RC振荡..可以实现低成本方案...
低成本,1.5一片已经写好调光程序的 或者RGB带定色程序的,谁要?
喊几声!
0
回复
2008-10-23 15:00
@niquanwei
低成本,1.5一片已经写好调光程序的或者RGB带定色程序的,谁要?喊几声!
能不能实现50Hz过零同步变化.....

台湾的单片机...1.3 ...我都能给..
0
回复
hzfzy
LV.1
5
2008-11-23 04:57
@niquanwei
低成本,1.5一片已经写好调光程序的或者RGB带定色程序的,谁要?喊几声!
我要这个,请发RGB带定色程序的详细资料来,谢谢!hzfzy@139.com
0
回复
morine
LV.1
6
2008-12-08 15:47
请给我一份,fiacky@163.com.谢谢了.
0
回复
2008-12-09 10:00
@niquanwei
低成本,1.5一片已经写好调光程序的或者RGB带定色程序的,谁要?喊几声!
我也要一份,能否发下给我?谢谢!zhongyuqiang2006@163.com
0
回复
2009-01-29 16:15
@niquanwei
低成本,1.5一片已经写好调光程序的或者RGB带定色程序的,谁要?喊几声!
我要~~~~~~~~邮箱misscool1656@163.com qq184217356
0
回复
2009-02-02 08:49
@niquanwei
低成本,1.5一片已经写好调光程序的或者RGB带定色程序的,谁要?喊几声!
我要~~~~~~~~邮箱ssg88@126.com  QQ19827671
0
回复
hqsh158
LV.1
10
2009-04-10 22:51
@点点滴滴
能不能实现50Hz过零同步变化.....台湾的单片机...1.3...我都能给..
请问可以实时控制亮度吗?也就是说电压变化时,亮度保持不变.
还有就是能告知兄弟单片机型号吗?hqsh158@126.com
0
回复
guotinglan
LV.2
11
2009-04-11 01:09
**此帖已被管理员删除**
0
回复
bhoo
LV.5
12
2009-04-11 08:06
@guotinglan
**此帖已被管理员删除**
chhp25@163.com 给我发一份.谢谢!
0
回复
lin135
LV.5
13
2009-04-11 12:42
@bhoo
chhp25@163.com给我发一份.谢谢!
其实用单片机做的话1.5以下就可以做个调光了,应该不贵吧.就需要一个外置的驱动三极管而且
0
回复
lin135
LV.5
14
2009-04-11 12:46
@lin135
其实用单片机做的话1.5以下就可以做个调光了,应该不贵吧.就需要一个外置的驱动三极管而且
我用过一个8脚的单片机控三色灯来显示温度值的,其中一个模式是按温度的高低来先择颜色,.比如50度是全红,慢慢低下来加一点点的加下绿色,0度是蓝色和绿的混色,-20是蓝色, 红绿蓝是按255,255,225级来分级的.有点像电脑的256色调板.
0
回复
wangw0718
LV.1
15
2009-10-30 14:48
@lin135
我用过一个8脚的单片机控三色灯来显示温度值的,其中一个模式是按温度的高低来先择颜色,.比如50度是全红,慢慢低下来加一点点的加下绿色,0度是蓝色和绿的混色,-20是蓝色,红绿蓝是按255,255,225级来分级的.有点像电脑的256色调板.
可以把这个设计的程序和相关资料发给我看一下么?wangw0718@163.com
0
回复
2011-04-16 00:34
@niquanwei
低成本,1.5一片已经写好调光程序的或者RGB带定色程序的,谁要?喊几声!
我也要 zaibu130@qq.com 谢谢
0
回复
2011-04-16 00:35
我也要 谢谢 zaibu130@qq.com
0
回复
sankong333
LV.4
18
2011-04-16 01:04
最好增加一个低功耗无线收发模块
0
回复
伟哥
LV.4
19
2011-04-16 07:50
@sankong333
最好增加一个低功耗无线收发模块

我的四路调光,3基色的LED.  芯片SOP-8,只要6毛,这个也太浪费,玩玩可以,不具备商业价值.

0
回复
fuzi
LV.3
20
2011-05-03 17:24
我批量要这东西.但是要改一下.有兴趣加我.QQ:1044929960
0
回复
windyde
LV.1
21
2012-04-17 23:56
@lin135
我用过一个8脚的单片机控三色灯来显示温度值的,其中一个模式是按温度的高低来先择颜色,.比如50度是全红,慢慢低下来加一点点的加下绿色,0度是蓝色和绿的混色,-20是蓝色,红绿蓝是按255,255,225级来分级的.有点像电脑的256色调板.
能把资料发来看看么,谢谢! windyde@163.com
0
回复
kingdau1985
LV.2
22
2012-04-18 23:20
@fuzi
我批量要这东西.但是要改一下.有兴趣加我.QQ:1044929960
**此帖已被管理员删除**
0
回复
borland_syj
LV.3
23
2012-04-18 23:52
@kingdau1985
**此帖已被管理员删除**

曾经的单片机到今天,技术也像白菜一样,价格也像白菜一样了...................

0
回复