⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 endad74.c

📁 单片机
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
/*全局符号定义*/
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define fuction
#define end_if
#define end_for
#define byte unsigned char
#define uchar unsigned char
#define uint unsigned int

sbit SCL=P1^0;
sbit SDA=P1^1;
sbit WDI=P1^2;    /**/
#define PA8255 XBYTE[0X8000]
#define PB8255  XBYTE[0X8001]
#define PC8255  XBYTE[0X8002]
#define COM8255  XBYTE[0X8003]
uchar  idata dis_buf[4]={12,2,3,4};
uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                      0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};

int   data temp=0;/*温度*/

uchar idata ja,jb;




/*@@本函数只有一条指令,根据需要可增加延时指令*/
void fuction delay(void){
     _nop_()    ;
     _nop_();

}



/*@@提供iic总线工作时序的起始位*/
void fuction I_start(void){
   SDA=HIGH;
   delay();
   SCL=HIGH;
   delay();
   SDA=LOW;
   delay();
   SCL=LOW;
   delay();
}

/*@@提供iic总线工作时序的停止位*/
void fuction I_stop(viod){
 SDA=LOW;
 delay();
 SCL=HIGH;
 delay();
 SDA=HIGH;
 delay();
 SCL=LOW;
 delay();
 }

 /*iic总线初始化,main()函数中应先调本函数,在调其他函数.*/
 void fuction I_init(viod){
     SCL=LOW;
     I_stop();
   }

 /*提供iic总线的时钟信号,并返回时钟电平位高期间sda信号线上的状态,本函数可用于发送也可用于接收*/
 bit fuction I_clock(viod){
    bit sample;
    SCL=HIGH;
    delay();
    sample=SDA;
    SCL=LOW;
    delay();
    return(sample);
 }


/*向iic总线发送8位数据,并请求一个应答信号ack.如收到ack则返回1(ture),否则返回0(false).*/
bit fuction I_send(byte I_data){
    register byte i;
   /*发送8位数据*/
    for(i=0;i<8;i++){
       SDA=(bit)(I_data&0x80);
       I_data=I_data<<1;
       I_clock();
     end_for}
     /*请求应答信号*/
     SDA=HIGH;
     return(~I_clock());
   }


/*从iic总线接收8位数据,并将接收到的8位数据作为一个字节返回,
不回送应答信号ack,主函数在调用本函数之前应保证sda信号处于浮置态,即使8051的p1.7置1*/
 byte fuction I_receive(void){
    byte I_data=0;
    register byte i;
    for(i=0;i<8;i++){
      I_data*=2;
      if(I_clock())
        I_data++;
      end_if
     end_for}
     return(I_data);
   }

/*向iic总线发送一个应答信号ack,一般用于连续数据的读取时.*/
 void fuction I_Ack(viod){
    SDA=LOW;
    I_clok();
    SDA=HIGH;
    }


/*提供5ms延时(时钟频率12mhz).*/
void fuction wait_5ms(void){
     register int i;
     for(i=0;i<100;i++)
     ;
     end_for

  }
/*@@@主应答子程序*/

void ack(void){
SDA=LOW;
delay();
SCL=HIGH;
delay();
SCL=LOW;
delay();
SDA=HIGH;
}

/*@@@主无应答子程序*/
void noack(void)
     {SDA=HIGH;
     delay();
     SCL=HIGH;
     delay();
     SCL=LOW;
     delay;
     SDA=LOW;
     }

/*@@@检查从应答子程序*/
bit check(void)
{
   bit sample;
   SDA=HIGH;
   delay();
   SCL=HIGH;
   delay();
   sample=SDA;
   SCL=LOW;
   if(sample)
   return(sample);
   }

 /*@@@写一个字节子程序*/
void write(uchar wr_data)
{  uchar i;
   for(i=0;i<8;i++)
      {
        SDA=(bit)(wr_data&0x80);
        wr_data<<=1;
        SCL=HIGH;
       delay();
       delay();
       SCL=LOW;
       }
     SDA=HIGH;

}


/*@@@读一个字节程序*/
uchar read(void)
{
   uchar i;
   bit sample;
   uchar re_data=0;
   for(i=0;i<8;i++){
      re_data*=2;
      SCL=HIGH;
      delay();
      sample=SDA;
      SCL=LOW;
      if(sample)
        re_data++;
    }

  return(re_data);

}
//--------------------------------------


void dl_ms()

{  uint data d;
         for(d=0;d<400;d++);
}

void display(uchar idata *p)
{uchar sel,i;
 COM8255=0X80;
 sel=0x01;
 for(i=0;i<4;i++){
   PA8255=table[*p];

   PB8255=~sel;
   dl_ms();
   p--;
   sel=sel<<1;
   }
 }
//----------------------------------------------

/*@@@读ad7416子程序*/

void rd_ad(uchar add)
 {  uchar conh=1;
    switch(conh){
    case 1:
       I_start();
      write(add);
       if(check())break;
       write(0x00);
       if(check())break;
       I_stop();
       I_start();
       write(add+1);
       if(check())break;
       ja=read();
       ack();
      jb=read();
      noack();
      I_stop();
      default:
      break;
      }
}

//-------------------------------------------------

void main(void)
{ uchar i;
  for(;;){
       for( i=0;i<4;i++) {
       rd_ad(0x92);
       temp=ja;
       temp<<=2;
       temp=temp|jb>>6;}
      temp=temp/4;
      dis_buf[1]=temp%10;
      dis_buf[2]=temp/10 ;
       if(dis_buf[2]>10)dis_buf[2]/=10;
       else if(dis_buf[2]==10)dis_buf[2]=0;
      dis_buf[3]=temp/100;

     display(dis_buf+3);
     }
  }


























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -