PWM说白了就是首先定义一个变量X并且给它赋值为你想要的高电平数量,接着再定义一个变量Y赋值为0,然后再给定时器弄个1ms的定时,每过1msY就加一,假设我要定的PWM是5/20,那么首先给X赋值为5,在定时器中写每过1ms就让Y加一,当Y小于X时输出高电平,当Y大于等于X时输出低电平,当Y>=20时就给Y赋值为0,这样就有5/20的时间是高电平,15/20的时间是低电平。
程序
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit key=P3^7;
- sbit fm=P2^3;
- uchar x=0;
- void keyscan();
- void delay(unsigned int xms)
- {
- unsigned int i,j;
- for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
- for(j=112;j>0;j--);
- }
- void main()
- {
- keyscan(); //按键扫描,没有按下K4之前程序一直卡在这里
- TMOD=0x01; //定时器0
- TH0=0xFC; //设定定时时间为1ms
- TL0=0x66;
- EA=1; //定时器的初始化
- ET0=1;
- TR0=1;
- while(1)
- {
- if(x<2)
- P1=0xfe;
- else
- P1=0xff;
- if(x>=20)
- x=0;
- }
- }
- void dinshi() interrupt 1 //定时器
- {
- TH0=0XFC;
- TL0=0X66;
- x=x+1;
- }
- void keyscan() //健扫描
- {
- A: if(key==0)
- {
- delay(10);
- if(key==0)
- {
- fm=0;
- while(key==0);
- fm=1;
- }
- else
- {
- goto A;
- }
- }
- else
- {
- goto A;
- }
- }