微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stc12c5a60s2单片机内部ADC读不到数值

stc12c5a60s2单片机内部ADC读不到数值

时间:10-02 整理:3721RD 点击:


在论坛里面下载了前辈的ADC代码,http://bbs.elecfans.com/jishu_363299_1_1.html
其他地方没改,只是改成了1602显示,结果ADC值一直读不出来,即num一直为1.00,ADC_value一直是0XFF00
不知道哪里有问题

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <string.h>


  6. #define ADC_POWER   0x80        //ADC电源控制位   
  7. #define ADC_FLAG    0x10        //ADC完成标志   
  8. #define ADC_START   0x08        //ADC开始标志位   
  9. #define ADC_SPEEDLL 0x00        //540 clocks   
  10. #define ADC_SPEEDL  0x20        //360 clocks   
  11. #define ADC_SPEEDH  0x40        //180 clocks   
  12. #define ADC_SPEEDHH 0x60                //90 clocks

  13. bit g_sys5msflag;                                //5ms标志位
  14. sfr ADC_CONTR = 0xBC;           //ADC 控制寄存器
  15. sfr ADC_RES   = 0xBD;           //ADC 高 8-bit result
  16. sfr ADC_LOW2  = 0xBE;           //ADC 低 2-bit result
  17. sfr P1ASF     = 0x9D;                        //P1 定义功能

  18. sbit RS = P1^0;   //定义端口
  19. sbit RW = P1^1;
  20. sbit EN = P2^5;

  21. #define RS_CLR RS=0
  22. #define RS_SET RS=1

  23. #define RW_CLR RW=0
  24. #define RW_SET RW=1

  25. #define EN_CLR EN=0
  26. #define EN_SET EN=1

  27. #define DataPort P0


  28. unsigned char ADC_value;
  29. float num;

  30. int k=0;



  31. void delay(int ms)
  32. {
  33.     while(ms--)
  34.         {
  35.       unsigned char i;
  36.           for(i=0;i<250;i++)  
  37.            {
  38.             _nop_();                           
  39.                 _nop_();
  40.                 _nop_();
  41.                 _nop_();
  42.            }
  43.         }
  44. }               


  45. /*------------------------------------------------
  46.               判忙函数
  47. ------------------------------------------------*/
  48. bit LCD_Check_Busy(void)
  49. {
  50. DataPort= 0xFF;
  51. RS_CLR;
  52. RW_SET;
  53. EN_CLR;
  54. _nop_();
  55. EN_SET;
  56. return (bit)(DataPort & 0x80);
  57. }
  58. /*------------------------------------------------
  59.               写入命令函数
  60. ------------------------------------------------*/
  61. void LCD_Write_Com(unsigned char com)
  62. {  
  63. while(LCD_Check_Busy()); //忙则等待
  64. delay(5);
  65. RS_CLR;
  66. RW_CLR;
  67. EN_SET;
  68. DataPort= com;
  69. _nop_();
  70. EN_CLR;
  71. }
  72. /*------------------------------------------------
  73.               写入数据函数
  74. ------------------------------------------------*/
  75. void LCD_Write_Data(unsigned char Data)
  76. {
  77. while(LCD_Check_Busy()); //忙则等待
  78. delay(5);
  79. RS_SET;
  80. RW_CLR;
  81. EN_SET;
  82. DataPort= Data;
  83. _nop_();
  84. EN_CLR;
  85. }

  86. /*------------------------------------------------
  87.                 清屏函数
  88. ------------------------------------------------*/
  89. void LCD_Clear(void)
  90. {
  91. LCD_Write_Com(0x01);
  92. delay(5);
  93. }
  94. /*------------------------------------------------
  95.               写入字符串函数
  96. ------------------------------------------------*/
  97. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  98. {     
  99. if (y == 0)
  100.          {     
  101.          LCD_Write_Com(0x80 + x);     //表示第一行
  102.          }
  103. else
  104.          {      
  105.          LCD_Write_Com(0xC0 + x);      //表示第二行
  106.          }        
  107. while (*s)
  108.          {     
  109. LCD_Write_Data( *s);     
  110. s ++;     
  111.          }
  112. }

  113. /*------------------------------------------------
  114.               初始化函数
  115. ------------------------------------------------*/
  116. void LCD_Init(void)
  117. {
  118.    LCD_Write_Com(0x38);    /*显示模式设置*/
  119.    delay(5);
  120.    LCD_Write_Com(0x38);
  121.    delay(5);
  122.    LCD_Write_Com(0x38);
  123.    delay(5);
  124.    LCD_Write_Com(0x38);  
  125.    LCD_Write_Com(0x08);    /*显示关闭*/
  126.    LCD_Write_Com(0x01);    /*显示清屏*/
  127.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  128.    delay(5);
  129.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  130.    }
  131.    

  132. void timer0Iint()
  133. {
  134.         g_sys5msflag = 0;
  135.         TMOD = 0x01;                                //选择定时器工作方式(分成两个定时器用)
  136.         TH0 = 0xee;                                        //赋初值
  137.     TL0 = 0x00;                                        //赋初值
  138.         EA = 1;                                                //开总中断
  139.         ET0 = 1;                                        //允许T0定时器中断请求
  140.         TR0 = 1;                                        //控制定时器T0工作
  141. }

  142. void Time0_interrupt(void) interrupt 1
  143. {
  144.         TH0 = 0xee;
  145.         TL0 = 0x00;

  146.         g_sys5msflag = 1;

  147. }

  148. void ADC_init()                                                           //ADC初始化
  149. {
  150.     P1ASF = 0x80;                                                     //仅P1^0作为模拟输入              
  151.     ADC_RES = 0;                    
  152.     ADC_CONTR = ADC_POWER | ADC_SPEEDH;
  153.     delay(1);                       
  154. }

  155. unsigned char GetADCResult(unsigned char ch)                                 //获取ADC转换结果
  156. {
  157.     ADC_CONTR = ADC_POWER | ADC_SPEEDH | ch | ADC_START;
  158.     _nop_();                        
  159.     _nop_();
  160.     _nop_();
  161.     _nop_();
  162.     while(!(ADC_CONTR&ADC_FLAG));
  163.     ADC_CONTR &= ~ADC_FLAG;        

  164.     return ADC_RES;                 
  165. }

  166. void process_init()
  167. {
  168.         ADC_value = 128;
  169.         num = 0;
  170. }

  171. void process()                                                           //数据处理
  172. {
  173.         ADC_value = GetADCResult(0);  
  174.     num = ADC_value*5/1024;
  175. }




  176. void main()                                                                   //主函数
  177. {   

  178.         unsigned char tw[15]={0};
  179.         unsigned char bf[15]={0};
  180.         timer0Iint();
  181.         ADC_init();
  182.         process_init();
  183.         LCD_Init();           //初始化液晶
  184.         delay(5);          //延时有助于稳定
  185.         LCD_Clear();          //清屏
  186.           delay(100);
  187.           LCD_Write_String(0,0,"hello");

  188.     while(1)
  189.     {  
  190.                 if(g_sys5msflag == 1)                   //时间片为5ms,及每5ms循环一次
  191.                 {
  192.                         g_sys5msflag = 0;
  193.                         process();        
  194.                         sprintf(tw,"%3.2f %x",num,ADC_value);
  195.                         sprintf(bf,"%d",k);
  196.                         LCD_Write_String(7,0,bf);
  197.                         LCD_Write_String(1,1,tw);
  198.                         k++;
  199.                 }        
  200.         }
  201. }

复制代码


上官方下载实例然后仿真观察一下就知道哪里数据错误可

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top