#include<reg51.h> #include<intrins.h> #define uchar unsigned char//宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。 #define uint unsigned int//宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。 sbit k1=P1^0; sbit k2=P1^5; sbit led=P3^4; uchar count,pwm,flag; void delay(uint z)//延时程序 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void keyscan()//按键扫描函数 { if(k1==0) { delay(5); if(k1==0) { pwm++; if(pwm>=20) pwm=0; } while(!k1); } if(k2==0) { delay(5); if(k2==0) { if(pwm>0) pwm--; if(pwm<=0) pwm=0; } while(!k2); } } void TimerInit()//定时器0初始化函数 { TMOD=0x01;//设定定时器0,工作模式为模式1。 TH0=(65536-50000)/256;//TH0重新装值 TL0=(65536-50000)%256;//TL0重新装值 // TH1=0xfc;//TH1装初值 // TL1=0x66;//TL1装初值 EA=1;//开启定时器总中断 ET0=1;//开启定时器0中断开关 TR0=1;//启动定时器0 // ET1=1;//开启定时器1中断开关 // TR1=1;//启动定时器1 } void timer0() interrupt 1//定时器0中断函数 { TH0=(65536-50000)/256;//中断定时50毫秒,表示高低电平占用周期50毫秒,也表示高低电平频率(计算工式:F=1/T,其中F单位为赫兹,即Hz,而T单位为秒,即s。)为1/0.05s(由50毫秒除以1000求得0.05秒)=20Hz。 TL0=(65536-50000)%256;// count++; if(count>=20)//中断次数变量达到20次,表示1秒(即中断次数变量20次X中断定时50毫秒)时间到 ,也表示高低电平占用周期1秒,另外表示高低电平频率(计算工式:F=1/T,其中F单位为赫兹,即Hz,而T单位为秒,即s。)为1/1s=1Hz。 { count=0; } if(count<pwm) { led=0;//led为低电平 } else { led=1;//led为高电平 } } void main()//主函数 { TimerInit(); while(1) { keyscan();//按键扫描函数 } }
基于51单片机增加减少键控制PWM(脉冲宽度调制)来调整LED亮灭程度
原文:https://www.cnblogs.com/AChenWeiqiangA/p/12724989.html