4652|19

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

AD没有转换 LCD上一直显示3.29v.求大神耐心看看,小弟毕设需过此关!!! [复制链接]

10芯积分
#include
#define uint unsigned int                                                                  //定义数据类型替代码
#define uchar unsigned char
#define dat P1OUT                                                                         //定义lcd1602的数据口为P1
#define CLR_RS P2OUT&=~BIT0                                                   //置零P2.0位,即置零RS
#define SET_RS P2OUT|=BIT0                                                      //置一P2.0位,即置一RS
#define CLR_RW P2OUT&=~BIT1
#define SET_RW P2OUT|=BIT1
#define CLR_EN P2OUT&=~BIT2
#define SET_EN P2OUT|=BIT2
uchar busy;                                                                                  //1602判忙标志
void delay_lms(int x);                                                                 //延时程序,短延时
void delay_ls(int x);                                                                   //延时程序,长延时
void display(void);                                                                    //显示程序
void busy_1602(void);                                                          //液晶查忙程序
void init_1602(void);                                                            //液晶初始化
void shj_1602(uchar a);                                                    //液晶写数据程序
void zhl_1602(uchar a);                                                   //液晶写指令程序



#define Num_of_Results 32

uchar table0[16]={"The Volt is"};  //定义lcd1602显示两行的字符
uchar table1[16]={"0123456789.v"};


static uint results[Num_of_Results]; //保存ADC转换结果的数组
void main(void)
{
  WDTCTL=WDTPW+WDTHOLD;  //关闭看门狗
  //下面六行程序关闭所有的IO口
  P1DIR=0XFF;P1OUT=0XFF;
  P2DIR=0XFF;P2OUT=0XFF;
  P3DIR=0XFF;P3OUT=0XFF;
  P4DIR=0XFF;P4OUT=0XFF;
  P5DIR=0XFF;P5OUT=0XFF;
  P6DIR=0XFF;P6OUT=0XFF;

  init_1602();             //复位1602液晶
   P6SEL|=BIT0;            //使能ADC通道
  ADC12CTL0=ADC12ON+SHT0_8+MSC;//打开ADC,设置采样时间
  //上面的配置中并没有打开内部的参考电压,ADC12MCTLx用来选择通道和参考电压,这里面没有对此寄存器进行配置为默认值,默认值是参考电压选择AVCC(3.3v),通道时A0,所以测量范围是0-3.3V
  ADC12CTL1=SHP+CONSEQ_2;//使用采样定时器,转换模式为单路重复转换
  ADC12MCTL0=INCH_0;
  ADC12IE=BIT0;//使能ADC中断
  ADC12CTL0|=ENC; //使能转换
  ADC12CTL0|=ADC12SC; //开始转换
_BIS_SR(GIE);           //开启全局中断
LPM0;
}

/****************************
函数名称:Trans_val
功能:将16禁止ADC转换数据变换成三位10进制真是的模拟电压数据,并在液晶上显示
参数:Hex_val  16进制数据
      n        变换时的分母等于2的n次方
返回值:无
*****************************/
void Trans_val(uint Hex_Val_1)
{
  unsigned long caltmp;
  uint Curr_Volt;
  uchar t1,i;
  uchar ptr[5];

  uint Hex_Val;
  Hex_Val=Hex_Val_1;

  caltmp=Hex_Val;
  caltmp=(caltmp<<5)+Hex_Val;  //caltmp=Hex_Val*33
  caltmp=(caltmp<<3)+(caltmp<<1);  //caltmp=caltmp*10
  Curr_Volt=caltmp>>12;        //Curr_Volt=caltmp/2^n
  //参考电压为3.3V,所以计算公式应该是Hex_Val*3.3/2^n
  //乘除计算通过移位来进行可以有效的提高程序运行效率
  ptr[0]=Curr_Volt/100;    //Hex->Dec变换
  t1=Curr_Volt-(ptr[0]*100);
  ptr[2]=t1/10;
  ptr[3]=t1-(ptr[2]*10);
  ptr[1]=10;      //shuzi表中第10位对应的符号“.”
  ptr[4]=11;



  init_1602();            //初始化1602
  zhl_1602(0x08);        //关闭显示
  zhl_1602(0x01);        //显示清屏
  for(i=0;i<16;i++)      //发送数据第二行
  {
    shj_1602(table0[i]);
  }
  zhl_1602(0x80+0x40+4);    //显示换行
  for(i=0;i<5;i++)       //发送数据第一行
  {
    shj_1602(table1[ptr[i]]);
  }
  zhl_1602(0x0c);        //显示开及光标设置
  //在液晶上显示变换后的结果


}

