负载输出:直流
16
附件四 程序:
/********************************************************************
//MSP430单片机内部12位ADC,采用内部2.5V基准,单通道单次转换,中断模式 //最大显示量2.50V,12864显示结果,单位为V //调试环境:EW430 V5.30
********************************************************************/ #include
static uchar Flag; //标志变量
uint temp1; //ADC值暂存变量 float temp;
unsigned char bank[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //十个数字的ASCII码
//*********************************************************************** // LCD端口初始化
//*********************************************************************** void LCD_Port_Init(void)
{ P4SEL=0x00; //普通IO口 P4DIR=0xFF; //输出方向 P5SEL=0x00; //普通IO口
P5DIR|=0xE3; //P5.0,P5.1,P5.5,P5.6,P5.7为输出方向 P5OUT|=BIT0; //PSB置1,液晶并口方式 P5OUT|=BIT1; //复位脚RST置高 }
//*********************************************************************** // 显示屏命令写入函数
//*********************************************************************** void LCD_write_com(unsigned char com)
{ RS_CLR; //P5OUT &= ~BIT5 RS置低 RW_CLR; //P5OUT &= ~BIT6 RW置低 EN_SET; //P5OUT |= BIT7 E置高 DataPort=com; //P4OUT P4口为数据口 delay_ms(5);
EN_CLR;} //P5OUT &= ~BIT7 E置低
//*********************************************************************** // 显示屏数据写入函数
//*********************************************************************** void LCD_write_data(unsigned char data)
{ RS_SET; //P5OUT |= BIT5 RS置高 RW_CLR; //P5OUT &= ~BIT6 RW置低 EN_SET; //P5OUT |= BIT7 E置高 DataPort=data;
delay_ms(5);
EN_CLR;} //P5OUT &= ~BIT7 E置低
17
//*********************************************************************** // 显示屏初始化函数
//*********************************************************************** void LCD_Screan_Init(void)
{ LCD_write_com(FUN_MODE); //显示模式设置(0x30)工作模式:8位基本指令集
delay_ms(5);
LCD_write_com(FUN_MODE); //显示模式设置 delay_ms(5);
LCD_write_com(DISPLAY_ON); //显示开(0x0c)显示游标,且游标位置反白 delay_ms(5);
LCD_write_com(CLEAR_SCREEN); //清屏(0x01)清屏指令:清屏且AC值为00H
delay_ms(5);}
//*********************************************************************** // 显示屏清空显示
//*********************************************************************** void LCD_clear(void) {LCD_write_com(0x01); delay_ms(5);}
//*********************************************************************** // 显示CGROM里的汉字
//*********************************************************************** void DisplayCgrom(uchar addr,uchar *hz) { LCD_write_com(addr); delay_ms(5);
while(*hz != '\\0') { LCD_write_data(*hz); hz++;
delay_ms(5);} }
//**************************************************************** //函数名称:Display()显示汉字
//**************************************************************** void Display(void)
{ DisplayCgrom(0x80,\通道0:\ DisplayCgrom(0x88,\通道1:\
//*********************************************************************** // 显示电压值值
//*********************************************************************** static void Lcd_Show(char adress,float data) { int idata;
float fdata; //将浮点数分拆成整数部分和小数部分 idata=(int)data; //整数部分 fdata=data-idata; //小数部分
LCD_write_com(adress); //设定显示地址
18
LCD_write_data(bank[idata]);
delay_ms(5); //不加延时的时候,小数点前一位一直闪 LCD_write_data(0x2E); //小数点 LCD_write_data(bank[(int)(fdata*10)]);
LCD_write_data(bank[(int)(fdata*100)]); LCD_write_data(bank[(int)(fdata*1000)]); }
//************************************************************************* // ADC初始化程序,用于配置ADC相关寄存器
//************************************************************************* void ADC_Init(void)
{ P6SEL|=0x01; //选择ADC通道,设置对应IO口的功能模式
ADC12CTL0|= ADC12ON + SHT0_2 +REFON+REF2_5V; //ADC电源控制开,16个CLK,内部基准2.5V
ADC12CTL1|= ADC12SSEL1 + ADC12SSEL0; //SMCLK做时钟源
ADC12MCTL0=SREF_1+INCH_0; //参考控制位及通道选择 ADC12IE|= 0x01; //中断允许 ADC12CTL0|= ENC;} //使能转换器 /*********************************************************** 启动ADC12
************************************************************/ void start_ADC12(void) { while(Flag==1)
{ADC12CTL0|=ADC12SC;
ADC12CTL0&=~ADC12SC; //清零 Flag=0;} }
//************************************************************************* // ADC中断服务程序
//************************************************************************* #pragma vector=ADC_VECTOR __interrupt void ADC12ISR(void)
{while((ADC12CTL0&0x01)==1); //如果ADC忙,则等待,否则读取ADC转换数值 Flag=1;
temp1=ADC12MEM0; //读取ADC转换值
temp=(temp1)*2.45/4095; //转换公式,ADC数字量转换为电压大小,注意数据类型
} //实际中的VREF+为2.45V
//*********************************************************************** // 主程序
//*********************************************************************** void main(void)
{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 Clock_Init(); //时钟初始化
LCD_Port_Init(); //液晶端口初始化
19
LCD_Screan_Init(); //液晶参数初始化 LCD_clear(); //清屏
ADC_Init(); //初始化ADC12 _EINT(); //开总中断 Flag=1; //标志位先置1
while(1)
{ for(int i=0;i<0xffff;i++);
start_ADC12(); //启动ADC12 Display(); //显示汉字 Lcd_Show(0x83,temp); } }
//显示电压 20