通过模拟PWM信号输出,利用光敏电阻控制led10
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AIN0 0xb4;
sbit CS = P3^7;
sbit DCLK = P2^1;
sbit DIN = P2^0;
sbit DOUT = P2^5;
sbit DU = P2^6;
sbit WE = P2^7;
sbit DAC_DATA = P4^4;
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb, 0xf7};
uchar pwm_t,DAC_VAL;
void timer0Init()
{
EA = 1;
TR0 =1;
ET0 = 1;
TMOD = 0X02;
TH0 = 220;
TL0 = 220;
}
void SPIWrite(uint DAT)
{
uchar i;
for( i = 0; i<8;i++)
{
DCLK = 0;
if(DAT & 0x80)
DIN = 1;
else
DIN = 0;
DAT <<= 1;
DCLK = 1 ;
}
}
uint SPIRead()
{
uchar i;
uint DAT;
for(i = 0; i<12;i++)
{
DAT <<= 1;
DCLK = 1;
DCLK = 0;
if(DOUT)
{
DAT |= 0x01;
}
}
return DAT;
}
uint ReadAD(uint cmd)
{
uint DAT;
CS = 0;
SPIWrite(cmd);
DCLK = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
DAT = SPIRead();
CS = 1;
return (DAT);
}
void display(uint i)
{
uchar q, b, s, g;
static uchar wei;
q = i / 1000;
b = i % 1000 / 100;
s = i % 100 / 10;
g = i % 10;
P0 = 0XFF;
WE = 1;
P0 = SMGwei[wei];
WE = 0;
P0 = 0XFF;
switch(wei)
{
case 0: DU = 1; P0 = SMGduan[q] ; DU = 0; break;
case 1: DU = 1; P0 = SMGduan[b]; DU = 0; break;
case 2: DU = 1; P0 = SMGduan[s]; DU = 0; break;
case 3: DU = 1; P0 = SMGduan[g]; DU = 0; break;
}
wei++;
if(wei == 4)
wei = 0;
}
void delayms(uchar xms)
{
uchar i,j;
for(i = xms;i>0; i--)
for(j = 110;j>0;j--);
}
void main()
{
uchar i;
uint vol;
timer0Init();
while(1)
{
if(i >= 100)
{
i = 0;
vol = ReadAD(0x94);
DAC_VAL = vol / 16;
}
display(vol);
i++;
}
}
void time0() interrupt 1
{
pwm_t++;
if(pwm_t <= DAC_VAL)
DAC_DATA = 1;
else
DAC_DATA = 0;
}