原创 【TI博客大赛】MSP430数模转换程序

2012-11-15 23:08 1806 7 8 分类: MCU/ 嵌入式

 

MSP430数模转换程序

单通道多次转换源程序,自己写的,给大家分享一下哈!
 
#include "msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
/********************************************************
函数名称:HT1621显示宏定义
功能描述: 无
全局变量:无
参数说明:无
********************************************************/
#define BIAS    0x52  //0b1000 0100 1010 1/3duty 3com
#define SYSDIS  0X00  //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN   0X02  //0b1000 0000 0010 打开系统振荡器
#define LCDOFF  0X04  //0b1000 0000 0100 关LCD偏压
#define LCDON   0X06  //0b1000 0000 0110 打开LCD偏压
#define TIMERDIS   0X08  //0b1000 0000 0110 禁止时基输出
#define XTAL    0x28  //0b1000 0010 1000 外部接时钟
#define RC256   0X30  //0b1000 0011 0000 内部时钟
#define TONEON  0X12  //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10  //0b1000 0001 0000 关闭声音输出
#define WDTDIS  0X0A  //0b1000 0000 1010 禁止看门狗
#define HT1621_DAT_H P2OUT|=BIT3
#define HT1621_DAT_L P2OUT&=~BIT3
#define HT1621_CS_H  P2OUT|=BIT1
#define HT1621_CS_L  P2OUT&=~BIT1
#define HT1621_WR_H  P2OUT|=BIT2
#define HT1621_WR_L  P2OUT&=~BIT2                       
 
/********************************************************
函数名称:段码表
功能描述: 显示数字
全局变量:无
参数说明:无
********************************************************/
uchar Ht1621Tab[]={0x00};
uchar Ht1621Tab1[]={0x0c,0x0a,0x0c,  //0  不带小数点表格
                    0x00,0x00,0x0c,  //1
                    0x04,0x0e,0x08,  //2
                    0x00,0x0e,0x0c,  //3
                    0x08,0x04,0x0c,  //4
                    0x08,0x0e,0x04,  //5
                    0x0c,0x0e,0x04,  //6
                    0x00,0x08,0x0c,  //7
                    0x0c,0x0e,0x0c,  //8
                    0x08,0x0e,0x0c}; //9
uchar Ht1621Tab2[]={0x0e,0x0a,0x0c,  //0    带小数点表格
                    0x02,0x00,0x0c,  //1
                    0x06,0x0e,0x08,  //2
                    0x02,0x0e,0x0c,  //3
                    0x0a,0x04,0x0c,  //4
                    0x0a,0x0e,0x04,  //5
                    0x0e,0x0e,0x04,  //6
                    0x02,0x08,0x0c,  //7
                    0x0e,0x0e,0x0c,  //8
                    0x0a,0x0e,0x0c}; //9
uchar Ht1621Tab3[]={0x0c,0x0a,0x0e,  //0  显示最前端1,LOW BATTERY CONTINUITY
                    0x00,0x00,0x0e,  //1
                    0x04,0x0e,0x0a,  //2
                    0x00,0x0e,0x0e,  //3
                    0x08,0x04,0x0e,  //4
                    0x08,0x0e,0x06,  //5
                    0x0c,0x0e,0x06,  //6
                    0x00,0x08,0x0e,  //7
                    0x0c,0x0e,0x0e,  //8
                    0x08,0x0e,0x0e}; //9
void Delay_nms(uint n)
{
  uchar i;
  while(n--)
    for(i=0;i<115;i++);
}
void Init()
{
  TACTL = TASSEL_2;
  P1DIR&=~BIT1;
  P2DIR|=BIT1+BIT2+BIT3;
}
 
 
/********************************************************
函数名称:Ht1621Wr_Data(uchar Data,uchar cnt)
功能描述: 写数据函数,cnt为传送数据位数,数据传送为低位在前
全局变量:无
参数说明:Data为写入的数据,cnt为传送的位数
 
********************************************************/
void Ht1621Wr_Data(uchar Data,uchar cnt)
{
  uchar i;
  for (i=0;i<cnt;i++)
  {
    HT1621_WR_L;
    Delay_nms(1);
    if(Data&0x80)
      HT1621_DAT_H;
    else
      HT1621_DAT_L;
    Delay_nms(1);
    HT1621_WR_H;
    Delay_nms(1);
    Data<<=1;
  }
}
 
