STC12C5A60S2的A/D转换在通道不接任何输入的情况下仍显示5V电压的转换值

[复制链接]
5561|14
 楼主| 林子ARM 发表于 2013-4-28 21:15 | 显示全部楼层 |阅读模式
  1. /***********************************************************
  2. 程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示
  3. MCU型号: STC12C5A60S2
  4. 晶振频率:11.0892MHz
  5. 整理时间:2013年4月25号
  6. ************************************************************/

  7. #include "STC12C5A60S2.h"
  8. #include "intrins.h"
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. typedef unsigned char BYTE;
  12. typedef unsigned int WORD;

  13. #include "1602.h"
  14. #include "DS18B20.h"

  15. #define ADC_POWER   0X80
  16. #define ADC_FLAG    0X10
  17. #define ADC_START   0X08
  18. #define ADC_SPEEDLL 0X00
  19. #define ADC_SPEEDL  0X20
  20. #define ADC_SPEEDH  0X40
  21. #define ADC_SPEEDHH 0X60

  22. void InitADC();
  23. void Delay(WORD n);
  24. WORD GetADCResult(BYTE ch);
  25. void DisplayADCResult(BYTE Channel);
  26. void DisplayTemperature();

  27. char qian=0,bai=0,shi=0,ge=0;
  28. BYTE ly_dis[4];//定义显示缓冲区

  29. void main()
  30. {
  31.         WORD i=0;
  32.         float tt;
  33.         int ltemp;
  34.         InitADC();
  35.         LCDInit();
  36.         DisplayListChar(0, 0, "Temp:");
  37.         DisplayListChar(0, 1, "Volt:");
  38.         while(1)
  39.         {

  40.                 if(i==0)
  41.                         tmpchange();              //温度转换
  42.                 if(i==100)
  43.                 {
  44.                         tt=tmp()*0.0625;          //得到真实十进制温度值,因为DS18B20
  45.                                                                 //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
  46.                           ltemp=tt*10+0.5;           //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

  47.                         if(ltemp<0)
  48.                         {                //判断第一位显示整数还是负号
  49.                                 ly_dis[0]=0xbf;
  50.                                 ltemp=0-ltemp;       
  51.                         }
  52.                         else
  53.                                 ly_dis[0]=ltemp/1000;//显示百位值
  54.                         ltemp=ltemp%1000;
  55.                         ly_dis[1]=ltemp/100;        //显示温度十位值
  56.                         ltemp=ltemp%100;
  57.                         ly_dis[2]=ltemp/10;                //显示温度个位值
  58.                         ly_dis[3]=ltemp%10;                //显示小数点后一位
  59.                 }
  60.                 i++;
  61.                 if(i==3000)
  62.                 {
  63.                         DisplayADCResult(0);
  64.                         i=0;
  65.                 }                       
  66.                 DisplayTemperature();        //调用显示               
  67.         }
  68. }

  69. void DisplayADCResult(BYTE Channel)
  70. {
  71.         uint t;
  72.         t=GetADCResult(Channel);
  73.         qian=t/1000;
  74.         bai=t%1000/100;
  75.         shi=t%1000%100/10;
  76.         ge=t%10;
  77.         if(0==qian)
  78.         DisplayOneChar(5,1,' ');
  79.         else
  80.         DisplayOneChar(5,1,table[qian]);

  81.         if(0==bai&&0==qian)
  82.         DisplayOneChar(6,1,' ');
  83.         else
  84.         DisplayOneChar(6,1,table[bai]);

  85.         DisplayOneChar(7,1,table[shi]);
  86.         DisplayOneChar(8,1,table[ge]);
  87.        
  88.         DisplayOneChar(9, 1, 'v');
  89.                
  90. }

  91. void DisplayTemperature()
  92. {
  93.         if(0==ly_dis[0])
  94.                 DisplayOneChar(5, 0, ' ');
  95.         else
  96.                 DisplayOneChar(5, 0, table[ly_dis[0]]);
  97.         DisplayOneChar(6, 0, table[ly_dis[1]]);
  98.         DisplayOneChar(7, 0, table[ly_dis[2]]);
  99.         DisplayOneChar(8, 0, '.');
  100.     DisplayOneChar(9, 0, table[ly_dis[3]]);
  101.         DisplayOneChar(10, 0, 0xdf);
  102.         DisplayOneChar(11, 0, 'C');
  103. }

  104. WORD GetADCResult(BYTE ch)
  105. {
  106.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  107.                   //0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         _nop_();
  112.         while(!(ADC_CONTR&ADC_FLAG));
  113.         ADC_CONTR&=~ADC_FLAG;

  114.         return (ADC_RES*4+ADC_RESL);
  115. }

  116. void InitADC()
  117. {
  118.     P1M0=0x01;
  119.         P1M1=0x01;
  120.         P1ASF = 0x01;
  121.         ADC_RES =0x00;
  122.         ADC_RESL=0x00;
  123.         ADC_CONTR = ADC_POWER|ADC_SPEEDLL;
  124.         Delay(2);
  125. }

  126. void Delay(WORD t)
  127. {
  128.         WORD x;
  129.         while(t--)
  130.         {
  131.                 x = 5000;
  132.                 while(x--);
  133.         }
  134. }


 楼主| 林子ARM 发表于 2013-4-28 21:16 | 显示全部楼层
