世纪电源网社区logo
社区
Datasheet
标题
返回顶部
讨论

单片机控制 LED 调光电路和程序分享

[复制链接]
查看: 3151 |回复: 11
1
Sinican
  • 积分:4396
  • |
  • 主题:15
  • |
  • 帖子:1519
积分:4396
LV8
副总工程师
  • 2015-5-9 22:34:37
前段时间将单片机捡过来重学一遍,将刚温习的知识转化成小程序与大家分享
功能:
1. 可控多路 PWM 输出占空比变化
2. 可外接摇控形成无线控制
并附上source code,算是初学,希望得到大家更多的指导
先上最小系统原理图:

收藏收藏
Sinican
  • 积分:4396
  • |
  • 主题:15
  • |
  • 帖子:1519
积分:4396
LV8
副总工程师
  • 2015-5-9 22:38:56
 
原代码如下,初学,自己就注释的很啰嗦
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit off = P1^4; //S1 duty=0 PWM 输出
sbit full =P1^5; //S2 duty=100% PWM 输出
sbit down = P1^6; //S3 duty减小 PWM输出
sbit up = P1^7; //S4 duty增加 PWM输出
uint t,PWM_T;
void delay(uint);
void init();
/****************************************************
主程序
****************************************************/
void main()
{
init();
PWM_T=130; //开机保持duty=130/250
while(1)
{
if(!full) //检测 S2 键是否按下
{
delay(5);
PWM_T = 0xff;
}
if(!off)
{
delay(5);
PWM_T = 0x00;
}
if(!up)
{
delay(5);
if(PWM_T<250)
{
PWM_T++;
}
}
if(!down)
{
delay(5);
if(PWM_T>0)
{
PWM_T--;
}
}
}
}
Sinican
  • 积分:4396
  • |
  • 主题:15
  • |
  • 帖子:1519
积分:4396
LV8
副总工程师
  • 2015-5-9 22:48:58
  • 倒数10
 
/****************************************************
初始化子程序
****************************************************/
void init()
{
TMOD = 0x02; //定时器0,工作模式2,8位定时模式
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
P0=0xff; //初始化P0,输出端口
}
/****************************************************
延时子程序
****************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/****************************************************
定时器0中断模拟PWM
****************************************************/
void timer0() interrupt 1
{
t++; //每次定时器中断溢出加1
if(t==255) //PWM周期 100个单位
{
t=0; //重置 t,开始新的PWM周期
P0=0x00; //输出端口置低
}

if(PWM_T==t) //按照当前占空比切换输出为高电平
{
P0=0xff; //输出端口置高
}
}
lahoward
  • 积分:23704
  • |
  • 主题:92
  • |
  • 帖子:5638
积分:23704
LV10
总工程师
  • 2015-5-9 23:23:21
  • 倒数9
 
P0口不能这样用的。
Sinican
  • 积分:4396
  • |
  • 主题:15
  • |
  • 帖子:1519
积分:4396
LV8
副总工程师
  • 2015-5-10 10:50:49
  • 倒数8
 
为啥?初学,不知原因
gaohq
  • gaohq
  • 离线
  • LV10
  • 总工程师
  • 积分:12593
  • |
  • 主题:249
  • |
  • 帖子:3244
积分:12593
LV10
总工程师
  • 2015-5-10 11:22:37
  • 倒数7
 
好像有个口是开漏(OC)输出吧,多年不搞单片机了,忘了。
Sinican
  • 积分:4396
  • |
  • 主题:15
  • |
  • 帖子:1519
积分:4396
LV8
副总工程师
  • 2015-5-10 11:33:59
  • 倒数6
 
增加驱动,只是加上拉电阻就OK了
似乎并不影响用它来模拟 PWM output 吧? 不懂,求解
lahoward
  • 积分:23704
  • |
  • 主题:92
  • |
  • 帖子:5638
积分:23704
LV10
总工程师
  • 2015-5-10 11:54:35
  • 倒数5
 
P0口用作输出如不加上拉电阻是没有“1”的,为高阻态。作为输入则不需上拉。
Sinican
  • 积分:4396
  • |
  • 主题:15
  • |
  • 帖子:1519
积分:4396
LV8
副总工程师
  • 2015-5-12 09:52:33
  • 倒数3
 
上面的电路图是 proteus 仿真图,后面是虚拟仪器示波器


P0 口类似 OC 门一样,在实际应用中是需要上拉电阻才能实现功能的
gaohq
  • gaohq
  • 离线
  • LV10
  • 总工程师
  • 积分:12593
  • |
  • 主题:249
  • |
  • 帖子:3244
积分:12593
LV10
总工程师
  • 2015-5-10 12:40:12
  • 倒数4
 
3楼就是说你的P0口没有上拉呀。
tang490116827
  • 积分:1491
  • |
  • 主题:9
  • |
  • 帖子:289
积分:1491
LV6
高级工程师
  • 2015-5-15 16:16:17
  • 倒数2
 
楼主可以在此帖https://bbs.21dianyuan.com/216457.html
谈谈自己的想法与建议
haitong121189
  • 积分:503
  • |
  • 主题:6
  • |
  • 帖子:37
积分:503
LV6
高级工程师
最新回复
  • 2015-7-13 22:27:43
  • 倒数1
 
好贴 顶 程序有点读不懂,看来要恶补C了
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号