/****************************
函数名称:ADC12ISR
功能:ADC中断服务函数,在这里用多次平均计算P6.0的模拟电压数值
参数:无
返回值:无
***************************/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
  static uint index=0;
  results[index++]=ADC12MEM0; //将转换的结果存入数组
  if(index==Num_of_Results)   //如果数组存满
  {
    uchar i;
    unsigned long sum=0;
    index=0;                 //再从头开始存,会覆盖原来的数据
    for(i=0;i     {
      sum+=results[i];
    }
    sum>>=5;            //除以32
    Trans_val(sum);
  }
}



void busy_1602(void)    //查询忙碌标志信号程序
{
  do
  {
    CLR_EN;             //EN置零
    SET_RW;            //RW置一 读信号线
    CLR_RS;            //RS置零 读取指令
    SET_EN;            //EN置一 读信息
    busy=dat;
    CLR_EN;            //EN置零
    delay_lms(10);
  }
  while(busy&&0x10==1);
}

void zhl_1602(uchar a)  //写指令到lcm程序
{
  busy_1602();
  CLR_EN;              //EN置零
  CLR_RW;              //RW置零 写信号线
  CLR_RS;              //RS置一 读取指令
  SET_EN;              //EN置一 读信息
  dat=a;        
  CLR_EN;              //EN置零
}

void shj_1602(uchar a)  //写数据到lcm程序
{
  busy_1602();
  CLR_EN;               //EN置零
  CLR_RW;               //RW置零 写信号线
  SET_RS;               //RS置一 读取数据
  SET_EN;               //EN置一 读信息
  dat=a;
  CLR_EN;               //EN置零
}

void init_1602(void)    //启动lcm程序
{
  zhl_1602(0x38);       //写指令
  zhl_1602(0x0c);       //显示开及光标设置
  zhl_1602(0x06);       //光标移动设置
}

void delay_lms(int x)     //延时程序,短延时
{
  while(x--)
    for(int i=0;i<25;i++);
}

void delay_ls(int x)
{
  for(int i=0;i<8;i++)
  {
    while(x--)
      for(int i=0;i<150;i++);
  }
}

最佳答案

查看完整内容

AD功能没什么影响,仿真的话你的端口电压怎么设置啊,如果仿真库里面默认是端口输出高电平那就是3.3 没错了

最新回复

都是大神,可以好好学习了  详情 回复 发表于 2014-4-2 11:50
 
点赞 关注
个人签名let us go

回复
举报

5015

帖子

12

TA的资源

裸片初长成(初级)

沙发
 
  1. #include  <msp430x24x.h>

  2. #define   Num_of_Results   8

  3. volatile unsigned int results[Num_of_Results];  // Needs to be global in this
  4.                                               // example. Otherwise, the
  5.                                               // compiler removes it because it
  6.                                               // is not used for anything.

  7. void main(void)
  8. {
  9.   WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  10.   P6SEL |= 0x01;                            // Enable A/D channel A0
  11.   ADC12CTL0 = ADC12ON+SHT0_8+MSC;           // Turn on ADC12, set sampling time
  12.   ADC12CTL1 = SHP+CONSEQ_2;                 // Use sampling timer, set mode
  13.   ADC12IE = 0x01;                           // Enable ADC12IFG.0
  14.   ADC12CTL0 |= ENC;                         // Enable conversions
  15.   ADC12CTL0 |= ADC12SC;                     // Start conversion
  16.   _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0,Enable interrupts
  17. }


  18. #pragma vector=ADC12_VECTOR
  19. __interrupt void ADC12ISR (void)
  20. {
  21.   static unsigned int index = 0;

  22.   results[index] = ADC12MEM0;               // Move results
  23.   index = (index+1)%Num_of_Results;         // Increment results index, modulo; Set Breakpoint1 here
  24.   if (index == 0)
  25.     _NOP();                                 // Set Breakpoint2 here
  26.   
  27. }
复制代码


 
个人签名《MCU工程师炼成记》作者之一
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

板凳
 
请参考以上AD代码

点评

ADC12MEM0寄存器中的值能从中断中调用出来吗?我需要这个寄存器中的值  详情 回复 发表于 2014-4-1 09:05
 
个人签名《MCU工程师炼成记》作者之一
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

4
 
wstt 发表于 2014-3-31 23:59
请参考以上AD代码

ADC12MEM0寄存器中的值能从中断中调用出来吗?我需要这个寄存器中的值

点评

可以的,完成一次转换之后即可读取  详情 回复 发表于 2014-4-1 09:13
 
个人签名let us go
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

5
 
贾维尔麦基 发表于 2014-4-1 09:05
ADC12MEM0寄存器中的值能从中断中调用出来吗?我需要这个寄存器中的值

可以的,完成一次转换之后即可读取
 
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

6
 
本帖最后由 tianshuihu 于 2014-4-1 09:28 编辑

建议在ADC中断函数的最后做如下尝试

  sum>>=5;            //除以32
