亚博智能论坛  
  
查看: 319|回复: 0

DA-AD试验

  [复制链接]

该用户从未签到

0

主题

13

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2017-6-22 15:59:05 | 显示全部楼层 |阅读模式

  1. #include<reg52.h>
  2. #include <I2C.H>

  3. #define  PCF8591 0x90    //PCF8591 地址


  4. //else IO
  5. sbit    LS138A=P2^2;  
  6. sbit    LS138B=P2^3;
  7. sbit    LS138C=P2^4;  

  8. //此表为 LED 的字模, 共阴数码管 0-9  -
  9. unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  10. unsigned char AD_CHANNEL;
  11. unsigned long xdata  LedOut[8];
  12. unsigned int  D[32];
  13.                  

  14. /*******************************************************************
  15. DAC 变换, 转化函数               
  16. *******************************************************************/
  17. bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  18. {
  19.    Start_I2c();              //启动总线
  20.    SendByte(sla);            //发送器件地址
  21.    if(ack==0)return(0);
  22.    SendByte(c);              //发送控制字节
  23.    if(ack==0)return(0);
  24.    SendByte(Val);            //发送DAC的数值  
  25.    if(ack==0)return(0);
  26.    Stop_I2c();               //结束总线
  27.    return(1);
  28. }

  29. /*******************************************************************
  30. ADC发送字节[命令]数据函数               
  31. *******************************************************************/
  32. bit ISendByte(unsigned char sla,unsigned char c)
  33. {
  34.    Start_I2c();              //启动总线
  35.    SendByte(sla);            //发送器件地址
  36.    if(ack==0)return(0);
  37.    SendByte(c);              //发送数据
  38.    if(ack==0)return(0);
  39.    Stop_I2c();               //结束总线
  40.    return(1);
  41. }

  42. /*******************************************************************
  43. ADC读字节数据函数               
  44. *******************************************************************/
  45. unsigned char IRcvByte(unsigned char sla)
  46. {  unsigned char c;

  47.    Start_I2c();          //启动总线
  48.    SendByte(sla+1);      //发送器件地址
  49.    if(ack==0)return(0);
  50.    c=RcvByte();          //读取数据0

  51.    Ack_I2c(1);           //发送非就答位
  52.    Stop_I2c();           //结束总线
  53.    return(c);
  54. }

  55. //******************************************************************/
  56. main()
  57. {  char i,j;

  58. while(1)
  59. {/********以下AD-DA处理*************/  
  60.    switch(AD_CHANNEL)
  61.    {
  62.      case 0: ISendByte(PCF8591,0x41);
  63.              D[0]=IRcvByte(PCF8591)*2;  //ADC0 模数转换1  放大2倍显示
  64.                          break;  

  65.          case 1: ISendByte(PCF8591,0x42);
  66.              D[1]=IRcvByte(PCF8591)*2;  //ADC1  模数转换2
  67.                          break;  

  68.          case 2: ISendByte(PCF8591,0x43);
  69.              D[2]=IRcvByte(PCF8591)*2;  //ADC2        模数转换3
  70.                          break;  

  71.          case 3: ISendByte(PCF8591,0x40);
  72.              D[3]=IRcvByte(PCF8591)*2;  //ADC3   模数转换4
  73.                          break;  

  74.          case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC          数模转换
  75.                  break;
  76.    }

  77.               // D[4]=400;  //数字--->>模拟输出
  78.                    D[4]=D[0];  //   把模拟输入 采样的信号 通过数模转换输出
  79.    if(++AD_CHANNEL>4) AD_CHANNEL=0;

  80. /********以下将AD的值送到LED数码管显示*************/
  81.                        
  82.          LedOut[0]=Disp_Tab[D[1]%10000/1000];
  83.      LedOut[1]=Disp_Tab[D[1]%1000/100];
  84.      LedOut[2]=Disp_Tab[D[1]%100/10]|0x80;
  85.      LedOut[3]=Disp_Tab[D[1]%10];
  86.          
  87.          LedOut[4]=Disp_Tab[D[0]%10000/1000];
  88.      LedOut[5]=Disp_Tab[D[0]%1000/100];
  89.      LedOut[6]=Disp_Tab[D[0]%100/10]|0x80;
  90.      LedOut[7]=Disp_Tab[D[0]%10];  
  91.          
  92.         
  93.          for( i=0; i<8; i++)
  94.          {         P0 = LedOut;
  95.                         
  96.           switch(i)          //使用switch 语句控制138译码器  也可以是用查表的方式 学员可以试着自己修改                                 
  97.              {            
  98.                         case 0:LS138A=0; LS138B=0; LS138C=0; break;         
  99.                 case 1:LS138A=1; LS138B=0; LS138C=0; break;                     
  100.                 case 2:LS138A=0; LS138B=1; LS138C=0; break;
  101.                 case 3:LS138A=1; LS138B=1; LS138C=0; break;
  102.                         case 4:LS138A=0; LS138B=0; LS138C=1; break;
  103.                         case 5:LS138A=1; LS138B=0; LS138C=1; break;
  104.                         case 6:LS138A=0; LS138B=1; LS138C=1; break;
  105.                         case 7:LS138A=1; LS138B=1; LS138C=1; break;
  106.                         
  107.              }
  108.          
  109.              for (j = 0 ; j<90 ;j++) { ;}           //扫描间隔时间
  110.           }

  111.             P0 = 0;

  112. }  
  113. }
复制代码


回复

使用道具 举报

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

本版积分规则

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