uchar Data2[16]={%uchar link[10]={\
uchar Bit[8]={0,0,0,0,0,0,0,0}; //数码管各位显示的数字
uint max=0; uint max1=0; uint max2=0; ulong maxget=0; ulong maxget1=0; ulong maxget2=0;
uint ADCBuf[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据
uint ADCBuf1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据
uint ADCBuf2[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据
//20个数据的和 ulong Sum=0;
ulong VBuf=0;//电压扩大10000000的值 uchar Count=0; uchar num=0;
//延时子程序
DelayMS(uint ms){ uint i;
while(ms--){
for(i=0; i<800;i++); } }
// 测试LCD忙碌状态 void LcdBusy(){ RS_LOW; RW_HIGH; E_HIGH;
_NOP();_NOP(); BUSY_IN;
while(BUSY_DATA); BUSY_OUT; E_LOW; }
//写入指令到LCD
WriteCommand(uchar Command){ LcdBusy(); RS_LOW;
16
RW_LOW; E_HIGH;
_NOP();_NOP(); P2OUT=Command; _NOP();_NOP(); E_LOW; }
//写入字符数据到LCD WriteData(uchar Data){ LcdBusy(); RS_HIGH; RW_LOW; E_HIGH;
_NOP();_NOP(); P2OUT=Data; _NOP();_NOP(); E_LOW; }
//LCD初始化设定 LcdInit(){
WriteCommand(0x38);//8位数据端口,2行显示,5*7点阵 DelayMS(5);
WriteCommand(0x0c);//开启显示, 无光标 DelayMS(5);
WriteCommand(0x06);//AC递增, 画面不动 DelayMS(5);
WriteCommand(0x01);//清屏 DelayMS(5); }
//时钟初始化函数
void InitClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率 do{
IFG1&=~OFIFG;//清除振荡器失效标志 for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频 }
//端口初始化函数 void InitPort(void){
17
P2SEL=0x00;//P2口所有引脚设置为一般的IO口 P4SEL=0x00;//P4口所有引脚设置为一般的IO口 P2DIR=0xFF;//P2口所有引脚设置为输出方向 P4DIR=0xFF;//P4口所有引脚设置为输出方向 }
//ms级延时子程序
void DelayMs(uint ms){ while(ms--){
for(uint i=0;i<800;i++); } }
//ADC12初始化
void InitADC12(void){
P6SEL=0x07;//P6.0为模拟输入
ADC12CTL0&=~ENC;//ENC设置为0从而修改ADC12寄存器
ADC12MCTL0=INCH_0+SREF_2;//参考电压为VeREF+和AVss 输入通道A0 ADC12MCTL1=INCH_1+SREF_2;//通道A1 ADC12MCTL2=INCH_2+SREF_2+EOS;
ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_3+ADC12SSEL_0+ADC12DIV_0;//起始地址ADCMEM0,采样脉冲由采样定时器产生,单通道多次转换,内部时钟源不分频 ADC12CTL0=MSC+ADC12ON;//采样信号由SHI仅首次触发,打开ADC12模块 }
//计算电压值
void GetV(void){ int a=0;int b=0;
maxget=max*((2.5*10000000)/4095.0); maxget1=max1*((2.5*10000000)/4095.0); maxget2=max2*((2.5*10000000)/4095.0); a=maxget/10000000;
b=maxget000000/1000000; Data1[3]=link[2*a+(2*b)/10]; Data1[5]=link[(2*b)];
Data1[12]=link[maxget1/10000000];
Data1[14]=link[maxget1000000/1000000];
Data2[3]=link[maxget2/10000000];
Data2[5]=link[maxget2000000/1000000]; Data2[6]=link[maxget200000/100000]; }
18
//定时器A初始化
void InitTimerA(void){
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR CCTL0=CCIE;//CCR0中断允许 CCR0=20000;//时间间隔20ms }
//定时器A中断
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void){
ADC12CTL0&=~ENC;
ADCBuf[Count]=ADC12MEM0; ADCBuf1[Count]=ADC12MEM1; ADCBuf2[Count]=ADC12MEM2;
if( ADCBuf[Count]>=max)max= ADCBuf[Count];
if( ADCBuf1[Count]>=max1)max1= ADCBuf1[Count]; if( ADCBuf2[Count]>=max2)max2= ADCBuf2[Count]; Count++;
if(Count==20){ GetV(); Count=0; max=0; max1=0; max2=0; }
ADC12CTL0|=ENC+ADC12SC;//使能ADC转换 }
void main(){ uchar i;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗 InitClock(); InitPort(); InitTimerA();
LcdInit();//Lcd初始化 InitADC12();
_EINT();//打开中断 while(1){
WriteCommand(0x80);//定位在第一行第一个位置 for(i=0;i<16;i++) WriteData(Data1[i]);
WriteCommand(0x80|0x40);//定位在第二行第一个位置 for(i=0;i<16;i++) WriteData(Data2[i]); } }
19
20