共有10个级别的脉冲宽度波形,可以通过观察LED的亮暗时间的变化,或者通过虚拟示波器观察P0.0脚输出脉冲宽度不断变化的十个级别。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar PWM_T=0; //占空比控制变量
- sbit PWM_OUT=P0^0;
- void main()
- {
- bit flag=1; //控制LED灯渐亮渐熄方式
- uint n;
- TMOD=0x02; //定时器T0,8位方式2定时模式
- TH0=241; //15μs溢出一次(11.0592M)
- TL0=241;
- TR0=1;
- ET0=1;
- EA=1;
- PWM_OUT=1;
- while(1)
- {
- for (n=0;n<30000;n++); //延时,将响应定时器T0中断
- if (flag==1)
- PWM_T++;
- else
- PWM_T--;
- if (PWM_T>=10)
- flag=0;
- if (PWM_T==0)
- flag=1;
- }
- }
- timer0()interrupt 1 using 2
- {
- static uchar t; //用t保存当前时间在1s的比例位置
- t++; //每15μs增1
- if (t==10) //1.5ms的周期
- {
- t=0;
- PWM_OUT=0;
- }
- if (PWM_T==t)
- PWM_OUT=1;
- }
复制代码
所有资料51hei提供下载:
51PWM.rar
(45.65 KB, 下载次数: 67)
|