完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 宋-_菜刀-、 于 2012-10-20 22:22 编辑
在学习单片机的时候发现了一个很好的帖子(https://bbs.elecfans.com/jishu_184829_1_1.html),在此感谢作者!里面有教怎么利用PWM原理控制灯的渐变,我照着写了一遍。发现了一个很奇怪的问题。代码如下://这是定时器的c文件,main.c里就是死循环而已了。 #include #include"MyDefine.h" #define LED P1 #define LED_ON() LED=0X00; #define LED_OFF() LED=0Xff; static uint8 Count=0;//计数是否达到了20MS static uint8 Direction=0;//亮还是灭的方向 static int8 PWM=0;// //static int8 tempPWM=0;位置1 void Timer0Init(void) { TMOD&=0xf0; TMOD|=0x01; TH0=0XFF;//200us的中断 TL0=0X37; TR0=1; ET0=1; } void Timer0Isr(void)interrupt 1 { static int8 tempPWM=0;//位置2 TH0=0XFF; TL0=0X37; if(++Count>=100) { Count=0; if(PWM<=99&&Direction==0) { ++PWM; if((PWM)>99) { Direction=1; PWM=99; } } if(PWM>=0&&Direction==1) { --PWM; if((PWM)<0) { Direction=0; PWM=0; } } tempPWM=PWM; } if(tempPWM>0) { LED_ON(); tempPWM--; } else { LED_OFF(); } } 我觉得应该把 static int8 tempPWM=0;放在位置1啊,因为我觉得这样才能算是PWM。不然每次到了200us的中断的时候如果不是到100次(也就是20MS)那么灯就一直是灭的(LED_OFF())。也就是说在这100次里有99次都是灭着的,而只有1次灯亮着。tempPWM--这句话就没有意义了啊。。。不知道看明白了没有(可以看看原帖,很好)。不过,我对调了位置以后,不管是彷真或者实际操作,放在两个位置出来的结果都没有区别。纳尼?请高手为我解答。。谢谢了 |
|
相关推荐
11个回答
|
|
|
|
|
|
|
|
之前没弄好程序,不好看,现在弄好了,大家帮忙看看啊。。。唉,这个论坛的修改真难用啊
|
|
|
|
请问你说的时哪条语句
|
|
|
|
不好意思,最重要的没说。。。static int8 tempPWM=0这条,谢谢了 |
|
|
|
自己顶啊自己顶。。
|
|
|
|
{:soso_e114:}
|
|
|
|
还是没有人回复吗
|
|
|
|
我知道原因了。。因为static变量只是在第一次调用的时候初始化,以后都不会了。。
|
|
|
|
嗯。,。。。。。。。
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
199 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
748 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1122 浏览 0 评论
874 浏览 0 评论
910 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11836 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 14:20 , Processed in 0.740071 second(s), Total 91, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号