湖南科技大学单片机课程设计题目基于单片机的数字电流表设计姓名学院专业学号指导教师成绩二〇一一年五月二十六日单片机课程设计任务书一、设计题目:基于单片机的数字电流表设计二、设计要求:1、数字电流表在平常工作环境中能良好工作2、能测0——1000mA电流,至少能达1%的精度3、要求掌握I/V信号转换,A/D转换器的使用和数据采集系统的设计4、电流表能数字显示,且由单片机处理采集数据并驱动LED显示摘要本设计是通过采样电阻及信号放大电路将待测的电流信号I转换成0—1V电压信号, 由A/D转换器采集电压信号,并将电压转换的数字信号传输给单片机,由单片机完成对采样信号的处理、分析,最后输出信号驱动LED显示器,显示被测的电压值。
目录一、功能要求 (1)二、原理及方案论证 (2)三、系统硬件电路的设计 (3)四、系统程序的设计 (4)五、调试及设计结果 (5)参考文献 (6)一、功能要求1、数字电流表在平常工作环境中能良好工作2、能测0——1000mA电流,至少能达1%的精度3、要求掌握I/V信号转换,A/D转换器的使用和数据采集系统的设计4、电流表能数字显示,且由单片机处理采集数据并驱动LED显示二、原理及方案论证1、数字电流表工作原理1.1采样电阻网络原理如下图所示,输入被测电流通过量程转换开关S1——S4,流经采样电阻R1——R4,由欧姆定律可知:U=I*R,因而转换输出电压为0V——0.1V的电压,输出电压可再经后续放大电路放大处理。
1.2高共模抑制比放大电路如下图,由双运放组成的同相输入高共模抑制比放大电路,其闭环输出可表示为: 为使共模输入为0,可令R1/R2=R4/R3,此时电路的差动闭环增益为Kd=1+R1/R2, U0=Kd(U1-U2); 下图即Kd=11,U0=11(U1-U2);1.3通用A/D 转换器ADC0832 是美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D 转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
ADC0832 具有以下特点:◆ 8 位分辨率;◆ 双通道 A/D 转换;)21)(3*14*22121(21)221(*)3*14*21(0U U R R R R R R U U R R R R U -++++-=◆输入输出电平与TTL/CMOS 相兼容;◆5V 电源供电时输入电压在0~5V 之间;◆工作频率为250KHZ,转换时间为32μS;◆一般功耗仅为15mW;◆8P、14P—DIP(双列直插)、PICC 多种封装;◆商用级芯片温宽为0°C to +70°C,工业级芯片温宽为- 40°C to +85°C;芯片接口说明CS_ 片选使能,低电平芯片使能。
CH0 模拟输入通道0,或作为IN+/-使用。
CH1 模拟输入通道1,或作为IN+/-使用。
GND 芯片参考0 电位(地)。
DI 数据信号输入,选择通道控制。
DO 数据信号输出,转换数据输出。
CLK 芯片时钟输入。
Vcc/REF 电源输入及参考电压输入(复用)。
1.4 AT89C52单片机AT89C52 是美国ATMEL 公司生产的低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的只读程序存储器(PEROM)和256 bytes 的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,与标准MCS-51 指令系统及8052 产品引脚兼容,片内置通用8 位央处理器(CPU)和Flash 存储单元,功能强大AT89C52 单片机适合于许多较为复杂控制应用场合。
主要性能参数·与MCS-51 产品指令和引脚完全兼容·8k 字节可擦写Flash 闪速存储器·1000 次擦写周期·全静态操作:0Hz-24MHz·三级加密程序存储器·256 ×8 字节内部RAM·32 个可编程I /O 口线·3 个16 位定时/计数器·8 个断源·可编程串行UART 通道·低功耗空闲和掉电模式功能特性概述AT89C52 提供以下标准功能:8k 字节Flash 闪速存储器,256 字节内部RAM,32 个I /O 口线,3 个16位定时/计数器,一个6 向量两级断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C52 可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU 的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2、方案论证本设计采用精密采样电阻(9欧、0.9欧、0.09欧、0.01欧),电阻精度可达0.1%可忽略;八位A/D精度为5/256(V);因而除去放大电路增益误差及线性误差,电流表精度约为(5/256)/11,约为1.7mA;对于1000mA的总量程精度可达0.1%,因而方案可达设计要求。
三、系统硬件电路的设计系统仿真接线简图本设计中用到AT89C52单片机、八位ADC AD0832、发光二极管、六位八段显示数码管LED,通用运放 UA741 、PNP管及必要的电阻、电容元件等。
系统原理方框图电路仿真简图如上图。
系统方框图四、系统程序设计程序流程图如下:系统程序流程图C语言程序如下:#include<reg52.h>//包含相应的头文件#include<intrins.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar axs[6],azs[6],ac[10],dc[6];void ITOAZ(int num,uchar *p);void ITOAX(int num,uchar *p);float U,U1;sbit CS=P3^4;//定义数模转换器硬件对应引脚sbit CLK=P3^5;sbit DO=P3^6;sbit DI=P3^7;/******************读写AD0832函数****************/ /************************************************/ unsigned char ReadADC(unsigned char channel){unsigned char j;unsigned char Temp=0;_nop_();_nop_();CS=0;//拉低CS端_nop_();_nop_();CLK=1;//拉高CLK端_nop_();_nop_();CLK=0;//拉低CLK端,形成下降沿1 _nop_();_nop_();CLK=1;//拉高CLK端DI=(channel>>1)&0x1;_nop_();_nop_();CLK=0;//拉低CLK端,形成下降沿2 _nop_();_nop_();CLK=1;//拉高CLK端DI=channel&0x1;_nop_();CLK=0;//拉低CLK端,形成下降沿3DI=1;//控制命令结束_nop_();_nop_();for(j=0;j<8;j++) //处理读入8位数据{CLK=0;_nop_();Temp=(Temp<<1)|DO;_nop_();CLK=1;}CS=1;CLK=0;DI=1;return(Temp); //返回转换值}/************************************************/ /************************************************//******************显示转换函数******************//************************************************///延时函数void delay(uint n){uint a;uchar i;for(a=n;a>0;a--)for(i=0;i<2;i++);}//将浮点数转成函数void ITOC(float f,uchar *c){float zs,xs;int bxs,bzs,i,k=0;xs=modf(f,&zs); //分离整数部分与小数部分函数if(P3==0XFE)bxs=(int)((xs*100)+0.5);elsebxs=(int)((xs*100)+0.5); //小数点后两位有效数字ITOAX(bxs,axs); //把小数部分转换成字符串存入axs数组bzs=(int)zs; //把整数部分转成整型ITOAZ(bzs,azs); //把整数部分转换成字符串存入azs数组for (i=0;axs[i]!='s';i++) //把最终结果存入c数组c[i]=axs[i];c[i]='.';for(k=0,i=i+1;azs[k]!='s';k++,i++)c[i]=azs[k];if(U<0) c[i]='-';else c[i]=0xff;c[i+1]='s';}//将整型数转换成对应的void ITOAZ(int num,uchar *p){uchar w,i=0;do{w=num%10; //将整型数各位分离,并转换成对应的字符存入a中p[i]=w;num=num/10;i++;}while(num);p[i]='s';}//将小数数部分转换成对应的void ITOAX(int num,uchar *p){uchar w,i=0;do{w=num%10; //将整型数各位分离,并转换成对应的字符存入a中p[i]=w;num=num/10;i++;}while(num);while(i<2){p[i]=0;i++;}p[i]='s';w=p[i];}//显示译码函数void decode(uchar *n,uchar *dn){uchar i;for(i=0; n[i]!='s';i++){switch( n[i]){case 0: dn[i]=0x3F;break;case 1: dn[i]=0x06;break;case 2: dn[i]=0x5B;break;case 9: dn[i]=0x6F;break;case 3: dn[i]=0x4F;break;case 4: dn[i]=0x66;break;case 5: dn[i]=0x6D;break;case 6: dn[i]=0x7D;break;case 7: dn[i]=0x07;break;case 8: dn[i]=0x7F;break;case 46: dn[i]=0x80;break;case'-':dn[i]=0x40;break;default:dn[i]=0x00;break;}}dn[i]='s';}/************************************************/ /************************************************//********************主换函数********************//************************************************/ void main(void){uchar i,j,P2_;float A;while(1){U=ReadADC(0)/256.0;switch(P1){case 0xfe:A=U*10*1.025;break;case 0xfd:A=U*100/1.09;break;case 0xfb: A=U*1000;break;default: A=0.0;break;}A=10*A;ITOC(A,ac);decode(ac,dc);P2=0XFf;P2_=0Xfe;for(j=0;dc[j]!='s';j++){P2=0XFf;P0=dc[j];P2=P2_;delay(150);P2_=_crol_(P2_,1);/*P2_<<=1;*/}}}/************************************************//************************************************/五、调试及设计结果1、PROTUSE系统仿真结果系统仿真能正常运行,达设计所有指标,仿真部分电路如下:PROTUSE系统仿真效果图2、实际硬件制作结果湖南科技大学课程设计根据电路图自制电路,测试结果:能正常测量10——1000mA电流,达大部分设计要求。