2230|0

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

MSP430学习笔记11-八路ADC采集诺基亚5110液晶显示 [复制链接]

本程序采用的是八路ADC单次采集的模式,根据配置,在单次的模式下转换完成后ADC12SC会自动复位,因此需要在循环中进行ADC12CTL0 |= ADC12SC;操作,而如果配置成连续采集的模式,只需要在程序开始将ADC12SC置位一次就可以,但是就需要注意当进入中断后如果不手动禁止中断会一直停留在循环中,因此在采集到需要的数据后需要将ADC关闭或者中断使能禁止才能重新回到主函数,这一点需要注意。

八路单次采集的程序如下:

  1. /***************************************
  2. 八路AD多路单次采集基亚5110液晶显示
  3. 采集模式:多路单次
  4. ****************************************/

  5. #include
  6. #include "LCD5110.h"
  7. #define   uint  unsigned int
  8. #define   uchar unsigned char

  9. unsigned char ad0[]="1:0.0V";
  10. unsigned char ad1[]="2:0.0V";
  11. unsigned char ad2[]="3:0.0V";
  12. unsigned char ad3[]="4:0.0V";
  13. unsigned char ad4[]="5:0.0V";
  14. unsigned char ad5[]="6:0.0V";
  15. unsigned char ad6[]="7:0.0V";
  16. unsigned char ad7[]="8:0.0V";
  17. uchar flag=1;

  18. uint temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;

  19. void Init_Clk()
  20. {
  21.     uchar i;
  22.     BCSCTL1&=~XT2OFF;  //打开XT振荡器   
  23.     do
  24.         {
  25.         IFG1 &= ~OFIFG;                 //清除振荡错误标志
  26.         for(i = 0; i < 100; i++)
  27.           _NOP();                        //延时等待
  28.         }
  29.     while ((IFG1 & OFIFG) != 0);        //如果标志为1继续循环等待
  30.     IFG1&=~OFIFG;
  31.     BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
  32. }
  33. void Init_ADC()
  34. {
  35.     P6SEL|=0XFF;                                //信号采集端口选择第二功能
  36.     ADC12CTL0 = ADC12ON+SHT0_8+MSC;                   // 打开ADC+设置采样时间
  37.     ADC12CTL1 = SHP+CONSEQ_1;                         // 使用采样时序电路信号+多路单次模式
  38.     //上面的寄存器配置采样保持触发源选择时ADC12SC,采集信号使用采样时序电路产生的信号
  39.     // 转换模式为多路单次复转换        上面的设置必须在ENC=0的情况下设置
  40.     //设置每个通道的输入端口和参考电压,参考电压默认为AVCC 3.3V
  41.     ADC12MCTL0 = INCH_0;   
  42.     ADC12MCTL1 = INCH_1;  
  43.     ADC12MCTL2 = INCH_2;  
  44.     ADC12MCTL3 = INCH_3;
  45.     ADC12MCTL4 = INCH_4;   
  46.     ADC12MCTL5 = INCH_5;  
  47.     ADC12MCTL6 = INCH_10;  
  48.     ADC12MCTL7 = INCH_11+EOS;                    // 最后一个通道
  49.     ADC12IE = BIT7;                                   // 最后一个通道转换完成后使能ADC中断
  50.     ADC12CTL0 |= ENC;                                 // 使能转换
  51. }
  52. /*******************************************
  53. 函数名称:Trans_val
  54. 功    能:将16进制ADC转换数据变换成三位10进制
  55.           真实的模拟电压数据,并在液晶上显示
  56. 参    数:Hex_Val--16进制数据
  57.           n--变换时的分母等于2的n次方      
  58. 返回值  :无
  59. ********************************************/
  60. void Trans_val(uchar ptr[6],uint Hex_Val)
  61. {
  62.     unsigned long caltmp;
  63.     uint Curr_Volt;

  64.     caltmp = Hex_Val;
  65.     caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 3
  66.     Curr_Volt = caltmp >> 12;                   //Curr_Volt = caltmp / 2^n
  67.     // 参考电压为3.3V,所以计算公式应该为Hex_val*3.3/2^n
  68.     // 乘除计算通过移位来进行可以有效的提高程序运行效率
  69.     ptr[2] = (Curr_Volt / 10)+0x30;             //个位
  70.     ptr[4] = (Curr_Volt % 10)+0x30;             //小数位
  71.        
  72. }

  73. void main()
  74. {
  75.     Init_Clk();
  76.     Init_ADC();
  77.     WDTCTL = WDTPW + WDTHOLD;
  78.     LCD_init();  
  79.     LCD_showsh(0, 0, "电压采集:");
  80.     _EINT();//开启全局中断
  81.     P5DIR|=BIT5;
  82.     P3OUT|=~BIT5;
  83.     while (1)
  84.     {
  85.         ADC12CTL0 |= ADC12SC;
  86.         LCD_prints(0,2,ad0);
  87.         LCD_prints(8,2,ad1);
  88.         LCD_prints(0,3,ad2);
  89.         LCD_prints(8,3,ad3);
  90.         LCD_prints(0,4,ad4);
  91.         LCD_prints(8,4,ad5);
  92.         LCD_prints(0,5,ad6);
  93.         LCD_prints(8,5,ad7);      
  94.     }
  95.    
  96. }
  97. /*******************************************
  98. 函数名称:ADC12ISR
  99. 功    能:ADC中断服务函数
  100. 参    数:无      
  101. 返回值  :无
  102. ********************************************/
  103. #pragma vector=ADC_VECTOR
  104. __interrupt void ADC12ISR (void)
  105. {
  106.     temp0 = ADC12MEM0;
  107.     Trans_val(ad0,temp0);
  108.     temp1 = ADC12MEM1;
  109.     Trans_val(ad1,temp1);
  110.     temp2 = ADC12MEM2;
  111.     Trans_val(ad2,temp2);
  112.     temp3 = ADC12MEM3;
  113.     Trans_val(ad3,temp3);
  114.     temp4 = ADC12MEM4;
  115.     Trans_val(ad4,temp4);
  116.     temp5 = ADC12MEM5;
  117.     Trans_val(ad5,temp5);
  118.     temp6 = ADC12MEM6;
  119.     Trans_val(ad6,temp6);
  120.     temp7 = ADC12MEM7;
  121.     Trans_val(ad7,temp7);
  122. }
复制代码
 
点赞 关注
个人签名

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表