智能数字万用表的设计(33页).doc

上传人:1595****071 文档编号:36367431 上传时间:2022-08-26 格式:DOC 页数:33 大小:268KB
返回 下载 相关 举报
智能数字万用表的设计(33页).doc_第1页
第1页 / 共33页
智能数字万用表的设计(33页).doc_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《智能数字万用表的设计(33页).doc》由会员分享,可在线阅读,更多相关《智能数字万用表的设计(33页).doc(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-湖北经济学院电子设计大赛设计报告课题名称: 数字智能万用表 指导教师: 汪成义 王金庭 刘光然 学生姓名: 汪凡 夏晶晶 张薇 学生院系: 电子工程系 时间: 2011年7月 智能数字万用表一 设计目的1、培养综合性电子线路的设计能力。2、掌握综合性电子线路的安装和调试方法。 3、学会基于M3进行软件设计。二 任务及要求1、任务设计并制作一台具有直流电压、交流电压和电阻测量功能的智能数字万用表。示意图如图1所示。 (9.77 KB)2010-8-19 08:16 图1 智能数字万用表示意图 2、要求1、基本要求(1)数码显示,最大读数1999。(2)直流电压量程:0.2V、2V、20V,精度

2、为0.2%1个字;输入阻抗10M。(3)交流电压量程:0.2V、2V、20V,精度为0.5%2个字(以50 Hz为 基准);输入阻抗10M;频率响应范围为401000Hz。(4)电阻量程: 2、200、2M,精度0.2%2个字。2、发挥部分(1)直流电压测量具有自动量程转换功能。(2)具有“自动关机”功能,即在测量过程中,若1分钟内无任何键按下,仪器会自动关闭显示并处于低功耗状态;再按任意键,仪器能返回“自动关机”前的工作状态。(3)具有相对误差(%)测量功能,即在进行某项测量时,首先通过示屏提示用户从键盘输入标称值,一旦输入确认后,仪器能显示相对误差中的值。(4)其它。三 总体设计方案1、系

3、统模块图根据题目要求和本系统的设计思想,系统主要包括图2所示的模块: 被 测 量 输 入 电测阻 量 程 自 动 转 换 电 路 单 片 机 系 统电阻测量电路测直流A/D转换电路 测交流键盘与显示交测直流转换电路 图2系统模块框2、 总体方案分析 若被测量为电阻,则须经过电阻测量电路将电阻量转化为直流电压量后才可以进入量程自动转换电路;若被测量为直流电压,则可以直接进入量程自动转换电路;若被测量为交流电压,则需要先经过交直流转换电路将交流电压转换为直流电压后再进入量程自动转换电路。单片机系统通过对CD4052芯片A、B端的控制实现量程自动转换。A/D转换电路将测得的模拟量转化为数字量之后通过

4、单片机系统在液晶显示屏上显示出来。 四 单元电路设计与计算1、 电阻测量电路 利用运算放大器采用反相比例运算的方法,将测电阻转化为测电压, 电路图如下: 图3电阻测量电路由反相比例电路可知:Uo=(Rx/500)5V,可推出Rx=Uo100,测量电阻时若输出电压Uo=2V,则被测电阻Rx=200如上图所示。2、交直流转换电路 测量交流电压时须先将交流转化为直流,这里采用全波精密整流电路, 利用二极管的单向导电性,运放A1构成反相器,运放A2构成反相加法器,电路图如下所示: 图4交直流转换电路当UI0时 D1导通、D2截止 UO1= -2UI UO= - UO1-UI=UI当UI0时 D1截止、

5、D2导通 UO1=0 UO= - UO1-UI=-UI 输入与输出信号波形如下: 图5交直流转换电路输入与输出波形3、量程自动转换电路 自动量程转换电路的作用是按输入信号条件(过量程、欠量程信号)和时钟信号(EOC、DS1DS4)发生相应的量程信号控制。通过单片机读取MC14433的数字信号,通过数字信号的大小来控制模拟开关,从而改变反馈电阻的大小来实现档位的不同选择。模拟开关的导通由Q3和Q0决定,当被测电压过量程时(Q3=0且Q0=1),向高量程变化;欠量程时(Q3=1且Q0=1),向低量程变化;当量程适当时,保持原来状态不变。其中,Au=-Rf/R ,R=10K ,如果要实现3个档位,可

6、以将Rf设为1k、10k、100k,然后通过控制开关来接通电阻,从而实现换档。CD4052是一个双 4 选一的多路模拟选择开关,其使用真值表如表 1所示 : 图6 CD4052芯片真值表应用时可以通过单片机对A/B的控制来选择输入哪一路,这里选择Y通道,电路图如下: 图 7量程自动转换电路4、A/D转换电路采用MC14433,集成芯片MC14433是是一个3 1/2位A/D转换器,其中集成了双积分式A/D转换器所有的CMOS模拟电路和数字电路。具有外接元件少,输入阻抗高,功耗低,电源电压范围宽,精度高等特点,并且具有自动校零和自动极性转换功能。MC1403提供输出可调基准电压,当输入一个直流电

7、压时,将进行A/D转换,用单片机来处理MC14433的控制信号。当A/D转换结束时,MC14433的EOC引脚输出一个高电平脉冲给单片机,单片机进入中断处理程序。单片机对MC14433的DS1DS4进行动态扫描,然后将Q0Q3进行转换之后由LCD显示。相关理论推导:双积分过程可以由下面的式子表示:因为,故有,式中=4000,是定时时间,是变时间,由确定斜率,若用时钟脉冲数N来表示时间,则被测电压就转换成了相应的脉冲数,实现了A/D转换。的参数计算: 式中为积分电容上充电电压幅度,=,=0.5V, =4000。假定=0.1,=5V,=66kHz。当=2V时,代入式1,可得=480 ,取标称值47

8、0。电路图如下图所示: 图 8 A/D转换电路五 软件设计1、软件设计流程图:开始初始化按键功能选择 进入相应测量 模块并显示进入休眠触键唤醒单片机控制系统循环并扫描 图 9软件设计流程2、程序代码:Systeminit.c 程序清单#include systeminit.hunsigned long TheSysClock = 12000000UL;/ 定义KEY#define KEY_PERIPH SYSCTL_PERIPH_GPIOB#define KEY_PORT GPIO_PORTB_BASE#define KEY_PIN GPIO_PIN_5/ 防止JTAG失效,解锁时需将EXP-

9、LM3S811板卡上的JP13跳至左侧(短接1-2)void jtagWait(void) SysCtlPeripheralEnable(KEY_PERIPH); / 使能KEY所在的GPIO端口 GPIOPinTypeGPIOInput(KEY_PORT, KEY_PIN); / 设置KEY所在管脚为输入 if (GPIOPinRead(KEY_PORT, KEY_PIN) = 0x00) / 若复位时按下KEY,则进入 for (;); / 死循环,以等待JTAG连接 SysCtlPeripheralDisable(KEY_PERIPH); / 禁止KEY所在的GPIO端口/ 系统时钟初始

10、化void clockInit(void) SysCtlLDOSet(SYSCTL_LDO_2_50V); / 设置LDO输出电压 SysCtlClockSet(SYSCTL_USE_OSC | / 系统时钟设置 SYSCTL_OSC_MAIN | / 采用主振荡器 SYSCTL_XTAL_6MHZ | / 外接6MHz晶振 SYSCTL_SYSDIV_1); / 不分频 TheSysClock = SysCtlClockGet(); / 获取当前的系统时钟频率main.c程序清单#include Systeminit.h#include lcd.h#define KEY_PORT GPIO_

11、PORTD_BASE#define KEY_Row GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0 /扫描信号输出PD30#define KEY_clo GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4 /按键信号输入PD74#define KEY_PERIPH SYSCTL_PERIPH_GPIODextern void display_dianzu_val(void);extern void display_menu1(void);extern void display_menu2(void);extern vo

12、id dianya_judge_display(void);extern void dianzu_judge_display(void);extern void GPIO_Init(void) ;extern void display_zhiliu_val(void);extern void display_jiaoliu_val(void); extern void display_wucha_val(void);extern void sleep(void) ;unsigned char key_val; / 键值void key_check(void) key_val=0;GPIOPin

13、Write(KEY_PORT,KEY_Row,0x0f);GPIOPinWrite(KEY_PORT,GPIO_PIN_0,0);if(GPIOPinRead(KEY_PORT,KEY_clo)&0xf0)!=0xf0)if(GPIOPinRead(KEY_PORT,GPIO_PIN_4)=0)key_val=1;if(GPIOPinRead(KEY_PORT,GPIO_PIN_5)=0)key_val=2;if(GPIOPinRead(KEY_PORT,GPIO_PIN_6)=0)key_val=3;if(GPIOPinRead(KEY_PORT,GPIO_PIN_7)=0)key_val=

