一,代码部分
1.smgshow
#include "reg52.h"
void Delay(int t)
{
while(t--);
}
void HC573(unsigned char channel, unsigned char dat)
{
P0=dat;
switch(channel)
{
case 4:
P2=(P2 & 0x1f) | 0x80;//选通Y4C,LED
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;//选通Y5C,蜂鸣器,继电器
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;//选通Y6C,数码管位选
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;//选通Y7C,数码管段码
break;
}
P2=(P2 & 0x1f) | 0x00;
}
void Display_SMG(unsigned char pos,unsigned char val)
{
HC573(6,0x01<<pos);
HC573(7,val);
Delay(500);
// HC573(6,0x01<<pos);
HC573(7,0xff);//消隐
}
void Display_ALL(unsigned char dat)
{
HC573(6,0xff);
HC573(7,dat);
}
2.pcf8591.c
#include "reg52.h"
#include "iic.h"
float Read_ADC()//RB2模拟量转数字量
{
unsigned char temp;
float v;
//伪写操作
IIC_Start();
IIC_SendByte(0x90);//设备地址,最后一位置0为可写入
IIC_WaitAck();
IIC_SendByte(0x43);//RB2连接在8591的通道3
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();//0~255
IIC_SendAck(1);
IIC_Stop();
v=temp*5/255.0;
return v;
}
void DAC(float temp)
{
unsigned char u;
u=temp*51;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_SendByte(u); //0~255
IIC_SendAck(1);
IIC_Stop();
}
相比以前的DAC函数做了优化,可以直接输出函数调用的值,如DAC(3.4),则直接输出3.4伏的电压。在使用函数的时候注意,形参是float型。这样做是为了方便题目的电压比较
<