51_LanQiaoBei/题目/真题/12 第十二届国赛_左岚/第十二届国赛/Driver/iic.c

196 lines
3.6 KiB
C
Raw Normal View History

2025-04-13 01:02:19 +08:00
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Keil uVision 4.10
Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: CT107<EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD>ۺ<EFBFBD>ʵѵƽ̨ 8051<EFBFBD><EFBFBD>12MHz
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: 2011-8-9
*/
#include "iic.h"
#include "intrins.h"
#define DELAY_TIME 5
#define Photo_Res_Channel 0x41
#define Adj_Res_Channel 0x43
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><C5B6><EFBFBD>
sbit SDA = P2^1; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
sbit SCL = P2^0; /* ʱ<><CAB1><EFBFBD><EFBFBD> */
void IIC_Delay(unsigned char i)
{
do {
_nop_();
}
while(i--);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//<2F><><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0<><30>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//<2F>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6>
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//ͨ<><CDA8>I2C<32><43><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
//<2F><>I2C<32><43><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
unsigned char Ad_Read(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
void Da_Write(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x41);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дEEPROM<4F><4D><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ĵ<EFBFBD>ַ(<28><><EFBFBD><EFBFBD>Ϊ8<CEAA>ı<EFBFBD><C4B1><EFBFBD>)<29><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>EERPOM<4F><4D>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>ַд<D6B7><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
void EEPROM_Write(unsigned char* EEPROM_String, unsigned char addr, unsigned char num)
{
IIC_Start();//<2F><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD>ź<EFBFBD>
IIC_SendByte(0xA0);//ѡ<><D1A1>EEPROMоƬ<D0BE><C6AC>ȷ<EFBFBD><C8B7>д<EFBFBD><D0B4>ģʽ
IIC_WaitAck();//<2F>ȴ<EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
IIC_SendByte(addr);//д<><D0B4>Ҫ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
IIC_WaitAck();//<2F>ȴ<EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
while(num--)
{
IIC_SendByte(*EEPROM_String++);//<2F><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣд<CFA2><D0B4>
IIC_WaitAck();//<2F>ȴ<EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
IIC_Delay(200);
}
IIC_Stop();//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><E6B4A2><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ĵ<EFBFBD>ַ(<28><><EFBFBD><EFBFBD>Ϊ8<CEAA>ı<EFBFBD><C4B1><EFBFBD>)<29><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ȡEERPOM<4F><4D>ij<EFBFBD><C4B3><EFBFBD><EFBFBD>ַ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
void EEPROM_Read(unsigned char* EEPROM_String, unsigned char addr, unsigned char num)
{
IIC_Start();//<2F><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD>ź<EFBFBD>
IIC_SendByte(0xA0);//ѡ<><D1A1>EEPROMоƬ<D0BE><C6AC>ȷ<EFBFBD><C8B7>д<EFBFBD><D0B4>ģʽ
IIC_WaitAck();//<2F>ȴ<EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
IIC_SendByte(addr);//д<><D0B4>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
IIC_WaitAck();//<2F>ȴ<EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
IIC_Start();//<2F><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD>ź<EFBFBD>
IIC_SendByte(0xA1);//ѡ<><D1A1>EEPROMоƬ<D0BE><C6AC>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
IIC_WaitAck();//<2F>ȴ<EFBFBD>EEPROM<4F><4D><EFBFBD><EFBFBD>
while(num--)
{
*EEPROM_String++ = IIC_RecByte();//<2F><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣд<CFA2><D0B4>
if(num) IIC_SendAck(0);//<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
else IIC_SendAck(1);//<2F><>Ӧ<EFBFBD><D3A6>
}
IIC_Stop();//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
}