14、4; GPIOPinWrite(KEY_PORT,KEY_Row,0x0f);GPIOPinWrite(KEY_PORT,GPIO_PIN_1,0);if(GPIOPinRead(KEY_PORT,KEY_clo)&0xf0)!=0xf0)if(GPIOPinRead(KEY_PORT,GPIO_PIN_4)=0)key_val=5;if(GPIOPinRead(KEY_PORT,GPIO_PIN_5)=0)key_val=6;if(GPIOPinRead(KEY_PORT,GPIO_PIN_6)=0)key_val=7;if(GPIOPinRead(KEY_PORT,GPIO_PIN_7)=

15、0)key_val=8; GPIOPinWrite(KEY_PORT,KEY_Row,0x0f);GPIOPinWrite(KEY_PORT,GPIO_PIN_2,0);if(GPIOPinRead(KEY_PORT,KEY_clo)&0xf0)!=0xf0)if(GPIOPinRead(KEY_PORT,GPIO_PIN_4)=0)key_val=9;if(GPIOPinRead(KEY_PORT,GPIO_PIN_5)=0)key_val=10;if(GPIOPinRead(KEY_PORT,GPIO_PIN_6)=0)key_val=11;if(GPIOPinRead(KEY_PORT,

16、GPIO_PIN_7)=0)key_val=12;GPIOPinWrite(KEY_PORT,KEY_Row,0x0f);GPIOPinWrite(KEY_PORT,GPIO_PIN_3,0);if(GPIOPinRead(KEY_PORT,KEY_clo)&0xf0)!=0xf0)if(GPIOPinRead(KEY_PORT,GPIO_PIN_4)=0)key_val=13;if(GPIOPinRead(KEY_PORT,GPIO_PIN_5)=0)key_val=14;if(GPIOPinRead(KEY_PORT,GPIO_PIN_6)=0)key_val=15;if(GPIOPinR

17、ead(KEY_PORT,GPIO_PIN_7)=0)key_val=16;int main()jtagWait(); clockInit();SysCtlPeripheralEnable(KEY_PERIPH);GPIOPinTypeGPIOOutput(KEY_PORT,KEY_Row); /扫描信号输出GPIOPinTypeGPIOInput(KEY_PORT,KEY_clo);/按键信号输入GPIO_Init();for(;)display_menu1(); /一级菜单do key_check(); while(key_val=0);switch(key_val) case 6:dis

