当前位置:文档之家› 智能数字万用表的设计

智能数字万用表的设计

湖北经济学院电子设计大赛设计报告课题名称:数字智能万用表指导教师:汪成义王金庭刘光然学生姓名:汪凡夏晶晶张薇学生院系:电子工程系时间: 2011年7月智能数字万用表一 设计目的1、培养综合性电子线路的设计能力。

2、掌握综合性电子线路的安装和调试方法。

3、学会基于M3进行软件设计。

二 任务及要求 1、任务设计并制作一台具有直流电压、交流电压和电阻测量功能的智能数字万用表。

示意图如图1所示。

图1 智能数字万用表示意图2、要求1、基本要求(1)213数码显示,最大读数1999。

(2)直流电压量程:0.2V、2V、20V,精度为±0.2%±1个字;输入阻抗≥10MΩ。

(3)交流电压量程:0.2V、2V、20V,精度为±0.5%±2个字(以50 Hz为基准);输入阻抗≥10MΩ;频率响应范围为40~1000Hz。

(4)电阻量程: 2Ω、200Ω、2MΩ,精度±0.2%±2个字。

2、发挥部分(1)直流电压测量具有自动量程转换功能。

(2)具有“自动关机”功能,即在测量过程中,若1分钟内无任何键按下,仪器会自动关闭显示并处于低功耗状态;再按任意键,仪器能返回“自动关机”前的工作状态。

(3)具有相对误差(△%)测量功能,即在进行某项测量时,首先通过示屏提示用户从键盘输入标称值,一旦输入确认后,仪器能显示相对误差中的△值。

(4)其它。

三总体设计方案1、系统模块图根据题目要求和本系统的设计思想,系统主要包括图2所示的模块:图2系统模块框2、总体方案分析若被测量为电阻,则须经过电阻测量电路将电阻量转化为直流电压量后才可以进入量程自动转换电路;若被测量为直流电压,则可以直接进入量程自动转换电路;若被测量为交流电压,则需要先经过交直流转换电路将交流电压转换为直流电压后再进入量程自动转换电路。

单片机系统通过对CD4052芯片A、B端的控制实现量程自动转换。

A/D转换电路将测得的模拟量转化为数字量之后通过单片机系统在液晶显示屏上显示出来。

四单元电路设计与计算1、电阻测量电路利用运算放大器采用反相比例运算的方法,将测电阻转化为测电压,电路图如下:图3电阻测量电路由反相比例电路可知:Uo=(Rx/500)×5V,可推出Rx=Uo×100,测量电阻时若输出电压Uo=2V,则被测电阻Rx=200Ω如上图所示。

2、交直流转换电路测量交流电压时须先将交流转化为直流,这里采用全波精密整流电路,利用二极管的单向导电性,运放A1构成反相器,运放A2构成反相加法器,电路图如下所示:图4交直流转换电路当U I>0时 D1导通、D2截止 U O1= -2U I U O= - U O1-U I=U I当U I<0时 D1截止、D2导通 U O1=0 U O= - U O1-U I=-U I输入与输出信号波形如下:图5交直流转换电路输入与输出波形3、量程自动转换电路自动量程转换电路的作用是按输入信号条件(过量程、欠量程信号)和时钟信号(EOC、DS1~DS4)发生相应的量程信号控制。

通过单片机读取MC14433的数字信号,通过数字信号的大小来控制模拟开关,从而改变反馈电阻的大小来实现档位的不同选择。

模拟开关的导通由Q3和Q0决定,当被测电压过量程时(Q3=0且Q0=1),向高量程变化;欠量程时(Q3=1且Q0=1),向低量程变化;当量程适当时,保持原来状态不变。

其中,Au=-Rf/R ,R=10K ,如果要实现3个档位,可以将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提供输出可调基准电压REF V ,当输入一个直流电压时,将进行A/D 转换,用单片机来处理MC14433的控制信号。

当A/D 转换结束时,MC14433的EOC 引脚输出一个高电平脉冲给单片机,单片机进入中断处理程序。

