- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于ST15L104E单片机模拟PWM调光小夜灯.doc
基于STC15L104E单片机模拟PWM调光小夜灯
(2012-10-23 14:44:44) 转载▼
标签: 分类:硬件 单片机
stcl5
模拟pwm
led调光
杂谈
鉴于宿舍晚上会被宿管灭灯,所以制作了 ?一个小台灯在关灯沿窥探”用,但是舍友陈某@反
应光线太强影响其睡眠,所以决心做个可以调光的LED小夜灯,窥探自己的隐私,让别人睡觉 去吧...
搜索自己的原件库,发现上半年买的STC15L104E—直没用,所以打算就用单片机来控制了, 当然,如果用模拟电路,可能几个元件就可以完成了,但是,模拟对我来说更难设计,所以,,,好吧, 废话多了下面贴电路:
其实也没什么,纯粹是IO操作,两个开光是调光用,AMS117是降压用,AMP4953就相当于开关, 后面的电感电容电路是防止出现闪烁的,额,如果有问题的话可以贴出來.
下而介绍模拟PWM操作,毕竟不是硬件的PWM而II要顾及程序长度,所以模拟出来的PWM 频率600HZ,不过用在LED上应该足够了.
设PWM基数为PWM_NUM,PWM比较输出值为PWM_CMP.
主要思路就是利用单片机内部计时器按一定周期中断,然后在中断服务程序里令 PWM_NUM加一,判断是否小于PWM_CMP比较值,如果小于,则IO输出高,否则输出低,这样,
我们就可以通过修改PWM_CMP的值来调节10输出脉宽,达到模拟PWM的效果了 .PWM周 期=计时器中断时间/PWM_NUM;
好吧,我的文字表达能力不好,贴张图来说明可能比较好:
如图,假设1^1\4_^^=6^^1^_\1^=16,也就是,??1\4_\1;1\4达到16后清零.每个?时器中 断周期PWM_NUM自动加一,判断是否小于PWM_CMP,是则输出高电平,否则输出低电平, 所以,如图所示,当PWM_NUM累加到6前,输出电平是一直是高的,知道PWM.NUM累加到 6后,输出就拉低了,当PWM_NUM达到16后,清零,这时PWM.NUM又小于PWM_CMP,故 PWM输出又为高了,周而S始,就达到模拟PWM的效果了,PWM周期就等于PWM.NUM ? 装周期.
当然值得注意的是,因为判断是在中断服务程序中执行,所以汁时器周期不能太短.
好吧,贴整个完整的程序出来,它的功能我先说明一下.
按下key 1变亮,按下key2变暗,长按则连续调节,两个键一起按下改变显示方式,分别有四个模 式,单个分别亮,两个亮,两个都不亮.每次改变亮度和模式都写入单片机EEPR0M,开机读取 EEPR0M,这样便能开机保持上次关机的状态,不用每次打开都要调Vf 了.说到这我就要吐槽 了,这STC15系列A版外部中断呐,连掉电唤醒都实现不了,那儿个外部中断LI都是摆设的.所 以原本打算使用掉电模式作为关机状态的,但是唤醒不了 (除了复位键),所以只好用外部硬件 开关关机了....
废话不多说,贴程序,程序有标注,看不明白或有问题指教的贴出来,虚心接受.
#include nreg52.hn #include intrins.h
#define ON 0 //LED是低电平有效
#define OFF 1
#define PWM_TIME 200 //计时器计数值 #define MODEL.ADDR 0x0000 //EEPEOM 地址 #define PWM_CMP_ADDR 0x0200
sfr AUXR =0x8e;
sfrP3Ml =0xbl;
sfr P3M0 =0xb2;
sfr IAP_DATA =0xc2;
sfr IAP_ADDRH=0xc3;
sfr IAP_ADDRL=0xc4;
sfr IAP_CMD =0xc5;
sfr IAP_TRIG =0xc6;
sfr IAP_CONTR=Oxc7;
sbit KEYl=P3A0;
sbit KEY2=P3A1;
sbit LED1=P3A2;
sbit LED2=P3A3;
unsigned char key_down,key_cont,key_up; //donw为上开沿,cont为长效,up为下降沿 unsigned char pwm_cmp=l; //PWM 比较值 unsigned char pwm_num=0; //PWM U?数值 unsigned char led_model=0; //LED 模式 unsigned char pwm_delay=0; //延时竹存 unsigned char cmp_temp;
//led_cmp的竹存,用于运算是否写入EEPROM
//计时器0初始化
void timer一init()
{
TMOD=0x00; //模式0,16位自动装载模式 EA=1;
ET0=l;
TR0=1;
AUXR|=0x80; //IT 模式
TL0=655
文档评论(0)