/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
说明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(uchar Cmd)
{
  HT1621_CS_L;
  Delay_nms(1);
  Ht1621Wr_Data(0x80,4); //写入命令标志100
  Ht1621Wr_Data(Cmd,8); //写入命令数据
  HT1621_CS_H;
  Delay_nms(1);
}
 
 
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
说明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void Ht1621WrOneData(uchar Addr,uchar Data)
{
  HT1621_CS_L;
  Ht1621Wr_Data(0xa0,3);    //写入数据标志101
  Ht1621Wr_Data(Addr<<2,6); //写入地址数据
  Ht1621Wr_Data(Data<<4,4); //写入数据
  HT1621_CS_H;
  Delay_nms(1);
}
 
 
/********************************************************
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
说明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算
********************************************************/
void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
{
  uchar i;
  HT1621_CS_L;
  Ht1621Wr_Data(0xa0,3); //写入数据标志101
  Ht1621Wr_Data(Addr<<2,6); //写入地址数据
  for (i=0;i<cnt;i++)
  {
    Ht1621Wr_Data(0x00,8); //写入数据
    p++;
  }
  HT1621_CS_H;
  Delay_nms(1);
}
/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
说明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
    HT1621_CS_H;
    HT1621_WR_H;
    HT1621_DAT_H;
    Delay_nms(20);       //延时使LCD工作电压稳定
    Ht1621WrCmd(BIAS);  //1/3duty 3com
    Ht1621WrCmd(RC256); //使用内部振荡器
    Ht1621WrCmd(SYSDIS);//关振系统荡器和LCD偏压发生器
    Ht1621WrCmd(WDTDIS);//禁止看门狗
    Ht1621WrCmd(TONEOFF);//关闭声音输出
    Ht1621WrCmd(SYSEN); //打开系统振荡器
    Ht1621WrCmd(LCDON); //打开LCD偏压
    P2DIR|=BIT1+BIT2+BIT3;
}
void display(uint da)
{
  uint data;
  data = (double)(25*da/10.23);
  volatile uchar tempint1,tempint2,tempint3,tempint4;//分别存储温度整数值,整数值的千,百,十,个位
  tempint1=(data/1000)%10;   //十位
  tempint2=(data/100)%10;    //个位
  tempint3=(data/10)%10;     //十分位
  tempint4=data%10;        //百分位
  Ht1621WrOneData(0x01,Ht1621Tab1[3*tempint1]);
  Ht1621WrOneData(0x03,Ht1621Tab1[3*tempint1+1]);
  Ht1621WrOneData(0x05,Ht1621Tab1[3*tempint1+2]);//在此地址调用 Ht1621Tab3
  Ht1621WrOneData(0x07,Ht1621Tab2[3*tempint2]);
  Ht1621WrOneData(0x09,Ht1621Tab2[3*tempint2+1]);
  Ht1621WrOneData(0x0b,Ht1621Tab3[3*tempint2+2]);
  Ht1621WrOneData(0x0d,Ht1621Tab1[3*tempint3]);
  Ht1621WrOneData(0x0f,Ht1621Tab1[3*tempint3+1]);
  Ht1621WrOneData(0x11,Ht1621Tab3[3*tempint3+2]);//在此地址调用 Ht1621Tab3 
  Ht1621WrOneData(0x13,Ht1621Tab1[3*tempint4]);   
  Ht1621WrOneData(0x15,Ht1621Tab1[3*tempint4+1]);
  Ht1621WrOneData(0x17,Ht1621Tab3[3*tempint4+2]); //在此地址调用 Ht1621Tab3   
  Delay_nms(20);
    //CONTINUITY
}
void  InitADC()
{
 
  P1SEL|=0x01;
  ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v
  __enable_interrupt();                     // Enable interrupts.
  TACCR0 = 30;                              // Delay to allow Ref to settle
  TACCTL0 |= CCIE;                          // Compare-mode interrupt.
  TACTL = TASSEL_2| MC_1;                  // TACLK = SMCLK, Up mode.
  LPM0;                                     // Wait for delay.
  TACCTL0 &= ~CCIE;                         // Disable timer Interrupt
  __disable_interrupt();
  ADC10CTL1 = INCH_1+CONSEQ_2;                       // input A1
  ADC10AE0 |= 0x02;                       // PA.1 ADC option select
  _EINT();
  ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  
    
}
void main()
{
  WDTCTL=WDTPW+WDTHOLD;
  Init();
  Ht1621_Init(); //上电初始化LCD
  Ht1621WrAllData(0,Ht1621Tab,16);//清除1621寄存器数据,暨清屏
  InitADC();
}
  
 // ADC10 interrupt service routine
 #pragma vector=ADC10_VECTOR
 __interrupt void ADC10_ISR (void)
 {
    ADC10CTL0&=~ENC;
    uint data,count=10;
   unsigned long sum=0;
  uint buffer[10];
    static uint index=0;
    buffer[index++]=ADC10MEM;
    if(index==count)
    {  
      index=0;
      uchar i;
      for(i=0;i<count;i++)
        sum+=buffer;
      sum=sum/count;
      display(sum);
    } 
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
   
 }
 
 #pragma vector=TIMER0_A0_VECTOR
 __interrupt void ta0_isr(void)
 {
   TACTL = 0;
   LPM0_EXIT;                                // Exit LPM0 on return
 }
 
 
 

文章评论1条评论)

登录后参与讨论

用户1849145 2016-1-18 10:46

期待后续

用户593939 2012-11-16 22:54

参考了,学习了
相关推荐阅读
用户435212 2013-03-07 15:43
[博客大赛]嵌入式系统之思
嵌入式系统的英文名称叫Embedded System,对于我们学习电子技术相关的人员来说,对于电子系列的英文名字必须记的,外加对于其的英文缩写也要记得,这样在我们以后读取datasheet的时候,...
用户435212 2012-12-18 22:47
【博客大赛】怎样成为优秀的电子工程师?
  “工程师是科学家;工程师是艺术家;工程师也是思想家。”一位伟大的工程师曾经提出过这样的一段感言。不错,工程师是利用自然科学来创造工程的人。工程既是物质的也是思想上的。许多不朽的工程,伟大的...
用户435212 2012-11-15 23:19
【TI博客大赛】Code Composer Studio v5.1 开发环境下使用MSP430
  Code Composer Studio™ v5.1 开发环境下使用MSP430 推荐大家使用CCSv5,如下所示           ...
用户435212 2012-11-15 23:14
【TI博客大赛】给大家转发个MSP430 JTAG(USB的和并口的)与目标板连接需要注意的几点总结
  经常看到有初学MSP430的朋友在坛里询问MSP430 JTAG与目标板连接方面的问题,我在这里给大家总结一下,希望能给初学MSP430的朋友拨云见日,不再疑惑。  MSP430的JTA...
用户435212 2012-11-15 23:11
【TI博客大赛】MSP430学习笔记
这只是我在学习TI公司生产的16位超的功耗单片机MSP430的随笔,希望能对其他朋友有所借鉴,不对之处还请多指教。 下面,开始430之旅。 讲解430的书现在也有很多了,不过大多数都是详细说明...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条