[LaunchPad] ad10单通道多次dtc测电压(2553)

zhanghua1209   2012-7-23 12:37 楼主
已验证 可行

#include"msp430g2553.h"
#define uint unsigned int
#define uchar unsigned char
uint c[32],b;
uint i=0;
float n,v;
uint d1,d2,d3,d4,d5;
uchar a1[]={"12864          "};
uchar a2[]={"液晶显示           "};
uchar a3[]={"哈喽                        "};
#define SID  BIT1
#define SCLK BIT2
#define CS   BIT0
#define SID_1  P2OUT |= SID
#define SID_0  P2OUT &= ~SID
#define SCLK_1 P2OUT |= SCLK
#define SCLK_0 P2OUT &= ~SCLK
#define CS_1   P2OUT |= CS
#define CS_0   P2OUT &= ~CS
void send_command(uchar command_data)//写命令
{
uchar i;
uchar i_data;
i_data=0xf8;
CS_1;
SCLK_0;
for(i=0;i<8;i++)
{
   SID_0;
if(i_data&0x80)
  SID_1 ;
_delay_cycles(100);
SCLK_0;
    SCLK_1;
   _delay_cycles(10);
    i_data<<=1;
}
i_data=command_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{ SID_0;
if(i_data&0x80)
  SID_1 ;
_delay_cycles(100);
  SCLK_0;
    SCLK_1;
    _delay_cycles(10);
    i_data<<=1;
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{ SID_0;
if(i_data&0x80)
  SID_1 ;
    _delay_cycles(100);
    SCLK_0;
    SCLK_1;
    _delay_cycles(10);
    i_data<<=1;
}
CS_0;
  _delay_cycles(100);
}
void send_data(uchar command_data)//写数据
{
uchar i;
uchar i_data;
i_data=0xfa;
CS_1;
SCLK_0;
for(i=0;i<8;i++)
{ SID_0;
if(i_data&0x80)
  SID_1 ;
_delay_cycles(100);
SCLK_0;
    SCLK_1;
    _delay_cycles(10);
    i_data<<=1;
}
i_data=command_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{ SID_0;
if(i_data&0x80)
  SID_1 ;
i_data<<=1;
    _delay_cycles(100);
    SCLK_0;
    SCLK_1;
    _delay_cycles(10);
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{ SID_0;
if(i_data&0x80)
  SID_1 ;
i_data<<=1;
    _delay_cycles(100);
    SCLK_0;
    SCLK_1;
    _delay_cycles(10);
}
CS_0;
  _delay_cycles(100);
}

void lcd_init(void)//液晶初始化
{
send_command(0x30);
  _delay_cycles(50);
send_command(0x0c);
  _delay_cycles(50);
send_command(0x01);
  _delay_cycles(50);
}
void display_s1()//第一行
{
uchar a;
send_command(0x80);
for(a=0;a<16;a++)
{
send_data(a1[a]);
}
}
void display_s2()//第二行
{
uchar a;
send_command(0x90);
for(a=0;a<16;a++)
{
send_data(a2[a]);
}
}
void display_s3()//第三行
{
uchar a;
send_command(0x88);
for(a=0;a<16;a++)
{
send_data(a3[a]);
}
}
void display_ad()//第四行
{
send_command(0x98);
send_data('D');
send_data('V');
send_data(d1+0x30);
send_data('.');
send_data(d2+0x30);
send_data(d3+0x30);
send_data(d4+0x30);
}
void jisuan(float x)
{      uint y;
y=x*1000;
   d1=0;d2=0;d3=0;d4=0;d5=0;
          d1=y/1000;
          d2=y%1000;
          d3=d2%100;
          d4=d3%10;
          d2=d2/100;
          d3=d3/10;
}

/*
* main.c
*/
void main(void)
{
   WDTCTL=WDTHOLD+WDTPW;
   P2SEL=0x00;
   P2DIR = BIT1 + BIT2 + BIT0+BIT3;
   P2OUT&=~BIT3;
   ADC10CTL1|= INCH_4 + CONSEQ_2; //   采样触发源选择ADC10SC 输入通道A4  4分频    单通道多次转换
   ADC10CTL0=SREF_1+REFON+REF2_5V+MSC+ADC10IE+ADC10ON;// 参考电压选择基准电压  打开内部参考电压发生器 参考电压选择2.5V 一次触发连续执行 开启AD功能
   ADC10AE0|=0X10;//开启通道4 (使能)
   ADC10DTC1 = 0x20;//转换32次
   lcd_init(); //液晶初始化
   _delay_cycles(10);
      while(1)
      {
      ADC10CTL0&=~ENC;//关闭采样使能
   while(ADC10CTL1&BUSY);//判断是否有采样或转换动作
   ADC10SA = (unsigned int)c;
   ADC10CTL0|=ADC10SC+ENC;//开始采样
   _bis_SR_register(LPM0_bits+GIE);//关闭cpu,开启中断
   _NOP();
   _NOP();
      }
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
     uint j;
     b=0;
    for(j=0;j<32;j++)
        {
         b+=c[j];
        }
        b=b/32;
        v=(b*2.5)/1023;
        jisuan(v);
         display_s1();
         display_s2();
         display_s3();
         display_ad();
        _delay_cycles(10);
          __bic_SR_register_on_exit(CPUOFF);


}


[ 本帖最后由 zhanghua1209 于 2012-7-24 00:47 编辑 ]

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复