基于单片机的数字电压表设计课程设计_第1页
基于单片机的数字电压表设计课程设计_第2页
基于单片机的数字电压表设计课程设计_第3页
基于单片机的数字电压表设计课程设计_第4页
基于单片机的数字电压表设计课程设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章PAGEPAGE3本科学生单片机课程设计报告基于单片机的数字电压表设计学号院(系)指导教师

目录1设计要求……………… 2硬件电路设计………2.12.1.13程序设计………………4总结……………………参考文献……………………附件一:电路原理图……………附件二:程序清单……………一题目设计要求:1、用LED数码管或LCD显示电压值;2、电压测量范围:0--200V,按2V、20V、200V量程自动换挡;3、电压测量精度:3位半(0000--1999),相对误差≤5%;方案确定:在拿到这个题目的时候,我首先想到的是,AD转换器直接用单片机内部自带的AD转换器,因为要求电压测量精度≤5%,用个8位的AD就能达到要求了。所以我最终选用了STC12C5A60S2单片机,内部自带10位AD,足够满足要求。20V与200V高电压可以采用电阻分压将其分压至5V,然后就可以单片机AD直接采,自动换档可以就跟据输入电压自动切换合适的电阻分压系数,然后在程序里处理好显示就行。因为输入电压比较高,不能使用普通的开关,可以用电磁继电器作为开关,然后用单片机IO口控制继电器的通断达到切换电阻分压系数的目的。综合上述考虑,设计了以下电路:其中,其中K1,K2,K3是继电器开关,通断由IO口控制,一次只闭合一个开关。分压电阻设计为当K1按下时AD采样电压值等于输入电压值,当K2按下时AD采样电压值等于输入电压值/4,当K3按下时AD采样电压值等于输入电压值/40,这样AD采样值最大为5V,就能直接用单片机采了。为防止单片机上电因为AD脚测量的是高电压而导致烧坏单片机,所以在程序中默认上电闭合K3开关,然后AD采样,并根据外部电压的大小进行升量程和降量程处理,直到自动换档到合适的量程,然后再显示。2硬件电路设计:2.1单片机最小系统:我选用的是STC12C5A60S2单片机,根据数据手册,采用24M晶振情况下,最小系统如下图所示:2.2电阻分压网络设计:因为当K1按下时AD采样电压值等于输入电压值,而当K2按下时AD采样电压值等于输入电压值/4,所以(R2+R3)/(R1+R2+R3)=1/4,当K3按下时AD采样电压值等于输入电压值/40,即R3/(R1+R2+R3)=1/40。所以我只要给出R1+R2+R3的电阻值,就可以一步步算出R1、R2、R3的电阻值分别为多少,而且R1+R2+R3就是输入阻抗,本次设计中,我选R1+R2+R3的值为1MΩ,相应的算出来R1+R2+R3=1MΩ(R2+R3)/(R1+R2+R3)=1/4R3/(R1+R2+R3)=1/40所以算出来R3=25KR2=225KR1=750K但由于没有标称阻值为25K、225K、750K的电阻,最终采用电阻串联的方式。25K=21.7K+3.3K、225K=198K+22K+5K、750K=460K+269K+10K+1K。为了保证精度,每个电阻均用实验室里的6位万用表测量。2.3开关电路设计:如右图所示,当IO口置0时,三极管饱和,输出高电平,继电器1、4脚闭合,1、5脚断开;当IO口置1时,三极管截止,三极管集电极和发射极等效断开,所以继电器1、4脚断开,1、5脚闭合。2.4显示电路:本设计采用LCD12864作显示部分,LCD12864是并口数据传输,具有速度快的优点,三软件部分3.1程序框图:附件一:电路原理图及其实物图:PCB图:实物图:附件二:程序清单主函数c文件:#include"STC12C5A60S2.h"#include"STC12AD.h"#include"BASIC.h"#include"12864.h"uint8_tSwitch_Flog=3;voidmain(){Switch3=0;Switch2=1;Switch1=1;Switch_Flog=3;delayms(100); Isr_Init();Time0_Init();Init_12864();AD_Init();while(1);}STC12C5A60S2.h:#ifndefSTC12C560S_H#defineSTC12C560S_H////新一代1T8051系列单片机内核特殊功能寄存器C51CoreSFRs//76543210ResetValuesfrACC=0xE0;//Accumulator0000,0000sfrB=0xF0;//BRegister0000,0000sfrPSW=0xD0;//ProgramStatusWordCYACF0RS1RS0OVF1P0000,0000//sbitCY=PSW^7;sbitAC=PSW^6;sbitF0=PSW^5;sbitRS1=PSW^4;sbitRS0=PSW^3;sbitOV=PSW^2;sbitP=PSW^0;//sfrSP=0x81;//StackPointer0000,0111sfrDPL=0x82;//DataPointerLowByte0000,0000sfrDPH=0x83;//DataPointerHighByte0000,0000////新一代1T8051系列单片机系统管理特殊功能寄存器//不可位寻址76543210ResetValuesfrPCON=0x87;//PowerControlSMODSMOD0LVDFPOFGF1GF0PDIDL0001,0000//76543210ResetValuesfrAUXR=0x8E;//AuxiliaryRegisterT0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRS0000,0000//sfrAUXR1=0xA2;//AuxiliaryRegister1-PCA_P4SPI_P4S2_P4GF2ADRJ-DPS0000,0000/*PCA_P4:0,缺省PCA在P1口1,PCA/PWM从P1口切换到P4口:ECI从P1.2切换到P4.1口,PCA0/PWM0从P1.3切换到P4.2口PCA1/PWM1从P1.4切换到P4.3口SPI_P4:0,缺省SPI在P1口1,SPI从P1口切换到P4口:SPICLK从P1.7切换到P4.3口MISO从P1.6切换到P4.2口MOSI从P1.5切换到P4.1口SS从P1.4切换到P4.0口S2_P4:0,缺省UART2在P1口1,UART2从P1口切换到P4口:TxD2从P1.3切换到P4.3口RxD2从P1.2切换到P4.2口GF2:通用标志位ADRJ:0,10位A/D转换结果的高8位放在ADC_RES寄存器,低2位放在ADC_RESL寄存器1,10位A/D转换结果的最高2位放在ADC_RES寄存器的低2位,低8位放在ADC_RESL寄存器DPS:0,使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///sfrWAKE_CLKO=0x8F;//附加的SFRWAK1_CLKO/*76543210ResetValuePCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKE_T1CLKOT0CLKO0000,0000Bb7-PCAWAKEUP:PCA中断可唤醒powerdown。b6-RXD_PIN_IE:当P3.0(RXD)下降沿置位RI时可唤醒powerdown(必须打开相应中断)。b5-T1_PIN_IE:当T1脚下降沿置位T1中断标志时可唤醒powerdown(必须打开相应中断)。b4-T0_PIN_IE:当T0脚下降沿置位T0中断标志时可唤醒powerdown(必须打开相应中断)。b3-LVD_WAKE:当CMPIN脚低电平置位LVD中断标志时可唤醒powerdown(必须打开相应中断)。b2-b1-T1CLKO:允许T1CKO(P3.5)脚输出T1溢出脉冲,Fck1=1/2T1溢出率b0-T0CLKO:允许T0CKO(P3.4)脚输出T0溢出脉冲,Fck0=1/2T1溢出率*///sfrCLK_DIV=0x97;//ClockDivder-----CLKS2CLKS1CLKS0xxxx,x000//sfrBUS_SPEED=0xA1;//Stretchregister--ALES1ALES0-RWS2RWS1RWS0xx10,x011/*ALES1andALES0:00:TheP0addresssetuptimeandholdtimetoALEnegativeedgeisoneclockcycle01:TheP0addresssetuptimeandholdtimetoALEnegativeedgeistwoclockcycles.10:TheP0addresssetuptimeandholdtimetoALEnegativeedgeisthreeclockcycles.(default)11:TheP0addresssetuptimeandholdtimetoALEnegativeedgeisfourclockcycles.RWS2,RWS1,RWS0:000:TheMOVXread/writepulseis1clockcycle.001:TheMOVXread/writepulseis2clockcycles.010:TheMOVXread/writepulseis3clockcycles.011:TheMOVXread/writepulseis4clockcycles.(default)100:TheMOVXread/writepulseis5clockcycles.101:TheMOVXread/writepulseis6clockcycles.110:TheMOVXread/writepulseis7clockcycles.111:TheMOVXread/writepulseis8clockcycles.*/////新一代1T8051系列单片机中断特殊功能寄存器//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义//其中有的位无位寻址能力,请参阅新一代1T8051系列单片机中文指南//76543210ResetValuesfrIE=0xA8;//中断控制寄存器EAELVDEADCESET1EX1ET0EX00x00,0000//sbitEA=IE^7;sbitELVD=IE^6;//低压监测中断允许位sbitEADC=IE^5;//ADC中断允许位sbitES=IE^4;sbitET1=IE^3;sbitEX1=IE^2;sbitET0=IE^1;sbitEX0=IE^0;//sfrIE2=0xAF;//AuxiliaryInterrupt------ESPIES20000,0000B////76543210ResetValuesfrIP=0xB8;//中断优先级低位PPCAPLVDPADCPSPT1PX1PT0PX00000,0000//sbitPPCA=IP^7;//PCA模块中断优先级sbitPLVD=IP^6;//低压监测中断优先级sbitPADC=IP^5;//ADC中断优先级sbitPS=IP^4;sbitPT1=IP^3;sbitPX1=IP^2;sbitPT0=IP^1;sbitPX0=IP^0;////76543210ResetValuesfrIPH=0xB7;//中断优先级高位PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0H0000,0000sfrIP2=0xB5;//------PSPIPS2xxxx,xx00sfrIPH2=0xB6;//------PSPIHPS2Hxxxx,xx00////新一代1T8051系列单片机I/O口特殊功能寄存器//76543210ResetValuesfrP0=0x80;//8bitPort0P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.01111,1111sfrP0M0=0x94;//0000,0000sfrP0M1=0x93;//0000,0000sfrP1=0x90;//8bitPort1P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.01111,1111sfrP1M0=0x92;//0000,0000sfrP1M1=0x91;//0000,0000sfrP1ASF=0x9D;//P1analogspecialfunctionsfrP2=0xA0;//8bitPort2P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.01111,1111sfrP2M0=0x96;//0000,0000sfrP2M1=0x95;//0000,0000sfrP3=0xB0;//8bitPort3P3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.01111,1111sfrP3M0=0xB2;//0000,0000sfrP3M1=0xB1;//0000,0000sfrP4=0xC0;//8bitPort4P4.7P4.6P4.5P4.4P4.3P4.2P4.1P4.01111,1111sfrP4M0=0xB4;//0000,0000sfrP4M1=0xB3;//0000,0000//76543210ResetValuesfrP4SW=0xBB;//Port-4switch -LVD_P4.6ALE_P4.5NA_P4.4---- x000,xxxxsfrP5=0xC8;//8bitPort5----P5.3P5.2P5.1P5.0xxxx,1111sfrP5M0=0xCA;//0000,0000sfrP5M1=0xC9;//0000,0000////新一代1T8051系列单片机定时器特殊功能寄存器//76543210ResetValuesfrTCON=0x88;//T0/T1ControlTF1TR1TF0TR0IE1IT1IE0IT00000,0000//sbitTF1=TCON^7;sbitTR1=TCON^6;sbitTF0=TCON^5;sbitTR0=TCON^4;sbitIE1=TCON^3;sbitIT1=TCON^2;sbitIE0=TCON^1;sbitIT0=TCON^0;//sfrTMOD=0x89;//T0/T1ModesGATE1C/T1M1_1M1_0GATE0C/T0M0_1M0_00000,0000sfrTL0=0x8A;//T0LowByte0000,0000sfrTH0=0x8C;//T0HighByte0000,0000sfrTL1=0x8B;//T1LowByte0000,0000sfrTH1=0x8D;//T1HighByte0000,0000////新一代1T8051系列单片机串行口特殊功能寄存器//76543210ResetValuesfrSCON=0x98;//SerialControlSM0/FESM1SM2RENTB8RB8TIRI0000,0000//sbitSM0=SCON^7;//SM0/FEsbitSM1=SCON^6;sbitSM2=SCON^5;sbitREN=SCON^4;sbitTB8=SCON^3;sbitRB8=SCON^2;sbitTI=SCON^1;sbitRI=SCON^0;//sfrSBUF=0x99;//SerialDataBufferxxxx,xxxxsfrSADEN=0xB9;//SlaveAddressMask0000,0000sfrSADDR=0xA9;//SlaveAddress0000,0000////76543210ResetValuesfrS2CON=0x9A;//S2ControlS2SM0S2SM1S2SM2S2RENS2TB8S2RB8S2TIS2RI00000000BsfrS2BUF=0x9B;//S2SerialBufferxxxx,xxxxsfrBRT=0x9C;//S2Baud-RateTimer0000,0000////新一代1T8051系列单片机看门狗定时器特殊功能寄存器sfrWDT_CONTR=0xC1;//Watch-Dog-TimerControlregister//76543210ResetValue//WDT_FLAG-EN_WDTCLR_WDTIDLE_WDTPS2PS1PS0xx00,0000//////新一代1T8051系列单片机PCA/PWM特殊功能寄存器//76543210ResetValuesfrCCON=0xD8;//PCA控制寄存器。CFCR----CCF1CCF000xx,xx00//sbitCF=CCON^7;//PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。sbitCR=CCON^6;//1:允许PCA计数器计数,必须由软件清0。//-//-sbitCCF1=CCON^1;//PCA模块1中断标志,由硬件置位,必须由软件清0。sbitCCF0=CCON^0;//PCA模块0中断标志,由硬件置位,必须由软件清0。//sfrCMOD=0xD9;//PCA工作模式寄存器。CIDL---CPS2CPS1CPS0ECF0xxx,x000/*CIDL:idle状态时PCA计数器是否继续计数,0:继续计数,1:停止计数。CPS2:PCA计数器脉冲源选择位2。CPS1:PCA计数器脉冲源选择位1。CPS0:PCA计数器脉冲源选择位0。CPS2CPS1CPS0000系统时钟频率fosc/12。001系统时钟频率fosc/2。010Timer0溢出。011由ECI/P3.4脚输入的外部时钟,最大fosc/2。100系统时钟频率,Fosc/1101系统时钟频率/4,Fosc/4110系统时钟频率/6,Fosc/6111系统时钟频率/8,Fosc/8ECF:PCA计数器溢出中断允许位,1--允许CF(CCON.7)产生中断。*///sfrCL=0xE9;//PCA计数器低位0000,0000sfrCH=0xF9;//PCA计数器高位0000,0000////76543210ResetValuesfrCCAPM0=0xDA;//PCA模块0PWM寄存器-ECOM0CAPP0CAPN0MAT0TOG0PWM0ECCF0x000,0000sfrCCAPM1=0xDB;//PCA模块1PWM寄存器-ECOM1CAPP1CAPN1MAT1TOG1PWM1ECCF1x000,0000//ECOMn=1:允许比较功能。//CAPPn=1:允许上升沿触发捕捉功能。//CAPNn=1:允许下降沿触发捕捉功能。//MATn=1:当匹配情况发生时,允许CCON中的CCFn置位。//TOGn=1:当匹配情况发生时,CEXn将翻转。//PWMn=1:将CEXn设置为PWM输出。//ECCFn=1:允许CCON中的CCFn触发中断。//ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn//00000000x00未启用任何功能。//x10000x0x2116位CEXn上升沿触发捕捉功能。//x01000x0x1116位CEXn下降沿触发捕捉功能。//x11000x0x3116位CEXn边沿(上、下沿)触发捕捉功能。//100100x0x4916位软件定时器。//100110x0x4d16位高速脉冲输出。//10000100x428位PWM。//ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn//00000000x00无此操作//10000100x42普通8位PWM,无中断//11000110x63PWM输出由低变高可产生中断(有捕捉,所以要置ECCFn=1,以在边沿中断中进行相应的操作)//10100110x53PWM输出由高变低可产生中断//11100110x73PWM输出由低变高或由高变低都可产生中断//sfrCCAP0L=0xEA;//PCA模块0的捕捉/比较寄存器低8位。0000,0000sfrCCAP0H=0xFA;//PCA模块0的捕捉/比较寄存器高8位。0000,0000sfrCCAP1L=0xEB;//PCA模块1的捕捉/比较寄存器低8位。0000,0000sfrCCAP1H=0xFB;//PCA模块1的捕捉/比较寄存器高8位。0000,0000////76543210ResetValuesfrPCA_PWM0=0xF2;//PCA模块0PWM寄存器。------EPC0HEPC0Lxxxx,xx00sfrPCA_PWM1=0xF3;//PCA模块1PWM寄存器。------EPC1HEPC1Lxxxx,xx00//PCA_PWMn:76543210//------EPCnHEPCnL//B7-B2:保留//B1(EPCnH):在PWM模式下,与CCAPnH组成9位数。//B0(EPCnL):在PWM模式下,与CCAPnL组成9位数。////新一代1T8051系列单片机ADC特殊功能寄存器//76543210ResetValuesfrADC_CONTR=0xBC;//A/D转换控制寄存器ADC_POWERSPEED1SPEED0ADC_FLAGADC_STARTCHS2CHS1CHS00000,0000sfrADC_RES=0xBD;//A/D转换结果高8位ADCV.9ADCV.8ADCV.7ADCV.6ADCV.5ADCV.4ADCV.3ADCV.2 0000,0000sfrADC_RESL=0xBE;//A/D转换结果低2位ADCV.1ADCV.0 0000,0000////新一代1T8051系列单片机SPI特殊功能寄存器//76543210ResetValuesfrSPCTL=0xCE;//SPIControlRegisterSSIGSPENDORDMSTRCPOLCPHASPR1SPR00000,0100sfrSPSTAT=0xCD;//SPIStatusRegisterSPIFWCOL------00xx,xxxxsfrSPDAT=0xCF;//SPIDataRegister0000,0000////新一代1T8051系列单片机IAP/ISP特殊功能寄存器sfrIAP_DATA=0xC2;sfrIAP_ADDRH=0xC3;sfrIAP_ADDRL=0xC4;//76543210ResetValuesfrIAP_CMD=0xC5;//IAPModeTable0-----MS1MS00xxx,xx00sfrIAP_TRIG=0xC6;sfrIAP_CONTR=0xC7;//IAPControlRegisterIAPENSWBSSWRSTCFAIL-WT2WT1WT00000,x000//#endifSTC12AD.h:#ifndefSTC12AD_H#defineSTC12AD_H#include"BASIC.h"//#include"1602.h"#include"12864.h"#defineADC_POWER0x80 //ADC模块上电#defineSPEED_LL0x00 //540clocks#defineSPEED_LH0x20 //360clocks#defineSPEED_HL0x40 //180clocks#defineSPEED_HH0x60 //90 clocks#defineADC_FLAG0x10//ADC转换完成标志,必须赢软件清0#defineADC_START0x08#defineCh_Votage0x07#defineADC_STOP0x00//#definech1 0x05 //选择AD输入口(P1^5)//#definech2 0x06 //选择AD输入口(P1^6)sbitControl_signal=P1^2;sbitSwitch1=P1^5;sbitSwitch2=P1^4;sbitSwitch3=P1^3;/*ADC电源电压*/floatADC_Voltage_Resolution_Multiply_1000=5.078125; //4.8->0.00468755V-> 0.00468755.2V->0.005078125/*AD采样前一时刻,后一时刻,当前时刻,L饱和时刻的电压值,保留三位小数*/unsignedlongintAD_REsult_Display=0;unsignedintAD_REsult=0;/*AD采样通道设定,*/uint8_tj=0,j1=0;/*AD采样值存储数组,为精准采样软件平均*/unsignedintxdataAD_Result_Divide[200];uint16_tTime1s_Display=0; externuint8_tSwitch_Flog;voidTime0_Init(){TMOD=0x01;//定时器1工作方式1(16位定时计算器)TH0=(65536-50000)/256;TL0=(65536-50000)%256;; //调频(250K/s(溢出率))TR0=1;}VoidAD_Init(){/***********************************************************P1ASF:P1端口是否用来做ADC输入端口1:是(ADC输入端口)0:否(普通I/O口)***********************************************************/P1ASF=0x80; //确定P1口的AD复用P1M1=0x80; //设定AD采样端口为高阻输入(1::0->高阻输入)P1M0=0x00;ADC_RES=0; //转换结果寄存器初始化ADC_RESL=0;ADC_CONTR=ADC_POWER|SPEED_HH|ADC_START|Ch_Votage;//ADC控制寄存器设置//delayms(10); //等待ADC电源稳定delay8uS(); //因为ADC的时钟源不是系统时钟,延时确保上面的控制字写入ADC_CONTR寄存器中}voidADC_isr()interrupt5using1{ADC_CONTR&=!ADC_FLAG; //清除ADC转换完毕标志AD_REsult=(ADC_RES)*4+ADC_RESL;AD_REsult=AD_REsult*ADC_Voltage_Resolution_Multiply_1000; //电压采样 //AD_Result_Divide[j]=AD_REsult;//j++; switch(Switch_Flog) { case3: if(AD_REsult>=4990) //超过电压表最大量程,发出警告 { j=0; } elseif(AD_REsult>=500) //次量程,降量程,切换Switch2 { AD_Result_Divide[j]=AD_REsult; j++; } else { Switch3=1; delayms(100); // Switch1=1; Switch2=0; delayms(100); Switch_Flog=2; j=0; } break; case2: if(AD_REsult>=4990) //过量程,so升量程,切换到Switch3 { Switch2=1; delayms(100); //继电器动作延时 Switch3=0; delayms(100); //继电器动作延时// Switch1=1; Switch_Flog=3; j=0; } elseif(AD_REsult>=500) { AD_Result_Divide[j]=AD_REsult; j++; } else //次量程,降量程,切换到Switch1 { Switch2=1; delayms(100); //继电器动作延时// Switch3=1; Switch1=0; delayms(100); Switch_Flog=1; j=0; } break; case1: if(AD_REsult>=2000) //过量程,so升量程,切换到Switch2 { Switch1=1; delayms(100); //继电器动作延时// Switch3=1; Switch2=0; delayms(100); //继电器动作延时 Switch_Flog=2; j=0; } else { AD_Result_Divide[j]=AD_REsult; j++; } break; } if(j==200) //一次值采样完毕,执行计算 {// j1=j; AD_REsult=0; AD_REsult_Display=0; for(j=0;j<200;j++) { AD_REsult_Display=AD_REsult_Display+AD_Result_Divide[j]; } AD_REsult_Display=AD_REsult_Display/200; //求平均值(寄存器值)// AD_REsult_Display=AD_REsult*ADC_Voltage_Resolution_Multiply_1000; //模拟计算(量化电压为VCC/1024,保留三位小数) j=0; } ADC_CONTR=ADC_POWER|SPEED_LL|ADC_START|Ch_Votage; //再次采样 } voidTime1_isr()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256; //调频(250K/s(溢出率))Time1s_Display++; if(Time1s_Display==40) { Time1s_Display=0; Address_Set_Zifu_12864(3,4); //设定12864显示地址 switch(Switch_Flog) { case3: AD_REsult_Display=AD_REsult_Display*40;//根据寄存器值电压还原 Variable_Display_12864(AD_REsult_Display/100000); Variable_Display_12864(AD_REsult_Display%100000/10000); Variable_Display_12864(AD_REsult_Display%10000/1000); DecimalPoint_display_12864(); Variable_Display_12864(AD_REsult_Display%1000/100); break; case2:// AD_REsult_Display=AD_REsult_Display-78; AD_REsult_Display=AD_REsult_Display*4; //根据寄存器值电压还原 AD_REsult_Display=AD_REsult_Display/10; //还原值// AD_REsult_Display=AD_REsult_Display*4; Variable_Display_12864(AD_REsult_Display/1000); Variable_Display_12864(AD_REsult_Display%1000/100); DecimalPoint_display_12864(); Variable_Display_12864(AD_REsult_Display%100/10); Variable_Display_12864(AD_REsult_Display%10); break; case1:// AD_REsult_Display=AD_REsult_Display; //根据寄存器值电压还原 Variable_Display_12864(AD_REsult_Display/1000); DecimalPoint_display_12864(); Variable_Display_12864(AD_REsult_Display%1000/100); Variable_Display_12864(AD_REsult_Display%100/10); Variable_Display_12864(AD_REsult_Display%10); break; } }} #endiBASIC.h:#include<intrins.h>#include"STC12C5A60S2.h"#ifndefBASIC_H#defineBASIC_H#defineSTC510#defineSTC121bitMCU=STC12; //选择单片机型号#defineuint8_tunsignedchar#defineuint16_tunsignedint//float:可以保留6-7位小数//double:可以保留15-16位小数//typedefunsignedcharBYTE;voiddelay8uS(){uint8_tz=0; if(MCU==STC51) { _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); } if(MCU==STC12) { for(z=0;z<8;z++) { _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); } }} voiddelayms(uint16_tz){ uint16_tx,y,i; if(MCU==STC51) { for(x=0;x<z;x++) for(y=0;y<110;y++); } if(MCU==STC12) { for(i=0;i<8;i++) for(x=0;x<z;x++) for(y=0;y<110;y++); }}voidIsr_Init(){EA=1;//ELVD=1; //低压监测中断允许位EADC=1; //ADC中断允许位//ES=1;//ET1=1;EX1=1;ET0=1;//EX0=1;} //76543210ResetValue//IPH:中断优先级低位PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0H0000,0000(不可位寻址)//76543210ResetValue//IP:中断优先级低位PPCAPLVDPADCPSPT1PX1PT0PX00000,0000(可位寻址)#endif12864.h:#ifndefLCD_12864_H#define LCD_12864_H#include"intrins.h"#defineIOP0sbitRS=P1^0;sbitRW=P1^1;sbitEN=P1^2;/*sbit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论