18、play_dianzu_val();break; /显示电阻 键2case 5: /进入二级菜单 键1 do display_menu2(); do key_check(); while(key_val=0); switch(key_val) case 12:display_zhiliu_val();break; /进入直流电压测量 键B case 16:display_jiaoliu_val();break; /进入交流电压测量 键A default: break; /sleep(); while(key_val !=4); Lcd_temp.c 程序清单#include systemIni

19、t.h#include lcd.h#include test.h#define CTL_PERIPH SYSCTL_PERIPH_GPIOC /控制液晶所用的片内端口外设定义#define CTL_PORT GPIO_PORTC_BASE#defineSCK GPIO_PIN_4 / 定义信号SCK#defineSID GPIO_PIN_5 / 定义信号SID#define CS GPIO_PIN_6 / 定义信号CS#define PSB GPIO_PIN_7 / 定义信号PSB#define SCK_LGPIOPinWrite(CTL_PORT,SCK,0x00); /定义信号输出低电平#

20、define SID_LGPIOPinWrite(CTL_PORT,SID,0x00); #define CS_LGPIOPinWrite(CTL_PORT,CS,0x00); #define PSB_LGPIOPinWrite(CTL_PORT,PSB,0x00); #define SCK_HGPIOPinWrite(CTL_PORT,SCK,0xFF);/定义信号输出高电平#define SID_HGPIOPinWrite(CTL_PORT,SID,0xFF); #define CS_HGPIOPinWrite(CTL_PORT,CS,0xFF);#define PSB_HGPIOPinW

