这次还是iic中光敏和电位器的通道互换了,不晓得为啥子,上次做国赛题的时候也遇到了这样的情况(见我博客的其他文章),现在也不知道是为啥,希望有大佬可以答疑解惑一下。(功能还是全部实现了)
题目:
main.c
#include#include"intrins.h" #include"iic.h" int smg_mode=0; int count_f=0; //555 计数 int num_f=0; //555 显示 int r_1=0;//光 int r_2=0;//电 int iic_mode=0; int eeprom_f; int eeprom_v; int led_work=1; int led=0xff; int num_z; sbit S4=P3^3; sbit S5=P3^2; sbit S6=P3^1; sbit S7=P3^0; char code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x8e,0xc8,0xc1,0xbf,0x7f}; void smg_display(); void get_z(); void choose_573(int i) { switch(i) { case(0):P2=(P2&0x1f)|0x00;break; case(4):P2=(P2&0x1f)|0x80;break; case(5):P2=(P2&0x1f)|0xa0;break; case(6):P2=(P2&0x1f)|0xc0;break; case(7):P2=(P2&0x1f)|0xe0;break; } } void init_system() { choose_573(4); P0=0xff; choose_573(5); P0=0x00; choose_573(0); } //==========================================555 void Timer0Init(void) //100微秒@11.0592MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD = 0x04; //设置定时器模式 TL0 = 0xff; //设置定时初始值 TH0 = 0xff; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; EA=1; } void time0_service() interrupt 1 { count_f++; } //========================================== //==========================================iic void get_guang() { r_1=guang(); } void get_dian() { r_2=dian(); } //========================================== //==========================================中断 void Timer1Init(void) //5毫秒@11.0592MHz { AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 TL1 = 0x00; //设置定时初始值 TH1 = 0x28; //设置定时初始值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1=1; EA=1; } int count_1;int count_2; void time1_service() interrupt 3 { count_1++; if(count_1>=180) { count_1=0; num_f=count_f; count_f=0; get_guang(); get_dian(); get_z(); } if(S7==0) { count_2++; if(count_2>=200) { count_2=0; if(led_work==1) { led_work=0; } else { led_work=1; } } } else { count_2=0; } } //========================================== //==========================================按键 void Delay10ms() //@11.0592MHz { unsigned char i, j; i = 108; j = 145; do { while (--j); } while (--i); } void key_board() { //S4 if(S4==0) { Delay10ms(); if(S4==0) { smg_mode++; if(smg_mode==2) { iic_mode=0; } if(smg_mode>=3) { smg_mode=0; } } while(!S4) { smg_display(); } } //S5 if(S5==0&&smg_mode==2) { Delay10ms(); if(S5==0&&smg_mode==2) { iic_mode++; if(iic_mode>=2) { iic_mode=0; } } while(!S5) { smg_display(); } } //S6 if(S6==0) { Delay10ms(); if(S6==0) { write_EEPROM(0x01,r_1); Delay10ms(); write_EEPROM(0x02,r_1>>8); } while(!S6) { smg_display(); } } //S7 if(S7==0) { Delay10ms(); if(S7==0) { write_EEPROM(0x05,num_f); Delay10ms(); write_EEPROM(0x06,num_f>>8); } while(!S7) { smg_display(); } } } //========================================== //==========================================eeprom void eeprom_read() { eeprom_f=read_EEPROM(0x06); eeprom_f=(eeprom_f<<8)|read_EEPROM(0x05); // eeprom_f=(eeprom_f*256)+read_EEPROM(0x05); eeprom_v=read_EEPROM(0x02); eeprom_v=(eeprom_v<<8)|read_EEPROM(0x01); } //========================================== //==========================================周期计算 void get_z() { num_z=1000000/num_f; } //========================================== //==========================================数码管 void Delay400us() //@11.0592MHz { unsigned char i, j; i = 5; j = 74; do { while (--j); } while (--i); } void SMG(int wei,int dat) { choose_573(6); P0=0x80>>(wei-1); choose_573(7); P0=xianshi[dat]; choose_573(0); Delay400us(); choose_573(7); P0=xianshi[10]; choose_573(0); } void smg_display() { if(smg_mode==0) { SMG(1,num_f%10); if(num_f>=10) { SMG(2,(num_f%100)/10); } else { SMG(2,10); } if(num_f>=100) { SMG(3,(num_f%1000)/100); } else { SMG(3,10); } if(num_f>=1000) { SMG(4,(num_f%10000)/1000); } else { SMG(4,10); } if(num_f>=10000) { SMG(5,(num_f%100000)/10000); } else { SMG(5,10); } if(num_f>=100000) { SMG(6,(num_f%1000000)/100000); } else { SMG(6,10); } if(num_f>=1000000) { SMG(7,(num_f%10000000)/1000000); } else { SMG(7,10); } SMG(8,11); } if(smg_mode==1) { SMG(1,num_z%10); if(num_z>=10) { SMG(2,(num_z%100)/10); } else { SMG(2,10); } if(num_z>=100) { SMG(3,(num_z%1000)/100); } else { SMG(3,10); } if(num_z>=1000) { SMG(4,(num_z%10000)/1000); } else { SMG(4,10); } if(num_z>=10000) { SMG(5,(num_z%100000)/10000); } else { SMG(5,10); } if(num_z>=100000) { SMG(6,(num_z%1000000)/100000); } else { SMG(6,10); } if(num_z>=1000000) { SMG(7,(num_z%10000000)/1000000); } else { SMG(7,10); } SMG(8,12); } if(smg_mode==2&&iic_mode==0) { SMG(1,r_1%10); SMG(2,(r_1%100)/10); SMG(3,(r_1%1000)/100); SMG(3,15); SMG(4,10); SMG(5,10); SMG(6,1); SMG(7,14); SMG(8,13); } if(smg_mode==2&&iic_mode==1) { SMG(1,r_2%10); SMG(2,(r_2%100)/10); SMG(3,(r_2%1000)/100); SMG(3,15); SMG(4,10); SMG(5,10); SMG(6,2); SMG(7,14); SMG(8,13); } } //========================================== //==========================================led void led_display() { if(led_work==1) { //L3 if(smg_mode==0) { led=(led&0xfb)|0x00; choose_573(4); P0=led; choose_573(0); } else { led=(led&0xfb)|0x04; choose_573(4); P0=led; choose_573(0); } //L4 if(smg_mode==1) { led=(led&0xf7)|0x00; choose_573(4); P0=led; choose_573(0); } else { led=(led&0xf7)|0x08; choose_573(4); P0=led; choose_573(0); } //L5 if(smg_mode==2) { led=(led&0xef)|0x00; choose_573(4); P0=led; choose_573(0); } else { led=(led&0xef)|0x10; choose_573(4); P0=led; choose_573(0); } //L2 if(num_f>eeprom_f) { led=(led&0xfd)|0x00; choose_573(4); P0=led; choose_573(0); } else { led=(led&0xfd)|0x02; choose_573(4); P0=led; choose_573(0); } //L1 if(r_1>eeprom_v) { led=(led&0xfe)|0x00; choose_573(4); P0=led; choose_573(0); } else { led=(led&0xfe)|0x01; choose_573(4); P0=led; choose_573(0); } } if(led_work==0) { led=0xff; choose_573(4); P0=led; choose_573(0); } } //========================================== void main() { init_system(); Timer0Init(); Timer1Init(); while(1) { smg_display(); key_board(); // eeprom_v=read_EEPROM(0x01); // eeprom_f=read_EEPROM(0x05); eeprom_read(); led_display(); // } }
iic.c
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
sbit SDA = P2^1;
sbit SCL = P2^0;
void IIC_Delay(unsigned char i)
{
do{_nop_();}
while(i--);
}
//总线启动条件
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
//总线停止条件
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
//通过I2C总线发送数据
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;
}
//从I2C总线上接收数据
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;
}
int guang()
{
int temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
temp=temp*1.96+0.5;
return temp;
}
int dian()
{
int temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
// temp=temp*1.96+0.5;
return temp;
}
void write_EEPROM(int add,int dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
int read_EEPROM(int add)
{
int temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
iic.h
#ifndef _IIC_H #define _IIC_H void IIC_Start(void); void IIC_Stop(void); bit IIC_WaitAck(void); void IIC_SendAck(bit ackbit); void IIC_SendByte(unsigned char byt); unsigned char IIC_RecByte(void); int guang(); int dian(); void write_EEPROM(int add,int dat); int read_EEPROM(int add); #endif



