找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5506|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机P1口的数据采样(ADC)驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:51773 发表于 2013-7-19 02:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "reg52.h"
  2. #include "intrins.h"

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

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. /*Declare SFR associated with the ADC */
  8. sfr ADC_CONTR   =   0xBC;           //ADC control register
  9. sfr ADC_RES     =   0xBD;           //ADC high 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. /*Define ADC operation const for ADC_CONTR*/
  13. #define ADC_POWER   0x80            //ADC power control bit
  14. #define ADC_FLAG    0x10            //ADC complete flag
  15. #define ADC_START   0x08            //ADC start control bit
  16. #define ADC_SPEEDLL 0x00            //420 clocks
  17. #define ADC_SPEEDL  0x20            //280 clocks
  18. #define ADC_SPEEDH  0x40            //140 clocks
  19. #define ADC_SPEEDHH 0x60            //70 clocks

  20. void InitUart();
  21. void InitADC();
  22. void SendData(BYTE dat);
  23. BYTE GetADCResult(BYTE ch);
  24. void Delay(WORD n);
  25. void ShowResult(BYTE ch);
  26. /*
  27. void main()
  28. {   InitUart();                     //Init UART, use to show ADC result
  29.     InitADC();                      //Init ADC sfr
  30.     while (1)
  31.     {
  32.         ShowResult(0);              //Show Channel0
  33.     }
  34. }
  35. */

  36. /*----------------------------
  37. Send ADC result to UART
  38. ----------------------------*/
  39. void ShowResult(BYTE ch)
  40. {
  41.     SendData(ch);                   //Show Channel NO.
  42.     SendData(GetADCResult(ch));     //Show ADC high 8-bit result

  43. //if you want show 10-bit result, uncomment next line
  44. //    SendData(ADC_LOW2);             //Show ADC low 2-bit result
  45. }

  46. /*----------------------------
  47. Get ADC result
  48. ----------------------------*/
  49. BYTE GetADCResult(BYTE ch)
  50. {
  51.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  52.     _nop_();                        //Must wait before inquiry
  53.     _nop_();
  54.     _nop_();
  55.     _nop_();
  56.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  57.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  58.     return ADC_RES;                 //Return ADC result
  59. }

  60. /*----------------------------
  61. Initial UART
  62. ----------------------------*/
  63. void InitUart()
  64. {
  65.     SCON = 0x5a;                    //8 bit data ,no parity bit
  66.     TMOD = 0x20;                    //T1 as 8-bit auto reload
  67.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
  68.     TR1 = 1;                        //T1 start running
  69. }

  70. /*----------------------------
  71. Initial ADC sfr
  72. ----------------------------*/
  73. void InitADC()
  74. {
  75.     P1ASF = 0xe7;                   //Open 8 channels ADC function
  76.     ADC_RES = 0;                    //Clear previous result
  77.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  78.     Delay(2);                       //ADC power-on and delay
  79. }
  80. /*----------------------------
  81. Send one byte data to PC
  82. Input: dat (UART data)
  83. Output:-
  84. ----------------------------*/
  85. void SendData(BYTE dat)
  86. {   while (!TI);                    //Wait for the previous data is sent
  87.     TI = 0;                         //Clear TI flag
  88.     SBUF = dat;                     //Send current data
  89. }
  90. /*----------------------------
  91. Software delay function
  92. ----------------------------*/
  93. void Delay(WORD n)
  94. {   WORD x;
  95.     while (n--)
  96.     {   x = 5000;
  97.         while (x--);
  98.     }
  99. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:390650 发表于 2018-9-22 15:57 | 只看该作者
这跟STC的一样么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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