21、rite(CTL_PORT,PSB,0xFF);#define SID_READ GPIOPinRead(CTL_PORT,SID);/定义读回的数据#define SID_IN GPIOPinTypeGPIOInput(CTL_PORT,SID);/定义SID信号为输入#define SID_OUT GPIOPinTypeGPIOOutput(CTL_PORT,SID);/定义SID信号为输出unsigned char AC_TABLE=0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, /第一行汉字位置0x90,0x91,0x92,0x93,0x94,0x95

22、,0x96,0x97, /第二行汉字位置 ;unsigned char menu1_1=请选择测量项目:; /选择提示unsigned char menu1_2=1:电压 2:电阻 ;unsigned char menu2_1=请选择测量项目: ;unsigned char menu2_2=A:交流 B:直流 ;unsigned char menu3_1=输入标称值: ; unsigned char menu3_2= ;unsigned char menu3_3=相对误差: ; unsigned char menu3_4= ;unsigned char str1=电阻为: ; unsigned

23、 char str5=C:误差分析 ; unsigned char str=直流电压 ; unsigned char str2=电压0.1 ;unsigned char str3=电压10;unsigned char str4=交流电压;unsigned char c1;extern unsigned char key_val; extern void key_check(void);extern void set_para(void);extern void para_input_display(void);/所用的芯片端口初始化void init(void) SysCtlPeriphera

24、lEnable( CTL_PERIPH); /使能所用的端口 GPIODirModeSet(CTL_PORT, (SCK | PSB | CS ) ,GPIO_DIR_MODE_OUT); /设置信号的方向GPIOPadConfigSet(CTL_PORT, (SCK | PSB | CS ), GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); /设置IO的驱动能力/串行方式发送一个字节void SendByte(unsigned char Dbyte) unsigned char i ; for(i=0 ;i 8 ;i+) SCK_L ; SID_OUT;

25、 if (Dbyte & 0x80) SID_H; else SID_L; Dbyte=Dbyte1 ; SCK_H ; SCK_L ; /串行方式接收一个字节unsigned char ReceiveByte(void) unsigned char i,temp1,t,temp2; temp1=temp2=0 ; for(i=0 ;i8 ;i+) temp1=temp11 ; SCK_L ; SCK_H ; SCK_L ; SID_IN; t=SID_READ; if (t) temp1+ ; for(i=0 ;i8 ;i+) temp2=temp21 ; SCK_L ; SCK_H ; S

