基于51单片机的光控LEDWord格式.docx
《基于51单片机的光控LEDWord格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的光控LEDWord格式.docx(11页珍藏版)》请在冰点文库上搜索。
二﹑电路与程序设计
1﹑光电转换电路设计
如图2-1所示。
2﹑模数转换电路设计
光敏电阻将光转换成电压后,接入MAX144的通道一进行数模转换电路2-1所示。
图2—1
图2—2模数转换电路
3﹑数模转换电路
单片机受到MAX144模数转换后的数据送给MAX531进行数模转换成电压控制LED的驱动电路,电路如图2—3所示。
图2—3数模转换电路
4﹑LED的驱动电路
将MAX531经数模转换后的电压变成电流并驱动BJT放大电流,电路如图2—4所示。
图2—4LED驱动电路
5、程序设计
采用51单片机做主控制器,程序流程图如图2—5所示。
图2—5程序流程图
附录详细程序清单
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar//宏定义
#defineuintunsignedint
#definedelay4us(){_nop_();
_nop_();
}
//输入端口设定
sbitmax144_CS=P1^7;
sbitmax144_DOUT=P1^6;
//定义max144端口,Vref=4.5V
sbitmax144_SCLK=P1^5;
sbitkey_cut=P3^2;
//切换
sbitkey_add=P3^3;
//+
sbitkey_dec=P3^4;
//-
sbitkey_back=P3^5;
//返回
//输出端口
sbitLCD_RS=P2^4;
sbitLCD_RW=P2^5;
//LCD位申明
sbitLCD_EN=P2^6;
//
sbitmax531_DIN=P2^0;
//定义max531端口
sbitmax531_CLR=P2^1;
sbitmax531_SCLK=P2^2;
sbitmax531_CS=P2^3;
uintI[]={'
0'
'
};
//数据分解为电流XX.X
ucharcodeDsp_Title[]={"
CurrentI:
"
ucharCurrent_I_Dsp_Buffer[]={"
I-.mA"
uintData,result;
bitsign;
//延时
voiddelay(intms)
{
uchari;
while(ms--)
for(i=0;
i<
250;
i++)delay4us();
//LCD忙检查
bitbusy_check()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delay4us();
result=(bit)(P0&
0x80);
LCD_EN=0;
returnresult;
Data=result;
//LCD写指令
voidwrite_(uchar)
while(busy_check());
LCD_RW=0;
_nop_();
P0=;
//LCD写数据
voidwrite_data(uchardat)
LCD_RS=1;
P0=dat;
//设置显示位置
voidset_pos(ucharpos)
write_(pos|0x80);
//LCD初始化
voidinit()
write_(0x38);
delay(5);
write_(0x0c);
write_(0x06);
write_(0x01);
//显示
voiddsp(ucharaddr,uchars[])
set_pos(addr);
for(i=0;
10;
i++)
write_data(s[i]);
//将模数转换后得到的结果分解存入缓冲
voidconvert_to_I()
//最大值为4000,对应于100mA,4000/100=40
I[2]=(Data/40)/10+'
;
//十位数
I[1]=(Data/40)%10+'
//个位?
I[0]=0+'
//小数位
//读取A/D转换结果
voidread_144_convert_Data()
uchari,j;
max144_SCLK=0;
max144_CS=1;
max144_CS=0;
16;
i++)
{
max144_SCLK=1;
j=max144_DOUT;
Data<
<
=1;
Data|=j;
max144_SCLK=0;
}
Data&
=0X0FFF;
voidread_keycontrol_data()
Data=Data;
if(!
key_add)
{
delay(8);
if(!
{
while(!
key_add);
if(Data<
0xFA0)
Data=Data+40;
}
elseif(!
key_dec)
{
delay(8);
if(!
{
while(key_dec);
if(Data>
0x07)
Data=Data-8;
}
elseif(!
key_back)
delay(8);
if(!
{
while(!
key_back);
sign=0;
}
//将A/D转换后的结果或按键输入的数值送入MAX531进行D/A转换
voidsend_Data_to_531()
max531_CLR=1;
max531_CS=0;
i=12;
while(i--)
max531_SCLK=0;
max531_DIN=(bit)(Data&
0x0800);
Data<
=1;
max531_SCLK=1;
max531_CS=1;
}
//主程序
voidmain()
init();
while
(1)
key_cut)
while(!
key_cut);
sign=1;
Data=0x7D0;
while(sign)
read_keycontrol_data();
convert_to_I();
//数据转换
Current_I_Dsp_Buffer[2]=I[2];
Current_I_Dsp_Buffer[3]=I[1];
Current_I_Dsp_Buffer[5]=I[0];
dsp(0x00,Dsp_Title);
dsp(0x40,Current_I_Dsp_Buffer);
send_Data_to_531();
read_144_convert_Data();
convert_to_I();
Current_I_Dsp_Buffer[2]=I[2];
Current_I_Dsp_Buffer[3]=I[1];
//分解存入显示缓冲
Current_I_Dsp_Buffer[5]=I[0];
dsp(0x00,Dsp_Title);
//显示标题
dsp(0x40,Current_I_Dsp_Buffer);
send_Data_to_531();