[资料分享] ADS7843驱动程序--51单片机

[复制链接]
 楼主| xyz549040622 发表于 2019-12-21 11:34 | 显示全部楼层 |阅读模式
本帖最后由 xyz549040622 于 2019-12-21 15:47 编辑
  1. ADS7843驱动程序

  2. ADS7843是一个内置12位模数转换、低导通电阻模拟开关的串行接口芯片。供电电压2.7~5 V,参考电压VREF为1 V~+VCC,转换电压的输入范围为0~ VREF,最高转换速率为125 kHz。


  3. //=====================================================================
  4. //                    ADS7843 驱动程序(串行)
  5. //硬件连接: DCLK ——P0^0;
  6. //          CS    ——P0^1;
  7. //          DIN   ——P0^2;
  8. //          BUSY ——P0^3
  9. //          DOUT ——P0^4
  10. //          PENIRQ——P3^2;
  11. //          VDD--逻辑电源(+5V)
  12. //          VSS--GND(0V)
  13. //=====================================================================


  14. #include       //STC单片机头文件
  15. #include

  16. #define uint unsigned int
  17. #define uchar unsigned char

  18. sbit DCLK   = P0^0;               //时钟信号,下降沿有效
  19. sbit CS     = P0^1;               //片选信号,低电平有效
  20. sbit DIN    = P0^2;               //串行数据输入
  21. sbit BUSY   = P0^3;      //忙信号
  22. sbit DOUT   = P0^4;      //串行数据输出
  23. sbit PENIRQ = P3^2;      //键盘中断请求信号,低电平(负边沿)有效

  24. void Tranfer(char Data);
  25. uint average(uint a[8]);

  26. //====================================================================================
  27. //函数名称:void delay(uint us)
  28. //函数功能:延时子函数
  29. //入口参数:us 延时时间
  30. //出口参数:无
  31. //====================================================================================


  32. void delay(uint us)
  33. {
  34. while(us--);
  35. }

  36. //====================================================================================
  37. //函数名称:void ADS7843_start(void)
  38. //函数功能:ADS7843启动
  39. //入口参数:无
  40. //出口参数:无
  41. //====================================================================================
  42. void ADS7843_start(void)
  43. {
  44. DCLK=0;
  45. CS=1;
  46. DIN=1;
  47. DCLK=1;
  48. CS=0;
  49. }

  50. //====================================================================================
  51. //函数名称:void ADS7843_wr(uchar dat)
  52. //函数功能:写ADS7843
  53. //入口参数:dat 写入的数据
  54. //出口参数:无
  55. //====================================================================================
  56. void ADS7843_wr(uchar dat)
  57. {
  58. uchar count;
  59. DCLK=0;
  60. for(count=0;count<8;count++)
  61. {
  62.    dat<<=1;
  63.    DIN=CY;
  64.    DCLK=0;
  65.    _nop_();
  66.    _nop_();
  67.    _nop_();
  68.    DCLK=1;
  69.    _nop_();
  70.    _nop_();
  71.    _nop_();
  72. }
  73. }

  74. //====================================================================================
  75. //函数名称:uint ADS7843_rd(void)
  76. //函数功能:读ADS7843
  77. //入口参数:无
  78. //出口参数:读回的坐标值
  79. //====================================================================================
  80. uint ADS7843_rd(void)
  81. {
  82. uchar count=0;
  83. uint dat=0;
  84. for(count=0;count<12;count++)
  85. {
  86.    dat<<=1;
  87.    DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效
  88.    DCLK=0; _nop_();_nop_();_nop_();
  89.    if(DOUT)
  90.     dat++;
  91. }
  92. return(dat);
  93. }

  94. //====================================================================================
  95. //函数名称:void intr0_int()   
  96. //函数功能:外中断0中断服务函数
  97. //入口参数:无
  98. //出口参数:无
  99. //====================================================================================
  100. void intr0_int() interrupt 0 using 2   
  101. {
  102. uint X=0,Y=0,a[4],i, avex,avey,x[8],y[8];
  103. IE=0;        //关中断
  104. delay(100);   //中断后延时以消除抖动,使得采样数据更准确
  105. if(!PENIRQ)
  106. {
  107.    for(i=0;i<8;i++) //进行8次数据采集
  108.    {
  109.     ADS7843_start();
  110.     delay(2);
  111.     ADS7843_wr(0x90);//送控制字 10010000 即用差分方式读X坐标
  112.     delay(2);
  113.     DCLK=1;
  114.     _nop_();
  115.     _nop_();
  116.     _nop_();
  117.     _nop_();
  118.     DCLK=0;
  119.     _nop_();
  120.     _nop_();
  121.     _nop_();
  122.     _nop_();
  123.     X=ADS7843_rd(); //读X轴坐标
  124.     x[i]=X;
  125.     ADS7843_wr(0xD0); //送控制字 11010000 即用差分方式读Y坐标
  126.     DCLK=1;
  127.     _nop_();
  128.     _nop_();
  129.     _nop_();
  130.     _nop_();
  131.     DCLK=0;
  132.     _nop_();
  133.     _nop_();
  134.     _nop_();
  135.     _nop_();
  136.     Y=ADS7843_rd();    //读Y轴坐标
  137.     y[i]=Y;
  138.     CS=1;
  139.    }
  140.    avex=average(x);   //X坐标数据处理
  141.    a[0]=avex/1000;    //发上位机观察结果
  142.    a[1]=(avex-a[0]*1000)/100;
  143.    a[2]=(avex-a[0]*1000-a[1]*100)/10;
  144.    a[3]=avex%10;
  145.    Tranfer(a[0]+48);
  146.    Tranfer(a[1]+48);
  147.    Tranfer(a[2]+48);
  148.    Tranfer(a[3]+48);
  149.    avey=average(y); //Y坐标数据处理
  150.    a[0]=avey/1000;   //发上位机观察结果
  151.    a[1]=(avey-a[0]*1000)/100;
  152.    a[2]=(avey-a[0]*1000-a[1]*100)/10;
  153.    a[3]=avey%10;
  154.    Tranfer(a[0]+48);
  155.    Tranfer(a[1]+48);
  156.    Tranfer(a[2]+48);
  157.    Tranfer(a[3]+48);
  158.    for(i=0;i<10;i++) //延时,在程序中根据具体情况改动
  159.     delay(10000);
  160. }
  161. IE=0x81;      //开中断
  162. }

  163. //====================================================================================
  164. //函数名称:void init_serial()
  165. //函数功能:初始化串口
  166. //入口参数:无
  167. //出口参数:无
  168. //====================================================================================
  169. void init_serial()   
  170. {
  171.    TMOD=0x22;    //定时器T1使用工作方式2
  172.    TH1=250;     //设置初值
  173.    TL1=250;
  174.    TR1=1;      //开始计时
  175.    PCON=0x80;     //SMOD=1;
  176.    SCON=0x50;     //工作方式1,波特率9600bit/s,允许接收
  177.    TI=1;
  178. }

  179. //====================================================================================
  180. //函数名称:void Tranfer(char Data)     
  181. //函数功能:发送数据程序
  182. //入口参数:Data 要发送的数据
  183. //出口参数:无
  184. //====================================================================================
  185. void Tranfer(char Data)
  186. {
  187. while(TI==0);
  188. SBUF=Data;
  189. TI=0;
  190. }

  191. //====================================================================================
  192. //函数名称:int main()   
  193. //函数功能:主函数
  194. //入口参数:无
  195. //出口参数:无
  196. //====================================================================================
  197. int main()
  198. {
  199. // uint b[4];
  200. TCON=0x01; //设置外部中断0下降沿触发
  201.     EX0=1;      //开外中断0
  202.     EA=1;   //开总中断
  203. init_serial();
  204. while(1);
  205. }

  206. //====================================================================================
  207. //函数名称:uint average(uint a[8])   
  208. //函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均
  209. //入口参数:数组首地址
  210. //出口参数:平均值
  211. //====================================================================================
  212. uint average(uint a[8])
  213. {
  214. uint max,min,i,ave=0,sum=0;
  215.     max=a[0];
  216.     min=a[0];
  217.     for(i=0;i<8;i++)
  218. {
  219. if(maxif(min>a[i])min=a[i];
  220. sum+=a[i];
  221. }
  222.     ave=(sum-min-max)/6;
  223. return ave;
  224. }



 楼主| xyz549040622 发表于 2019-12-21 11:38 | 显示全部楼层

本帖子中包含更多资源

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

×
externally 发表于 2019-12-23 19:39 | 显示全部楼层
感谢楼主分享!学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

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