A/D通道不接任何输入情况下就是不显示0,哪位大神指导麻烦帮看看,LCD1602和18b20部分没什么问题。
 楼主| 林子ARM 发表于 2013-4-28 21:19 | 显示全部楼层
A/D通道选择为P1.0
lyjian 发表于 2013-4-28 21:20 | 显示全部楼层
林子ARM 发表于 2013-4-28 21:16
A/D通道不接任何输入情况下就是不显示0,哪位大神指导麻烦帮看看,LCD1602和18b20部分没什么问题。 ...

为什么一定要显示0?
dirtwillfly 发表于 2013-4-29 09:46 | 显示全部楼层
同意4楼观点
 楼主| 林子ARM 发表于 2013-4-29 12:23 | 显示全部楼层
楼上,试问你测电压的时候,无电压输入的情况下显示5V电压,正常吗?
lyjian 发表于 2013-4-29 12:47 | 显示全部楼层
如果是用万用表测试,在无电压输入的情况下显示5V电压,那是不正常。
但如果你用的是MCU的IO,在不接任何输入情况下显示5V电压,那太正常不过了。
 楼主| 林子ARM 发表于 2013-4-30 10:12 | 显示全部楼层
跪求楼上解释一下后面那句话,再者,我把输入的IO口接地,为何又是显示5V?
ningling_21 发表于 2013-4-30 11:11 | 显示全部楼层
林子ARM 发表于 2013-4-30 10:12
跪求楼上解释一下后面那句话,再者,我把输入的IO口接地,为何又是显示5V? ...

用电压表测量你有疑问的IO口,如果电压表显示5V,那AD肯定是5V.
如果电压表不是5V而AD显示5V就是程序的问题。
 楼主| 林子ARM 发表于 2013-5-1 16:12 | 显示全部楼层
很明确,电压表测只有几十mv电压,所以烦请大神帮上面的程序
gx_huang 发表于 2013-5-1 17:51 | 显示全部楼层
看代码前要看MCU的寄存器,可能大家没有空。
如果显示5V,同时检测输入是毫伏级别的,那就说明程序有问题了。
不过,劝LZ不要这么问问题,MCU输入悬空和万用表输入悬空,概念不一样的。
万用表输入悬空,只要周围没有干扰源,输入还是0V,因为万用表输入对地一般有10M电阻的固定输入阻抗。
而GPIO就不清楚了,和你程序的设计有很大关系,不同的MCU也不一样。
 楼主| 林子ARM 发表于 2013-5-1 20:51 | 显示全部楼层
越听越糊涂了,不过还是谢谢楼上,我自己再理一下思路吧
logokfu 发表于 2013-5-1 20:59 | 显示全部楼层
这个程序好像是之前我写的吧,这个程序我是实际测试通过的。你的因该排除硬件问题。你的可能是因为没有采集到电压,由于是高阻态,导致显示为满值。
 楼主| 林子ARM 发表于 2013-5-2 13:38 | 显示全部楼层
楼上,采集到的电压值比较小,是不是也会满值呢?求详细指导!
明眸 发表于 2015-10-29 10:42 | 显示全部楼层
单片机的IO浮空了,这个ADC的转换结果是任意的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

35

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部