(注:题目来源,小蜜蜂老师)
原文链接: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();
}
}