[资料分享] ADS1255驱动--51单片机

[复制链接]
 楼主| xyz549040622 发表于 2019-12-26 21:36 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| xyz549040622 发表于 2019-12-26 21:37 | 显示全部楼层
  1. #include <c8051f120.h>
  2. #include <ADS1255.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit SCLK=P0^2;
  6. sbit MISO=P0^3;
  7. sbit MOSI=P0^4;
  8. sbit INT0=P1^2;
  9. float snow,snow1;
  10. unsigned long snow2,snow3,snow4,snow5,snow6;
  11. uchar date1,date2,date3;
  12. uchar date4,date5,date6,date7,date8,date9;                        
  13. void PORT_Init (void);

  14. /****************************************
  15. 功能描述:微秒可控延时
  16. 设计人:孙占山
  17. 说明:进行微秒延时,注意while(--i),不能为while(i--)
  18. *****************************************/

  19. void delayus(uchar i)                                                  
  20. {
  21. while(--i);
  22. }

  23. /****************************************
  24. 功能描述:毫可控秒延时
  25. 设计人:孙占山
  26. 说明:进行毫秒延时,可以改变时间
  27. *****************************************/
  28. /*
  29. void delayms(void)
  30. {
  31. uchar i,j,k;
  32. for(i=0;i<20;i++)
  33.   for(j=0;j<248;j++)
  34.    for(k=0;k<248;k++);
  35. }
  36. */
  37. void delayms(uchar k)
  38. {
  39. uchar i,j;
  40. for(i=0;i<k;i++)
  41.   for(j=0;j<248;j++);
  42.    
  43. }

  44. /****************************************
  45. 功能描述:ADS1255单字节写入
  46. 设计人:孙占山
  47. 说明:在下降沿写入数据,就是在SCLK=1的时候写1,这样ADS1255在SCLK由1变为0时就能取到数据
  48. *****************************************/

  49. void ADS1255_write_bit(uchar temp)
  50. {
  51. uchar i;
  52. SCLK=0;
  53. for(i=0;i<8;i++)
  54. {
  55.   temp=temp<<1;
  56.   SCLK=0;
  57.   delayus(2);
  58.   SCLK=1;
  59.   delayus(1);
  60.   MOSI=CY; //在下降沿的时候写入数据
  61.   delayus(1);
  62.   SCLK=0;
  63.   delayus(1);
  64.   }
  65. }

  66. /****************************************
  67. 功能描述:ADS1255单字节读出
  68. 设计人:孙占山
  69. 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了
  70. 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定)
  71. *****************************************/

  72. uchar ADS1255_read_bit(void)
  73. {
  74. uchar i;
  75. uchar date;
  76. SCLK=0;
  77. MISO=1;
  78. for(i=0;i<8;i++)
  79. {
  80.   date=date<<1;
  81.   SCLK=0;
  82.   delayus(2);
  83.   SCLK=1;
  84.   delayus(2);
  85.   date=date|MISO;//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可
  86.   SCLK=0;
  87.   }
  88.   return date;
  89. }

  90. /****************************************
  91. 功能描述:ADS1255的24位数据分三次读出
  92. 设计人:孙占山
  93. 说明:1:ADS1255是24位的AD转换器,24位数据可以分三个八位读出,然后再经过公式算出结果
  94.      2:公式有两种,一种是左移右移,一种是date1*65536+snow2*256+snow3
  95.          3:注意公式左移时不好,因为左移有进位,这样可能数据会变化,一般尽量采取右移
  96. *****************************************/

  97. float ADS1255_read(void)
  98. {
  99. date1=ADS1255_read_bit();
  100. date2=ADS1255_read_bit();
  101. date3=ADS1255_read_bit();
  102. //snow=((((snow|date1)<<8)|date2)<<8)|date3;
  103. //snow=snow<<8;
  104. snow=date1*65536+date2*256+date3;
  105. return snow;
  106. }

  107. /****************************************
  108. 功能描述:ADS1255 24位一起读出读出
  109. 设计人:孙占山
  110. 说明:上升沿读出数据,在SCLK由0变为1时数据输出,并且保持到下一个上升沿,等到SCLK=1以后,数据稳定了
  111. 再读出数据,因为在下一个上升沿时数据才会变化,所以可以等到SCLK=0时读出数据(因为这是的数值比较稳定)
  112. *****************************************/

  113. unsigned long ADS1255_24read(void)
  114. {
  115. uchar i;
  116. unsigned long date;
  117. SCLK=0;
  118. MISO=1;
  119. for(i=0;i<24;i++)
  120. {
  121.   date=date<<1;
  122.   SCLK=0;
  123.   delayus(2);
  124.   SCLK=1;
  125.   delayus(2);
  126.   SCLK=0;
  127.   date=date|MISO;//数据在上升沿输出,但是读的时候在SCLK=1后面到下个SCLK=1之前读出便可
  128.   }
  129.   date=date<<8;
  130.   return date;
  131. }

  132. /****************************************
  133. 功能描述:ADS1255写寄存器
  134. 设计人:孙占山
  135. 说明:根据要求写入寄存器和命令字
  136. *****************************************/

  137. void ADS1255_write_reg(uchar ADS1255_command,uchar ADS1255_data)
  138. {
  139. ADS1255_write_bit(ADS1255_command);
  140. ADS1255_write_bit(0x00);
  141. ADS1255_write_bit(ADS1255_data);
  142. delayms(248);
  143. }

  144. /****************************************
  145. 功能描述:ADS1255读寄存器
  146. 设计人:孙占山
  147. 说明:根据要求写入寄存器和命令字
  148. *****************************************/

  149. uchar ADS1255_read_reg(uchar ADS1255_command)
  150. {
  151. uchar reg_date;
  152. ADS1255_write_bit(ADS1255_command);
  153. ADS1255_write_bit(0x00);
  154. delayus(50);
  155. reg_date=ADS1255_read_bit();
  156. return reg_date;
  157. }

  158. /****************************************
  159. 功能描述:ADS1255唤醒
  160. 设计人:孙占山
  161. 说明:唤醒待机和同步
  162. *****************************************/
  163. void ADS1255_WAKEUP(void)
  164. {
  165. ADS1255_write_bit(0x00);
  166. }

  167. /****************************************
  168. 功能描述:ADS1255读一次数据命令
  169. 设计人:孙占山
  170. 说明:在DRDY为低时读出一个数据
  171. *****************************************/

  172. void ADS1255_RDATA(void)
  173. {
  174. ADS1255_write_bit(0x01);
  175. }

  176. /****************************************
  177. 功能描述:ADS1255连续数据命令
  178. 设计人:孙占山
  179. 说明:在DRDY为低时连续读出数据
  180. *****************************************/

  181. void ADS1255_RDATAC(void)
  182. {
  183. ADS1255_write_bit(0x03);
  184. }

  185. /****************************************
  186. 功能描述:ADS1255停止连续数据命令
  187. 设计人:孙占山
  188. 说明:在ADS1255连续输出24位当中的任何八位时写入,停止连续读数据
  189. *****************************************/

  190. void ADS1255_SDATAC(void)
  191. {
  192. ADS1255_write_bit(0x0F);
  193. }

  194. /****************************************
  195. 功能描述:偏移和增益自校准
  196. 设计人:孙占山
  197. 说明:偏移和增益自校准,也可以用STATUS寄存器中的ACAL来自校准
  198. *****************************************/

  199. void ADS1255_SELFCAL(void)
  200. {
  201. ADS1255_write_bit(0xf0);
  202. }

  203. /****************************************
  204. 功能描述:同步
  205. 设计人:孙占山
  206. 说明:同步用在命令的开始快速执行,紧接着用WAKE UP命令进行同步
  207. *****************************************/

  208. void ADS1255_SYNC(void)
  209. {
  210. ADS1255_write_bit(0xfc);
  211. }

  212. /****************************************
  213. 功能描述:复位
  214. 设计人:孙占山
  215. 说明:复位后不管ACAL位如何,都执行一个自校准
  216. *****************************************/

  217. void ADS1255_RESET(void)
  218. {
  219. ADS1255_write_bit(0xfe);
  220. }

  221. /****************************************
  222. 功能描述:ADS1255寄存器设置初始化
  223. 设计人:孙占山
  224. 说明:1:自校准可以通过写STATUS寄存器的ACAL位,还可以通过写SELFCAL命令来自校准
  225.      2:使能自校准,在写寄存器ADCON(PGA),DRATE(DR),STATUS(BUFEN)自动校准
  226.          3:在STATUS(BUFEN)与ACAL(自校准)位一起使能时,读出校准寄存器有错
  227. *****************************************/

  228. void ADS1255_init(void)
  229. {
  230. while(INT0==1);
  231. ADS1255_write_reg(0x50,0x04);
  232. delayus(1);
  233. //while(INT0==1);
  234. //ADS1255_write_reg(0x50,0x02); //写在STATUS(BUFEN)寄存器使能在BUFEN
  235. //delayus(1);                                          
  236. while(INT0==1);                         
  237. ADS1255_write_reg(0x51,0x01);
  238. delayus(1);
  239. while(INT0==1);
  240. ADS1255_write_reg(0x52,0x01);
  241. delayus(1);
  242. while(INT0==1);
  243. ADS1255_write_reg(0x53,0x92);
  244. delayus(1);
  245. while(INT0==1);
  246. ADS1255_write_reg(0x54,0x00);
  247. }
  248. void ADS1255_out_reg(void)
  249. {
  250.    while(INT0==1);
  251.    date4=ADS1255_read_reg(0x15);
  252.    while(INT0==1);
  253.    date5=ADS1255_read_reg(0x16);
  254.    while(INT0==1);
  255.    date6=ADS1255_read_reg(0x17);
  256.    while(INT0==1);
  257.    date7=ADS1255_read_reg(0x18);
  258.    while(INT0==1);
  259.    date8=ADS1255_read_reg(0x19);
  260.    while(INT0==1);
  261.    date9=ADS1255_read_reg(0x1a);
  262. }
  263. void main (void)
  264. {
  265.    unsigned char i,j;
  266.    WDTCN = 0xde;
  267.    WDTCN = 0xad;
  268.    SFRPAGE = CONFIG_PAGE;
  269.    PORT_Init ();
  270.    delayms(248);
  271.    ADS1255_RESET();           //复位
  272.    delayus(5);
  273.    ADS1255_init();
  274.    delayus(5);
  275.    //ADS1255_SELFCAL();        //通过写SELFCAL命令来自校准,可以与初始化中的STATUS(ACAL)互换
  276.    ADS1255_out_reg();
  277.    ADS1255_SYNC();
  278.    delayms(248);
  279.    ADS1255_WAKEUP();
  280.    delayus(5);
  281.            while(1)          //一次性读数据
  282.         {
  283.          for(j=0;j<50;j++)
  284.         {
  285.         while(INT0==1);
  286.     ADS1255_write_bit(0x01);
  287.         delayus(50);
  288.         snow4=ADS1255_read();
  289.         //delayms(248);
  290.         //snow5+=(snow4>>8);
  291.         snow5+=snow4;
  292.         }
  293.    
  294.         snow6=snow5/50;
  295.         snow5=0x00000000;
  296.         }         
  297. /*  
  298.    while(1)                //写寄存器,接着读寄存器
  299.   {
  300.    //while(INT0==1);
  301.    //ADS1255_write_bit(0x52);
  302.    //ADS1255_write_bit(0x01);
  303.    //ADS1255_write_bit(0x26);
  304.    //ADS1255_write_bit(0x03);
  305.    //delayms(248);
  306.    //delayms(248);

  307.   
  308.    while(INT0==1);
  309.    ADS1255_write_bit(0x12);
  310.    ADS1255_write_bit(0x01);
  311.    delayus(50);
  312.    snow2=ADS1255_read_bit();
  313.    snow3=ADS1255_read_bit();
  314.    delayms(248);
  315.   }
  316. */
  317. /*   //待机模式
  318.    while(1)
  319.    {
  320.    while(INT0==1);
  321.    ADS1255_write_bit(0xfd);
  322.    delayms(248);
  323.    delayms(248);
  324.    ADS1255_write_bit(0xff);
  325.    while(INT0==1);
  326.    ADS1255_write_bit(0x01);
  327.    delayus(50);
  328.    snow2=ADS1255_read();
  329.   }
  330.   */
  331. /*
  332. while(1)
  333. {  
  334.    while(INT0==1);         //建立输入复用器时间
  335.    ADS1255_write_bit(0x52);
  336.    ADS1255_write_bit(0x00);
  337.    ADS1255_write_bit(0x01);
  338.    delayus(10);
  339.    ADS1255_write_bit(0xfc);
  340.    delayus(10);
  341.    ADS1255_write_bit(0xff);
  342.    delayus(10);
  343.    ADS1255_write_bit(0x01);
  344.    delayus(10);
  345.    //snow1=ADS1255_read();
  346.    snow2=ADS1255_24read();
  347.    delayms(248);
  348.    while(INT0==1);         //建立输入复用器时间
  349.    ADS1255_write_bit(0x52);
  350.    ADS1255_write_bit(0x00);
  351.    ADS1255_write_bit(0x01);
  352.    delayus(10);
  353.    ADS1255_write_bit(0xfc);
  354.    delayus(10);
  355.    ADS1255_write_bit(0xff);
  356.    delayus(10);
  357.    ADS1255_write_bit(0x01);
  358.    delayus(10);
  359.    snow1=ADS1255_read();
  360.    //snow2=ADS1255_24read();
  361.    delayms(248);

  362. }

  363. */


  364. }
  365. void PORT_Init (void)
  366. {
  367.    XBR2    = 0x40;                     
  368. }

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

本版积分规则

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

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

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