sum=512;    //修改此数值看看最终的显示是否正确,如正确显示则可删除此行
    Trans_val(sum);

另外LCD初始化一次即可,显示的长度一样的话,每次会自动覆盖之前的显示内容,所以每次只需更新显示的数值即可

点评

刚才试了试,加sum=512这行后 调用函数Tran_val(sum);是工作的,但是扯下sum=512;这行之后,lcd上一直显示参考电压3.3V。应该是寄存器中的值没取出来,或者AD没有工作。大神能帮忙看看嘛  详情 回复 发表于 2014-4-1 09:41
我先试试哈,不管怎么样,先谢谢你!  详情 回复 发表于 2014-4-1 09:33
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

7
 
tianshuihu 发表于 2014-4-1 09:27
建议在ADC中断函数的最后做如下尝试

  sum>>=5;            //除以32

我先试试哈,不管怎么样,先谢谢你!
 
个人签名let us go
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

8
 
tianshuihu 发表于 2014-4-1 09:27
建议在ADC中断函数的最后做如下尝试

  sum>>=5;            //除以32

刚才试了试,加sum=512这行后 调用函数Tran_val(sum);是工作的,但是扯下sum=512;这行之后,lcd上一直显示参考电压3.3V。应该是寄存器中的值没取出来,或者AD没有工作。大神能帮忙看看嘛
 
个人签名let us go
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

9
 
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
  static uint index=0;
  results[index]=ADC12MEM0; //将转换的结果存入数组
  
  Trans_val(results[index]);//在此行设置断点观察一下 results[index] 是否正确

}

另外用万用表看一下你的引脚电压是否异常

点评

现在用Proteus仿真来着,用里面的249代替149弄的,会有影响吗  详情 回复 发表于 2014-4-1 09:59
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

10
 
tianshuihu 发表于 2014-4-1 09:56
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{

现在用Proteus仿真来着,用里面的249代替149弄的,会有影响吗
 
个人签名let us go
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

11
 
AD功能没什么影响,仿真的话你的端口电压怎么设置啊,如果仿真库里面默认是端口输出高电平那就是3.3 没错了

点评

249的默认的AD参考电压就是3.3V。我在仿真的时候在P6.0口加上一个电位器了,想通过改变电位器的值实时观察LCD的显示,假如这之前的程序都正确的话,我是不是能观察到我想要的实时改变P6.0口的模拟电压,然后在lcd上  详情 回复 发表于 2014-4-1 10:06
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

12
 
tianshuihu 发表于 2014-4-1 10:02
AD功能没什么影响,仿真的话你的端口电压怎么设置啊,如果仿真库里面默认是端口输出高电平那就是3.3 没错了 ...

249的默认的AD参考电压就是3.3V。我在仿真的时候在P6.0口加上一个电位器了,想通过改变电位器的值实时观察LCD的显示,假如这之前的程序都正确的话,我是不是能观察到我想要的实时改变P6.0口的模拟电压,然后在lcd上能显示出来呢?
 
个人签名let us go
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

13
 
嗯,是的
你试试,直接把P6.0 接地,看看有没有变化吧

点评

没有变化,还是显示3.3V。应该是AD没能工作了。现在都只能呵呵了  详情 回复 发表于 2014-4-1 10:16
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

14
 
tianshuihu 发表于 2014-4-1 10:11
嗯,是的
你试试,直接把P6.0 接地,看看有没有变化吧

没有变化,还是显示3.3V。应该是AD没能工作了。现在都只能呵呵了
 
个人签名let us go
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

15
 
既然可以显示就说明成功完成了AD转换并且进入了中断处理函数,至于为什么一直是3.3我也感觉很奇怪

如果可能的话单步运行一下看看寄存器变化,进入中断后看看 ADC12MEM0 是否变化过
你也可以把仿真电路图截个屏让大家分析一下,或许有高人能发现问题

点评

电路图很简单,没什么连线都。求大神!  详情 回复 发表于 2014-4-1 10:52
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

16
 
tianshuihu 发表于 2014-4-1 10:41
既然可以显示就说明成功完成了AD转换并且进入了中断处理函数,至于为什么一直是3.3我也感觉很奇怪

如果 ...

电路图很简单,没什么连线都。求大神!

电路图.png (29.41 KB, 下载次数: 0)

电路图.png
 
个人签名let us go
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

17
 
孤陋寡闻了,电路图居然可以如此简单....
 
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

18
 
LCD 和 芯片 都不用供电的吗

点评

Proteus对单片机和液晶显示的外围电路有自动供电的功能吧  详情 回复 发表于 2014-4-1 14:24
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

19
 
tianshuihu 发表于 2014-4-1 11:15
LCD 和 芯片 都不用供电的吗

Proteus对单片机和液晶显示的外围电路有自动供电的功能吧
 
个人签名let us go
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

20
 
都是大神,可以好好学习了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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