- #include<msp430g2553.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define BIT(x) (1<<(x))
- #define Range_3V 0 //量程为0~3V
- #define Range_15V 1 //量程为0~15V
- /*********************************************************
- 函数声明
- *********************************************************/
- void System_Init(void);
- void ADC_Init(void);
- void LCD_Init();
- void LCD_Send(uchar type,uchar transdata);
- void Delay_nms(uint n);
- void LCD_Pos(uchar x,uchar y);
- void LCD_Display_String(const uchar *pt,uchar num);
- void LCD_Display(long int Data);
- void LCD_Display_Digit(long int num);
- uchar LCD_Table[]={'0','1','2','3','4','5','6','7','8','9','.','V'};
- long int Voltage; //全局变量Voltage
- uint Voltage_Range;
- /*********************************************************
- 函数功能:系统初始化
- 入口参数:无
- 出口参数:无
- 函数说明:无
- *********************************************************/
- void System_Init(void)
- {
- WDTCTL = WDT_ADLY_1000; //看门狗工作在定时器模式,1s中断一次
- IE1 |= WDTIE; //使能看门狗中断
- P1DIR |= BIT0 + BIT1; //相应的位端口设置为输出
- P1SEL |= BIT4; //P1.4为A4通道
- Voltage_Range = Range_15V; //Range_3V即量程为3V,Range_15V即量程为15V
- ADC_Init(); //ADC初始化;
- LCD_Init(); //液晶初始化
- }
- /*********************************************************
- 函数功能:ADC初始化
- 入口参数:无
- 出口参数:无
- 函数说明:无
- *********************************************************/
- void ADC_Init (void)
- {
- ADC10CTL0 &= ~ENC; //复位转换允许位
- ADC10CTL0 |= ADC10ON + ADC10SHT_0 + SREF_0 + ADC10IE ;
- //设置转换控制寄存器ADC10CTL0,ADC10ON=0x010,使ADC10内核工作
- //ADC10SHT_0=0*0x800u,确定采样周期为4xADC10CLKs
- //SREF_0=0*0x2000u,选择参考电压为VR+=AVCC,VR-=AVSS
- //ADC10IE=0x00使对应通道转换后产生中断
- ADC10CTL1 |= INCH_4 + CONSEQ_0;
- //设置AD转换控制寄存器ADC10CTL1,INCH_0=0*0x1000u,选择通道A4
- //CONSEQ_1=1*2u,设置工作模式为单通道、单次转换模式
- ADC10CTL0 |= ENC + ADC10SC;
- //设置转换控制寄存器ADC12CTL0,ENC=0x002使转换允许位为1
- //ADC12SC=0x001使采样/转换控制位为1
- _EINT(); //总中断使能
- }
- /***************************ADC中断函数****************************/
- #pragma vector = ADC10_VECTOR
- __interrupt void ADC10_Interrupt(void)
- {
- uint data;
- data = ADC10MEM; //将AD采样值存入data
- if(Voltage_Range == Range_3V) //V(实际)=(VR+ - VR-)*data/1023 + VR-
- Voltage = (uint)(35.4*data/10.23); //Voltage是实际电压值的1000倍
- else
- Voltage = (uint)(35.4*data/10.23*5.38);
- }
- /***************************WDT中断函数****************************/
- #pragma vector = WDT_VECTOR
- __interrupt void watchdog_timer(void)
- {
- LCD_Display(Voltage); //显示电压值
- }
- /*********************************************************
- 函数名称:LCD初始化函数
- 入口参数:无
- 出口参数:无
- 函数说明:无
- *********************************************************/
- void LCD_Init()
- {
- Delay_nms(5);
- LCD_Send(0,0x01); //清屏指令
- Delay_nms(5); //延时等待液晶完成复位
- LCD_Send(0,0x30); //功能设定:基本指令集操作
- Delay_nms(5);
- LCD_Send(0,0x02); //地址归0
- Delay_nms(5);
- LCD_Send(0,0x0c); //开显示,且关闭光标及其反白显示
- Delay_nms(5);
- }
- /*********************************************************
- 函数功能:写指令或数据
- 入口参数:type,transdata
- 出口参数:无
- 函数说明:无
- *********************************************************/
- void LCD_Send(uchar type,uchar transdata)
- {
- uchar firstbyte = 0xf8;
- uchar temp,i,j;
- if(type)
- firstbyte |= 0x02;
- P1OUT &= ~BIT1;
- for(j=3;j>0;j--)
- {
- switch(j)
- {
- case 3:temp=firstbyte;break;
- case 2:temp=transdata&0xf0;break;
- case 1:temp=(transdata<<4)&0xf0;break;
- }
- for(i=8;i>0;i--)
- {
- if(temp&0x80)
- P1OUT |= BIT0;
- else
- P1OUT &= ~BIT0;
- P1OUT |= BIT1;
- temp <<= 1;
- P1OUT &= ~BIT1;
- }
- Delay_nms(1);
- }
- P1OUT &= ~BIT0;
- }
- /**********************定位函数************************/
- void LCD_Pos(uchar x,uchar y)
- {
- int pos;
- switch(x)
- {
- case 1:pos=0x80;break;
- case 2:pos=0x90;break;
- case 3:pos=0x88;break;
- case 4:pos=0x98;break;
- default:pos=0x80;
- }
- pos += y;
- LCD_Send(0,pos);
- }
- /*********************************************************
- 函数功能:字符串显示函数
- 入口参数:*pt ,num
- 出口参数:无
- 函数说明:无
- *********************************************************/
- void LCD_Display_String(const uchar *pt,uchar num)
- {
- uchar i;
- for(i = 0;i < (num*2);i++)
- LCD_Send(1,*(pt++));
- }
- /*********************************************************
- 函数功能:数字显示函数
- 入口参数:num
- 出口参数:无
- 函数说明:无
- *********************************************************/
- void LCD_Display_Digit(long int num)
- {
- uint SHOW[7],i=0;
- SHOW[0]=(num/10000)%10; //十位
- SHOW[1]=(num/1000)%10; //个位
- SHOW[2]=10; //.
- SHOW[3]=(num/100)%10; //十分位
- SHOW[4]=num/10%10; //百分位
- SHOW[5]=num%10; //千分位
- SHOW[6]=11; //V
- switch(Voltage_Range)
- {
- case Range_3V: for(i=1;i<7;i++)
- LCD_Send(1,LCD_Table[SHOW[i]]); break;
- case Range_15V: for(i=0;i<7;i++)
- {
- if(i==5)++i;
- LCD_Send(1,LCD_Table[SHOW[i]]);
- } break;
- default: break;
- }
- }
- /***********************延时函数*************************/
- void Delay_nms(uint n)
- {
- uchar i;
- while(n--)
- for(i=0;i<115;i++);
- }
- /*************************************************************
- 函数名称:显示函数
- 入口参数:Data
- 出口参数:无
- 函数说明:每行最多8个字,2个字母或数字相当于1个字的长度,注意
- 汉字没法跨格显示。
- *************************************************************/
- void LCD_Display(long int Data)
- {
- //LCD_Pos(1,0); //第一行
- //LCD_Display_String("",0);
- LCD_Pos(2,0); //第二行
- LCD_Display_String(" 数字式电压表",7);
- LCD_Pos(3,0); //第三行
- LCD_Display_String("当前电压:",5);
- LCD_Display_Digit(Data);
- //LCD_Pos(4,0); //第四行
- //LCD_Display_String(12.13);
- }
- /*********************************************************
- 函数名称:主函数
- 入口参数:无
- 出口参数:无
- 函数说明:请看完最上面程序说明再运行程序
- *********************************************************/
- void main()
- {
- System_Init();
- while(1)
- {
- ADC10CTL0 |= ENC + ADC10SC; //开启ADC转换
- }
- }
复制代码 |