⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 描述:ADC12-A0模数转换+LCD12864[KS0108(HD61202)]演示LCD12864液晶显示模块,对于芯片KS0108(HD61202)驱动程序.
💻 C
字号:
//描述:ADC12-A0模数转换+LCD12864[KS0108(HD61202)]演示
//******************************************************************************
# include <msp430x14x.h>//包含针对MSP430F149的头文件
# include "lcd12864.h"
//******************************************************************************
//全局变量定义区
 unsigned char H;
 unsigned char temp;
 unsigned char M;
 unsigned char L;
 unsigned char timp;     
 unsigned int value1; 
 unsigned int value2; 
 unsigned char title0[] = {"ADC12  Conventor"};
 unsigned char title1[] = {"Ref voltage : 3.3V"};
 unsigned char title2[] = {"A0 Result = "};
 unsigned char title3[] = {"A0 voltage : "};
 
 unsigned char a[]={'.','.','.','.','\0'};
 unsigned char ADVAL[5]={'x','x','x','x','\0'};
 unsigned char zhi[7]={'x','x','x','x','x','x','\0'};
 unsigned char number_tab[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.','V'};
 unsigned char display_buffer[]={0x00,0x00,0x00,0x00,'\0'};
 
//*******************波特率***********300  600 1200 2400 4800 9600 19200 38400 76800 115200const 
//************************************[0]**[1]**[2]*[3]**[4]**[5]***[6]***[7]****[8]***[9]*
unsigned char BaudrateUBR0[]       ={0x6D,0x36,0x1B,0x0D,0x06,0x03, 0xA0, 0xD0, 0x68, 0x45};
unsigned const char BaudrateUBR1[] ={0x00,0x00,0x00,0x00,0x00,0x00, 0x01, 0x00, 0x00, 0x00};
unsigned const char BaudrateUMCTL[]={0x22,0xD5,0x03,0x6B,0x6F,0x4A, 0xC0, 0x40, 0x40, 0x4A};
 
//******************************************************************************
void LED(void) //LED灯闪烁,并且闪烁频率和数据采集频率有关(zhouxxy)
{
  float count = 128;//稍加修改,使得LED灯闪烁频率和AD采集速率稍降低(zhouxxy)
  if(P1OUT & BIT1)   //数值越大,LED灯和数据采集的频率越低(zhouxxy)
  {
    P1OUT &= ~BIT1;
    while(count--);
  }
  else
  {
    P1OUT |= BIT1;
    while(count--);
  }
}
//******************************************************************************
//UART0初始化                 //8Mhz晶体程序不能用.
void BaudrateSetup(unsigned char U0)      
{   
 unsigned int i;
 if(U0>5)                     //当U0>5时,启用XT2
 {
  BCSCTL1 &= ~XT2OFF;         //启动XT2,
 do
  {IFG1 &= ~OFIFG;           //清OSCFault标志
     for(i=0xFF;i>0;i--);    //延时等待
  }
  while((IFG1 & OFIFG) != 0); //查OSCFault,为0时转换完成
 BCSCTL2 |= SELS;             //SMCLK为XT2
 }
 //UART0 
 P1OUT=0x00;
 if(U0>5){UTCTL0=SSEL1;}      // Clock Source:SMCLK
 else{UTCTL0=SSEL0;}          // Clock Source:ACLK
 UCTL0 &= ~SWRST;             // SWRST复位, USART允许
 UCTL0=CHAR;                  // 8bit
 ME1|=UTXE0 + URXE0;          // Enable Tx0,Rx0
 IE1|=URXIE0;                 // RX enable
 UBR00=BaudrateUBR0[U0];      // 低位分频器因子
 UBR10=BaudrateUBR1[U0];      // 高位分频器因子 	
 UMCTL0=BaudrateUMCTL[U0];    // 波特率调整因子
 P3SEL |= 0x30;               // 将P3.4,5使用外围模块 = USART0 TXD/RXD
 P3DIR |= 0x10;               // 将P3.4设为输出(发),P3.5默认为输入(收)
}

//******************************************************************************
//串口接收中断,退出LPM3模式.
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
 LPM0_EXIT;
}

