社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1034|回复: 0

[资料分享] MSP430学习笔记11-八路ADC采集诺基亚5110液晶显示

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 19:02:08 | 显示全部楼层 |阅读模式

本程序采用的是八路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. }
复制代码
此帖出自MSP430论坛


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-19 14:49 , Processed in 0.541274 second(s), 17 queries , Gzip On, Redis On.

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