標(biāo)題: msp430g2553單片機(jī)ADC轉(zhuǎn)換程序 [打印本頁(yè)]

作者: chengjingtao1    時(shí)間: 2021-11-28 13:59
標(biāo)題: msp430g2553單片機(jī)ADC轉(zhuǎn)換程序
  1. #include<msp430g2553.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define BIT(x)   (1<<(x))
  5. #define Range_3V  0         //量程為0~3V
  6. #define Range_15V   1       //量程為0~15V
  7. /*********************************************************
  8.                         函數(shù)聲明
  9. *********************************************************/
  10. void System_Init(void);
  11. void ADC_Init(void);  
  12. void LCD_Init();  
  13. void LCD_Send(uchar type,uchar transdata);
  14. void Delay_nms(uint n);
  15. void LCD_Pos(uchar x,uchar y);
  16. void LCD_Display_String(const uchar *pt,uchar num);
  17. void LCD_Display(long int Data);
  18. void LCD_Display_Digit(long int num);
  19. uchar LCD_Table[]={'0','1','2','3','4','5','6','7','8','9','.','V'};
  20. long int Voltage;       //全局變量Voltage
  21. uint Voltage_Range;
  22. /*********************************************************
  23. 函數(shù)功能:系統(tǒng)初始化
  24. 入口參數(shù):無(wú)
  25. 出口參數(shù):無(wú)
  26. 函數(shù)說(shuō)明:無(wú)
  27. *********************************************************/
  28. void System_Init(void)
  29. {
  30.   WDTCTL = WDT_ADLY_1000;               //看門狗工作在定時(shí)器模式,1s中斷一次
  31.   IE1 |= WDTIE;                         //使能看門狗中斷
  32.   P1DIR |= BIT0 + BIT1;                        //相應(yīng)的位端口設(shè)置為輸出  
  33.   P1SEL |= BIT4;                        //P1.4為A4通道
  34.   Voltage_Range = Range_15V;            //Range_3V即量程為3V,Range_15V即量程為15V
  35.   ADC_Init();                           //ADC初始化;  
  36.   LCD_Init();                                //液晶初始化
  37. }
  38. /*********************************************************
  39. 函數(shù)功能:ADC初始化
  40. 入口參數(shù):無(wú)
  41. 出口參數(shù):無(wú)
  42. 函數(shù)說(shuō)明:無(wú)
  43. *********************************************************/
  44. void ADC_Init (void)  
  45. {  
  46.   ADC10CTL0 &= ~ENC;   //復(fù)位轉(zhuǎn)換允許位
  47.   ADC10CTL0 |= ADC10ON + ADC10SHT_0 + SREF_0 + ADC10IE ;
  48.   //設(shè)置轉(zhuǎn)換控制寄存器ADC10CTL0,ADC10ON=0x010,使ADC10內(nèi)核工作
  49.   //ADC10SHT_0=0*0x800u,確定采樣周期為4xADC10CLKs              
  50.   //SREF_0=0*0x2000u,選擇參考電壓為VR+=AVCC,VR-=AVSS
  51.   //ADC10IE=0x00使對(duì)應(yīng)通道轉(zhuǎn)換后產(chǎn)生中斷

  52.   ADC10CTL1 |= INCH_4 + CONSEQ_0;
  53.   //設(shè)置AD轉(zhuǎn)換控制寄存器ADC10CTL1,INCH_0=0*0x1000u,選擇通道A4
  54.   //CONSEQ_1=1*2u,設(shè)置工作模式為單通道、單次轉(zhuǎn)換模式      
  55.   ADC10CTL0 |= ENC + ADC10SC;
  56.   //設(shè)置轉(zhuǎn)換控制寄存器ADC12CTL0,ENC=0x002使轉(zhuǎn)換允許位為1                                
  57.   //ADC12SC=0x001使采樣/轉(zhuǎn)換控制位為1  
  58.   _EINT();  //總中斷使能  
  59. }
  60. /***************************ADC中斷函數(shù)****************************/
  61. #pragma vector = ADC10_VECTOR
  62. __interrupt void ADC10_Interrupt(void)   
  63. {
  64.   uint data;
  65.   data = ADC10MEM;                         //將AD采樣值存入data
  66.   if(Voltage_Range == Range_3V)          //V(實(shí)際)=(VR+ - VR-)*data/1023 + VR-
  67.     Voltage = (uint)(35.4*data/10.23);     //Voltage是實(shí)際電壓值的1000倍
  68.   else
  69.     Voltage = (uint)(35.4*data/10.23*5.38);
  70. }                                    
  71. /***************************WDT中斷函數(shù)****************************/
  72. #pragma vector = WDT_VECTOR
  73. __interrupt void watchdog_timer(void)
  74. {
  75.   LCD_Display(Voltage);                   //顯示電壓值
  76. }
  77. /*********************************************************
  78. 函數(shù)名稱:LCD初始化函數(shù)
  79. 入口參數(shù):無(wú)
  80. 出口參數(shù):無(wú)
  81. 函數(shù)說(shuō)明:無(wú)
  82. *********************************************************/  
  83. void LCD_Init()
  84. {
  85.   Delay_nms(5);
  86.   LCD_Send(0,0x01);      //清屏指令
  87.   Delay_nms(5);          //延時(shí)等待液晶完成復(fù)位
  88.   LCD_Send(0,0x30);         //功能設(shè)定:基本指令集操作
  89.   Delay_nms(5);
  90.   LCD_Send(0,0x02);         //地址歸0
  91.   Delay_nms(5);
  92.   LCD_Send(0,0x0c);         //開顯示,且關(guān)閉光標(biāo)及其反白顯示
  93.   Delay_nms(5);
  94. }
  95. /*********************************************************
  96. 函數(shù)功能:寫指令或數(shù)據(jù)
  97. 入口參數(shù):type,transdata
  98. 出口參數(shù):無(wú)
  99. 函數(shù)說(shuō)明:無(wú)
  100. *********************************************************/  
  101. void LCD_Send(uchar type,uchar transdata)
  102. {
  103.   uchar firstbyte = 0xf8;
  104.   uchar temp,i,j;
  105.   if(type)
  106.     firstbyte |= 0x02;
  107.   P1OUT &= ~BIT1;
  108.   for(j=3;j>0;j--)
  109.   {
  110.     switch(j)
  111.     {
  112.       case 3:temp=firstbyte;break;
  113.       case 2:temp=transdata&0xf0;break;
  114.       case 1:temp=(transdata<<4)&0xf0;break;
  115.     }
  116.     for(i=8;i>0;i--)
  117.     {
  118.       if(temp&0x80)
  119.         P1OUT |= BIT0;
  120.       else
  121.         P1OUT &= ~BIT0;
  122.       P1OUT |= BIT1;
  123.       temp <<= 1;
  124.       P1OUT &= ~BIT1;
  125.     }
  126.     Delay_nms(1);
  127.   }
  128.   P1OUT &= ~BIT0;
  129. }
  130. /**********************定位函數(shù)************************/
  131. void LCD_Pos(uchar x,uchar y)
  132. {
  133.   int pos;
  134.   switch(x)
  135.   {
  136.     case 1:pos=0x80;break;
  137.     case 2:pos=0x90;break;
  138.     case 3:pos=0x88;break;
  139.     case 4:pos=0x98;break;
  140.     default:pos=0x80;
  141.   }
  142.   pos += y;
  143.   LCD_Send(0,pos);
  144. }
  145. /*********************************************************
  146. 函數(shù)功能:字符串顯示函數(shù)
  147. 入口參數(shù):*pt ,num
  148. 出口參數(shù):無(wú)
  149. 函數(shù)說(shuō)明:無(wú)
  150. *********************************************************/  
  151. void LCD_Display_String(const uchar *pt,uchar num)
  152. {
  153.   uchar i;
  154.   for(i = 0;i < (num*2);i++)
  155.     LCD_Send(1,*(pt++));
  156. }
  157. /*********************************************************
  158. 函數(shù)功能:數(shù)字顯示函數(shù)
  159. 入口參數(shù):num
  160. 出口參數(shù):無(wú)
  161. 函數(shù)說(shuō)明:無(wú)
  162. *********************************************************/  
  163. void LCD_Display_Digit(long int num)
  164. {
  165.   uint SHOW[7],i=0;
  166.   SHOW[0]=(num/10000)%10;   //十位
  167.   SHOW[1]=(num/1000)%10;    //個(gè)位
  168.   SHOW[2]=10;               //.
  169.   SHOW[3]=(num/100)%10;     //十分位
  170.   SHOW[4]=num/10%10;        //百分位
  171.   SHOW[5]=num%10;           //千分位  
  172.   SHOW[6]=11;               //V
  173.   switch(Voltage_Range)
  174.   {
  175.     case Range_3V:  for(i=1;i<7;i++)
  176.                      LCD_Send(1,LCD_Table[SHOW[i]]); break;
  177.     case Range_15V:  for(i=0;i<7;i++)
  178.                     {
  179.                       if(i==5)++i;  
  180.                         LCD_Send(1,LCD_Table[SHOW[i]]);
  181.                     } break;
  182.     default:  break;
  183.   }  
  184. }
  185. /***********************延時(shí)函數(shù)*************************/
  186. void Delay_nms(uint n)
  187. {
  188.   uchar i;
  189.   while(n--)
  190.     for(i=0;i<115;i++);
  191. }
  192. /*************************************************************
  193. 函數(shù)名稱:顯示函數(shù)
  194. 入口參數(shù):Data
  195. 出口參數(shù):無(wú)
  196. 函數(shù)說(shuō)明:每行最多8個(gè)字,2個(gè)字母或數(shù)字相當(dāng)于1個(gè)字的長(zhǎng)度,注意
  197.           漢字沒(méi)法跨格顯示。
  198. *************************************************************/  
  199. void LCD_Display(long int Data)
  200. {
  201.   //LCD_Pos(1,0);                           //第一行
  202.   //LCD_Display_String("",0);
  203.   LCD_Pos(2,0);                             //第二行
  204.   LCD_Display_String("  數(shù)字式電壓表",7);
  205.   LCD_Pos(3,0);                             //第三行
  206.   LCD_Display_String("當(dāng)前電壓:",5);
  207.   LCD_Display_Digit(Data);
  208.   //LCD_Pos(4,0);                           //第四行
  209.   //LCD_Display_String(12.13);
  210. }
  211. /*********************************************************
  212. 函數(shù)名稱:主函數(shù)
  213. 入口參數(shù):無(wú)
  214. 出口參數(shù):無(wú)
  215. 函數(shù)說(shuō)明:請(qǐng)看完最上面程序說(shuō)明再運(yùn)行程序
  216. *********************************************************/
  217. void main()
  218. {
  219.   System_Init();
  220.   while(1)
  221.   {   
  222.     ADC10CTL0 |= ENC + ADC10SC;         //開啟ADC轉(zhuǎn)換
  223.   }
  224. }
復(fù)制代碼





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1