51单片机上实现ADDA以及模拟PWM信号控制小灯
/*模拟PWM信号控制电压和占位比*/
#include<reg52.h> //自己在reg52.h加入了stf P4 = 0xe8;
#define uchar unsigned char
#define uint unsigned int
sbit DAC_DATA = P4^4;
uchar pwm_t,DAC_VAL;
void timer0Init() //定时器0初始化,以及设置TMOD为8位自动重装
{
TR0 = 1;
EA = 1;
ET0 = 1;
TMOD = 0X02;
TH0 = 220; //47HZ
TL0 = 220;
}
void delayms(uchar xms) //延时函数
{
uchar i,j;
for(i = xms;i>0; i--)
for(j = 110;j>0;j--);
}
void main()
{
bit flag = 0;
timer0Init();
DAC_VAL = 80; //灯泡点亮最低电压
while(1)
{
delayms(5);
if(DAC_VAL == 255)
flag = 1;
else if(DAC_VAL == 80)
flag = 0;
if((DAC_VAL < 255)&&(flag == 0))
DAC_VAL++;
else if((DAC_VAL > 80)&&(flag == 1))
DAC_VAL--;
}
}
void timer0() interrupt 1
{
pwm_t++; //255自动溢出
if(pwm_t <= DAC_VAL)
DAC_DATA = 1;
else
DAC_DATA = 0;
}