单片机对MC14433的DS1~DS4进行动态扫描,然后将Q0~Q3进行转换之后由LCD 显示。

相关理论推导:双积分过程可以由下面的式子表示:1112111011T C R V dt V C R V xt t x -=-=⎰X REFt t REF T C R V dt V C R V 112111021-=-=⎰因为0201V V =,故有REF xX V T T V 1=,式中1T =4000CP T ,1T 是定时时间,X T 是变时间,由1R 1C 确定斜率,若用时钟脉冲数N 来表示时间X T ,则被测电压就转换成了相应的脉冲数,实现了A/D 转换。

1R 1C 的参数计算:CX V TC V R ∆⨯=11(max) 式中C V ∆为积分电容上充电电压幅度,C V ∆=V V V x DD ∆--(max),V ∆=0.5V ,T =4000clkf 1⨯。

假定1C =0.1uF ,DD V =5V ,clk f =66kHz 。

当(max)x V =2V 时,代入式1,可得1R =480 Ωk ,取标称值470Ωk 。

电路图如下图所示:图 8 A/D 转换电路五 软件设计1、软件设计流程图:图 9软件设计流程2、程序代码:Systeminit.c 程序清单#include "systeminit.h"unsigned long TheSysClock = 12000000UL;// 定义KEY#define KEY_PERIPH SYSCTL_PERIPH_GPIOB#define KEY_PORT GPIO_PORTB_BASE#define KEY_PIN GPIO_PIN_5// 防止JTAG失效,解锁时需将EXP-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端口}// 系统时钟初始化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_PORTD_BASE#define KEY_Row GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0 //扫描信号输出PD3~0#define KEY_clo GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4 //按键信号输入PD7~4#define KEY_PERIPH SYSCTL_PERIPH_GPIODextern void display_dianzu_val(void);extern void display_menu1(void);extern void display_menu2(void);extern void 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;GPIOPinWrite(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=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)==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,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(GPIOPinRead(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:display_dianzu_val();break; //显示电阻键2case 5: //进入二级菜单键1do{display_menu2();do {key_check();}while(key_val==0);switch(key_val){case 12:display_zhiliu_val();break; //进入直流电压测量键Bcase 16:display_jiaoliu_val();break; //进入交流电压测量键Adefault: break;}//sleep();} while(key_val !=4);}}}Lcd_temp.c 程序清单#include "systemInit.h"#include "lcd.h"#include "test.h"#define CTL_PERIPH SYSCTL_PERIPH_GPIOC // 控制液晶所用的片内端口外设定义#define CTL_PORT GPIO_PORTC_BASE#define SCK GPIO_PIN_4 // 定义信号SCK#define SID GPIO_PIN_5 // 定义信号SID#define CS GPIO_PIN_6 // 定义信号CS#define PSB GPIO_PIN_7 // 定义信号PSB#define SCK_L GPIOPinWrite(CTL_PORT,SCK,0x00); // 定义信号输出低电平#define SID_L GPIOPinWrite(CTL_PORT,SID,0x00);#define CS_L GPIOPinWrite(CTL_PORT,CS,0x00);#define PSB_L GPIOPinWrite(CTL_PORT,PSB,0x00);#define SCK_H GPIOPinWrite(CTL_PORT,SCK,0xFF); // 定义信号输出高电平#define SID_H GPIOPinWrite(CTL_PORT,SID,0xFF);#define CS_H GPIOPinWrite(CTL_PORT,CS,0xFF);#define PSB_H GPIOPinWrite(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,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 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){SysCtlPeripheralEnable( 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;if (Dbyte & 0x80){SID_H;}else{SID_L;}Dbyte=Dbyte<<1 ;SCK_H ;SCK_L ;}}// 串行方式接收一个字节unsigned char ReceiveByte(void){unsigned char i,temp1,t,temp2;temp1=temp2=0 ;for(i=0 ;i<8 ;i++){temp1=temp1<<1 ;SCK_L ;SCK_H ;SCK_L ;SID_IN;t=SID_READ;if (t){temp1++ ;}}for(i=0 ;i<8 ;i++){temp2=temp2<<1 ;SCK_L ;SCK_H ;SCK_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(0xf0&Cbyte<<4) ; // 低四位(先执行< ;< ;)CS_L;}// 向液晶发送显示数据void WriteData( unsigned char Dbyte ) //显示字符{CS_H ;CheckBusy() ;SendByte(0xfa) ; // 字节格式:11111,RW(0),RS(1),0SendByte(0xf0&Dbyte) ; // 高四位SendByte(0xf0&Dbyte<<4) ; // 低四位(先执行< ;< ;) CS_L ;}// 延时函数void Delay(unsigned int MS){unsigned char us,usn ;while(MS!=0){usn = 2 ;while(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 ;i<Second*100+MS100*10 ;i++){Delay(10) ;}}// 液晶初始化函数void LcmInit( void ){WriteCommand(0x30) ; // 8BitMCU,基本指令集合 WriteCommand(0x03) ; // AC归0,不改变DDRAM 内容WriteCommand(0x0c) ; // 显示ON,游标Off,游标位反白OFFWriteCommand(0x01) ; // 清屏,AC归0WriteCommand(0x06) ; // 写入时,游标右移动}void PutStr1(unsigned char row,unsigned char col,unsigned char *puts) { // 128X32方式WriteCommand(0x30) ; // 8BitMCU,基本指令集合WriteCommand(AC_TABLE[8*row+col]) ; // 起始位置while(*puts != '\0') // 判断字符串是否显示完毕{if(col==8) // 判断换行{ // 若不判断,则自动从第一行到第三行col=0 ;row++ ;}if(row==2) // 一屏显示完,回到屏左上角,128x32时为row=2{row=0 ;DelayKey(1,5);Delay(2000) ;}WriteCommand(AC_TABLE[8*row+col]) ;WriteData(*puts) ; // 一个汉字要写两次puts++ ;WriteData(*puts) ;puts++ ;col++ ;}}// 显示直流电压函数void display_zhiliu_val(void){PSB_L; // 串行方式Delay(100) ;LcmInit() ; // 液晶初始化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); //显示电压×10DelayKey(1,5) ;}else if ((GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)==0xff)&&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)==0xff)) {PutStr1(0,0,str2); //显示电压×0.1DelayKey(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();break; //进入直流电压测量键Cdefault: 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) ;}else if ((GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)==0xff)&&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)==0x00)){PutStr1(0,0,str3); //显示电压×10DelayKey(1,5) ;}else if ((GPIOPinRead(OUTPUT_PORT, GPIO_PIN_1)==0xff)&&(GPIOPinRead(OUTPUT_PORT, GPIO_PIN_0)==0xff)) {PutStr1(0,0,str2); //显示电压×0.1DelayKey(1,5) ;}else{PutStr1(0,0,str); //显示第一行DelayKey(1,5) ;}do{ key_check();jiaoliu_judge_display();} while(key_val !=4);}// 显示电阻函数void display_dianzu_val(void){式Delay(100) ;LcmInit() ; // 液晶初始化PutStr1(0,0,str1); //显示第一行DelayKey(1,5)do{ key_check();dianzu_judge_display();} while(key_val !=4);}// 显示一级菜单函数void display_menu1(void){unsigned char i;init(); // 端口初始化PSB_L; // 串行方式SysCtlDelay(250*(SysCtlClockGet()/3000));LcmInit() ; // 液晶初始化WriteCommand(0x30) ;WriteCommand(0x80) ;for(i=0;menu1_1[i]!='\0';i++){WriteData(menu1_1[i]) ;}WriteCommand(0x90) ;for(i=0;menu1_2[i]!='\0';i++){WriteData(menu1_2[i]) ;}SysCtlDelay(500*(SysCtlClockGet()/3000));}//显示二级菜单void display_menu2(void){unsigned char i;init(); // 端口初始化式SysCtlDelay(250*(SysCtlClockGet()/3000));LcmInit() ; // 液晶初始化WriteCommand(0x30) ;WriteCommand(0x80) ;for(i=0;menu2_1[i]!='\0';i++){WriteData(menu2_1[i]) ;}WriteCommand(0x90) ;for(i=0;menu2_2[i]!='\0';i++){WriteData(menu2_2[i]) ;}SysCtlDelay(500*(SysCtlClockGet()/3000));}//误差显示 ,显示”输入标称值“”相对误差“void display_wucha_val(){set_para();para_input_display();}// 输出参数提示void set_para(void){init(); // 端口初始化PSB_L; // 串行方式SysCtlDelay(250*(SysCtlClockGet()/3000));LcmInit() ; // 液晶初始化PutStr1(0,0,menu3_1);DelayKey(1,5) ;Delay(20);PutStr1(1,0,menu3_3);DelayKey(1,5) ;Delay(20);SysCtlDelay(500*(SysCtlClockGet()/3000));}// 参数输入与显示void para_input_display(void){ int return_up_flag=0;WriteCommand(0x30) ;WriteCommand(0x85) ;while(return_up_flag==0){do {key_check();} while(key_val==0);switch(key_val){case 1:WriteData('0');DelayKey(1,5);break;case 2:;break;case 3:;break;case 4:return_up_flag=1;break;case 5:WriteData('1') ;DelayKey(1,5);break;case 6:WriteData('2') ;DelayKey(1,5);break;case 7:WriteData('3') ;DelayKey(1,5);break;case 8:;break;case 9:WriteData('4') ;DelayKey(1,5);break;case 10:WriteData('5') ;DelayKey(1,5);break;case 11:WriteData('6') ;DelayKey(1,5);break;case 12:;break;case 13:WriteData('7') ;DelayKey(1,5);break;case 14:WriteData('8') ;DelayKey(1,5);break;case 15:WriteData('9') ;DelayKey(1,5);break;case 16:;break;}}}void LCD_init(void){SysCtlPeripheralEnable( 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的驱动能力PSB_L; // 串行方式Delay(100) ;LcmInit() ; // 液晶初始化LcmClearTXT() ;}// 文本区清RAM函数void LcmClearTXT( void ){unsigned char i ;WriteCommand(0x30) ; // 8BitMCU,基本指令集合WriteCommand(0x80) ; // AC归起始位for(i=0 ;i<64 ;i++)WriteData(0x20) ;}void WriteNum(unsigned char num){WriteData(0x30+num);}test.c 程序清单#include "systemInit.h"#include "lcd.h"#include "test.h"unsigned char a[4],flag0,flag1,flag2,flag3;void GPIO_Init(){SysCtlPeripheralEnable(READDATA_PERIPH);GPIOPinTypeGPIOInput(READDATA_PORT,READDATA);GPIOPinTypeGPIOOutput(READDATA_PORT,LED);SysCtlPeripheralEnable(SCAN_PERIPH);GPIOPinTypeGPIOInput(SCAN_PORT,SCAN);SysCtlPeripheralEnable(OUTPUT_PERIPH);GPIOPinTypeGPIOOutput(OUTPUT_PORT,OUTPUT);GPIOPinTypeGPIOInput(READDATA_PORT,INT);GPIOIntTypeSet(READDATA_PORT,INT,GPIO_RISING_EDGE);GPIOPinIntEnable(READDATA_PORT,INT);IntEnable(INT_GPIOB);IntMasterEnable();}void scan(){unsigned char scan_num;scan_num=GPIOPinRead(SCAN_PORT,SCAN)&0x0f;switch (scan_num){case0x01:a[3]=GPIOPinRead(READDATA_PORT,READDATA)&0x0f;flag0=1;break;case0x02:a[2]=GPIOPinRead(READDATA_PORT,READDATA)&0x0f;flag1=1;break;case0x04:a[1]=GPIOPinRead(READDATA_PORT,READDATA)&0x0f;flag2=1;break;case0x08:a[0]=GPIOPinRead(READDATA_PORT,READDATA)&0x0f;flag3=1;GPIOPinWri te(READDATA_PORT,LED,0x00);break;}}//定义直流显示void zhiliu_judge_display(){unsigned char polarity=0;unsigned char qian=0,bai=0,shi=0,ge=0;if((a[3]&0x04)==0x04) //通过Q2判断极性,Q2=1为正polarity=1;elsepolarity=0;if((a[3]&0x09)==0x09) //Q3=1,Q0=1 ,为欠量程 ,此时需进行放大{GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_1, 0xff);GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_0, 0x00);}else if((a[3]&0x09)==0x01) //Q3=0,Q0=1, 为过量程,此时需进行衰减{GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_1, 0xff);GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_0, 0xff);}else{GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_1, 0x00);GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_0, 0x00);}if((a[3]&0x08)==0x08)qian=0;elseqian=1;bai=a[2];shi=a[1];ge=a[0];WriteCommand(0x84);if(polarity==1)WriteData('+');elseWriteData('-');WriteNum(qian);WriteData('.');WriteNum(bai);WriteNum(shi);WriteNum(ge);WriteData('v');}//定义交流显示void jiaoliu_judge_display(){unsigned char polarity=0;unsigned char qian=0,bai=0,shi=0,ge=0;unsigned char m,n,c,d,s ;if((a[3]&0x04)==0x04) //通过Q2判断极性,Q2=1为正polarity=1;elsepolarity=0;if((a[3]&0x09)==0x09) //Q3=1,Q0=1 ,为欠量程 ,此时需进行放大{GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_1, 0xff);GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_0, 0x00);}else if((a[3]&0x09)==0x01) //Q3=0,Q0=1, 为过量程,此时需进行衰减{GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_1, 0xff);GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_0, 0xff);}else{GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_1, 0x00);GPIOPinWrite(OUTPUT_PORT, GPIO_PIN_0, 0x00);}if((a[3]&0x08)==0x08)qian=0;elseqian=1;bai=a[2];shi=a[1];ge=a[0];s=(qian*1000+bai*100+shi*10+ge)*(1.571) ;m=s/1000;n=(s-m*1000)/100 ;c=(s-m*1000-n*100)/10 ;d=s%10 ;WriteCommand(0x84);if(polarity==1)WriteData('+');elseWriteData('-');WriteNum(m);WriteData('.');WriteNum(n);WriteNum(c);WriteNum(d);WriteData('v');}//定义电阻显示void dianzu_judge_display(){unsigned char qian=0,bai=0,shi=0,ge=0;unsigned char m,n,c,d,dianzu ;if((a[3]&0x08)==0x08)qian=0;elseqian=1;bai=a[2];shi=a[1];ge=a[0];dianzu=(qian*1000+bai*100+shi*10+ge )/10 ;m=dianzu/1000;n=(dianzu-m*1000)/100 ;c=(dianzu-m*1000-n*100)/10 ;d=dianzu%10 ;WriteCommand(0x85);WriteNum(m);WriteNum(n);WriteNum(c);WriteNum(d);//WriteData('') ;}void GPIO_Port_B_ISR(void){unsigned long ulStatus;ulStatus=GPIOPinIntStatus(READDATA_PORT,true);GPIOPinIntClear(READDATA_PORT,ulStatus);if(ulStatus&INT){while(!((flag0==1)&&(flag1==1)&&(flag2==1)&&(flag3==1))){scan();}GPIOPinWrite(READDATA_PORT,LED,0xff);}flag0=0;flag1=0;flag2=0;flag3=0;}Sleep.c 程序清单#include "systemInit.h"#include "lcd.h"#define SysCtlPeriClkGating SysCtlPeripheralClockGating#define SysCtlPeriSlpEnable SysCtlPeripheralSleepEnable#define LED_PERIPH SYSCTL_PERIPH_GPIOA#define LED_PORT GPIO_PORTA_BASE#define LED_PIN GPIO_PIN_0// 定义KEY#define KEY_PERIPH SYSCTL_PERIPH_GPIOD#define KEY_PORT GPIO_PORTD_BASE#define KEY_PIN GPIO_PIN_7void keyInit(void){SysCtlPeriEnable(KEY_PERIPH); GPIOPinTypeIn(KEY_PORT, KEY_PIN); GPIOIntTypeSet(KEY_PORT, KEY_PIN, GPIO_LOW_LEVEL); GPIOPinIntEnable(KEY_PORT, KEY_PIN);IntEnable(INT_GPIOD); IntMasterEnable( );}//定义睡眠程序void sleep (void){jtagWait( ); clockInit( );keyInit( ); SysCtlPeriEnable(LED_PERIPH); GPIOPinTypeOut(LED_PORT, LED_PIN);GPIOPinWrite(LED_PORT, LED_PIN, 0x00);SysCtlDelay(2500 * (TheSysClock / 3000));SysCtlPeriClkGating(true);SysCtlPeriSlpEnable(KEY_PERIPH);for (;;){GPIOPinWrite(LED_PORT, LED_PIN,0xff);SysCtlSleep( );GPIOPinWrite(LED_PORT, LED_PIN, 0x00);SysCtlDelay(2500 * (TheSysClock / 3000));}}void GPIO_Port_D_ISR(void){unsigned long ulStatus;ulStatus = GPIOPinIntStatus(KEY_PORT, true); GPIOPinIntClear(KEY_PORT, ulStatus);if (ulStatus & KEY_PIN){SysCtlDelay(10 * (TheSysClock / 3000));while (GPIOPinRead(KEY_PORT, KEY_PIN) == 0); SysCtlDelay(10 * (TheSysClock / 3000));}}Lcd.h 程序清单#define SCK_L GPIOPinWrite(CTL_PORT,SCK,0x00); // 定义信号输出低电平#define SID_L GPIOPinWrite(CTL_PORT,SID,0x00);#define CS_L GPIOPinWrite(CTL_PORT,CS,0x00);#define PSB_L GPIOPinWrite(CTL_PORT,PSB,0x00);#define SCK_H GPIOPinWrite(CTL_PORT,SCK,0xFF); // 定义信号输出高电平#define SID_H GPIOPinWrite(CTL_PORT,SID,0xFF);#define CS_H GPIOPinWrite(CTL_PORT,CS,0xFF);#define PSB_H GPIOPinWrite(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);void LCD_init(void);void SendByte(unsigned char Dbyte);unsigned char ReceiveByte(void);void CheckBusy( void );void WriteCommand( unsigned char Cbyte );void WriteData( unsigned char Dbyte );unsigned char ReadData( void );void Delay(unsigned int MS);void DelayKey(unsigned int Second , unsigned int MS100);void LcmInit( void );void LcmClearTXT( void );void PutStr(unsigned char row,unsigned char col,unsigned char *puts); void WriteNum(unsigned char num);#endifTest.h 程序清单#ifndef __TEST_H_#define __TEST_H_#include "systemInit.h"#include "lcd.h"#define READDATA_PERIPH SYSCTL_PERIPH_GPIOB#define READDATA_PORT GPIO_PORTB_BASE#define READDATAGPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0#define INT GPIO_PIN_4#define LED GPIO_PIN_5#define SCAN_PERIPH SYSCTL_PERIPH_GPIOA#define SCAN_PORT GPIO_PORTA_BASE#define SCANGPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0#define OUTPUT_PERIPH SYSCTL_PERIPH_GPIOE#define OUTPUT_PORT GPIO_PORTE_BASE#define OUTPUT GPIO_PIN_1|GPIO_PIN_0void scan(void);void zhiliu_judge_display(void);void jiaoliu_judge_display(void);void dianzu_judge_display(void);void display_wucha_val(void);#endif六系统联调、测试与分析1、测试使用的仪器(1)函数信号发生器(2)直流电源(3)示波器(4)数字万用表2、系统联调测试结果(1)直流电压的测试测试方法:通过单片机系统选择直流电压档,将直流电源作为整机系统的输入端,在LCD上显示出所测直流电压值。

相关主题