搜索
bottom↓
回复: 9

帮忙看下12C5A60S2单片机AD转换程序有没有错误?

[复制链接]

出0入0汤圆

发表于 2013-7-30 17:00:11 | 显示全部楼层 |阅读模式
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include "math.h"
  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;
  6. /*Declare SFR associated with the ADC */
  7. sfr ADC_CONTR = 0xBC; //ADC control register
  8. //ADC_POWER | SPEED1 | SPEED0 | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0
  9. sfr ADC_RES = 0xBD; //ADC hight 8-bit result register
  10. sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
  11. sfr P1ASF = 0x9D; //P1 secondary function control register
  12. sfr AUXR1 = 0XA2;
  13. /*Define ADC operation const for ADC_CONTR*/
  14. #define ADC_POWER 0x80 //ADC power control bit
  15. #define ADC_FLAG 0x10 //ADC complete flag
  16. #define ADC_START 0x08 //ADC start control bit
  17. #define ADC_SPEEDLL 0x00 //540 clocks
  18. #define ADC_SPEEDL 0x20 //360 clocks
  19. #define ADC_SPEEDH 0x40 //180 clocks
  20. #define ADC_SPEEDHH 0x60 //90 clocks
  21. extern void Init_ST7920();                                                           //液晶屏初始化
  22. extern void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s);
  23. extern void Write_Cmd(unsigned char Cmd);
  24. extern void Write_Data(unsigned char Data);
  25. unsigned char code Tab_LCD[]={0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};
  26. void Delay(WORD n);
  27. void InitADC();
  28. BYTE ch = 0; //ADC channel NO.
  29. WORD Data;
  30. WORD V_Data;
  31. BYTE num=0;
  32. bit flag=0;
  33. unsigned char code Tab_BiaoTi[]={"12C5A60S2_A/D"};
  34. unsigned char code Tab_Bit[]={"8bit_A/D:"};
  35. unsigned char Tab_Count_Data[]={0,0,0,0};
  36. extern void DelayMs(unsigned char t);
  37. extern void LED_ScanDisplay(char Num);
  38. extern void Count_Data(unsigned int Data);
  39. /*----------------------------
  40. Initial ADC sfr
  41. ----------------------------*/
  42. void InitADC( )
  43. {
  44.         P1ASF = 0xff; //Set  P10 as analog input port
  45.         ADC_RES = 0; //Clear previous result
  46. //        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  47. //        Delay(2); //ADC power-on delay and Start A/D conversion
  48. }
  49. void LCD_Update_Screen()
  50. {
  51.         Write_Cmd(0x8b);
  52.         Write_Data(Tab_LCD[Tab_Count_Data[3]]);
  53.         Write_Data(Tab_LCD[Tab_Count_Data[2]]);
  54.         Write_Data(Tab_LCD[Tab_Count_Data[1]]);
  55.         Write_Data(Tab_LCD[Tab_Count_Data[0]]);
  56.         DelayMs(5);
  57. }
  58. void Init_LCD_Screen()
  59. {
  60.         LCD_PutString(0,1,Tab_BiaoTi);               
  61.         LCD_PutString(0,2,Tab_Bit);
  62. //        LCD_Update_Screen();
  63. }
  64. void Count_Data(unsigned int Data)
  65. {
  66.         Tab_Count_Data[3]=Data/1000;       
  67.         Tab_Count_Data[2]=Data%1000/100;
  68.         Tab_Count_Data[1]=Data%1000%100/10;
  69.         Tab_Count_Data[0]=Data%10;       
  70. }
  71. void main()
  72. {
  73.         Init_ST7920();                                                           //液晶屏初始化
  74.         Init_LCD_Screen();
  75.         InitADC();  //Init ADC sfr
  76.         while (1)
  77.         {
  78.                  ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  79.                 Delay(2); //ADC power-on delay and Start A/D conversion
  80.                 while(!(ADC_CONTR & ADC_FLAG));
  81.                 ADC_CONTR &= !ADC_FLAG;
  82.                 Data=ADC_RES;
  83.                 ADC_RES=0;
  84.                 V_Data=Data*5/256;
  85.                 Count_Data(V_Data);
  86.                
  87.                 LCD_Update_Screen();
  88.         }
  89. }
  90. /*----------------------------
  91. Software delay function
  92. ----------------------------*/
  93. void Delay(WORD n)
  94. {
  95.         WORD x;
  96.         while (n--)
  97.         {
  98.                 x = 5000;
  99.                 while (x--);
  100.         }
  101. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-7-30 17:04:13 | 显示全部楼层
大循环里面主要就是打开电源,启动AD转换,然后再判断转换标志位。转换成功后清除标志位。读ADC_RES的值,经过公式转换后,数值送给液晶屏显示。AD输入接电位器,旋转电位器,液晶屏个位只会显示0到1,其它位显示0

出0入0汤圆

发表于 2013-7-30 17:43:53 | 显示全部楼层
本帖最后由 xpxp 于 2013-7-30 18:01 编辑

不懂看程序。以下是我用在STC15F204EA上的AD读取函数:
uint GetADCResult(void)
{
    uint AD_result;
    ADC_CONTR=0xC1;   //开AD电源,设置转换周期为180个时钟,设置P11为ADC通道                            
    ADC_RES=0x00;                                  //高8位清零     
    ADC_RESL=0x00;                                  //低2位清零
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
   ADC_CONTR|=0x9;                                //启动AD转换
   while ((0x10&ADC_CONTR)!=0x10);  //等待转换完成  
    AD_result=(ADC_RES<<2)|(ADC_RESL&0x03);
    ADC_CONTR&=0xE7;                //清零ADC_FLAG标志位
   return   AD_result;             //Return ADC result 10bit
}

补充,主程序中有这样的设置:
  P1M0=0x2,P1M1=0x2;         //设置P1口的P11为开漏,其余为默认

出0入0汤圆

发表于 2013-7-30 17:50:26 | 显示全部楼层
楼上一看就是高手!

出0入0汤圆

 楼主| 发表于 2013-7-30 20:45:24 | 显示全部楼层
xpxp 发表于 2013-7-30 17:43
不懂看程序。以下是我用在STC15F204EA上的AD读取函数:
uint GetADCResult(void)
{

我程序跟你这个差不多啊,虽然不是同样的MCU,有点区别。

出0入0汤圆

发表于 2013-7-30 21:42:15 | 显示全部楼层
端口要设置一下。
/******************************************************************************************
** 函数名称: Init_IO
** 函数描述: 初始化IO
** 输入参数: 无
** 输出参数: 无          //P20-27,P30-37,P00-03,P10-P17,
*******************************************************************************************/
void InitIo(void)
{
P4M1 = 0x00;
P4M0 = 0xff;        //设置为输出口
P4 = 0;
P3M1 = 0x00;
P3M0 = 0xff;        //p3.7,p3.6,p3.1,p3.0为输入口,其它设置为输出口
P3   = 0X03;   //
P2M1 = 0x0;        //p2口全部设置为输出口
P2M0 = 0xff;        //p2口全部设置为输出口
P2   = 0Xff,
P1M1 = 0x27;        //p1.3为输入口,p1.0 p1.1,P1.2,p1.5为ADC输入口
P1M0 = 0xe7;        //p1.6-P1.7设置为输出口
P1   = 0x3f        ;
P0M1 = 0;      //p0.0-p0.7设置为输出口
P0M0 = 0Xff;   //p0.0-p0.7设置为输出口
P0= 0X0c;
  return;
}

出0入0汤圆

 楼主| 发表于 2013-7-30 22:58:26 | 显示全部楼层
GUOHUDONG 发表于 2013-7-30 21:42
端口要设置一下。
/********************************************************************************** ...

谢谢哈,基本搞定了

出0入0汤圆

发表于 2013-7-31 08:26:59 | 显示全部楼层
想说的,是下载的工具有例子,可以参考

出0入0汤圆

 楼主| 发表于 2013-7-31 10:00:32 | 显示全部楼层
devcang 发表于 2013-7-31 08:26
想说的,是下载的工具有例子,可以参考

谢谢,已搞定

出0入0汤圆

发表于 2013-9-23 23:23:37 | 显示全部楼层
我最近也在学这款单片机的AD装换,在这里受教了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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