明天就要比赛了,今天总结一份救命模板加深记忆;
1--24c02的操作
//==================24C02单字节写入===================
void Write_24C02(unsigned char addr, unsigned char dat)
{
IIC_Start(); //起始信号
IIC_SendByte(0xa0); //EEPROM的写设备地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(addr); //内存单元地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(dat); //内存写入数据
IIC_WaitAck(); //等待从机应答
IIC_Stop(); //停止信号
}
//==================24C02单字节读取===================
unsigned char Read_24C02(unsigned char addr)
{
unsigned char tmp;
//首先,进行一个伪写操作
IIC_Start(); //起始信号
IIC_SendByte(0xa0); //EEPROM的写设备地址
IIC_WaitAck(); //等待从机应答
IIC_SendByte(addr); //内存单元地址
IIC_WaitAck(); //等待从机应答
//然后,开始字节读操作
IIC_Start(); //起始信号
IIC_SendByte(0xa1); //EEPROM的读设备地址
IIC_WaitAck(); //等待从机应答
tmp = IIC_RecByte(); //读取内存中的数据
IIC_SendAck(1); //产生非应答信号
IIC_Stop(); //停止信号
return tmp;
}
2.PCF8591读取通道1光敏电阻rb1,通道3可变电阻rb2的电压 --DAC
unsigned char adc1_value = 0; //AIN1的采样数据
float adc1_volt = 0; //AIN1的换算电压
unsigned int smg1_volt = 0; //AIN1的显示电压
unsigned char adc3_value = 0; //AIN3的采样数据
float adc3_volt = 0; //AIN3的换算电压
unsigned int smg3_volt = 0; //AIN3的显示电压unsigned char Read_PCF8591_ADC(unsigned char ain)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0x90); //PCF8591的写设备地址
IIC_WaitAck();
if(ain == 1)
{
IIC_SendByte(0x01); //通道1,光敏电阻电压
}
else if(ain == 3)
{
IIC_SendByte(0x03); //通道3,可调电阻电压
}
IIC_WaitAck();
IIC_Stop();
DisplaySMG_ADC(); //等待电压转换完成
IIC_Start();
IIC_SendByte(0x91); //PCF8591的读设备地址
IIC_WaitAck();
tmp = IIC_RecByte(); //读出AD采样数据
IIC_SendAck(1); //产生非应答信号
IIC_Stop();
return tmp;
}
//=============采样光敏电阻和可调电阻的电压=============
void Read_AIN1_AIN3()
{
adc1_value = Read_PCF8591_ADC(1);
adc1_volt = adc1_value * (5.0 / 255);
smg1_volt = adc1_volt * 100;
adc3_value = Read_PCF8591_ADC(3);
adc3_volt = adc3_value * (5.0 / 255);
smg3_volt = adc3_volt * 100;
}
3.采样PCF8591的阻值 --
ADC
void Read_RD1()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
DisplaySMG_ADC(1,dat_rd1);
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_rd1 = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
DisplaySMG_ADC(1,dat_rd1);
}
void Read_RB2()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
DisplaySMG_ADC(3,dat_rb2);
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_rb2 = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
DisplaySMG_ADC(3,dat_rb2);
}
4--DS18B20
void Read_DS18B20_temp()
{
unsigned char LSB,MSB;
init_ds18b20(); //初始化操作
Write_DS18B20(0xcc); //跳过ROM操作
Write_DS18B20(0x44); //转换温度
Delay(1000);
init_ds18b20(); //初始化操作
Write_DS18B20(0xcc); //跳过ROM操作
Write_DS18B20(0xbe); //开始读取暂存器中的温度
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = MSB;
temp = (temp <<= 8) | LSB;
temp >>= 4; //右移四位相当于去掉了小数部分
/*
if((temp & 0xf800) == 0x0000) //判断温度正负,高五位为符号位
{
temp >>= 4; //相当于*0.0625
temp = temp *10;
temp = temp +(LSB & 0x0f) * 0.625;
}
*/
}
5--NE555测频率
unsigned int count_f = 0;
unsigned int dat_f = 0;
unsigned char count_t = 0;
void Init_Timer()
{
//定时器0用作计数,8位重装方式
TH0 = 0xff;
TL0 = 0xff;
//定时器1用作定时,定时时间50ms
TH1 = (65535 - 50000 + 1) / 256;
TL1 = (65535 - 50000 + 1) % 256;
TMOD = 0x16; // 0001 0110
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_T0() interrupt 1
{
count_f++;
}
void Service_T1() interrupt 3
{
TH1 = (65535 - 50000 + 1) / 256;
TL1 = (65535 - 50000 + 1) % 256;
count_t++;
if(count_t == 20)
{
dat_f = count_f;
count_f = 0;
count_t = 0;
} //测量频率完成
}
void DisPlaySMG_F()
{
DisPlaySMG_Bit(0,0x8e); // 1000 1110 f的段码
DelaySMG(100);
DisPlaySMG_Bit(1,0xff);
DelaySMG(100);
DisPlaySMG_Bit(2,0xff);
DelaySMG(100);
if(dat_f > 9999) //显示五位数的最高位
{
DisPlaySMG_Bit(3,SMGNoDot_CA[dat_f / 10000]);
DelaySMG(100);
}
if(dat_f > 999)
{
DisPlaySMG_Bit(4,SMGNoDot_CA[(dat_f / 1000) % 10]);
DelaySMG(100);
}
if(dat_f > 99)
{
DisPlaySMG_Bit(5,SMGNoDot_CA[(dat_f / 100) % 10]);
DelaySMG(100);
}
if(dat_f > 9)
{
DisPlaySMG_Bit(6,SMGNoDot_CA[(dat_f / 10) % 10]);
DelaySMG(100);
}
DisPlaySMG_Bit(7,SMGNoDot_CA[(dat_f / 1) % 10]);
DelaySMG(100);
DisPlay_All(0xff);
}
6.PWM波控制
unsigned char count=0;
unsigned char pwm_duty=0; //占空比设置为可变
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
ET0 = 1;
EA = 1;
}
void ServiceTimer() interrupt 1
{
TH0 = (65535 - 100) / 256; //10 ms = 10000us 定时中断100us,则100次中断达到一个周期
TL0 = (65535 - 100) % 256; // 将一个脉冲划分为100份,若占空比10%,则计数10次高电平后计数90次低电平后置零完成
count++;
if(count == pwm_duty)
{
L1 = 1 ;
}
else if(count == 100)
{
L1 = 0;
count = 0;
}
}unsigned char stat=0;
void ScanKey()
{
if(S7 == 0)
{
Delay(500);
if(S7 == 0)
{
//多状态时使用状态机的跳转
switch(stat)
{
case 0 : L1 = 0;
TR0 = 1;
pwm_duty = 10;
stat = 1;
break;
case 1 :
pwm_duty = 50;
stat = 2;
break;
case 2 :
pwm_duty = 90;
stat = 3;
break;
case 3 :
L1 = 1;
TR0 = 0;
stat=0;
break;
}
while (S7 == 0); //防止出现误判误操作
}
}
}