26、CK_L ; SID_IN; t=SID_READ; if (t) temp2+ ; return (0xf0&temp1)+(0x0f&temp2) ;/判断是否忙碌void CheckBusy( void ) do SendByte(0xfc) ; while(0x80&ReceiveByte() ;/判断是否忙碌:BF(.7)=1 Busy/向液晶发送命令void WriteCommand( unsigned char Cbyte ) CS_H; CheckBusy() ; SendByte(0xf8) ; SendByte(0xf0&Cbyte) ; /高四位 SendByte(0xf

27、0&Cbyte4) ;/低四位(先执行 ; ;) CS_L;/向液晶发送显示数据void WriteData( unsigned char Dbyte )/显示字符 CS_H ; CheckBusy() ; SendByte(0xfa) ; /字节格式:11111,RW(0),RS(1),0 SendByte(0xf0&Dbyte) ; /高四位 SendByte(0xf0&Dbyte4) ;/低四位(先执行 ; ;) CS_L ;/延时函数void Delay(unsigned int MS) unsigned char us,usn ; while(MS!=0) usn = 2 ; whi

28、le(usn!=0) us=0xf5 ; while (us!=0)us- ; ; usn- ; MS- ; /维捷登测试架专用延时函数void DelayKey(unsigned int Second , unsigned int MS100) /输入精确到0.1S,是用, unsigned int i ; for(i=0 ;iSecond*100+MS100*10 ;i+) Delay(10) ; /液晶初始化函数void LcmInit( void ) WriteCommand(0x30) ; /8BitMCU,基本指令集合 WriteCommand(0x03) ; /AC归0,不改变D

29、DRAM内容 WriteCommand(0x0c) ; /显示ON,游标Off,游标位反白OFF WriteCommand(0x01) ; /清屏,AC归0 WriteCommand(0x06) ; /写入时,游标右移动void PutStr1(unsigned char row,unsigned char col,unsigned char *puts) /128X32方式 WriteCommand(0x30) ; /8BitMCU,基本指令集合 WriteCommand(AC_TABLE8*row+col) ; /起始位置 while(*puts != 0) /判断字符串是否显示完毕 if

30、(col=8) /判断换行 /若不判断,则自动从第一行到第三行 col=0 ; row+ ; if(row=2) /一屏显示完,回到屏左上角,128x32时为row=2 row=0 ; DelayKey(1,5);Delay(2000) ; WriteCommand(AC_TABLE8*row+col) ; WriteData(*puts) ; /一个汉字要写两次 puts+ ; WriteData(*puts) ; puts+ ; col+ ; / 显示直流电压函数void display_zhiliu_val(void) PSB_L; /串行方式 Delay(100) ; LcmInit(

31、) ; /液晶初始化 PutStr1(1,0,str5); /显示第一行 DelayKey(1,5) ; if (GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)=0x00)&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)=0x00) PutStr1(0,0,str); /显示电压 DelayKey(1,5) ; else if (GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)=0xff)&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)=0x00) PutStr1(0,0,str3); /

32、显示电压10 DelayKey(1,5) ; else if (GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)=0xff)&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)=0xff) PutStr1(0,0,str2); /显示电压0.1 DelayKey(1,5) ; else PutStr1(0,0,str); /显示第一行 DelayKey(1,5) ; do key_check(); do key_check(); while(key_val=0); switch(key_val) case 8:display_wucha_val(

33、);break; /进入直流电压测量 键C default: break; zhiliu_judge_display(); while(key_val !=4); / 显示交流流电压函数void display_jiaoliu_val(void) PSB_L; /串行方式 Delay(100) ; LcmInit() ; /液晶初始化 if (GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)=0x00)&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)=0x00) PutStr1(0,0,str4); /显示电压 DelayKey(1,5) ;

34、 else if (GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)=0xff)&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)=0x00) PutStr1(0,0,str3); /显示电压10 DelayKey(1,5) ; else if (GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)=0xff)&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)=0xff) PutStr1(0,0,str2); /显示电压0.1 DelayKey(1,5) ; else PutStr1(0,0,str); /显示第一行 DelayKey(1,5) ; do key_check(); jiaoliu_judge_display(); while(key_val !=4); / 显示电

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 单元课程

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