[资料分享] ADS7841驱动-ATmega64

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

本帖子中包含更多资源

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

×
 楼主| xyz549040622 发表于 2019-12-26 16:18 | 显示全部楼层
  1. ADS7841接线:1、7、9脚接VCC=5V
  2.                            3、6、10、11脚接GND
  3.                           4、5脚悬空
  4.                            12----16脚接PD4----PD0
  5.                            2脚加外部输入电压,8脚接2.5V外部参考电压
  6. 以下是main.c
  7. /******************************************************************************
  8.                               ADS7841驱动程序
  9. * * 主控芯片:ATmega64
  10. * * 编译环境:ICCAVR6.31A
  11. ******************************************************************************/
  12. #include <iom64v.h>
  13. #include <macros.h>
  14. #include "delay.h"
  15. #include "ads7841.h"
  16. #include "LCD1602.h"
  17. //----------------------ADS7841控制字节----------------------------------------
  18. #define control_byte 0b10011000
  19. //bit      val description
  20. //bit7       1      start,恒为1
  21. //bit6,5,4   001    选择CH0为+IN
  22. //bit4       1      选择为单端输入
  23. //bit2       X      外部MODE接GND,该位无作用,恒为12位
  24. //bit1,0     00     转换期间ADC为掉电模式
  25. void port_init(void)
  26. {
  27.    PORTA = 0xFF;//将所有端口初始化为输入,打开上拉
  28.    DDRA = 0x00;
  29.    PORTB = 0xFF;
  30.    DDRB = 0x00;
  31.    PORTC = 0xFF; 
  32.    DDRC = 0x00;
  33.    PORTD = 0xFF;
  34.    DDRD = 0x00;
  35.    PORTE = 0xFF;
  36.    DDRE = 0x00;
  37.    PORTF = 0xFF;
  38.    DDRF = 0x00;
  39.    PORTG = 0xFF;
  40.    DDRG = 0x00;
  41. }
  42. void main()
  43. {
  44. unsigned int result;
  45. unsigned char i,array[4],table[]="0123456789";
  46. port_init();                            //端口初始化
  47. LCD1602_init();                         //1602液晶初始化
  48. ads7841_init();                         //ADS7841初始化

  49. LCD_write_string(0x80,"result:");
  50. while(1)
  51. {
  52.    ads7841_start();                    //启动ADS7841,即拉低CS
  53.    delay_nus(10);
  54.    result=ads7841_W_R(control_byte);   //发送控制字,并得到转换数据
  55.     result&=0b0000111111111111;         //屏蔽掉高四位
  56.    delay_nus(10);
  57.    ads7841_finish();                   //停止ADS7841,即拉高CS
  58.    for(i=0;i<4;i++)                    //以下均为显示部分
  59.    {
  60.     array[i]=result%10;//
  61.     result/=10;
  62.    }
  63.    for(i=0;i<4;i++)
  64.    {
  65.     LCD_write_onechar(0x87+i,table[array[3-i]]);
  66.    }
  67.    delay_nms(300);
  68. }
  69. }
  70. 以下是ads7841.h

  71. #ifndef _ads7841_h
  72. #define _ads7841_h
  73. #define DCLK       PD0
  74. #define DCLK_ddr   DDRD
  75. #define DCLK_port PORTD
  76. #define DCLK_pin   PIND
  77. #define CS         PD1
  78. #define CS_ddr     DDRD
  79. #define CS_port    PORTD
  80. #define CS_pin     PIND
  81. #define DIN        PD2
  82. #define DIN_ddr    DDRD
  83. #define DIN_port   PORTD
  84. #define DIN_pin    PIND
  85. #define BUSY       PD3
  86. #define BUSY_ddr   DDRD
  87. #define BUSY_port PORTD
  88. #define BUSY_pin   PIND
  89. #define DOUT       PD4
  90. #define DOUT_ddr   DDRD
  91. #define DOUT_port PORTD
  92. #define DOUT_pin   PIND
  93. #define ads7841_start() CS_port&=~(1<<CS) //启运ADS7841
  94. #define ads7841_finish() CS_port|=(1<<CS)   //停止ADS7841
  95. void ads7841_init(void);
  96. unsigned int ads7841_W_R(unsigned char byte);
  97. #endif
  98. 以下是ads7841.c
  99. #include <iom64v.h>
  100. #include <macros.h>
  101. #include "delay.h"
  102. #include "ads7841.h" 
  103. /*******************************************************************************
  104. * * 函数名称:ads7841_init()
  105. * * 函数功能:初始化ADS7841端口
  106. * * 备    注:无
  107. *******************************************************************************/
  108. void ads7841_init(void)
  109. {
  110. DCLK_port&=~(1<<DCLK);             //时钟端初始化为输出低电平
  111. DCLK_ddr|=(1<<DCLK);

  112. CS_port|=(1<<CS);          //片选端初始化为输出高电平
  113. CS_ddr|=(1<<CS);               //即不选中ADS7841

  114. DIN_port&=~(1<<DIN);              //数据输入端初始化为输出低电平
  115. DIN_ddr|=(1<<DIN);

  116. BUSY_port|=(1<<BUSY);             //忙信号初始化为输入,打开上拉
  117. BUSY_ddr&=~(1<<BUSY);

  118. DOUT_port|=(1<<DOUT);             //数据输出初始化为输入,打开上拉
  119. DOUT_ddr&=~(1<<DOUT);
  120. }
  121. /*******************************************************************************
  122. * * 函数名称:ads7841_W_R
  123. * * 函数功能:向ADS7841写入控制字节,读出转换好的数
  124. * * 输入参数:unsigned char byte : 控制字节
  125.                unsigned int result: AD转换好的数
  126. * * 备    注:数据从高位到低位写入,从高位到低位读出
  127. *******************************************************************************/
  128. unsigned int ads7841_W_R(unsigned char byte)
  129. {
  130. unsigned char i,temp;
  131. unsigned int result=0;
  132.    for(i=0;i<8;i++)         //8位数据计数
  133.    {
  134.   
  135.    DCLK_port&=~(1<<DCLK);    //拉低时钟端
  136.    if(byte&0x80)      //当前位是否是1
  137.    {
  138.        DIN_port|=(1<<DIN);       //当前位是1,拉高数据端
  139.    }
  140.    else        
  141.    {
  142.        DIN_port&=~(1<<DIN);   //当前位是0,拉低数据端
  143.    } 
  144.    delay_nus(10);      //调整时钟和脉冲宽度
  145.    DCLK_port|=(1<<DCLK);    //时钟上升沿
  146.    delay_nus(10);
  147.    byte<<=1;       //数据左移1位,为送出新数据位做准备
  148.    }
  149. delay_nus(10);
  150. DCLK_port&=~(1<<DCLK);        //拉低时钟端
  151. delay_nus(10);
  152. i=BUSY_pin;                       //读BUSY的状态
  153. delay_nus(10);
  154. if(i&(1<<BUSY))                   //如果为高则说明转换完成,应将其读出
  155. {
  156. //------------------------以下先读出高八位-------------------------------------  
  157.    for(i=1;i<=8;i++)            
  158.    {
  159.     result<<=1;        //保存读入的数据位
  160.    
  161.     DCLK_port|=(1<<DCLK);    //时钟上升沿
  162.     delay_nus(10);
  163.     DCLK_port&=~(1<<DCLK);   //拉低时钟端
  164.     delay_nus(10);
  165.     if(DOUT_pin&(1<<DOUT))
  166.     {
  167.      result|=0x01;
  168.     }
  169.     else
  170.     {
  171.      result&=0xfe;
  172.     }
  173.    }
  174. //-----------------------以下读出低四位----------------------------------------
  175.    for(i=1;i<=4;i++)
  176.    {
  177.     temp<<=1;        //保存读入的数据位
  178.    
  179.     DCLK_port|=(1<<DCLK);    //时钟上升沿
  180.     delay_nus(10);
  181.     DCLK_port&=~(1<<DCLK); //拉低时钟端
  182.     delay_nus(10);
  183.     if(DOUT_pin&(1<<DOUT))
  184.     {
  185.      temp|=0x01;
  186.     }
  187.     else
  188.     {
  189.      temp&=0xfe;
  190.     }
  191.    }
  192.    for(i=1;i<=4;i++)           //再给ADS7841四个时钟
  193.    {
  194.     DCLK_port|=(1<<DCLK);   //时钟上升沿
  195.     delay_nus(10);          //调整时钟和脉冲宽度
  196.     DCLK_port&=~(1<<DCLK); //拉低时钟端
  197.     delay_nus(10);          //调整时钟和脉冲宽度
  198.    }
  199. }
  200. result=(result<<4)+temp;        //将结果合成,返回
  201. return result; 
  202. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

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