示例代码:
main.c
#include <REG52.H>
#include "IIC.h"
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
void HC573(unsigned char channel,unsigned char value);
void Nixie(unsigned char column,unsigned char value);
void Delay(unsigned int x);
void System_init();
void Display_Frequency();
unsigned char code Array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
unsigned char code Array_pot[]={0x40,0x79,0X24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int Frequency=0;//频率采集
unsigned int F=0;//频率
unsigned char temp=0;//记录电压参数
unsigned int Count=0;//定时器计数
unsigned int Voltage=0;//电压采集
float T_V=0;//电压计算
unsigned char Mode=0;
unsigned char DAC_Mode=0;
unsigned char LED_Stat=0xff;//led控制
unsigned char LED=0;//led总开关
unsigned char nixie=0;//数码管开关
//读取电压
void PCF8591_Read()
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp=I2CReceiveByte();
I2CWaitAck();
I2CStop();
T_V=temp*(5.0/255);
Voltage=T_V*100;
}
//DAC输出
void Send_DAC(unsigned char Data)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CSendByte(Data);
I2CWaitAck();
I2CStop();
}
//电压显示
void Display_Voltage()
{
Nixie(1,0xc1);
Nixie(2,0xff);
Nixie(3,0xff);
Nixie(4,0xff);
Nixie(5,0xff);
Nixie(6,Array_pot[Voltage/100%10]);
Nixie(7,Array[Voltage/10%10]);
Nixie(8,Array[Voltage%10]);
}
//总显示函数
void Display_All()
{
if(Mode==0)
{
Display_Voltage();
}
else if(Mode==1)
{
Display_Frequency();
}
}
//按键扫描
void Key_Scan()
{
if(S4==0)
{
if(Mode==0)Mode=1;
else if(Mode==1)Mode=0;
while(S4==0){Display_All();}
}
if(S5==0)
{
if(DAC_Mode==0)DAC_Mode=1;
else if(DAC_Mode==1)DAC_Mode=0;
while(S5==0){Display_All();}
}
if(S6==0)
{
if(LED==0)LED=1;
else if(LED==1)LED=0;
while(S6==0){Display_All();}
}
if(S7==0)
{
if(nixie==0)nixie=1;
else if(nixie==1)nixie=0;
while(S7==0){Display_All();}
}
}
//LED灯光控制
void LED_Ctrl()
{
if(LED==0)
{
if(Mode==0)
{
LED_Stat=P0&0xFE;
HC573(4,LED_Stat);
if((Voltage<150)||((Voltage<350)&&(Voltage>=250)))
{
LED_Stat=P0|0x04;
HC573(4,LED_Stat);
}
else if((Voltage>=350)||((Voltage<250)&&(Voltage>=150)))
{
LED_Stat=P0&0xfb;
HC573(4,LED_Stat);
}
}
else if(Mode==1)
{
LED_Stat=P0&0xFD;
HC573(4,LED_Stat);
if((F<1000)||((F<10000)&&(F>=5000)))
{
LED_Stat=P0|0x08;
HC573(4,LED_Stat);
}
else if((F>=10000)||((F<5000)&&(F>=1000)))
{
LED_Stat=P0&0xF7;
HC573(4,LED_Stat);
}
}
if(DAC_Mode==0)
{
LED_Stat=P0|0x10;
HC573(4,LED_Stat);
}
else if(DAC_Mode==1)
{
LED_Stat=P0&0xef;
HC573(4,LED_Stat);
}
}
else if(LED==1)
{
LED_Stat=P0|0xff;
HC573(4,LED_Stat);
}
}
void Time_init()
{
TMOD=0x16;
TH0=0xFF;
TL0=0xFF;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
ET0=1;ET1=1;
TF0=0;TF1=0;
TR0=1;TR1=1;
EA=1;
}
//频率显示页面
void Display_Frequency()
{
Nixie(1,Array[15]);
Nixie(2,0xff);
Nixie(3,0xff);
if(F>99999)Nixie(4,Array[F/100000%10]);
if(F>9999)Nixie(4,Array[F/10000%10]);
if(F>999)Nixie(5,Array[F/1000%10]);
if(F>99)Nixie(6,Array[F/100%10]);
if(F>9)Nixie(7,Array[F/10%10]);
Nixie(8,Array[F%10]);
}
//关闭所以数码管
void Display_Off()
{
P0=0xff;
P2=0xC0;
P2=0xE0;
}
void main()
{
System_init();
Time_init();
while(1)
{
Key_Scan();
PCF8591_Read();
if(DAC_Mode==0)
{
Send_DAC(102);
}
else if(DAC_Mode==1)
{
Send_DAC(temp);
}
LED_Ctrl();
if(nixie==0)
{
Display_All();
}
else if(nixie==1)
{
Display_Off();
}
}
}
void Time0() interrupt 1
{
Frequency++;
}
void Time1() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
Count++;
if(Count>20)
{
F=Frequency;
Frequency=0;
Count=0;
}
}
void System_init()
{
HC573(5,0x00);
HC573(4,0xff);
}
void HC573(unsigned char channel,unsigned char value)
{
P2=(0x1f&P2)|0x00;
P0=value;
switch(channel)
{
case 4:P2=(0x1f&P2)|0x80;break;
case 5:P2=(0x1f&P2)|0xa0;break;
case 6:P2=(0x1f&P2)|0xc0;break;
case 7:P2=(0x1f&P2)|0xe0;break;
case 0:P2=(0x1f&P2)|0x00;break;
}
P2=(0x1f&P2)|0x00;
}
void Delay(unsigned int x)
{
unsigned char i,j;
while(x--)
{
i=11;
j=190;
do
{
while(--j);
}while(--i);
}
}
void Nixie(unsigned char column,unsigned char value)
{
HC573(6,0x01<<(column-1));
HC573(7,value);
Delay(1);
HC573(6,0x01<<(column-1));
HC573(7,0xff);
}
IIC.c
#include "reg52.h"
#include "intrins.h"
sbit sda=P2^1;
sbit scl=P2^0;
#define DELAY_TIME 5
//
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
//
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
//
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
//
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//
unsigned char I2CReceiveByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++){
scl = 1;
I2C_Delay(DELAY_TIME);
da <<= 1;
if(sda)
da |= 0x01;
scl = 0;
I2C_Delay(DELAY_TIME);
}
return da;
}
//
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
//
//void I2CSendAck(unsigned char ackbit)
//{
// scl = 0;
// sda = ackbit;
// I2C_Delay(DELAY_TIME);
// scl = 1;
// I2C_Delay(DELAY_TIME);
// scl = 0;
// sda = 1;
// I2C_Delay(DELAY_TIME);
//}
IIC.h
#ifndef __IIC_H_
#define __IIC_H_
void I2CStart(void);
void I2CStop(void);
void I2CSendByte(unsigned char byt);
unsigned char I2CReceiveByte(void);
unsigned char I2CWaitAck(void);
#endif