假设输入Vin=3V,电流Iout=20mA,
R1=3*1000/20=150Ω,
Ib=Ie(1+β)=20/51=
1
Vout=3++*R2<5V
R2<=Ω
这里取R2=3KΩ
电阻R3的计算:
因为R3=U3/Ic,当Uc点电压最小时U3电压最大,当三极管NPN饱和时Uce两端的压差最小为,所以
Uc=Ue+=3+=
所以U3=Vcc-Uc=,R3<=85Ω.
R3阻值在0~85Ω
图1
、C8051F芯片的介绍
(1)、C8051F020是混合信号型单片机,在片内集成了一个100Ksps、12位分辨率的逐次逼近寄存器型ADC。
ADC0的最高转换速度为100ksps,其转换时钟来源于系统时钟的分频,分频值保存在寄存器ADC0CF的ADCSC位。
其包含了9个输入通道,一个可编程增益放大器(PGA0)和一个100Ksps、12位分辨率的逐次逼近寄存器型ADC,其中集成了跟踪保持电路和可编程窗口检测器。
其基
2
准点电压源来自于C8051F020的内部VREF端口提供的,保证了其ADC的基准电压,位AD的准确转换提供了保障。
(2)、C8051F020内部有两个12位电压方式数/模转换器(DAC)。
其输出摆幅均为0V到(VREF-1LSB),对应输入码范围是0X000~0XFFF。
对寄存器DAC0CN和DAC1CN控制使能或禁止DAC0和DAC1。
每个DAC的电压基准由VREF引脚提供。
保证了DAC工作的稳定性。
、显示方案的设计
2.3.1液晶1602
(1)液晶原理:
是利用液晶的物理特性,通过电压对显示区域进行控制,有电就有显示,这样既可以显示图形。
液晶具有厚度薄,适合于大规模集成电路直接驱动,易于实现全彩色显示的特点,目前被广泛应用在电脑、数码相机、PDA移动通信等领域。
(2)1602可以显示内部常用字符(包括阿拉伯数字,英文字母大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)
图2
(3)引脚接口说明表:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
3
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
(4)由于用数码管显示电路较复杂,而1602液晶比较简单,所以选用液晶1602;
3、系统框图
如附件A
4、系统框图
图3
本设计CPU采用的是C8051F020单片机,由于电流的分辨率为,所以A/D
4
和D/A采用的均为12位的。
电源采用5V电压供电,而单片机需要的电压,用LM1117来降压,为其提供稳定的工作电压。
如果按一下按键加,CPU会得到信号,使D/A输出的电压增加△U,通过恒流源电路使其电流增加△I,因为△I=,所以
△Vin=3/(20/)=
用A/D进行采样,再通过CPU处理,使增加的电流在LCD上显示,如果按键减按下,会使电流减少△I,并在液晶上显示。
5、经验体会:
1)、在此次的恒流源设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法,还有程序编程及调试都有很大的提高。
2)、在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如仿真的连接示意图中,往往没有接高电平的管脚以及接低电平的管脚,因此在实际的电路连接中往往容易遗漏
4)、在设计电路的连接图中出错的主要原因都是接线和芯片的接触不良以及接线的错误所引起的,也应注重软硬件的结合。
5
【参考文献】
[1]数字电子技术基础简明教程(第三版)
·清华大学电子学教育组-编
·余孟尝-主编
[2]模拟电子技术基础简明教程(第三版)
·清华大学电子学教研组-编
·杨素行-主编
[3]电子线路CAD使用教程(第三版)
·潘永雄沙河-编著
[4]C8051F单片机原理及应用
·鲍可进-主编
A附录:
系统电路原理图
5
图4
B附录:
C语言程序流程图
6
7
#include<8051f>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
sfr16ADC0=0xbe;
sfr16DAC0=0xd2;
bitINTBIT;
uintkey,tempI;
sbitrs=P3^0;
sbitlcden=P3^1;
uintshiwei,gewei,fenwei,baifen;
//voidAD_isr();
ucharstr0[]={"I:
"};
uchartongdao[3]={0x00,0x01,0x02};
voidchangeI(uinttemp);
voiddelay(unsignedintz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidDA_init()
{
REF0CN=0X03;
DAC0CN|=0X80;
}
voidwrite_date(uchardate)
{
//rw=0;
rs=1;
lcden=0;
P5=date;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
//向1602写指令
voidwrite_com(ucharcom)
{
//rw=0;
rs=0;
lcden=0;
P5=com;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
voidwrite_mxc(ucharhang,uchar*icc,ucharnum)
{
uinti;
write_com(128+3+hang*64);
for(i=0;i{write_date(*icc);
icc++;
delay
(2);
}
delay(6);
}
voidLCDinit()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_mxc(0,str0,9);
}
voidAD_init()
{
ADC0CN=0X84;
REF0CN=0X03;
ADC0CF=0X50;
AMX0CF=0X00;
EIE2=0X02;
}
voidtimer3_init()
{
TMR3CN=0X00;
TMR3RLH=0X12;
TMR3RLL=0X34;
TMR3H=0XFF;
TMR3L=0XFF;
TMR3CN=0X04;
}
voidinit()
{
WDTCN=0XDE;
WDTCN=0XAD;
XBR2=0X40;
P74OUT=0XFF;
P1MDIN=0XFF;
EA=1;
AD_init();
DA_init();
timer3_init();
}
voidmain()
{
//unsignedchari;
init();
LCDinit();
DAC0=1;
delay(6000);
while
(1)
{
AMX0SL=tongdao[0];//选择通道0
if(INTBIT==1)
{
TMR3CN=0XFB;
tempI=ADC0;
P6=ADC0H;
P7=ADC0L;
changeI(tempI/2);
INTBIT=0;
}
if(P1==0xfe)
{
delay(10);
if(P1==0XFE)
//P5=0XAA;
key=key+9;
if(key>=3200)
key=1;
DAC0=key;
//DAC0L=DAC0L;
//DAC0H=DAC0H;
while(P1==0XFE);
delay(10);
}
if(P1==0xfd)
{
delay(10);
if(P1==0xfd)
//P5=0XFA;
key=key-9;
if(key<9)
key=3200;
DAC0=key;
//DAC0L=DAC0L;
//DAC0H=DAC0H;
while(P1==0XFD);
delay(10);
}
TMR3CN=0X04;
delay(100);
}
}
voidAD_isr()interrupt15
{
AD0INT=0;
INTBIT=1;
}
voidchangeI(uinttemp)
{
shiwei=temp/1000;
gewei=(temp%1000)/100;
fenwei=(temp%100)/10;
baifen=temp%10;
str0[2]=shiwei+'0';
str0[3]=gewei+'0';
str0[5]=fenwei+'0';
str0[6]=baifen+'0';
//write_com(0x38);
//write_com(0x01);
//write_mxc(0,str0,9);
LCDinit();
}