//******************************************************************************
//说明:单片机初始化
void init(void)
{  InitLCD();   
   //ADC12初始化-------------------------------------------------------
   //单通道,单次采样模式

   P6SEL |= BIT0;                   //使能A/D通道 A0
   //P6SEL |= 0x01;                 //和上一语句等效   
   ADC12CTL0 = ADC12ON + SHT0_2;    //开ADC12内核和设置SHIT0=2(N=4)
                                    //SHT1,SHT0分别表示采样保持器1和采样保持器0
   ADC12CTL1 |= SHP;                //SHP=1表示采样信号SAMPCON信号来源于为采样定时器输出
                                    //SHP=0表示采样直接由ADC12SC控制
   ADC12CTL1 |= CSTARTADD_0;        //定义单次转换地址(CSTARTADD为转换存储器地址位)
   ADC12MCTL0 |= INCH_0;            //INCH为模拟输入通道选择位,INCH0~7对应A0~A7
   //ADC12MCTL0 = SREF_2;           //SREF为参考电压源选择位,使用外部参考电压 Vr+ = VeREF+
   ADC12CTL0 |= ENC;                //ADC转换允许(ENC为转换允许位)
   
   //Timer_A初始化-----------------------------------------------------
   P1DIR |= 0x02;
   CCR0 = 1638-1;
   CCTL0 = CCIE;                  //CCR0中断允许
   TACTL = TASSEL_1+MC_1;         //timerA CLK=ACLK,增计数模式
   _EINT();                       //开总中断
}

//******************************************************************************
//说明:数值转换
void conv(unsigned int intdata, unsigned char *pc)//将AD转换后的数值分解成四个数
{  unsigned int a,b,c;
   pc[0]=number_tab[intdata/1000] ;
   a=intdata%1000 ;  
   pc[1]=number_tab[a/100] ;
   b=a%100 ;
   pc[2]=number_tab[b/10] ;
   c=b%10 ;
   pc[3]=number_tab[c/1] ;
}
//******************************************************************************
//说明:转换成电压值
void zhuanhuan(unsigned int data,unsigned char *pc1)//将AD转换后的值转换成实际的电压值
{
   unsigned int a,b,c;
   pc1[0]=number_tab[data/1000] ;
   a=data%1000 ; 
   pc1[1]=number_tab[16];
   pc1[2]=number_tab  [a/100] ;
   b=a%100 ;
   pc1[3]=number_tab[b/10] ;
   c=b%10;
   pc1[4]=number_tab[c/1] ;
   pc1[5]=number_tab[17]; 
}
//******************************************************************************
//TimerA0中断服务程序
  #pragma vector=TIMERA0_VECTOR
  __interrupt void Timer_a(void)
  {
    LPM0_EXIT;
  }

//******************************************************************************
//串行口发送数组
void send_data(unsigned char *p)
{unsigned int n; 
 timp=RXBUF0;
 for(n=0;p[n]!='\0';n++)
   {
    while ((IFG1 & UTXIFG0) == 0); // USART0发送UTXIFG0=1,表示UTXBUF准备好发送一下字符
    TXBUF0 = p[n]; 
   } 
}

//******************************************************************************
void main(void)
{    unsigned int i;
     WDTCTL=WDTPW+WDTHOLD;     //关闭看门狗,以便调试程序
     init();                   //程序开始要先单片机初始化
     BaudrateSetup(5);
     ShowString86(0,3, title0);//在第几行,从第几列开始显示
     ShowString86(2,2, title1);
     ShowString86(4,1, title2);
     ShowString86(6,1, title3);
     //ReverseLinChar(0,0,21);    //从第几行第几列开始反白显示
     LPM3;
      while(1)
      {ADC12CTL0 |= ADC12SC;          //ADC12SC为开始转换位,当为1时开始转换
       while((ADC12IFG & BIT0)==0);
       _NOP();                  //????????
       LED();  
       value1=ADC12MEM0;              // 读取结果;
       value2=ADC12MEM0*0.8058608058; //将转换出来的值*3.3/4095,换算出实际电压值  
//******************************************************************************
       H=ADC12MEM0/256;        //十六进制输出的高四位
       temp=ADC12MEM0%256;
       M=temp%16;              //十六进制输出的中四位
       L=temp%16;              //十六进制输出的低四位
//******************************************************************************
       conv(value1,ADVAL);            //数据转换调用
       zhuanhuan(value2,zhi);    
       for(i=0;i<4;i++)               //将转换值赋给串口缓冲器
       {
         display_buffer[i]=ADVAL[i];         
       }
       send_data(display_buffer);            //发送数据
       send_data(a);
       send_data(a);
       send_data(a);      
       ShowString86(4,13,ADVAL);    
       ShowString86(6,14,zhi);
     LPM3;
      }
}
//******************************************************************************


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -