RF1244KU1121415111524A10B96XX0X1X2X3Y0Y1Y2Y3ABINH4052XY133XRF219.6kRV18%R21k5K5KU2R1OPAMP 同相放大器的放大增益为:Au=1+Rf/R1 , 在本电路中使R3、R4、R5与多路选择开关连接,使电路分别放大50、5和1倍。
2).A/D采集和串口:
RF1244KU1121415111524A10B96XX0X1X2X3Y0Y1Y2Y3ABINH4052XY133XRF219.6kRV18%R21k5K5KU2R1OPAMP
P116RXD27TXD3849DCDDSRRXDRTSTXDCTSDTRRIERRORCOMPIM
3.3软硬件设计 (1)原理图
RF1244KU1121415111524A10B96XX0X1X2X3Y0Y1Y2Y3ABINHXY133XX26272812345U3IN0IN1IN2IN3IN4IN5IN6IN7ADD AADD BADD CALEVREF(+)VREF(-)ADC0808P10P11P12P13P14P15P16P1712345678CLOCKSTARTEOCOUT1OUT2OUT3OUT4OUT5OUT6OUT7OUT810CLOCKSTA67212019188151417EOC18P07P06P05P04P03P02P01P0019RP1U4XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617P00P01P02P03P04P05P06P07123456STAOERXDTXDEOCClock123456789RESPACK-8RF219.6kXTAL2RV145%9RV1(3)V=2.24999R21k5K5KU2+5VR1OPAMPXV=2.407384052252423STA221216RSTOE9OE293031PSENALEEAP116RXD27TXD3849DCDDSRRXDRTSTXDCTSDTRRIP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51ABP10P11P12P13P14P15P16P17123456ERRORCOMPIM
分析: 根据同相放大器Au=1+Rf/R1,可计算出各反馈电阻值,设R1=5k,则50倍时,Rf=245k;5倍时,Rf=20k,1倍时,相当于一根导线。调节电位器,使得输入在0-100mV之间,此时通过仿真会发现输出会是在输入的50倍左右;同理,
100mV-1V间,输出会是在5被左右;而1-5V时,则与输入差不多。 在这一过程中,我们会发现理论值与实际值并不是完全一致,这是因为实验过程中存在着一些干扰因素。
(2)程序
1)主程序main.c文件
#include
#define X1 1 #define X5 5 #define X50 50
sbit _A=P3^6; sbit _B=P3^7;
double get_ad(int weight); void uartSendInfo(uchar info); double volatile volt=0;
unsigned char numSBUF=0; unsigned char weightSBUF=0;
void main() { initial(); UartInit();
while(1) {
volt=get_ad(X50); //weightSBUF=X50; if(volt>=0.1) {
volt=0; volt=get_ad(X5); if(volt>=1) { volt=0; volt=get_ad(X1)/1.06;//此处除以的1.06是程控放大器在
放大1倍时,由系统自身误差导致的最大放大倍数(实际电压在4.7V时程控放大器输出5.02V,即实际放大了1.06倍,故除以放大的倍数,消除误差) } } uartSendInfo(numSBUF); uartSendInfo(weightSBUF); showMain(volt*100000); }
}
double get_ad(int weight) {
// unsigned char num=0; switch(weight) {
case X1 :_B=1;_A=0;break; case X5 :_B=0;_A=1;break; case X50:_B=0;_A=0;break; default :break; } OE=0;//数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。 ST=0;//start是A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。 ST=1; delay(1); ST=0; while(EOC==0);//(EOC): A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。 OE=1; //打开输出三态门 numSBUF=P0; OE=0; weightSBUF=weight;
return numSBUF*5.0/255/weight; }
void timer0() interrupt 1 {
TH0=(65536-20)/256; TL0=(65536-20)%6;
CLK=~CLK; }
void uartSendInfo(uchar info) {
//ES = 0; //关串口中断 TI = 0; //发送中断标志清零 SBUF = info; while (!TI) showMain(volt*100000); TI = 0;
//ES = 1; //开串口中断 }
2)头文件ext.h #ifndef __ext_H__ #define __ext_H__
#define uint unsigned int #define uchar unsigned char
sbit ST=P2^6; sbit OE=P2^7; sbit EOC=P3^2; sbit CLK=P3^3; sbit p17=P1^7;
void delay(uint z); void Delay500ms(); void delay100ms(void); void display(); void initial();
void UartInit(void);
void showMain(double volt); #endif
3)子文件ext.c #include
uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar disp[6];