这次还是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);}//==========================================555void 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++;}//==========================================//==========================================iicvoid 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(){//S4if(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();}}//S5if(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();}}//S6if(S6==0){Delay10ms();if(S6==0){write_EEPROM(0x01,r_1);Delay10ms();write_EEPROM(0x02,r_1>>8);}while(!S6){smg_display();}}//S7if(S7==0){Delay10ms();if(S7==0){write_EEPROM(0x05,num_f);Delay10ms();write_EEPROM(0x06,num_f>>8);}while(!S7){smg_display();}}}//==========================================//==========================================eepromvoid 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);}}//==========================================//==========================================ledvoid led_display(){if(led_work==1){//L3if(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);}//L4if(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);}//L5if(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);}//L2if(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);}//L1if(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_Hvoid 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