[资料分享] ADS7818驱动程序--C51

[复制链接]
673|0
 楼主| xyz549040622 发表于 2020-1-27 14:12 | 显示全部楼层 |阅读模式
  1. 时间:    2008-7
  2. 子程序名:ADS7818
  3. 程序功能:控制模拟/数字转换器ADS7818的工作
  4. 程序入口:引脚P1.0(输入信号) ;采样/保持转换控制信号CONV      
  5.      引脚P1.1(输入信号) ;串行数据输出DATA
  6.      引脚P1.2(输入信号) ;串行时钟信号CLK

  7. ******************************************************************/
  8. #include<reg52.h>
  9. #include<intrins.h>
  10. #define uint unsigned int
  11. #define uchar unsigned char

  12. sbit Conv=P1^0;    //采样/保持转换控制信号
  13. sbit Data =P1^1;    //串行数据输出
  14. sbit Clk =P1^2;     //串行时钟信号

  15. uint result;            //保存十二位值(结果)
  16. uint temp;

  17. // 数码管驱动相关接口
  18. /*sbit SDATA_595 = P2^0 ;       //串行数据输入
  19. /sbit SCLK_595 = P2^1;       //移位时钟脉冲
  20. /sbit RCK_595   = P2^2;      //输出锁存器控制脉冲
  21. /code uchar TAB[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
  22. uchar sz[3];
  23. uint get;
  24. */
  25. /***********延时子函数***********************/
  26. void delay(uint z)
  27. {
  28.    uint x,y;
  29. for(x=z;x>0;x--)
  30.     for(y=113;y>0;y--);
  31. }

  32. /******************ADS转换读取************************/
  33. uint ADS_7818()
  34. {
  35. char i;              //用于12位数字的计数
  36. result=0;
  37. Conv=1;
  38. Conv=0;              //产生Conv信号的下跳沿,触发采样到保持的转换
  39. Clk=0;           //CLK信号清零
  40. Clk=1;               //产生第一个时钟信号

  41. for(i=11;i>=0;i--)    //12位数的取样循环
  42. {      
  43.    Clk=0;        //循环中产生十二个时钟信号(加之前的),全过程至少要十三个时钟信号
  44.    Clk=1;
  45. // if(Data==1)
  46.    result|=Data;
  47.    Clk=0;
  48.    result<<=1;        
  49. }
  50. Clk=0;
  51. Clk=1;
  52. Clk=0;
  53. Clk=1;                //等待系统稳定(也可以不要)
  54. Clk=0;
  55. Conv=1;               //CONV拉高,即CONV信号复位
  56.     return(result);        //返回值   
  57. }
  58. /*
  59. static void WR_595(unsigned char data num2 )
  60. {
  61.    uchar data count1;
  62.    
  63.    for(count1=0;count1<=7;count1++)
  64.    {
  65.      if((num2&0x80)==0x80) //最高位为1,则向SDATA_595发送1
  66.     SDATA_595=1;        //发出数据的最高位
  67. else
  68.     SDATA_595=0;

  69.    num2<<=1;         //右移位
  70.    SCLK_595=0;    //产生上生沿
  71.          SCLK_595=1;
  72.    
  73. }

  74. }
  75.    */
  76. /********************打开锁存,更新74595输出子程序************/                     

  77. //static void Out_595(void)
  78. //{
  79. // RCK_595=0;
  80. // _nop_();
  81. // _nop_();
  82. // RCK_595=1; /*上升沿锁存数据*/

  83. //}
  84. /****************************算法************************/
  85. //void calculate(void)   //算法
  86. // {
  87. //   sz[0]=(get/1000);
  88. // sz[1]=get/100%10;
  89. // sz[2]=get/10%10;
  90. // sz[3]=get%10;

  91. // }         

  92. /******************ADS转换读取*******************************/
  93. /*
  94. void disp(void)
  95. {
  96.    uchar j,m;
  97. temp=ADS_7818();
  98. get=temp;
  99. P0=get;
  100.     get=temp*5.0*1000/0xfff;
  101. calculate();
  102.     if(sz[0]==0)
  103. {
  104.    j=TAB[m]&0x7F;   
  105. }
  106. else
  107.    j=TAB[m];
  108. WR_595(TAB[sz[0]]);
  109. WR_595(0xfd);
  110. Out_595();
  111. WR_595(TAB[sz[1]]);
  112. WR_595(0xfe);
  113. Out_595();
  114. WR_595(TAB[sz[2]]);
  115. WR_595(0xfb);
  116. Out_595();
  117. WR_595(TAB[sz[3]]);
  118. WR_595(0xf7);
  119. Out_595();
  120. WR_595(0x00);
  121. WR_595(0xff);
  122. Out_595();
  123. }
  124. */
  125. void wa(void)
  126. {
  127.     uint get;
  128.     temp=ADS_7818();
  129. get=temp;
  130. P2=get;
  131. }
  132. /****************主程序********************************/
  133. void main()
  134. {

  135. while(1)
  136. {
  137.    wa();   
  138. }
  139. }


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

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部