用普中的51开发板,点亮点阵中的一个LED,并使这个LED的亮度随着光敏电阻感受到的光强变化而变化。
这个开发板的点阵使用四个级联的74HC595控制的。附上用到的模块的原理图。
这个是16*16的点阵。
这个是四片级联的74HC595。
这个是光敏电阻及ADC模块
随下附上我的代码,已写好十分详细的注释。
#include<reg51.h>
sbit RCK=P1^5; // ???????λ??????????洢?????
sbit SCK=P1^6; //??????λ
sbit SER=P1^7; //????????74HC595
sbit DOUT=P2^7; //??????????????????
sbit DIN=P2^6; //??????????????
sbit CS=P2^5; //????????
sbit DCLK=P2^4; //???????
unsigned char a=0; //1ms
unsigned char n=1; //pwm??
unsigned int L=0; //????????
unsigned int out=0; //???????
void delay(unsigned char x) //???????
{
unsigned char i;
while(x--)
for(i=0;i<120;i++);
}
void uint() //??????????
{
IE=0X82;
TMOD=0X02; //T0????????2
TH0=0Xc9; //???
TL0=0Xc9;
n=1; //????????
TR0=1;
}
void DZ() // ?????????е????LED
{
unsigned char i,x=120;
while(x--)
{
RCK=0;
for(i=0;i<32;i++)
{
SCK=0;
if(i<16)
{ if(i==7) //?????
SER=0;
else
SER=1;}
else
{ if(i==23) //?????
SER=n;
else
SER=0;}
SCK=1; //SCK????????????λ
}
RCK=1; //RCK??????????????洢?????
}
}
void uint1() //AD???????
{
CS=0;
DCLK=0;
out=0;
}
void crol() //д??????
{
unsigned char crol1=0xA4,i;
for(i=0;i<8;i++)
{
DIN=crol1>>7;
DCLK=0;
DCLK=1;
crol1=crol1<<1;
}
}
void dout() //?????
{
unsigned char i;
for(i=0;i<12;i++)
{
out=out|DOUT;
DCLK=1;
DCLK=0;
out=out<<1;
}
L=out/10;
}
void time0() interrupt 1 //????pwm??
{
a++;
if(a==L)
n=0;
if(a==50)
{
n=1;
a=0;
}
}
void main()
{
uint();
while(1)
{
uint1();
crol();
delay(1); //???????????????????????
dout();
DZ();
}
}
注释为什么都变成问号了,尴尬。凑合看一下吧。
再附上成果视频。
视频链接