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

📄 adc.c

📁 atm16L与ads1110通过TWI来实现模数转换!
💻 C
字号:
#include<iom16v.h>
#include<macros.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int  
#define add_write 0x90            //write  adc
#define add_read  0x91             //read  adc  
#define ad_peizhi 0x90      
#define TW_START        0X08
#define TW_REP_START    0X10
#define TW_MT_SLA_ACK   0X18
#define TW_MT_SLA_NACK  0X20
#define	TW_MT_DATA_ACK  0X28
#define TW_MT_DATA_NACK 0X30
#define TW_MT_ARB_LOST  0X38
#define TW_MR_SLA_ACK   0X40
#define TW_MR_SLA_NACK  0X48
#define TW_MR_DATA_ACK  0X50
#define TW_MR_DATA_NACK 0X58


uchar table[]={0xc0,0xF9,0xA4,0xB0,0x99,
               0x92,0x82,0xF8,0x80,0x90};
uchar data[]={0,0,0,0};
uchar cnt;                                              //读出ad值

void delay(uchar i)
{
  uint j;
  for(;i!=0;i--)
    { for(j=2000;j!=0;j--) {;} }
}

void display(uchar *p)
{
  uchar i,sel=0x80;
  for(i=0;i<4;i++)
    {
      PORTC=~sel;
      PORTB=table[p[i]];
      delay(2);
      sel>>=1;
    }
}

void process(uchar i,uchar *p)
{
  p[0]=i%1000;
  p[1]=i%1000/100;
  p[2]=i%1000%100;
  p[3]=i%1000%100%10;
}

void io_init(void)
{
  DDRB=0XFF;
  PORTB=0XFF;
  DDRC=0XF0;
  PORTC=0XFF;
}


void iic_init(void)                         //initial iic
{
  TWSR=0X00;
  TWBR=0X00;
  TWAR=0X00;                                 //比特率为250khz
  TWCR=0X44;                                 //enable iic,enable TWEA
}

uchar iic_start(void)
{
  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT))) {};
  return 1;                                  //发送成功返回1
}

void iic_stop(void)
{ TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);}

uchar iic_write(uchar ch)
{
  uchar ack=1;
  TWDR=ch;
  TWCR=(1<<TWINT)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT))) {};
  if((TWCR&0XF8)!=TW_MT_SLA_ACK)
    ack=0;
  return ack;
}

uchar iic_read(uchar ack)
{
  if(ack)
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  else
    TWCR=(1<<TWINT)|(1<<TWEN);
  while(!(TWCR&(1<<TWINT))) {};
  return (TWDR);
}

void adc_set(void)
{ 
  iic_start();
  iic_write(add_write);                     //写配置寄存器地址
  iic_write(ad_peizhi);
  iic_stop();
  delay(100);
}

uchar adc_read(void)
{
  uchar datah,datal,datahl;
  iic_start();
  iic_write(add_read);                     //读输出寄存器地址
  datah=iic_read(1);
  datal=iic_read(0);
  iic_stop();
  datahl=((datah<<8)+datal);
  return datahl;
}

void main()
{
  io_init();
  PORTB=0X00;
  PORTC=0X0F;
  delay(500);
  PORTC=0XFF;
  adc_set();
  cnt=adc_read();
  while(1)
  {
    process(cnt,data);
    display(data);
  }
}
















































































⌨️ 快捷键说明

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