8051学习笔记——AD

发布时间:2024-07-24  

AD.C


  1 #include

  2 #include

  3 

  4 #define  PCF8591 0x90    //PCF8591 地址

  5 

  6 sbit    LS138A=P2^2;  

  7 sbit    LS138B=P2^3;

  8 sbit    LS138C=P2^4;  

  9 

 10 //此表为 LED 的字模, 共阴数码管 0-9  - 

 11 unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

 12 

 13 unsigned char AD_CHANNEL;

 14 unsigned long xdata  LedOut[8];

 15 unsigned int  D[32];

 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 /*******************************************************************

 31 ADC发送字节[命令]数据函数               

 32 *******************************************************************/

 33 bit ISendByte(unsigned char sla,unsigned char c)

 34 {

 35     Start_I2c();              //启动总线

 36     SendByte(sla);            //发送器件地址

 37     if(ack==0)    return(0);

 38     SendByte(c);              //发送数据

 39     if(ack==0)    return(0);

 40     Stop_I2c();               //结束总线

 41     return(1);

 42 }

 43 

 44 /*******************************************************************

 45 ADC读字节数据函数               

 46 *******************************************************************/

 47 unsigned char IRcvByte(unsigned char sla)

 48 {  

 49     unsigned char c;

 50 

 51        Start_I2c();          //启动总线

 52        SendByte(sla+1);      //发送器件地址

 53        if(ack==0)    return(0);

 54        c=RcvByte();          //读取数据0

 55 

 56        Ack_I2c(1);           //发送非就答位

 57        Stop_I2c();           //结束总线

 58        return(c);

 59 }

 60 

 61 void main()

 62 {  

 63     char i,j;

 64     while(1)

 65      {/********以下AD-DA处理*************/  

 66            switch(AD_CHANNEL)

 67            {

 68              case 0: ISendByte(PCF8591,0x41);

 69                      D[0]=IRcvByte(PCF8591);  //ADC0 模数转换1  放大2倍显示

 70                      break;  

 71  

 72              case 1: ISendByte(PCF8591,0x42);

 73                      D[1]=IRcvByte(PCF8591);  //ADC1  模数转换2

 74                      break;  

 75 

 76              case 2: ISendByte(PCF8591,0x43);

 77                      D[2]=IRcvByte(PCF8591);  //ADC2    模数转换3

 78                     break;  

 79 

 80              case 3: ISendByte(PCF8591,0x40);

 81                      D[3]=IRcvByte(PCF8591);  //ADC3   模数转换4

 82                      break;  

 83 

 84              case 4: DACconversion(PCF8591,0x40, D[4]); //DAC      数模转换

 85                      break;

 86            }

 87 

 88         D[4]=400;  //数字--->>模拟输出

 89         D[4]=D[0];  //   把模拟输入 采样的信号 通过数模转换输出

 90            if(++AD_CHANNEL>4)    AD_CHANNEL=0;

 91 

 92  /********以下将AD的值送到LED数码管显示*************/

 93                

 94          LedOut[0]=Disp_Tab[D[1]%10000/1000];

 95          LedOut[1]=Disp_Tab[D[1]%1000/100]|0x80;

 96          LedOut[2]=Disp_Tab[D[1]%100/10];

 97          LedOut[3]=Disp_Tab[D[1]%10];

 98      

 99          LedOut[4]=Disp_Tab[D[0]%10000/1000];

100          LedOut[5]=Disp_Tab[D[0]%1000/100]|0x80;

101          LedOut[6]=Disp_Tab[D[0]%100/10];

102          LedOut[7]=Disp_Tab[D[0]%10];  

103       

104     

105          for( i=0; i<8; i++) 

106          {     

107              P0 = LedOut[i];    

108               switch(i)      //使用switch 语句控制138译码器  也可以是用查表的方式 学员可以试着自己修改                  

109             {        

110                 case 0:LS138A=0; LS138B=0; LS138C=0; break;         

111                 case 1:LS138A=1; LS138B=0; LS138C=0; break;                 

112                 case 2:LS138A=0; LS138B=1; LS138C=0; break; 

113                 case 3:LS138A=1; LS138B=1; LS138C=0; break; 

114                 case 4:LS138A=0; LS138B=0; LS138C=1; break;

115                 case 5:LS138A=1; LS138B=0; LS138C=1; break;

116                 case 6:LS138A=0; LS138B=1; LS138C=1; break;

117                 case 7:LS138A=1; LS138B=1; LS138C=1; break;    

118             }

119             for (j = 0 ; j<90 ;j++) { ;}       //扫描间隔时间

120           }

121     }  

122 }


IIC.h


 1 #include

 2 #include

 3 

 4 #define  _Nop()  _nop_()   /*定义空指令*/ 

 5 sbit     SCL = P2^1;       //I2C  时钟 

 6 sbit     SDA = P2^0;       //I2C  数据 

 7 bit ack;                 /*应答标志位*/

 8  

 9 void Start_I2c()

10 {

11     SDA = 1;         /*发送起始条件的数据信号*/

12       _Nop();

13       SCL = 1;         /*起始条件建立时间大于4.7us,延时*/

14       _Nop();_Nop();_Nop();_Nop();_Nop();    

15       SDA = 0;         /*发送起始信号,起始条件锁定时间大于4μs*/

16       _Nop();_Nop();_Nop();_Nop();_Nop();       

17       SCL = 0;       /*钳住I2C总线,准备发送或接收数据 */

18       _Nop();_Nop();

19 }

20 

21 void Stop_I2c()

22 {

23       SDA = 0;     

24       _Nop();      

25       SCL = 1;      

26       _Nop();_Nop();_Nop();_Nop();_Nop();

27       SDA = 1;      /*发送I2C总线结束信号*/

28       _Nop();_Nop();_Nop();_Nop();

29 }

30 

31 void  SendByte(unsigned char  c)

32 {

33     int i;

34  

35      for(i = 0;i < 8;i++)  /*要传送的数据长度为8位*/

36     {

37         if((c << i) & 0x80)    SDA=1;   /*判断发送位*/

38            else  SDA = 0;                

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>