| 你放到while(1)里就变成大概3微秒扫描到一次这部分,改变一次pwm高低信号 1或 0,你定时器里却要10微秒才改变一次单位步进值time,不同步了。按道理你10微秒time加1,和10微秒进来改变pwm信号要一起做。你分开扫描一个在主函数里很快做,一个在定时器里10微秒才做肯定不行。 |
| 应该也可以的,只是时间不对了 |
| 中断里面实时性高 |
| 按钮和PWM波都放到中断外,不要什么都往中断仍,中断越轻量级越好https://bbs.csdn.net/topics/392742676 |
| 注意的是不断地产生中断,对于按键的判断还有外面的的执行有一定的影响,毕竟每次中断的时间都很短,所以建议在中断服务程序里面首先停止中断服务,等运行完任务后再开启,这样比较好 |
sldx 发表于 2017-11-26 21:40 加上WHILE是因为等待按键结束,不过不加,就会一直判断按下,一直执行判断 |
sldx 发表于 2017-11-26 21:40 这个是按键松手检测啊, 和定时器有什么问题吗? 就算程序一直卡在这里, 无法执行后面的, 但是也会进入中断服务函数的, 而且我是在 没有按按键的情况下输出不了PWM波(这个不好意思, 问题没有说清楚 /尴尬) |
| 谢谢大家的解答, 我今天试的时候又可以输出PWM波了;我猜 是不是示波器的问题? 如果有知道答案的欢迎留言 |
HC6800-ES-V2.0 发表于 2017-11-27 09:06 首先谢谢你的解答。 但是 我是当它小了之后输出高电平, 大了之后输出低电平啊。 无论大小都可以检测到的啊。 |
|
你的说法是不对的。 看我的程序: #include<reg51.h> #define LED P2 unsigned int T=0,Tt=500,i=0,Ii=100,j=0; bit A=1; void TimeConfig(); void main(void) { TimeConfig(); while(1) { if (T>=Tt) { T=0; } if (i>=Ii) { i=0; if (A==1) { j++; } else { j--; } } if (j==Tt) { A=0; } if (j==0) { A=1; } if (T<=j) { LED=0x00; } else { LED=0xff; } } } void TimeConfig() { TMOD = 0x01; TH0 = 0xff; TL0 = 0xff; EA = 1; ET0 = 1; TR0 = 1; } void Time0() interrupt 1 { TH0 = 0xff; TL0 = 0xff; T++; i++; } 看出我们的程序有什么不同了没? 就是那点不同,却得到不同的结果。 分析程序可以知道:你和我都是用的time++,你用的判断是<=,我作的>=。我们都没有学汇编,对语句执行的时间不了解,中断在什么时候发生就不可预见。我的语句判断,是大了就怎么样,你的判断是小了就怎么样。大了,不论大多少,总是可以判断到的,而小了的判断,当数据大了后,就无法判断,这正是你的程序执行不了的原因。 |
| while(!s1);while(!s2);去掉试试 |
Yusutitsa 发表于 2017-11-26 20:17 给了我希望又让我失望 |
| 不清楚,可能和c的规则有关系 |