频率370Hz,用手机摄像头看,没有频闪
仿真LED会闪烁,主要看波形;实物不会闪烁,很稳定;代码简短
有完整代码如下- /***********************************************************************/
- /***功能:按键控制PWM对LED灯调光,短按开关,长按调光 亮---暗 ----亮 循环 ***********/
- /***改变j的值就改变了占空比,初值50% */
- /*** STC89C52 @ 12MHz */
- /***********************************************************************/
- #include<reg52.h>
- typedef unsigned char U8;
- typedef unsigned int U16;
- /*---------------------------------------------------------------------*/
- /*-- 端口定义 ---------------------------------------*/
- /*---------------------------------------------------------------------*/
- #define PORT_1 P1
- sbit KEY1 = P3^0;
- U8 j,knum,temp=127;
- /*----------按键扫描--------------------*/
- void keyscan()
- {
- static U16 x; //消抖延时变量
-
- if(KEY1==0) //
- {
- x++; //按键消抖
- if(x>500) //长按亮度调节
- { knum=0;
-
- if(knum==0)
- {
- if(j<251)
- j+=5;
- else
- j=3; //写j=3;加到最大亮度后回到最小亮度,又开始加,如此循环
- temp=j;
- }
- x=450;
- }
-
- }
- else
- {
- if(x>50 && x<500) //短按 开关灯
- {
- x=0;
- if(knum==1)
- {
- if(j>3)
- { j=0;} //关灯
- else j=temp; //开灯,保持前次设置的亮度
- }
- knum ++;
- if(knum>1)
- knum=1;
- }
- }
- }
- /*---------------------------------------------------------------------*/
- /*-- 主程序 ---------------------------------------*/
- /*---------------------------------------------------------------------*/
- void main()
- {
- U8 i;
- PORT_1=0Xff;
- j=127; //改变j的值就改变了占空比,初值50%
- while(1)
- {
- for(i=255;i>0;i--)
- // PORT_1=(j<i)?0x00:0xff; //三目运算 这句用在拉电流
- PORT_1=(j<i)?0xff:0x00; //这句用在灌电流
- keyscan();
- }
- }
- /*---------------------------------------------------------------------*/
- /*-- 程序结束 ---------------------------------------*/
- /*---------------------------------------------------------------------*/
复制代码
|