• STC51单片机学习笔记10——AD测试(stc15w408as)


     main.h:

    /*--------------------------------------------------------------------------------

    采集ADC口(P1.3)的数据发送到串口显示
         MCU:             STC15W408AS
         开发板:             STC15W408AS开发板
         晶振:            内部时钟:11.0592MHz 波特率9600
    -------------------------------------------------------------------------------------*/
    /************************包含头文件***************************************************/

    #include
    #include
    #include

    //定义要采集AD通道
    #define ch    3        //即P1.3端口

    //sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
    //sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain

    /************************主函数******************************************************/
    void main()  
    {
         unsigned int res=0;
         unsigned char result[4]={0};

         P1M1=0;
         P1M0=0;

       InitSerialPort();         //初始化串口,波特率9600,8bit数据位,1停止位,无校验
         OpenADC_CHx(ch);

         while(1)
         {
                    //发送数据采集结果
                    //SendByte('\t');
                    SendString("AD_Value = ");
                    GetADCResult_Char(ch,result);
                    SendString(result);
                    //SendByte(GetADCResult_High(ch));
                    //SendByte(GetADCResult_Low(ch));
                    //换行
                    SendByte('\n');
                    //延时
                    Delay(30);
         }
    }  
    /*********************************The End****************************************/

    ADC.c:

    1. #include
    2. #include
    3. #include "intrins.h"
    4. code unsigned char decode_ch[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    5. /*----------------------------------------------------------------------
    6. 函数:打开采集通道ch
    7. 参数:ch取值:0~7
    8. ----------------------------------------------------------------------*/
    9. void OpenADC_CHx(unsigned char ch)
    10. {
    11. P1ASF |= decode_ch[ch]; //打开采集通道
    12. ADC_RES = 0; //Clear previous result
    13. ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    14. Delay(2); //ADC power-on and delay
    15. }
    16. /*----------------------------------------------------------------------
    17. 函数:关闭采集通道ch
    18. 参数:ch取值:0~7
    19. ----------------------------------------------------------------------*/
    20. void CloseADC_CHx(unsigned char ch)
    21. {
    22. P1ASF &= ~decode_ch[ch]; //关闭采集通道
    23. }
    24. /*----------------------------------------------------------------------
    25. 函数:获取采集数据
    26. 参数:ch取值0~7,代表0-7通道号
    27. 返回值:10bit返回值
    28. -----------------------------------------------------------------------*/
    29. unsigned int GetADCResult(unsigned char ch)
    30. {
    31. unsigned int res = 0;
    32. ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    33. _nop_(); //Must wait before inquiry
    34. _nop_();
    35. _nop_();
    36. _nop_();
    37. while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    38. ADC_CONTR &= ~ADC_FLAG; //Close ADC
    39. res = ADC_RES;
    40. res = res << 2;
    41. res = res + (0x03&ADC_RESL);
    42. return res; //Return ADC result
    43. }
    44. /*----------------------------------------------------------------------
    45. 函数:获取采集数据,结果以4个数字格式存储
    46. 参数:ch取值0~7,代表0-7通道号
    47. 返回值:返回采集结果,并分解为4个数字存储到数组中,方便数显使用
    48. -----------------------------------------------------------------------*/
    49. void GetADCResult_Number(unsigned char ch,unsigned char* ptr)
    50. {
    51. unsigned int res = 0;
    52. ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    53. _nop_(); //Must wait before inquiry
    54. _nop_();
    55. _nop_();
    56. _nop_();
    57. while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    58. ADC_CONTR &= ~ADC_FLAG; //Close ADC
    59. res = ADC_RES;
    60. res = res << 2;
    61. res = res + (0x03&ADC_RESL);
    62. *ptr = res/1000;
    63. *(ptr+1) = (res % 1000)/100;
    64. *(ptr+2) = ((res % 1000)%100)/10;
    65. *(ptr+3) = ((res % 1000)%100)%10;
    66. }
    67. /*----------------------------------------------------------------------
    68. 函数:获取采集数据,结果以4个字符格式存储
    69. 参数:ch取值0~7,代表0-7通道号
    70. 返回值:返回采集结果,并分解为4个字符存储到数组中,方便串口发送使用
    71. -----------------------------------------------------------------------*/
    72. void GetADCResult_Char(unsigned char ch,unsigned char* ptr)
    73. {
    74. unsigned int res = 0;
    75. ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    76. _nop_(); //Must wait before inquiry
    77. _nop_();
    78. _nop_();
    79. _nop_();
    80. while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    81. ADC_CONTR &= ~ADC_FLAG; //Close ADC
    82. res = ADC_RES;
    83. res = res << 2;
    84. res = res + (0x03&ADC_RESL);
    85. *ptr = res/1000+0x30;
    86. *(ptr+1) = (res % 1000)/100+0x30;
    87. *(ptr+2) = ((res % 1000)%100)/10+0x30;
    88. *(ptr+3) = ((res % 1000)%100)%10+0x30;
    89. }
    90. /*----------------------------------------------------------------------
    91. 函数:获取采集数据,返回结果的高字节
    92. 参数:ch取值0~7,代表0-7通道号
    93. 返回值:返回采集结果高字节
    94. -----------------------------------------------------------------------*/
    95. unsigned char GetADCResult_High(unsigned char ch)
    96. {
    97. ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    98. _nop_(); //Must wait before inquiry
    99. _nop_();
    100. _nop_();
    101. _nop_();
    102. while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    103. ADC_CONTR &= ~ADC_FLAG; //Close ADC
    104. return ADC_RES;
    105. }
    106. /*----------------------------------------------------------------------
    107. 函数:获取采集数据,返回结果的低字节
    108. 参数:ch取值0~7,代表0-7通道号
    109. 返回值:返回采集结果低字节
    110. -----------------------------------------------------------------------*/
    111. unsigned char GetADCResult_Low(unsigned char ch)
    112. {
    113. ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    114. _nop_(); //Must wait before inquiry
    115. _nop_();
    116. _nop_();
    117. _nop_();
    118. while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    119. ADC_CONTR &= ~ADC_FLAG; //Close ADC
    120. return ADC_RESL;
    121. }
    122. /*----------------------------------------------------------------------
    123. 函数:延时
    124. -----------------------------------------------------------------------*/
    125. void Delay(unsigned int n)
    126. {
    127. unsigned int x;
    128. while (n--)
    129. {
    130. x = 5000;
    131. while (x--);
    132. }
    133. }

    ADC.h:

    1. #ifndef _ADC_H_
    2. #define _ADC_H_
    3. /*Define ADC operation const for ADC_CONTR*/
    4. #define ADC_POWER 0x80 //ADC power control bit
    5. #define ADC_FLAG 0x10 //ADC complete flag
    6. #define ADC_START 0x08 //ADC start control bit
    7. #define ADC_SPEEDLL 0x00 //420 clocks
    8. #define ADC_SPEEDL 0x20 //280 clocks
    9. #define ADC_SPEEDH 0x40 //140 clocks
    10. #define ADC_SPEEDHH 0x60 //70 clocks
    11. void OpenADC_CHx(unsigned char ch);
    12. void CloseADC_CHx(unsigned char ch);
    13. unsigned int GetADCResult(unsigned char ch);
    14. void GetADCResult_Number(unsigned char ch,unsigned char* ptr);
    15. void GetADCResult_Char(unsigned char ch,unsigned char* ptr);
    16. unsigned char GetADCResult_High(unsigned char ch);
    17. unsigned char GetADCResult_Low(unsigned char ch);
    18. void Delay(unsigned int n);
    19. #endif

    USART.c:

    1. #include
    2. #include
    3. unsigned char *pchar; //定义一个全局指针
    4. //----------------------------------------------------------
    5. // 函数名称:void IniSerialPort(void)
    6. // 函数功能:串口初始化
    7. //----------------------------------------------------------
    8. void InitSerialPort(void)
    9. {
    10. SCON = 0x50; //8位数据,可变波特率
    11. AUXR |= 0x01;
    12. AUXR |= 0x04; //定时器时钟为Fosc,1T模式
    13. T2L = 0xE0; //定时器初值,内部时钟11.0592M,波特率9600
    14. T2H = 0xFE; //定时器初值
    15. AUXR |= 0x10; //启动定时器
    16. //ES=1; //串口中断开关,采用查询法时不用打开中断
    17. REN=1; //串口为工作方式1,允许接收数据
    18. SM0=0; //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定
    19. SM1=1;
    20. }
    21. //----------------------------------------------------------
    22. // 函数名称:unsigned char ReceiveByte(void)
    23. // 函数功能:查询法接收一个字节
    24. //----------------------------------------------------------
    25. unsigned char ReceiveByte(void)
    26. {
    27. unsigned char rbyte;
    28. while(!RI); //查询接收标志位,是否有数据到达缓冲区
    29. RI=0; //清零接收标志位
    30. rbyte=SBUF; //从缓冲区读取数据
    31. return rbyte;
    32. }
    33. //----------------------------------------------------------
    34. // 函数名称:void SendByte(unsigned char sbyte)
    35. // 函数功能:串口发送一个字节
    36. //----------------------------------------------------------
    37. void SendByte(unsigned char sbyte)
    38. {
    39. SBUF=sbyte; //发送数据
    40. while(!TI); //等待发送完成
    41. TI=0; //清零发送标志位
    42. }
    43. //----------------------------------------------------------
    44. // 函数名称:void SendString(unsigned char *pstr)
    45. // 函数功能:串口发送一个字符串
    46. //----------------------------------------------------------
    47. void SendString(unsigned char *pstr)
    48. {
    49. while(*pstr!='\0') //字符串是否发完
    50. {
    51. SendByte(*pstr); //发送字符串数据
    52. pstr++; //指向下一个字符
    53. }
    54. }
    55. //----------------------------------------------------------
    56. // 函数名称:void SerialPortInte(void)
    57. // 函数功能:串口中断方式接收一个字符
    58. //----------------------------------------------------------
    59. void SerialPortInte(void) interrupt 4
    60. {
    61. RI=0; //清零接收标志位
    62. *pchar=SBUF; //读取缓冲区的数据
    63. }
    64. /**********************************THE END**********************************/

    USART.h:

    1. #ifndef _USART_H_
    2. #define _USART_H_
    3. extern unsigned char *pchar;
    4. void InitSerialPort(void); //串口初始化设置
    5. unsigned char ReceiveByte(void); //串口查询法接收一个字节
    6. void SendByte(unsigned char sbyte); //串口发送一个字节
    7. void SendString(unsigned char *pstr); //串口发送一个字符串
    8. #endif

    完整资料打包:

    STC51单片机学习笔记10-AD测试(stc15w408as)资源-单片机文档类资源-CSDN下载

  • 相关阅读:
    【软件测试】自动化测试selenium(二)
    PCL 曲率 结构体
    MySQL数据库-备份
    动态规划:子序列问题(C++)
    【owt】owt-client-native-p2p-e2e-test vs2017构建 3 : 无 测试单元对比, 手动生成vs项目
    MySQL–第4关:查询用户日活数及支付金额
    redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池
    【更新】囚生CYのMemo(20231118~)
    ts中的泛型
    直流有刷电机编码器测速基于STM32F302R8+X-NUCLEO-IHM07M1
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127629123