蓝桥杯单片机——DAC转换输出电压

(注:题目来源,小蜜蜂老师)

原文链接:https://blog.csdn.net/ohy3686/article/details/123969207

  DAC的输出模式有3种。
    模式1中,数码管左边显示“-1-”,DAC输出固定电压2.00V。
    模式2中,数码管左边显示“-2-”,DAC输出固定电压4.00V。
    模式3中,数码管左边显示“-3-”,数码管右边显示PCF8591芯片AIN3通道的实时输入电压,并将该电压作为DAC的输出参数,使DAC的输出电压和PCF8591芯片AIN3通道的输入电压保持同步变化,通过改变Rb2可调电阻可以改变DAC的输出电压。

J5配置BTN模式,把S4设置为独立按键,选择DAC的输出模式。

在模式1中按下S4按键,进入模式2;在模式2中按下S4按键,进入模式3;在模式3中按下S4按键,重新回到模式1,如此循环。

 初始状态:系统上电后,工作在模式1。

#include <reg52.h>
#include <iic.h>
sbit s4=P3^3;
unsigned char code smg_nodot[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int dat_rb2=0;//电压转换数据
unsigned char dat=0;//采样数据
unsigned char flag_s4=0;//模式切换按键标志
unsigned char num=1;//模式号数
void delaysmg(unsigned int t)
{
	while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
	P2=0XE0;P0=0XFF;
	P2=0XC0;P0=0X01<<pos;
	P2=0XE0;P0=value;
}
void display()
{
  displaysmg_byte(0,0xbf);
  delaysmg(100);
  displaysmg_byte(1,smg_nodot[num]);
  delaysmg(100);
  displaysmg_byte(2,0xbf);
  delaysmg(100);
  displaysmg_byte(5,smg_dot[dat_rb2/100]);
  delaysmg(100);
  displaysmg_byte(6,smg_nodot[(dat_rb2/10)%10]);
  delaysmg(100);
  displaysmg_byte(7,smg_nodot[dat_rb2%10]);
  delaysmg(100);
  P2=0XC0;P0=0XFF;
  P2=0XE0;P0=0XFF;
}
void read_rb2()
{
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(0x43);
  IIC_WaitAck();
  IIC_Stop();

  IIC_Start();
  IIC_SendByte(0x91);
  IIC_WaitAck();
  dat=IIC_RecByte();
  IIC_WaitAck();
  IIC_SendAck(1);
  IIC_Stop();

  dat_rb2=dat*(5.0/255)*100;
}
void set_rb2_dac(unsigned char dat)
{
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(0x43); 	//输出DAC,转换AIN3	
  IIC_WaitAck();
  IIC_SendByte(dat);
  IIC_WaitAck();
  IIC_Stop();	
}

void key()
{
	if(s4==0)
	{
	  delaysmg(100);
	  if(s4==0)
	  {
	  	 while(s4==0)
		 {
			display();
		 }
		 flag_s4++;
		 if(flag_s4==3)
		 {
			flag_s4=0;
		 }
	  }
	}
}
void displaysmg()
{
  switch(flag_s4)
  {
  	case 0: //模式1
			num=1;
			dat_rb2=200;
			set_rb2_dac(102);
			display();break;
	case 1://模式2
			num=2;
			dat_rb2=400;
			set_rb2_dac(204);
			display();break;
	case 2://模式3
			num=3;
			read_rb2();
			set_rb2_dac(dat_rb2);
			display();break;
  }
}
void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	while(1)
	{
	 	key();
		displaysmg();
	}
}



 

猜你喜欢

转载自blog.csdn.net/m0_57263863/article/details/124003007