找回密码
 立即注册

QQ登录

只需一步,快速开始

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

角度传感器YL-40模块测试程序 PCF8591 AD转换

[复制链接]
跳转到指定楼层
楼主
本文件仅供参考

单片机源程序如下:

  1. /*********************************************************************************
  2. * 【使用说明】: 单片机:STC89C52
  3.                  串口波特率:9600
  4.                                  串口一共发送4个字节  
  5.                                  1 光敏电阻
  6.                                  2 热敏电阻
  7.                                  3 悬空
  8.                                  4 可调0-5V电压(蓝色电位器调节)
  9.                                  
  10. **********************************************************************************/
  11. /********************************************************************************************/

  12. #include<reg52.h>    //包含单片机寄存器的头文件
  13. #include <I2C.H>

  14. #define uchar unsigned char
  15. #define  PCF8591 0x90    //PCF8591 地址



  16. // 变量定义
  17. unsigned char AD_CHANNEL;
  18. unsigned long xdata  LedOut[8];
  19. unsigned int  D[32];
  20. sbit P2_0 = P2^0;
  21. sbit P2_1 = P2^1;
  22. sbit P2_2 = P2^2;
  23. sbit P2_3 = P2^3;

  24. unsigned char date;

  25. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  26.                         0xf8,0x80,0x90};


  27.   // 函数申明

  28. void display();
  29. void delay(uchar i);
  30. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
  31. bit ISendByte(unsigned char sla,unsigned char c);
  32. unsigned char IRcvByte(unsigned char sla);
  33. void Initial_com(void);
  34. //******************************************************************/
  35. main()
  36. {  

  37.         Initial_com();
  38.         while(1)
  39.         {

  40.         /********以下AD-DA处理*************/  
  41.         
  42.             switch(AD_CHANNEL)
  43.                 {
  44.                         case 0: ISendByte(PCF8591,0x41);
  45.                              D[0]=IRcvByte(PCF8591);  //ADC0 模数转换1      光敏电阻
  46.                                  break;  
  47.                         
  48.                         case 1: ISendByte(PCF8591,0x42);
  49.                              D[1]=IRcvByte(PCF8591);  //ADC1  模数转换2          热敏电阻
  50.                                  break;  
  51.                         
  52.                         case 2: ISendByte(PCF8591,0x43);
  53.                              D[2]=IRcvByte(PCF8591);  //ADC2        模数转换3           悬空
  54.                                  break;  
  55.                         
  56.                         case 3: ISendByte(PCF8591,0x40);
  57.                              D[3]=IRcvByte(PCF8591);  //ADC3   模数转换4           可调0-5v
  58.                                  break;  
  59.                         
  60.                         case 4: DACconversion(PCF8591,0x40, D[4]); //DAC          数模转换
  61.                              break;
  62.                  
  63.                 }

  64.             D[4]=D[3];  //把模拟输入采样的信号 通过数模转换输出
  65.                         
  66.            if(++AD_CHANNEL>4) AD_CHANNEL=0;
  67.         
  68.            /********以下将AD的值通过串口发送出去*************/
  69.          delay(200);        
  70.          SBUF=D[0];                              
  71.          delay(200);                  
  72.          SBUF=D[1];                           
  73.          delay(200);        
  74.          SBUF=D[2];
  75.          delay(200);
  76.          SBUF=D[3];
  77.          delay(200);
  78.          if(RI)
  79.         {
  80.                 date=SBUF;    //单片机接受
  81.                 SBUF=date;    //单片机发送
  82.                 RI=0;
  83.         }         
  84.    }
  85. }


  86. void delay(uchar i)
  87. {
  88.   uchar j,k;
  89.   for(j=i;j>0;j--)
  90.     for(k=125;k>0;k--);
  91. }

  92. /*******************************************************************
  93. DAC 变换, 转化函数               
  94. *******************************************************************/
  95. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  96. {
  97.    Start_I2c();              //启动总线
  98.    SendByte(sla);            //发送器件地址
  99.    if(ack==0)return(0);
  100.    SendByte(c);              //发送控制字节
  101.    if(ack==0)return(0);
  102.    SendByte(Val);            //发送DAC的数值  
  103.    if(ack==0)return(0);
  104.    Stop_I2c();               //结束总线
  105.    return(1);
  106. }

  107. /*******************************************************************
  108. ADC发送字节[命令]数据函数               
  109. *******************************************************************/
  110. bit ISendByte(unsigned char sla,unsigned char c)
  111. {
  112.    Start_I2c();              //启动总线
  113.    SendByte(sla);            //发送器件地址
  114.    if(ack==0)return(0);
  115.    SendByte(c);              //发送数据
  116.    if(ack==0)return(0);
  117.    Stop_I2c();               //结束总线
  118.    return(1);
  119. }

  120. /*******************************************************************
  121. ADC读字节数据函数               
  122. *******************************************************************/
  123. unsigned char IRcvByte(unsigned char sla)
  124. {  unsigned char c;

  125.    Start_I2c();          //启动总线
  126.    SendByte(sla+1);      //发送器件地址
  127.    if(ack==0)return(0);
  128.    c=RcvByte();          //读取数据0

  129.    Ack_I2c(1);           //发送非就答位
  130.    Stop_I2c();           //结束总线
  131.    return(c);
  132. }


  133. //*****串口初始化函数***********

  134. //******************************
  135. void Initial_com(void)
  136. {
  137. EA=1;        //开总中断
  138. ES=1;        //允许串口中断
  139. ET1=1;        //允许定时器T1的中断
  140. TMOD=0x20;   //定时器T1,在方式2中断产生波特率
  141. PCON=0x00;   //SMOD=0
  142. SCON=0x50;   // 方式1 由定时器控制
  143. TH1=0xfd;    //波特率设置为9600
  144. TL1=0xfd;
  145. TR1=1;       //开定时器T1运行控制位

  146. }
复制代码

以上程序51hei提供下载:
YL-40模块测试程序.rar (234.82 KB, 下载次数: 7)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:429540 发表于 2020-10-30 18:49 | 只看该作者

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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