> 文档中心 > 蓝桥杯第十一届省赛代码

蓝桥杯第十一届省赛代码

 

代码存在一定的不足,但功能全部实现,可供大家参考,代码整体风格与小蜜蜂老师的相似,

另外本人就小菜鸡一枚。 

 主函数

#include #include #define uchar unsigned char#define uint unsigned intsbit HC_138_A=P2^5;sbit HC_138_B=P2^6;sbit HC_138_C=P2^7;sfr P4 = 0xc0;sbit Q1=P4^4; sbit Q2=P4^2;sbit Q3=P3^5;sbit Q4=P3^4; sbit C1=P3^0; sbit C2=P3^1;sbit C3=P3^2;sbit C4=P3^3; sbit LED3 = P0^2;sbit LED2 = P0^1;sbit LED1 = P0^0;uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//-----------------------变量区--------------------uchar num1 = 0 ,  num2 = 0 ;//按键参数uchar main_go = 0;//主线uint date_Vp ;//电压参数uint old_dat ;//历史电压uint stat_date ;//当前电压uint param ;//用于加减电压参数uchar LED3_Flag=0 , LED1_Flag = 0 , LED2_flag = 0;//灯标志位uchar date_24c02;//存入24c02中的数据uchar count = 0;//计数值uchar count_num = 0;//50ms计数单位uchar state_volt = 0;//计数标志位(赋值给 old_dat )//-----------------------函数区--------------------void HC_573(uchar channel);//通道选择void Display(uint t);//数码管延时函数void Display_SMG(uchar pos,uchar dat);//单个数码管控制void Display_SMG_all(uchar dat);//所有数码管显示void eeprom_write(uchar addr,uchar date);//将数据存入eepromuchar adc_read(uchar addr);//adc输出函数uchar eeprom_read(uchar addr);//读出eeprom中的数据void Init_GWS();//系统初始化void Delay5ms();//@12.000MHz 延时函数void  San_Key();//按键扫描函数void Scan_Key_dat();//按键处理函数void Innt_TH_();//初始化定时器void Ctrl_LED();//LED控制void Vp_();//实时电压比较参数电压void Display(uint t){while(t--);}void HC_573(uchar channel){switch(channel){case 0: HC_138_A= 0; HC_138_B= 0;  HC_138_C=0 ; break;case 4: HC_138_A= 0; HC_138_B= 0;  HC_138_C=1 ; break;case 5: HC_138_A= 1; HC_138_B= 0;  HC_138_C=1 ; break;case 6: HC_138_A= 0; HC_138_B= 1;  HC_138_C=1 ; break;case 7: HC_138_A= 1; HC_138_B= 1;  HC_138_C=1 ; break;}P2 = (P2 & 0x1f)|0x00;}void Init_GWS(){  HC_573(0);Display_SMG_all(0xff);P0 = 0x00;HC_573(5);P0 = 0xff;HC_573(4);}void Delay5ms()//@12.000MHz{unsigned char i, j;i = 10;j = 183;do{while (--j);} while (--i);}void Display_SMG(uchar pos,uchar dat){P0 = 0x01<<pos;HC_573(6);P0 = dat;HC_573(7);Display(300);P0 = 0x01<<pos;HC_573(6);P0 = 0xff;HC_573(7);}void Display_SMG_all(uchar dat){P0 = 0xff;HC_573(6);P0 = dat;HC_573(7);}void  San_Key()//按键扫描函数{Q1=Q2=Q3=Q4=1;C1=C2=C3=C4=0;if(Q1 == 0){Display(10);if(Q1 == 0)num1=1;}if(Q2 == 0){Display(10);if(Q2 == 0)num1=2;}if(Q3 == 0){Display(10);if(Q3 == 0)num1=3;}if(Q4 == 0){Display(10);if(Q4 == 0)num1=4;}Q1=Q2=Q3=Q4=0;C1=C2=C3=C4=1;if(C1 == 0){Display(10);if(C1 == 0){num2=num1;}while(C1 == 0);}else if(C2 == 0){Display(10);if(C2 == 0){num2=num1+4;}while(C2 == 0);}else if(C3 == 0){Display(10);if(C3 == 0){num2=num1+8;;}while(C3 == 0);}else if(C4 == 0){Display(10);if(C4 == 0){num2=num1+12;}while(C4 == 0);}}void Scan_Key_dat()//按键处理函数{if(num2==15)//S12{num2 = 0;LED3_Flag = 0;main_go++;if(main_go==3){main_go=0;}}   else if(num2==16)//参数+{num2 = 0;if(main_go==1)//有效按键{LED3_Flag = 0;if(param0){param = param - 50;}else{param = 500;}}else//无效按键{LED3_Flag++;}date_24c02 = param/10;eeprom_write(0x00,date_24c02);}if(num2==1||num2==2||num2==3||num2==4||num2==5||num2==6||num2==7||num2==8||num2==9||num2==10||num2==14||num2==13)//{num2 = 0;LED3_Flag++;}}void Innt_TH_(){TMOD = 0x11;TH0 = (65536 - 50000)/256;TL0 = (65536 - 50000)%256;TH1 = (65536 - 50000)/256;TL1 = (65536 - 50000)%256;EA = 1;ET0 = 1;TR0 = 1;ET1 = 1;}void Service_TH1() interrupt 3{TH1 = (65536 - 50000) / 256;TL1 = (65536 - 50000) % 256;    count_num++;if(count_num>100){LED1_Flag = 1;}}void Service_TH0() interrupt 1{TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;if(state_volt == 0){state_volt = 1;old_dat = stat_date;}else{if(stat_date > date_Vp && old_dat < date_Vp && old_dat =99){count = 0;}if(count%2==0){LED2_flag = 1;}else {LED2_flag = 0;}}old_dat = stat_date;}}void Ctrl_LED()//LED控制{if(LED3_Flag >= 3){LED3 = 0;HC_573(4);}else if(LED3_Flag == 0){LED3 = 1;HC_573(4);}if(LED1_Flag == 1){LED1= 0;HC_573(4);}else{LED1= 1;HC_573(4);}if(LED2_flag == 1){LED2 = 0;HC_573(4);}else{LED2 = 1;HC_573(4);}}void Vp_()//实时电压比较参数电压{if(stat_date  50 || date_24c02 % 5 !=0)//清除之前的数据{date_24c02 = 0;}param = date_24c02 * 10;//用于参数加减while(1){stat_date = adc_read(0x43)*1.97;//放大100倍,实时电压Vp_();//电压比较Ctrl_LED();//LED控制San_Key();//键盘扫描Scan_Key_dat();//键值处理函数switch(main_go){case 0: Display1(); break;//显示通道3电压case 1: Display2(); break;//显示电压参数case 2: Display3(); break;//显示计数值}}}

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); #endif

 

 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;    }