51单片机PWM呼吸灯效果程序的若干问题

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit LED0 = P1^5;

unsigned char HighRH = 0,HighRL = 0,LowRH = 0,LowRL = 0;

void ConfigPWM(unsigned int fr,unsigned char dc)
{
unsigned long tmp;
unsigned int high,low;

tmp = 11059200/12/fr; //这是什么作用?
high = (tmp*dc)/100; //这是什么作用?
low = tmp - high;
high = 65535 - high + 12;
low = 65535 - low + 12; //这两个语句是什么作用?
HighRH = (unsigned char)(high >> 8);
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low >> 8);
LowRL = (unsigned char)low; //以上全是什么作用?
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = HighRH;
TL0 = HighRL;
ET0 = 1;
TR0 = 1;
LED0 = 1;
}

void ClosePWM()
{
TR0 = 0;
ET0 = 0;
LED0 = 1;
}

void main()
{
unsigned char i;

EA = 1;

while(1)
{
ConfigPWM(100,10);
for(i=0;i<40000;i++);
ClosePWM();
ConfigPWM(100,40);
for(i=0;i<40000;i++);
ClosePWM();
ConfigPWM(100,90);
for(i=0;i<40000;i++);
ClosePWM();
for(i=0;i<40000;i++);
}

}

void InterruptTimer0() interrupt 1 //这个中断是什么作用?
{
if(LED0 == 1)
{
TH0 = LowRH;
TL0 = LowRL;
LED0 = 0;
}
else
{
TH0 = HighRH;
TL0 = HighRL;
LED0 = 1;
}
}

不就是定时输出吗?

楼主,先去弄明白了定时输出,就不难理解此程序了。

不过,很简单的事,程序却写得这么滥。
看不懂,也没有什么奇怪的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-07-25
<script type="text/javascript">
Leaf leaf = new Leaf("Leaf D");
root.Add(leaf);
root.Remove(leaf);
root.Display(1);
Console.Read();
}追问

不懂。。

本回答被网友采纳
第2个回答  2015-07-25
什么啊这是

51单片机两个定时器中断写了个呼吸灯程序,怎么调试出来是小灯闪烁程序...
程序太乱,只用一个定时器就可以 如定时100us 中断一次 20次是2 ms 即周期是2 ms 中断一次计数变量a加一,并且与另一变量b(1到20)比较,如果a>b,则输出高电平,反之则输出低电平 a=20时清0 主程序中可不断改变b的值,先由大到 小 再由小到大,就是呼吸灯了 如延时200ms改变一次b...

求单片机大神帮忙设计一个电路,51单片机制作led呼吸灯的
proteus仿真按理来说是不可能达得到效果的,因为这种仿真得有非常快的处理速度。我刚动手试了下和自己的想法相同,LED只会间断的闪烁。我是用AVR单片机,用51也是一样的。我这个程序也在实物试过效果很好。演示定时器1的快速PWM输出@利用快速PWM输出控制LED的亮度变化,达到呼吸灯的效果*\/ include<iom8...

51单片机用汇编语言如何设计8个轮流呼吸的呼吸灯?
ACALL DELAY;延迟,不加延迟的话 你根本看不起清到底那个灯亮的 MOV P0,#02H;()只有第二个灯亮 ACALL DELAY MOV P0,#04H;()只有第三个灯亮 ACALL DELAY MOV P0,#08H;()只有第四个灯亮 ACALL DELAY MOV P0,#10H;()只有第五个灯亮 ACALL DELAY MOV P0,#20H;()只有第六个灯亮 A...

51单片机输出的pwm波形不是方波吗
51单片机输出这是一个PWM输出占空比一直变化的方波,控制一个发光二极管实现呼吸灯的效果。我的问题是:为啥定时器判定if(highv>100)不能改成if(highv==100),改后就没有呼吸灯的效果了,原因是 include<reg52.h>

谁帮忙把这个51单片机模仿PWM呼吸灯的主函数程序注释下,很乱
void main (void){ unsigned int t = 1;unsigned int i, TEMP;unsigned int TYPE = 0;bit LOOP = 0;while (1){ if (KEY == 0){ l1:Delay(10000);TYPE = (1 - TYPE);if (TYPE == 0){ t = 1;LOOP = 0;};} if (TYPE == 0){ if (LOOP == 0){ Display(t);t++;...

单片机式的呼吸灯控制方法
呼吸灯的程序,如果有硬件的PWM模块,是很简单的,按一定的规律让PWM的输出变化就可以。像这样输出10%亮度,持续200ms,输出20%亮度,持续200ms,输出30%亮度,持续200ms。如果没有硬件PWM模块,可以用软件来模拟,比如,输出10%亮度,持续200ms这两件事合在一起作,变成输出高电平10us,输出低电平90...

我在设置里面看呼吸灯是开着的,但是为什么不亮。
你的呼吸灯坏了,亦或其线路开路了,这对你电脑或手机的关系不大,主要起装饰作用和提醒功能。你在设置里面看是开着的,是单片机定时器产生的PWM程序。表示有输出而已。

单片机制作呼吸灯的C语言程序怎样编写
sbit dianzhen=P1^3;sbit leden=P1^2;void Delay(unsigned int t);void main (void){ unsigned int CYCLE=600,PWM_LOW=0;\/\/定义周期并赋值 lcden=0;P0=0x00;dianzhen=0;P0=0xff;wei=0;duan=0;while (1) \/\/主循环 { LED0=1;Delay(150000); \/\/特意加延时,可以看到熄灭的过程 for...

求编程大神!给一个可以直接调用的PWM(呼吸灯,)模快! 越简单越好类似延时...
在 \/INT1、\/INT0 外接了两个按键,用来调整占空比;在 P0 口外接了两个 BCD 数码显示器,用来显示当前的占空比的等级。实验的时候,可以使用示波器来观察 P2 口输出的波形。如果把 PWM 波形的频率提高,也可以用 LED 观察到渐亮渐暗的效果,目前看,只是闪烁的时间发生变化。include<reg52.h> un...

51单片机设计呼吸灯
include "reg51.h" \/\/包含头文件 define uchar unsigned char define uint unsigned int \/\/ \/\/延时函数 \/\/ delay(uint time) \/\/int型数据为16位,所以最大值为65535 { uint i,j; \/\/定义变量i,j,用于循环语句 for(i=0;i<time;i++) \/\/for循环,循环50*time次 for(j=0...

相似回答