蓝桥杯单片机|蓝桥杯单片机 省赛 第13届模拟题

这次还是iic中光敏和电位器的通道互换了,不晓得为啥子,上次做国赛题的时候也遇到了这样的情况(见我博客的其他文章),现在也不知道是为啥,希望有大佬可以答疑解惑一下。(功能还是全部实现了)
题目: 蓝桥杯单片机|蓝桥杯单片机 省赛 第13届模拟题
文章图片

蓝桥杯单片机|蓝桥杯单片机 省赛 第13届模拟题
文章图片

蓝桥杯单片机|蓝桥杯单片机 省赛 第13届模拟题
文章图片

蓝桥杯单片机|蓝桥杯单片机 省赛 第13届模拟题
文章图片

代码: 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
/* 程序说明: IIC总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz 日期: 2011-8-9 */#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; }

【蓝桥杯单片机|蓝桥杯单片机 省赛 第13届模拟题】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

    推荐阅读