[蓝桥杯单片机12]ADC及DAC的实现

// 本实验实现了数码管显示adc的值(0~255)
// 通过改变Rb2可调电阻可以改变DAC 的输出电压。

注意:iic里需要加代码,iic.h需要自己添加。

//本实验实现了数码管显示adc的值(0~255)
//并随着adc(RB2)的变化,dac输出电压随之变化。
#include "reg52.h"
#include "intrins.h"
#include "iic.h"

unsigned char adc_val = 123;
void SMG_Show(unsigned char pos,unsigned char value);
void SMG_Proc();

code unsigned char Seg_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};


void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

void SMG_Show(unsigned char pos,unsigned char value)
{
  P0 = 0Xff;
  P2 = (P2 & 0x1f) | 0xc0;
  P0 = 0X01 << pos;
  P2 = (P2 & 0x1f) | 0xe0;
  P0 = value;
}
void SMG_Proc()
{
  SMG_Show(1,Seg_Table[adc_val/100]);
  Delay1ms();
  SMG_Show(2,Seg_Table[adc_val/10%10]);
  Delay1ms();
  SMG_Show(3,Seg_Table[adc_val%10]);
  Delay1ms();
}
void ADC_Init()
{
  I2CStart();
  I2CSendByte(0x90);//选中ADC写模式
  I2CWaitAck();
  I2CSendByte(0x43);
  I2CWaitAck();
  I2CStop(); 
}

void DAC_Write(unsigned char value)
{
  I2CStart();
  I2CSendByte(0x90);//选中ADC写模式
  I2CWaitAck();
  I2CSendByte(0x43);
  I2CWaitAck();
  
  I2CSendByte(value);
  I2CWaitAck();
  I2CStop(); 
}
unsigned char ADC_Read()
{
  unsigned char value;
  I2CStart();
  I2CSendByte(0x91);//选中ADCread模式
  I2CWaitAck();
  value = I2CReceiveByte();
  I2CSendAck(1);
  
  I2CStop();
   
  return value;
}

void main()
{
  ADC_Init();
  while(1)
  {
    SMG_Proc();
    adc_val = ADC_Read();
    DAC_Write(adc_val);
  }
}

你可能感兴趣的:(单片机,蓝桥杯,嵌入式硬件)