用脉宽调制控制AC220V白炽灯程序,本人经过试验,基本正确。控制部分用普中开发板,SCR部分外接。详见硬件连接图:
单片机源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit K1=P1^0; //按键1,PWM脉冲宽度值增加
- sbit K2=P1^1; //按键2,PWM脉冲宽度值减少
- sbit LED=P1^3; //LED显示
- sbit PWM_OUT=P1^4; //PWM输出,SCR控制
- uchar PWM,num; //PWM设定脉冲宽度值,num计算中断次数;
- void delay(uint ms) //1ms延时
- {
- uchar i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
- void keyscan() //按键扫描函数
- {
- if(K1==0) //按键1是否按下
- {
- delay(50); //去抖延时
- if(K1==0) //按键1是否继续按下
- {
- if(PWM<32) //PWM设定脉冲宽度值是否小于32
- {
- PWM++; //PWM设定脉冲宽度值加1
- delay(100);
- }
- }
- }
- if(K2==0) //按键2是否按下
- {
- delay(50); //去抖延时
- if(K2==0) //按键2是否继续按下
- {
- if(PWM>1) //PWM设定脉冲宽度值是否大于1
- {
- PWM--; //PWM设定脉冲宽度值减1
- delay(100);
- }
- }
- }
- }
- void init_t0() //定时器T0初始化
- {
- TMOD=0x01; //方式1,16位定时器
- TH0=(65536-500)/256; //0,5ms定时
- TL0=(65536-500)%256; //0,5ms定时
- EA=1; //开总中断
- ET0=1; //开定时器T0
- TR0=1; //启动定时器T0
- }
- void t0() interrupt 1 //T0中断服务函数
- {
- TR0=0; //停止T0定时器
- TH0=(65536-500)/256; //0,5ms定时
- TL0=(65536-500)%256; //0,5ms定时
- num++; //num计算中断次数+1
- if(num>32) //中断次数大于32
- {
- num=0; //中断次数=0
- }
- if(num<=PWM) //中断次数<=PWM脉冲宽度
- {
- LED=0x01; //输出高电平,小灯灭
- PWM_OUT=0x00; //输出低电平,关闭SCR
-
- }
- else
- {
- LED=0x00; //输出低电平,小灯亮
- PWM_OUT=0x01; //输出高电平,启动SCR
- }
- TR0=1; //启动T0定时器,等待下一次中断
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
PWM_键调LED显示脉宽控制SCR.rar
(71.82 KB, 下载次数: 21)
|