找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1859|回复: 0
收起左侧

msp430g2553单片机ADC转换程序

[复制链接]
ID:280288 发表于 2021-11-28 13:59 | 显示全部楼层 |阅读模式
  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.                         函数声明
  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. 函数功能:系统初始化
  24. 入口参数:无
  25. 出口参数:无
  26. 函数说明:无
  27. *********************************************************/
  28. void System_Init(void)
  29. {
  30.   WDTCTL = WDT_ADLY_1000;               //看门狗工作在定时器模式,1s中断一次
  31.   IE1 |= WDTIE;                         //使能看门狗中断
  32.   P1DIR |= BIT0 + BIT1;                        //相应的位端口设置为输出  
  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. 函数功能:ADC初始化
  40. 入口参数:无
  41. 出口参数:无
  42. 函数说明:无
  43. *********************************************************/
  44. void ADC_Init (void)  
  45. {  
  46.   ADC10CTL0 &= ~ENC;   //复位转换允许位
  47.   ADC10CTL0 |= ADC10ON + ADC10SHT_0 + SREF_0 + ADC10IE ;
  48.   //设置转换控制寄存器ADC10CTL0,ADC10ON=0x010,使ADC10内核工作
  49.   //ADC10SHT_0=0*0x800u,确定采样周期为4xADC10CLKs              
  50.   //SREF_0=0*0x2000u,选择参考电压为VR+=AVCC,VR-=AVSS
  51.   //ADC10IE=0x00使对应通道转换后产生中断

  52.   ADC10CTL1 |= INCH_4 + CONSEQ_0;
  53.   //设置AD转换控制寄存器ADC10CTL1,INCH_0=0*0x1000u,选择通道A4
  54.   //CONSEQ_1=1*2u,设置工作模式为单通道、单次转换模式      
  55.   ADC10CTL0 |= ENC + ADC10SC;
  56.   //设置转换控制寄存器ADC12CTL0,ENC=0x002使转换允许位为1                                
  57.   //ADC12SC=0x001使采样/转换控制位为1  
  58.   _EINT();  //总中断使能  
  59. }
  60. /***************************ADC中断函数****************************/
  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(实际)=(VR+ - VR-)*data/1023 + VR-
  67.     Voltage = (uint)(35.4*data/10.23);     //Voltage是实际电压值的1000倍
  68.   else
  69.     Voltage = (uint)(35.4*data/10.23*5.38);
  70. }                                    
  71. /***************************WDT中断函数****************************/
  72. #pragma vector = WDT_VECTOR
  73. __interrupt void watchdog_timer(void)
  74. {
  75.   LCD_Display(Voltage);                   //显示电压值
  76. }
  77. /*********************************************************
  78. 函数名称:LCD初始化函数
  79. 入口参数:无
  80. 出口参数:无
  81. 函数说明:无
  82. *********************************************************/  
  83. void LCD_Init()
  84. {
  85.   Delay_nms(5);
  86.   LCD_Send(0,0x01);      //清屏指令
  87.   Delay_nms(5);          //延时等待液晶完成复位
  88.   LCD_Send(0,0x30);         //功能设定:基本指令集操作
  89.   Delay_nms(5);
  90.   LCD_Send(0,0x02);         //地址归0
  91.   Delay_nms(5);
  92.   LCD_Send(0,0x0c);         //开显示,且关闭光标及其反白显示
  93.   Delay_nms(5);
  94. }
  95. /*********************************************************
  96. 函数功能:写指令或数据
  97. 入口参数:type,transdata
  98. 出口参数:无
  99. 函数说明:无
  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. /**********************定位函数************************/
  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. 函数功能:字符串显示函数
  147. 入口参数:*pt ,num
  148. 出口参数:无
  149. 函数说明:无
  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. 函数功能:数字显示函数
  159. 入口参数:num
  160. 出口参数:无
  161. 函数说明:无
  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;    //个位
  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. /***********************延时函数*************************/
  186. void Delay_nms(uint n)
  187. {
  188.   uchar i;
  189.   while(n--)
  190.     for(i=0;i<115;i++);
  191. }
  192. /*************************************************************
  193. 函数名称:显示函数
  194. 入口参数:Data
  195. 出口参数:无
  196. 函数说明:每行最多8个字,2个字母或数字相当于1个字的长度,注意
  197.           汉字没法跨格显示。
  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("  数字式电压表",7);
  205.   LCD_Pos(3,0);                             //第三行
  206.   LCD_Display_String("当前电压:",5);
  207.   LCD_Display_Digit(Data);
  208.   //LCD_Pos(4,0);                           //第四行
  209.   //LCD_Display_String(12.13);
  210. }
  211. /*********************************************************
  212. 函数名称:主函数
  213. 入口参数:无
  214. 出口参数:无
  215. 函数说明:请看完最上面程序说明再运行程序
  216. *********************************************************/
  217. void main()
  218. {
  219.   System_Init();
  220.   while(1)
  221.   {   
  222.     ADC10CTL0 |= ENC + ADC10SC;         //开启ADC转换
  223.   }
  224. }
复制代码

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表