请大家帮我看看这个基于STC15W408AS的AD转换程序

2019-03-24 17:08发布

我用74HC595,串转并输出到数码管,但是不能正常输出,麻烦大佬们帮我看下程序,也给我点用这个单片机检测电压并输出到数码管的建议,蟹蟹不知道哪里出了问题,请大神们帮下忙

  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC 18432000L
  4. #define BAUD 9600

  5. typedef unsigned char  BYTE;
  6. typedef unsigned int   WORD;
  7. BYTE code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  8. sbit SRCLK=P1^2;
  9. sbit RCLK=P1^3;
  10. sbit SER=P1^4;








  11. sfr  AUXR  =  0x8e;                                   //辅助寄存器
  12.                                                                   
  13. sfr  ADC_CONTR  =  0xBC;                         //ADC控制寄存器
  14. sfr  ADC_RES  =  0xBD;                                    //ADC高8位结果
  15. sfr  ADC_LOW2  =  0xBE;                                 //ADC低2位结果
  16. sfr  P1ASF  =  0x9D;                                //P1口第2功能控制寄存器

  17. #define ADC_POWER      0x80                         //ADC电源控制位
  18. #define ADC_FLAG       0x10                         //ADC完成标志
  19. #define ADC_START      0x08                         //ADC起始控制位
  20. #define ADC_SPEEDLL    0x00                         //540个时钟
  21. #define ADC_SPEEDL     0x20                         //360个时钟
  22. #define ADC_SPEEDH     0x40                         //180个时钟
  23. #define ADC_SPEEDHH    0x60                         //90个时钟


  24. void InitADC();
  25. void Hc595SendByte(BYTE dat);

  26. BYTE GetADCResult(BYTE ch);
  27. void Delay(WORD n);
  28.         BYTE  ch=0           ;
  29. void main()
  30. {
  31.         InitADC();                                                  //初始化ADC
  32.         IE=0xa0;                                                  //打开ADC转换中断

  33.         while(1)
  34.           {

  35.           }
  36. }

  37. /*---------------------------------------------
  38. ADC          中断服务程序
  39. ---------------------------------------------*/
  40. void adc_isr() interrupt 5 using 1
  41. {

  42.                   double x;
  43.              WORD a,b;
  44.                 int i;
  45.             BYTE outData[3];

  46.          ADC_CONTR&=!ADC_FLAG;                                                                                 // 清除ADC中断标志
  47.          a=ADC_RES;
  48.          b=ADC_LOW2;
  49.          a=a*4+b;
  50.          x=5.0*a/1023.0;

  51.      x=x/1.0;                                                
  52.       for(i = 0;i<3;i++)
  53.           {
  54.              outData[i] = (unsigned char)x;
  55.              x = x - outData[i];
  56.              x = x*10;
  57.           }
  58.              
  59.                  Hc595SendByte(smgduan[outData[0]]);                                          //此处先让其输出第一位,以测试
  60.                  Delay(500);
  61.                                                                 

  62.          ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
  63. }



  64. /*---------------------------------------------
  65. 读取ADC结果
  66. ---------------------------------------------*/
  67. /*BYTE GetADCResult(BYTE ch)
  68. {
  69.        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  70.            _nop_();                                                                                          //等待4个NOP
  71.            _nop_();                                                                                          //CLOSE ADC
  72.            _nop_();
  73.            _nop_();
  74.            while(!(ADC_CONTR&ADC_FLAG));
  75.            ADC_CONTR&=~ADC_FLAG;

  76.            return ADC_RES;                                                                          //返回ADC结果
  77. }           */


  78. /*---------------------------------------------
  79. 初始化ADC
  80. ---------------------------------------------*/
  81. void InitADC()
  82. {                                                                                                         
  83.            P1ASF=0x01;                                                                                 //设置P1口为AD口
  84.            ADC_RES=0;                                                         //清除结果寄存器
  85.            ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;                                          
  86.            Delay(20);                                                                                     //ADC上电并延时
  87. }



  88. /*******************************************************************************
  89. * 函 数 名         : Hc595SendByte(u8 dat)
  90. * 函数功能                   : 向74H595发送一个字节的数据
  91. * 输    入         : 无
  92. * 输    出         : 无
  93. *******************************************************************************/
  94. void Hc595SendByte(BYTE dat)
  95. {
  96.         BYTE a;

  97.         SRCLK =1;
  98.         RCLK = 1;

  99.         for(a=0;a<8;a++)                 //发送8位数
  100.         {
  101.                 SER = dat >> 7;                 //从最高位开始发送
  102.                 dat <<= 1;

  103.                 SRCLK = 0;                         //发送时序
  104.                 _nop_();
  105.                 _nop_();
  106.                 SRCLK = 1;       
  107.         }
  108.         RCLK = 0;
  109.         _nop_();
  110.         _nop_();
  111.         RCLK = 1;
  112. }


  113. /*---------------------------------------------
  114. 软件延时
  115. ---------------------------------------------*/
  116. void Delay(WORD n)
  117. {

  118.            WORD x;

  119.            while(n--)
  120.              {
  121.                          x=5000;
  122.                          while(x--);
  123.                  }
  124. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
billliu66
1楼-- · 2019-03-24 22:14
 精彩回答 2  元偷偷看……
菁华如风
2楼-- · 2019-03-24 22:17
我又检查了下,是我昨天把数码管的高低位连接乱了(尴尬……),但是,现在的问题是,AD转换的数值不会及时更新,要断电后重新上电才能检测到新的待测电压。由于手头没有74HC595的芯片,所以借用单片机上的,因此595和STC15W408AS单片机是分别供电的。这又出现了个问题,要先打开595的电源,再给单片机供电才能正常显示…………
IMG_20171206_184138.jpg

IMG_20171206_184242.jpg
菁华如风
3楼-- · 2019-03-25 00:25
billliu66 发表于 2017-12-6 16:35
AD中断函数,将“Hc595SendByte(smgduan[outData]); “放在for循环中的最后面。去掉”Hc595SendByte(smgdua ...

我觉得你的方法不太可行。Hc595SendByte(smgduan[outData]);是用来显示处理得到的最终数据的个位数值的啊。x的数值为4.23,则我就是要用数组将各位分开的啊。

一周热门 更多>