精华内容
下载资源
问答
  • 2020-12-31 04:06:56

    #include

    #include "iic.h"

    #define uchar unsigned char

    #define uint unsigned int

    uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};

    uchar yi,er,san,si,wu,liu,qi,ba;

    uchar led_start=0;

    uchar mode=1;//????

    uchar set=0;//s6??

    uint  jiange=400;//????

    uint  LED_tt=0,set_tt=0,AD_tt=0;//0.8???

    uint  RB2=0;//AD??

    uchar flag4=0;//s4????

    uchar LED_n=0;

    uchar Light=0,LED_T=0;

    void allinit();

    void Delay1ms(uint ms);

    void display1(uchar yi,uchar er);

    void display2(uchar san,uchar si);

    void display3(uchar wu,uchar liu);

    void display4(uchar qi,uchar ba);

    void keyscan();

    void Timer0Init(void);

    void main()

    {

    allinit();

    Timer0Init();

    mode=EEPROM_Read(0x10);

    Delay1ms(5);

    jiange=EEPROM_Read(0x20)*100;

    Delay1ms(5);

    yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;

    while(1)

    {

    //                RB2=AD_Read(0x03);

    if((set==0)&&(flag4==1))

    {

    if(RB2<64){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=1;}

    else if((RB2>=64)&&(RB2<128)){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=2;}

    else if((RB2>=128)&&(RB2<192)){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=3;}

    else if((RB2>=192)&&(RB2<255)){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=4;}

    }

    else if(set==0)

    {

    yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;

    }

    keyscan();

    display1(yi,er);

    display2(san,si);

    display3(wu,liu);

    display4(qi,ba);

    }

    }

    void keyscan()

    {

    if(P30==0)//s7

    {

    Delay1ms(5);

    if(P30==0)

    {

    if(led_start==0)

    led_start=1;

    else if(led_start==1)

    led_start=0;

    }

    while(!P30);

    }

    else if(P31==0)//s6

    {

    Delay1ms(5);

    if(P31==0)

    {

    if(set==0)

    {

    set=1;set_tt=0;

    if(jiange>=1000)

    {

    yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;

    }

    else

    {

    yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;

    }

    }

    else if(set==1)

    {

    set=2;set_tt=0;

    if(jiange>=1000)

    {

    yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;

    }

    else

    {

    yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;

    }

    }

    else if(set==2)

    {

    set=0;set_tt=0;

    yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;

    EEPROM_Write(mode,0x10);

    Delay1ms(5);

    EEPROM_Write(jiange/100,0x20);

    Delay1ms(5);

    }

    }

    while(!P31);

    }

    else if(P32==0)//s5

    {

    Delay1ms(5);

    if(P32==0)

    {

    if(set==1)

    {

    mode+=1;

    if(mode>4)

    {

    mode=4;

    }

    }

    else if(set==2)

    {

    jiange+=100;

    if(jiange>1200)

    {

    jiange=1200;

    }

    }

    }

    while(!P32);

    }

    else if(P33==0)//s4

    {

    Delay1ms(5);

    if(P33==0)

    {

    flag4=1;

    }

    }

    if((flag4==1)&&(P33==1))

    {

    flag4=0;

    if(set==1)

    {

    mode-=1;

    if(mode<1)

    {

    mode=1;

    }

    }

    else if(set==2)

    {

    jiange-=100;

    if(jiange<400)

    {

    jiange=400;

    }

    }

    }

    }

    void Timer0Init(void)                //1??@12.000MHz

    {

    AUXR |= 0x80;                //?????1T??

    TMOD &= 0xF0;                //???????

    TL0 = 0x20;                //??????

    TH0 = 0xD1;                //??????

    TF0 = 0;                //??TF0??

    TR0 = 1;                //???0????

    EA=1;

    ET0=1;

    }

    void Timer0() interrupt 1

    {

    set_tt++;

    LED_tt++;

    AD_tt++;

    if((LED_tt==1)&&(led_start==1))//?1ms??????

    {

    if(mode==1)

    {

    P2=0X00;P0=0XFF;P2=0X80;P0=~(0X01<

    }

    else if(mode==2)

    {

    P2=0X00;P0=0XFF;P2=0X80;P0=~(0X80>>LED_n);P2=0X00;

    }

    else if(mode==3)

    {

    P2=0X00;P0=0XFF;P2=0X80;

    if(LED_n==0)P0=0X7E;

    else if(LED_n==1)P0=0XBD;

    else if(LED_n==2)P0=0XDB;

    else if(LED_n==3)P0=0XE7;

    P2=0X00;

    }

    else if(mode==4)

    {

    P2=0X00;P0=0XFF;P2=0X80;

    if(LED_n==0)P0=0XE7;

    else if(LED_n==1)P0=0XDB;

    else if(LED_n==2)P0=0XBD;

    else if(LED_n==3)P0=0X7E;

    P2=0X00;

    }

    }

    else if(LED_tt==Light)//PWM?? ?????20ms mode1 LED_tt=1? 2-20??  ???5%

    //           mode2 LED_tt=1-4?   ???20%

    //            mode3 1-9???45%   mode4 1-19 ???95%

    {

    P2=0X00;P0=0XFF;P2=0X80;P0=0XFF;P2=0X00;

    }

    else if(LED_tt==20)//?20ms???? LED_T +1

    {

    LED_tt=0;LED_T++;

    if((LED_T*20)>=jiange)//?????????? ????

    {

    LED_T=0;

    if(mode==1){LED_n++;if(LED_n>=8)LED_n=0;}

    else if(mode==2){LED_n++;if(LED_n>=8)LED_n=0;}

    else if(mode==3){LED_n++;if(LED_n>=4)LED_n=0;}

    else if(mode==4){LED_n++;if(LED_n>=4)LED_n=0;}

    }

    }

    if(AD_tt==200)//?200ms????RB2?

    {

    AD_tt=0;

    RB2=AD_Read(0x03);

    if(RB2<64)Light=2;

    else if((RB2>=64)&&(RB2<128))Light=5;

    else if((RB2>=128)&&(RB2<192))Light=10;

    else if((RB2>=192)&&(RB2<256))Light=19;

    }

    if(set_tt==800)

    {

    if(set==1)

    {

    if(jiange>=1000)

    {

    yi=11;er=11;san=11;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;

    }

    else

    {

    yi=11;er=11;san=11;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;

    }

    }

    else if(set==2)

    {

    if(jiange>=1000)

    {

    yi=10;er=mode;san=10;si=11;wu=11;liu=11;qi=11;ba=11;

    }

    else

    {

    yi=10;er=mode;san=10;si=11;wu=11;liu=11;qi=11;ba=11;

    }

    }

    }

    if(set_tt==1600)

    {

    set_tt=0;

    if(set==1)

    {

    if(jiange>=1000)

    {

    yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;

    }

    else

    {

    yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;

    }

    }

    else if(set==2)

    {

    if(jiange>=1000)

    {

    yi=10;er=mode;san=10;si=11;wu=jiange/1000;liu=jiange%1000/100;qi=jiange%100/10;ba=jiange%10;

    }

    else

    {

    yi=10;er=mode;san=10;si=11;wu=11;liu=jiange/100;qi=jiange%100/10;ba=jiange%10;

    }

    }

    }

    }

    void allinit()

    {

    P2=0X80;

    P0=0XFF;

    P2=0XC0;

    P0=0XFF;

    P2=0XE0;

    P0=0XFF;

    P2=0XA0;

    P0=0X00;

    }

    void Delay1ms(uint ms)                //@12.000MHz

    {

    uint k;

    unsigned char i, j;

    for(k=ms;k>0;k--)

    {

    i = 12;

    j = 169;

    do

    {

    while (--j);

    } while (--i);

    }

    }

    void display1(uchar yi,uchar er)

    {

    P2=0XC0;

    P0=0X01;

    P2=0XE0;

    P0=tab[yi];

    Delay1ms(1);

    P2=0XC0;

    P0=0X02;

    P2=0XE0;

    P0=tab[er];

    Delay1ms(1);

    }

    void display2(uchar san,uchar si)

    {

    P2=0XC0;

    P0=0X04;

    P2=0XE0;

    P0=tab[san];

    Delay1ms(1);

    P2=0XC0;

    P0=0X08;

    P2=0XE0;

    P0=tab[si];

    Delay1ms(1);

    }

    void display3(uchar wu,uchar liu)

    {

    P2=0XC0;

    P0=0X10;

    P2=0XE0;

    P0=tab[wu];

    Delay1ms(1);

    P2=0XC0;

    P0=0X20;

    P2=0XE0;

    P0=tab[liu];

    Delay1ms(1);

    }

    void display4(uchar qi,uchar ba)

    {

    P2=0XC0;

    P0=0X40;

    P2=0XE0;

    P0=tab[qi];

    Delay1ms(1);

    P2=0XC0;

    P0=0X80;

    P2=0XE0;

    P0=tab[ba];

    Delay1ms(1);

    P2=0XC0;

    P0=0XFF;

    P2=0XE0;

    P0=0XFF;//?????????????

    }

    更多相关内容
  • 第九届蓝桥杯 单片机省赛 客观题 pdf格式。
  • 第九届蓝桥杯单片机竞赛真题——彩灯控制的例程 自己写的蓝桥杯单片机比赛的例程,文件里有考题的PDF和keil文件。第一次发资源,如有不足还请多多指正
  • 第9届蓝桥杯单片机省赛-客观题参考答案与解析.pdf
  • 第九届蓝桥杯单片机项目资源数据包,包含单片机项目和嵌入式项目。
  • 第九届蓝桥杯单片机省赛题目解析

    千次阅读 2021-09-01 14:08:54
    别的话也不多说,一起来看看第九届(2018)的题目吧。 题目 这次的题目依然还是用到了三大模块(数码管、LED、按键),还用到了EEPROM和模拟输入(ADC),也都是一些常见的外设,只要平常都练习过,也就不...

    别的话也不多说,一起来看看第九届(2018)的题目吧。

    题目

     

     

     这次的题目依然还是用到了三大模块(数码管、LED、按键),还用到了EEPROM和模拟输入(ADC),也都是一些常见的外设,只要平常都练习过,也就不难,最重要的还是编程逻辑。

    1 数码管显示

    数码管有两个界面需要显示一个是设置状态的界面,还有一个是亮度等级界面。设置状态界面由运行模式和流转间隔组成。

    2 LED显示

     这次的LED是重点,不仅有四种运行模式还有四个亮度等级。四种运行模式就设置数组,然后循环运行。四个亮度等级就是把ADC 0到255分成四份,在哪个等级,LED就相应的亮多久,这样就会有视觉上的亮度等级,具体看代码。

    3 按键模块

     使用的是独立按键,s7是LED的启动和停止,s6定义一个变量mode1,为0时数码管关闭(此时按s4显示亮度等级),为1时显示运行模式1以及流转间隔,为2时运行模式1闪烁按s5或s4进行加减,为3时流转间隔闪烁按s5或s4进行加减。

    4 EEPROM

     就是改写底层驱动代码部分(IIC),在运行完加减后把流转间隔保存到其中去,在延时5ms。

    5 ADC

     就是改写底层驱动代码部分(IIC)。

    IIC.c

    #include"IIC.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);
    }
    
    bit IIC_WaitAck(void)
    {
        bit ackbit;
    	
        SCL  = 1;
        IIC_Delay(DELAY_TIME);
        ackbit = SDA;
        SCL = 0;
        IIC_Delay(DELAY_TIME);
        return ackbit;
    }
    
    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;  
    }
    
    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;    
    }
    
    unsigned char Read_AD()
    {
    	unsigned char 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_Stop();
    	
    	return temp;
    }
    
    void write_eeprom(unsigned char add,unsigned char da)
    {
    	IIC_Start();
    	IIC_SendByte(0xa0);
    	IIC_WaitAck();
    	
    	IIC_SendByte(add);
    	IIC_WaitAck();
    	
      IIC_SendByte(da);
    	IIC_WaitAck();
    	
    	IIC_Stop();
    }
    
    unsigned char Read_eeprom(unsigned char add)
    {
    	unsigned char da;
    	IIC_Start();
    	IIC_SendByte(0xa0);
    	IIC_WaitAck();
    	IIC_SendByte(add);
    	IIC_WaitAck();
    	IIC_Stop();
    	
    	IIC_Start();
      IIC_SendByte(0xa1);
    	IIC_WaitAck();
    	da=IIC_RecByte();
    	IIC_Stop();
    	return da;
    } 

    IIC.h

    #ifndef _IIC_H_
    #define _IIC_H_
    
    #include<stc15f2k60s2.h>
    #include<intrins.h>
    
    void IIC_Delay(unsigned char i);
    void IIC_Start(void);
    void IIC_Stop(void);
    bit IIC_WaitAck(void);
    void IIC_SendByte(unsigned char byt);
    unsigned char IIC_RecByte(void);
    unsigned char Read_AD();
    void write_eeprom(unsigned char add,unsigned char da);
    unsigned char Read_eeprom(unsigned char add);
    
    #endif

    init.h

    #include"init.h"
    #include"jm.h"
    
    #define u8 unsigned char 
    #define u16 unsigned int
    #define state_0 0
    #define state_1 1
    #define state_2 2
    	
    static u8 segadder=0,key_state;
    
    extern u8 mode1,a;
    	
    u8 seg[]={11,11,11,11,11,11,11,11};
    u8 tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
    u8 key_press,key_num,value;
    	
    void close_init()   //关闭无关外设
    {
    	P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
    	
    	P2=(P2&0x1f)|0xa0;P04=0;P06=0;P2&=0x1f;
    	
    	P2=(P2&0x1f)|0xc0;P0=0x00;P2&=0x1f;
    	
    	P2=(P2&0x1f)|0xe0;P0=0xff;P2&=0x1f;
    }
    
    void display()    // 数码管显示函数
    {
    	P2=(P2&0x1f)|0xe0;P0=0xff;P2&=0x1f;
    	
    	P2=(P2&0x1f)|0xc0;P0=1<<segadder;P2&=0x1f;
    	
    	P2=(P2&0x1f)|0xe0;P0=tab[seg[segadder]];P2&=0x1f;
    	
    	if(++segadder==8) segadder=0;
    }
    
    u8 read_key()    //独立按键
    {
    	key_press=P3&0x0f;
    	switch(key_state)
    	{
    		case state_0:
    			if(key_press!=0x0f)
    				key_state=state_1;
    			break;
    		case state_1:
    			if(key_press!=0x0f)
    			{
    				if((key_press&0x08)==0)
    				{
    					if(mode1==0&&a==1)
    					{
    						jm3();
    						a=0;
    					}
    					key_num=4;
    				}
    				if((key_press&0x04)==0) key_num=5;
    				if((key_press&0x02)==0) key_num=6;
    				if((key_press&0x01)==0) key_num=7;
    				key_state=state_2;
    			}
    			else
    				key_state=state_0;
    			break;
    		case state_2:
    			if(key_press==0x0f)
    			{
    				if(mode1==0&&a==0)a=1;
    				key_state=state_0;
    			}
    			break;
    	}
    	value=key_num;
    	key_num=0;
    	return value;
    }
    
    void Timer0Init(void)		
    {
    	AUXR |= 0x80;		
    	TMOD &= 0xF0;		
    	TL0 = 0xCD;		
    	TH0 = 0xD4;		
    	TF0 = 0;		
    	TR0 = 1;
      EA = 1;
      ET0 = 1;	
    }
    

    init.h

    #ifndef _INIT_H_
    #define _INIT_H_
    
    #include<stc15f2k60s2.h>
    
    void close_init();
    void display();
    unsigned char read_key();
    void Timer0Init(void);
    
    
    
    
    
    #endif

    jm.h

    #include"jm.h"
    #include"IIC.h"
    
    #define u8 unsigned char 
    #define u16 unsigned int
    	
    extern bit sp,mode_flag,val_flag;      // extern表示此变量是在别处定义的,要在此处引用
    extern u8 seg[],mode1,RB2_value;
    extern u8 val1,val2,val3,val4,val_count;
    
    u8 mode12[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //模式1,2的数组
    u8 mode34[]={0x7e,0xbd,0xdb,0xe7};   //模式3,4的数组
    u8 mode=1,i=0,j=7,x=0,y=3,mode2=1;
    
    void Delay5ms()
    {
    	unsigned char i, j;
    
    	i = 54;
    	j = 199;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    void jm3()      //亮度等级显示函数
    {
    	seg[0]=11;
    	seg[1]=11;
    	seg[2]=11;
    	seg[3]=11;
    	seg[4]=11;
    	seg[5]=11;
    	seg[6]=10;
    	seg[7]=RB2_value;
    }
    
    void jm4()    //s4的功能
    {
    	if(mode1==2)
    	{
    		if(--mode==0)mode=4;
    	}
    	if(mode1==3)
    	{
    		if(mode==1)val1-=10;
    		if(val1<=40)val1=40;
    		write_eeprom(0x10,val1);
    		Delay5ms();
    		
    		if(mode==2)val2-=10;
    		if(val2<=40)val2=40;
    		write_eeprom(0x20,val2);
    		Delay5ms();
    		
    		if(mode==3)val3-=10;
    		if(val3<=40)val3=40;
    		write_eeprom(0x40,val3);
    		Delay5ms();
    		
    		if(mode==4)val4-=10;
    		if(val4<=40)val4=40;
    		write_eeprom(0x80,val4);
    		Delay5ms();
    	}
    }
    
    void jm5()     //s5的功能
    {
    	if(mode1==2)
    	{
    		if(++mode==5)mode=1;
    	}
    	if(mode1==3)
    	{
    		if(mode==1)val1+=10;
    		if(val1>=120)val1=120;
    		write_eeprom(0x10,val1);
    		Delay5ms();
    		
    		if(mode==2)val2+=10;
    		if(val2>=120)val2=120;
    		write_eeprom(0x20,val2);
    		Delay5ms();
    		
    		if(mode==3)val3+=10;
    		if(val3>=12)val3=120;
    		write_eeprom(0x40,val3);
    		Delay5ms();
    		
    		if(mode==4)val4+=10;
    		if(val4>=120)val4=120;
    		write_eeprom(0x80,val4);
    		Delay5ms();
    	}
    }
    
    void jm6()    
    {
    	if(mode1==0)  //数码管关闭
    	{
    		seg[0]=11;
    		seg[1]=11;
    		seg[2]=11;
    		seg[3]=11;
    		seg[4]=11;
    		seg[5]=11;
    		seg[6]=11;
    		seg[7]=11;
    	}
    	if(mode1==1)    //显示运行模式1以及流转间隔
    	{
    		seg[0]=10;
    		seg[1]=1;
    		seg[2]=10;
    		seg[3]=11;
    		seg[4]=val1/100;
    		seg[5]=val1/10%10;
    		seg[6]=val1%10;
    		seg[7]=0;
    	}
    	if(mode1==2)    //运行模式1闪烁
    	{
    		if(mode_flag==1)
    		{
    			seg[0]=10;
    			seg[1]=mode;
    			seg[2]=10;
    			seg[3]=11;
    			if(mode==1)
    			{
    				seg[4]=val1/100;
    				seg[5]=val1/10%10;
    				seg[6]=val1%10;
    				seg[7]=0;
    			}
    			if(mode==2)
    			{
    				seg[4]=val2/100;
    				seg[5]=val2/10%10;
    				seg[6]=val2%10;
    				seg[7]=0;
    			}
    			if(mode==3)
    			{
    				seg[4]=val3/100;
    				seg[5]=val3/10%10;
    				seg[6]=val3%10;
    				seg[7]=0;
    			}
    			if(mode==4)
    			{
    				seg[4]=val4/100;
    				seg[5]=val4/10%10;
    				seg[6]=val4%10;
    				seg[7]=0;
    			}
    		}
    		else
    		{
    			seg[0]=11;
    			seg[1]=11;
    			seg[2]=11;
    			seg[3]=11;
    		}	
    	}
    	if(mode1==3)      //流转间隔闪烁
    	{
    		if(mode_flag==1)
    		{
    			if(mode==1)
    			{
    				seg[4]=val1/100;
    				seg[5]=val1/10%10;
    				seg[6]=val1%10;
    				seg[7]=0;
    			}
    			if(mode==2)
    			{
    				seg[4]=val2/100;
    				seg[5]=val2/10%10;
    				seg[6]=val2%10;
    				seg[7]=0;
    			}
    			if(mode==3)
    			{
    				seg[4]=val3/100;
    				seg[5]=val3/10%10;
    				seg[6]=val3%10;
    				seg[7]=0;
    			}
    			if(mode==4)
    			{
    				seg[4]=val4/100;
    				seg[5]=val4/10%10;
    				seg[6]=val4%10;
    				seg[7]=0;
    			}
    		}
    		else
    		{
    			seg[4]=11;
    			seg[5]=11;
    			seg[6]=11;
    			seg[7]=11;
    		}
    	}
    }
    
    void jm7()
    {
    	if(sp==1)   //打开LED
    	{
    		if(mode2==1&&val_flag==0)
    		{	
    				P2=(P2&0x1f)|0x80;	
    				P0=mode12[i];
    				P2&=0x1f;
    		}
    		if(mode2==1&&val_flag==1)
    		{
    			val_flag=0;
    			if(++i==8)
    			{
    				i=0;
    				mode2=2;
    				val_count=0;
    			}
    		}
        if(mode2==2&&val_flag==0)
    		{
    
    				P2=(P2&0x1f)|0x80;
    				P0=mode12[j];
    				P2&=0x1f;
    		}	
    		if(mode2==2&&val_flag==1)
    		{
    			val_flag=0;
    			if(--j==-1)
    				{
    					j=7;
    					mode2=3;
    					val_count=0;
    				}
    		}
    		if(mode2==3&&val_flag==0)
    		{
    				P2=(P2&0x1f)|0x80;
    				P0=mode34[x];
    				P2&=0x1f;	
    		}
    		if(mode2==3&&val_flag==1)
    		{
    			val_flag=0;
    			if(++x==4)
    				{
    					x=0;
    					mode2=4;
    					val_count=0;
    				}
    		}
    		if(mode2==4&&val_flag==0)
    		{
    				P2=(P2&0x1f)|0x80;
    				P0=mode34[y];
    				P2&=0x1f;	
    		}
    		if(mode2==4&&val_flag==1)
    		{
    			val_flag=0;
    			if(--y==-1)
    			{
    				y=3;
    				mode2=1;
    				val_count=0;
    			}
    		}
    	}
    	else
    	{
    	  P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
    	}
    }

    jm.h

    #ifndef _JM_H_
    #define _JM_H_
    
    #include<stc15f2k60s2.h>
    
    void jm3();
    void jm4();
    void jm5();
    void jm6();
    void jm7();
    void Delay5ms();
    
    
    
    
    #endif

    main.c

    #include"init.h"
    #include"IIC.h"
    #include"jm.h"
    
    #define u8 unsigned char 
    #define u16 unsigned int
    	
    extern u8 mode2;
    	
    u8 a,b,num,mode1=0,RB2=0,RB2_value=0,RB2_count=0,e_count=0;
    bit sp=0,mode_flag=0,val_flag=1,e_flag=0;
    u16 mode_count=0,val_count=0;
    u8 val1=40,val2=40,val3=40,val4=40;
    	
    void main()
    {	
    	close_init();
    	Timer0Init();
    	while(1)
    	{
    		RB2=Read_AD();
    		num=read_key();
    		switch(num)
    		{
    			case 4:
    				jm4();
    			break;
    			case 5:
    				jm5();
    			break;
    			case 6:
    				if(++mode1==4)mode1=0;
    				a=1;
    			break;
    			case 7:
    				sp^=1;
    				b=1;
    			break;			
    		}
    		num=0;
    		if(a==1)jm6();
    		if(b==1)jm7();
    		if(RB2>=0&&RB2<64)RB2_value=1;       //把ADC的值分成四个等级
    		if(RB2>=64&&RB2<128)RB2_value=2;
    		if(RB2>=128&&RB2<192)RB2_value=3;
    		if(RB2>=192&&RB2<=255)RB2_value=4;
    		if(e_flag==1)        //读取EEPROM中的值
    		{
    			e_flag=0;
    			val1=Read_eeprom(0x10);
    			val2=Read_eeprom(0x20);
    			val3=Read_eeprom(0x40);
    			val4=Read_eeprom(0x80);
    		}
    	}
    }
    	
    void Timer0() interrupt 1
    {
    	display();
    	val_count++;
    	if(mode1==2||mode1==3)
    	{
    		if(++mode_count==800)
    		{
    			mode_count=0;
    			mode_flag^=1;
    		}
    	}
    	if((val_count==val1*10)&&mode2==1)
    	{
    		val_count=0;
    		val_flag=1;
    	}
    	if((val_count==val2*10)&&mode2==2)
    	{
    		val_count=0;
    		val_flag=1;
    	}
    	if((val_count==val3*10)&&mode2==3)
    	{
    		val_count=0;
    		val_flag=1;
    	}
    	if((val_count==val4*10)&&mode2==4)
    	{
    		val_count=0;
    		val_flag=1;
    	}
    	
    	if(++RB2_count<=RB2_value) jm7();   //亮度等级越大,LED亮的越久
    	else if((RB2_count>RB2_value)&&(RB2_count<=4))
    	{
    		P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;
    	}
    	else if(RB2_count>4)RB2_count=0;
    	
    	if(++e_count==200)
    	{
    		e_count=0;
    		e_flag=1;
    	}
    }	

    最后,有什么写的不好的地方,还希望大家指正,或者有更好的意见和想法都可以讨论。

    展开全文
  • 蓝桥杯单片机第九届省赛题程序,里面有hex代码可提供下载调试,需要源码和赛题请解压里面的一个压缩包,里面包含源码和hex文件的源代码。非常的银杏,非常的好用。
  • 第九届蓝桥杯单片机程序 创好程序直接复制粘贴就行,没那么多步骤。

    直接复制粘贴然后运行

    然后打开stc烧录到开发板上面就能用  程序哪里不懂的话问我,我闲的蛋疼!

    #include <STC15F2K60S2.H>
    #include <intrins.h>

    unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
    unsigned char yi,er,san,si,wu,liu,qi,ba;
    unsigned char jiemian=0;   //定义界面
    int moshi=1;       //定义模式
    unsigned char jiange=4;      //定义间隔
    unsigned char a=0,tiao=0,shan=0;
    unsigned char b=0,app=0,shan1=0;
    unsigned char shuju;
    unsigned char d=0;
    int c=0;
    unsigned char tiaozhuan;
    unsigned char pwm=0;

    unsigned char AD();

    #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}    


    #define SlaveAddrW 0xA0
    #define SlaveAddrR 0xA1


    sbit SDA = P2^1;  
    sbit SCL = P2^0; 
        
        void Timer0Init(void)        //5毫秒@11.0592MHz
    {
        AUXR |= 0x80;        //定时器时钟1T模式
        TMOD &= 0xF0;        //设置定时器模式
        TL0 = 0x00;        //设置定时初值
        TH0 = 0x28;        //设置定时初值
        TF0 = 0;        //清除TF0标志
        TR0 = 1;        //定时器0开始计时
        EA=1;
        ET0=1;
    }
    void tm0_isr() interrupt 1
    {
        TL0 = 0x00;        //设置定时初值
        TH0 = 0x28;        //设置定时初值
        
        a++;
        if(a==160)
        {
            a=0;
            if(tiao==1)
            {
                if(shan==0)
                {
                    wu=jiange/10;liu=jiange%10;
                    er=11;
                    shan=1;
                }
                else 
                    if(shan==1)
                    {
                        wu=jiange/10;liu=jiange%10;
                        er=moshi;
                        shan=0;
                    }
            }
            if(tiao==2)
            {
                if(shan==0)
                {
                    er=moshi;
                    wu=11;liu=11;
                    shan=1;
                }
                else 
                    if(shan==1)
                    {
                        er=moshi;
                        wu=jiange/10;liu=jiange%10;
                        shan=0;
                    }
            }
        }
        
    }


    void Delayms(int ms)
    {
        int i,j;
        for(i=0;i<ms;i++)
            for(j=845;j>0;j--);
    }
    void chushihua()
    {
        P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
        P2=0XC0;P0=0X00;P2=0XFF;P0=0XFF;
    }
    void shumaguan1(unsigned char yi,unsigned char er)
    {
        P2=0XC0;
        P0=0X01;
        P2=0XFF;
        P0=tab[yi];
        Delayms(1);
        
        P2=0XC0;
        P0=0X02;
        P2=0XFF;
        P0=tab[er];
        Delayms(1);
    }
    void shumaguan2(unsigned char san,unsigned char si)
    {
        P2=0XC0;
        P0=0X04;
        P2=0XFF;
        P0=tab[san];
        Delayms(1);
        
        P2=0XC0;
        P0=0X08;
        P2=0XFF;
        P0=tab[si];
        Delayms(1);
    }
    void shumaguan3(unsigned char wu,unsigned char liu)
    {
        P2=0XC0;
        P0=0X10;
        P2=0XFF;
        P0=tab[wu];
        Delayms(1);
        
        P2=0XC0;
        P0=0X20;
        P2=0XFF;
        P0=tab[liu];
        Delayms(1);
    }
    void shumaguan4(unsigned char qi,unsigned char ba)
    {
        P2=0XC0;
        P0=0X40;
        P2=0XFF;
        P0=tab[qi];
        Delayms(1);
        
        P2=0XC0;
        P0=0X80;
        P2=0XFF;
        P0=tab[ba];
        Delayms(1);
    }

    void anjian()
    {
        if(P30==0)
        {
            Delayms(5);
            if(P30==0)
            {
                while(!P30);
            }
            if(d==0)
            {
                    EA=1;
                    ET1=1;
                    d=1;
            }    
            else 
                if(d==1)
                {
                        EA=0;
                        ET1=0;
                    d=0;
                        b=0;
        pwm=0;
                    
                }
        
            
        }
        if(P31==0)
        {
            Delayms(30);
            if(P31==0)
            {
                while(!P31);
            }
            
        if(jiemian==0)
        {
            jiemian=1;
        }
        else
            if(jiemian==1)
            {
                jiemian=2;
            }
            else
                if(jiemian==2)
                {
                    jiemian=0;
                }
                
                if(tiao==0)
                {
                    tiao=1;
                }
                else 
                    if(tiao==1)
                    {
                        tiao=2;
                    }
                    else
                        if(tiao==2)
                        {
                            tiao=0;
                        }
                
            
        }
        if(P32==0)
        {
            Delayms(35);
            if(P32==0)
            {
                while(!P32);
            }
            if(jiemian==1)
            {
                moshi=moshi+1;
                if(moshi==5)
                {
                    moshi=1;
                }
            }
            if(jiemian==2)
            {
                jiange=jiange+1;
                if(jiange==13)
                {
                    jiange=4;
                }
            }
            
            
        }
        if(P33==0)
        {
            Delayms(5);
            if(P33==0)
            {
                while(!P33)
                {
                    if(jiemian==0)
                    {
                        shuju=AD()/64+1;
                        yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=10;ba=shuju;
                        shumaguan1(yi,er);
                        shumaguan2(san,si);
                        shumaguan3(wu,liu);
                        shumaguan4(qi,ba);
                        
                    }
            }
            if(jiemian==1)
            {
                moshi=moshi-1;
                if(moshi==0)
                {
                    moshi=1;
                }
            }
            if(jiemian==2)
            {
                jiange=jiange-1;
                if(jiange==3)
                {
                    jiange=4;
                }
            }
            
            if(jiemian==0)
            {
                
            }
            
            
            
            
        }
    }
        }


    void IIC_Start(void)
    {
        SDA = 1;
        SCL = 1;
        somenop;
        SDA = 0;
        somenop;
        SCL = 0;    
    }

    //总线停止条件
    void IIC_Stop(void)
    {
        SDA = 0;
        SCL = 1;
        somenop;
        SDA = 1;
    }

    //等待应答
    bit IIC_WaitAck(void)
    {
        SDA = 1;
        somenop;
        SCL = 1;
        somenop;
        if(SDA)    
        {   
            SCL = 0;
            IIC_Stop();
            return 0;
        }
        else  
        { 
            SCL = 0;
            return 1;
        }
    }

    //通过I2C总线发送数据
    void IIC_SendByte(unsigned char byt)
    {
        unsigned char i;
        for(i=0;i<8;i++)
        {   
            if(byt&0x80) 
            {    
                SDA = 1;
            }
            else 
            {
                SDA = 0;
            }
            somenop;
            SCL = 1;
            byt <<= 1;
            somenop;
            SCL = 0;
        }
    }

    //从I2C总线上接收数据
    unsigned char IIC_RecByte(void)
    {
        unsigned char da;
        unsigned char i;
        
        for(i=0;i<8;i++)
        {   
            SCL = 1;
            somenop;
            da <<= 1;
            if(SDA) 
            da |= 0x01;
            SCL = 0;
            somenop;
        }
        return da;
    }


    unsigned char AD()
    {
        unsigned char 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_Stop();
        
        return temp;
    }

    unsigned char EEAD(unsigned char add)
    {
        unsigned char temp;
        IIC_Start();
        IIC_SendByte(0xA0);
        IIC_WaitAck();
        IIC_SendByte(add);
        IIC_WaitAck();
        IIC_Stop();
        
        IIC_Start();
        IIC_SendByte(0xA1);
        IIC_WaitAck();
        temp=IIC_RecByte();
        IIC_Stop();
        
        return temp;
    }

    void EEDA(unsigned char add,unsigned char dat)
    {
        IIC_Start();
        IIC_SendByte(0xA0);
        IIC_WaitAck();
        IIC_SendByte(add);
        IIC_WaitAck();
        IIC_SendByte(dat);
        IIC_WaitAck();
        IIC_Stop();
    }
        

    void Timer1Init(void)        //5毫秒@11.0592MHz
    {
        AUXR |= 0x40;        //定时器时钟1T模式
        TMOD &= 0x0F;        //设置定时器模式
        TL1 = 0x00;        //设置定时初值
        TH1 = 0x28;        //设置定时初值
        TF1 = 0;        //清除TF1标志
        TR1 = 1;        //定时器1开始计时

    }

    void tm1_isr() interrupt 3
    {
        TL1 = 0x00;        //设置定时初值
        TH1 = 0x28;        //设置定时初值
        b++;
        pwm++;
        if(b==jiange*20)
        {
            b=0;
            if(moshi==1)
            {
                

                    
                    P2=0X80;
                    tiaozhuan=~((0X01)<<app);
            
                    
                    shan1=1;
                    app++;
                    if(app==8)
                    {
                        app=0;
                    }

         }
            if(moshi==2)
            {

                    P2=0X80;
                    tiaozhuan=~((0X80)>>app);
                    shan1=1;
                    app++;
                    if(app==8)
                    {
                        app=0;
                    }

          }
            if(moshi==3)
            {
                

                    P2=0X80;
                    tiaozhuan=(~((0X80)>>app))&(~((0x01)<<app));
                    shan1=1;
                    app++;
                    if(app==4)
                    {
                        app=0;
                    }

          }
            if(moshi==4)
            {
                

                    P2=0X80;
                    tiaozhuan=(~((0X08)>>app))&(~((0x10)<<app));
                    shan1=1;
                    app++;
                    if(app==4)
                    {
                        app=0;
                    }
                

          }
            
     }
        
    if(pwm==6)
    {
        pwm=0;
    }

        if(0<=pwm<=shuju)
        {

            P2=0X80;
            P0=tiaozhuan;
        }
        if(shuju<pwm)
        {
            
            P2=0X80;
                P0=0XFF;
        }

    }


    void main()
    {
        chushihua();
        Timer0Init();
        Timer1Init();    
        moshi=EEAD(0X00);Delayms(2);
    jiange=EEAD(0X01);Delayms(2);
        
        while(1)
        {
            shuju=AD()/64+1;
        
            
            anjian();
        
            if(jiemian==0)
            {
                yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;
            }
            if(jiemian==1)
            {
                yi=10;san=10;si=11;qi=0;ba=0;
            
            }
            if(jiemian==2)
            {
                yi=10;san=10;si=11;qi=0;ba=0;

            }
            
        
            
            
            
            EEDA(0X00,moshi);Delayms(2);
            
            EEDA(0X01,jiange);Delayms(2);
            
            
                shumaguan1(yi,er);
                shumaguan2(san,si);
                shumaguan3(wu,liu);
                shumaguan4(qi,ba);
            
        }
    }

    展开全文
  • 2018年第九届蓝桥杯单片机设计与开发组决赛 程序题+客观题
  • 蓝桥杯第九届 单片机省赛试题 pdf格式。
  • 第九届蓝桥杯单片机-彩灯控制器代码 代码优化,有注解,通俗易懂。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • (1) 当MCS-51访问片外的存储器时,其低8位地址由由(P2)口提供,8位数据由(P0)...(2) 当由MCS-51单片机构成的系统正常工作后,在RST引脚上附加一个(高)电平,并至少维持(2)个机器周期可令系统复位,复位后各IO口为(高)电平。
  • 蓝桥杯比赛单片机组,比赛专用开发板protues仿真图
  • 第九届蓝桥杯单片机省赛试题

    万次阅读 多人点赞 2019-03-16 21:27:14
    uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//数码管段 uchar code mode1_2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//模式1.2灯数组 uchar code mode3_4[]={0x7e,0...

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    个人觉得本题主要考的是定时器,本题如果直接用数码管延时扫描的话会很棘手,之前数码管显示函数我一般都是先位选后段选接着在后面延时个1毫秒,现在这题目用这种方式写好像不太行,正因为不行,我卡在这地方太久了,如果大哥大姐能用这种方法做的话希望你们能教一下我,谢谢!
    好了,下面是我刚编完的程序,步数挺多的。。。:

    main.c

     #include "STC15F2K60S2.h"
     #include "iic.h"
     #define uchar unsigned char 
     #define uint  unsigned int
     uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//数码管段
     uchar code mode1_2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//模式1.2灯数组
     uchar code mode3_4[]={0x7e,0xbd,0xdb,0xe7}; //模式3.4灯数组
     uchar yi,er,san,si,wu,liu,qi,ba;//数码管的8个位
     uchar jiange=4; //运行间隔.用于显示在数码管上.或赋值给jiange1~jiange4;
     uchar modeset=1;//设置运行间隔时的模式
     uchar jiange1,jiange2,jiange3,jiange4;
     uchar level;    //亮度等级
     uchar light; //=PCF8591的3通道
     uchar mode=1;//流水灯工作模式
     uchar reserve;//保护现场
     uchar S6count=0;//0为关数码管状态,1为数码管显示且闪模式位,2为数码管显示且闪运行间隔;
     bit S7=0;				//S7按键按下为1表示流水灯启动工作
     bit bling=0;			//用于数码管0.8秒闪烁
     bit AD_flag=1;		//AD采集
     bit PWM;				//用于亮度
     bit flag=0;				//读EEPROM的条件之一
     void delayms(uint ms);//1毫秒延时子程序
     void keyscan(void);//独立按键扫描
     void allinit(void);//关闭继电器蜂鸣器数码管LED灯
     void Timer1Init(void);
     void Timer0Init(void);
     void S6DATAPRO();//S6按键下的一些数据处理
     void main(void)
     {
     		//	Write_EEPROM(0x01,4);delayms(10);
    		//	Write_EEPROM(0x02,4);delayms(10);
    		//	Write_EEPROM(0x03,4);delayms(10);
    		//	Write_EEPROM(0x04,4);delayms(10);
     		jiangge1=Read_EEPROM(0x01);delayms(10);
     		jiangge2=Read_EEPROM(0x02);delayms(10);
     		jiangge3=Read_EEPROM(0x03);delayms(10);
    		jiangge4=Read_EEPROM(0x04);delayms(10);
     	    jiangge=jiangge1;
    		allinit();
     		Timer1Init();
     		Timer0Init();
     		EA=1;ET0=1;ET1=1;
     		while(1)
    		{
     			keyscan();
     			S6DATAPRO();
    		}
    }
    void delayms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=845;j>0;j--);
    }	
    void keyscan(void)
    {
    	if(P30==0)
    	{
    		//delayms(5);
    		if(P30==0)
    		{
    			if(S7==0){S7=1;TR0 =1;}
    			else     S7=0;
    		}
    		while(!P30);
    	}
    	else if(P31==0)
    	{
    		delayms(5);
    		if(P31==0)
    		{
    			S6count++;
    			flag=1;
    		}
    		while(!P31);
    	}
    	else if(P32==0)
    	{
    		//delayms(5);
    		if(P32==0)
    		{
    			flag=1;	//加按键
    			if(S6count==1)
    			{
    				modeset++;
    				if(modeset==5)modeset=1;
    			}
    			else if(S6count==2)
    			{
    				jiangge++;
    				if(jiangge==13)jiangge=12;
    			}
    		}
    		while(!P32);
    	}
    	else if(P33==0)
    	{
    		//delayms(5);
    		flag=1;
    		if(P33==0 && S6count!=0)//减按键
    		{
    			if(S6count==1)
    			{
    				modeset--;
    				if(modeset==0)modeset=4;
    			}
    			else if(S6count==2)
    			{
    				jiangge--;
    				if(jiangge==3)jiangge=4;
    			}
    		}
    		while(P33==0 && S6count!=0);
    		if(P33==0 && S6count==0)//显示亮度等级按键
    		{
    			yi=er=san=si=wu=liu=11;qi=10;ba=level;
    		}
    	}
    }
    void allinit(void)
    {
    	P2=0xA0;P0=0x00;//关闭凤鸣器继电器
    	P2=0x80;P0=0xFF;//关闭led灯
    	P2=0xC0;P0=0xFF;//选择所有数码管
    	P2=0xFF;P0=0xFF;//关闭所有数码管
    }	
    void S6DATAPRO()
    {
    	if(S6count==0 && P33==1)
    		{
    			yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;
    		}
    		else if(bling==1 && S6count==1)
    		{
    			yi=10;er=11;san=10;si=11;wu=jiangge/10;liu=jiangge%10;qi=0;ba=0;
    		}
    		else if(bling==1 && S6count==2)
    		{
    			yi=10;er=modeset;san=10;si=11;wu=11;liu=11;qi=11;ba=11;
    		}
    		else if(bling==0 && S6count!=0)
    		{
    			yi=10;er=modeset;san=10;si=11;wu=jiangge/10;liu=jiangge%10;qi=0;ba=0;
    		}
    }
    void Timer0Init(void)		//100微秒@11.0592MHz
    {
    	AUXR |= 0x80;		//定时器时钟1T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TL0 = 0xAE;		//设置定时初值
    	TH0 = 0xFB;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 0;		//定时器0开始计时
    }
    
    void Timer1Init(void)		//2毫秒@11.0592MHz
    {
    	AUXR |= 0x40;		//定时器时钟1T模式
    	TMOD &= 0x0F;		//设置定时器模式
    	TL1 = 0x9A;		//设置定时初值
    	TH1 = 0xA9;		//设置定时初值
    	TF1 = 0;		//清除TF1标志
    	TR1 = 1;		//定时器1开始计时
    }
    void TIM0_isr() interrupt 1
    {
    	static uchar PWMcount=0;
    	static uint  numcount=0;
    	static uchar number=0;
    	PWMcount++;numcount++;
    	reserve=P0;P0=0xff;
    	if(PWMcount==80)
    	{
    		PWMcount=0;
    		PWM=1;
    	}
    	if(level==1 && PWMcount==20)PWM=0;
    	else if(level==2 && PWMcount==40)PWM=0;
    	else if(level==3 && PWMcount==60)PWM=0;
    	else if(level==4)								PWM=1;
    	if(mode==1 && numcount==jiangge1*1000)
    	{
    		numcount=0;
    		if(S7==1)number++;
    		if(number==8)
    		{
    			number=7;mode=2;
    		}
    	}
    	else if(mode==2 && numcount==jiangge2*1000)
    	{
    		numcount=0;
    		if(S7==1)number--;
    		if(number==255)
    		{
    			number=0;mode=3;
    		}
    	}
    	else if(mode==3 && numcount==jiangge3*1000)
    	{
    		numcount=0;
    		if(S7==1)number++;
    		if(number==4)
    		{
    			number=3;mode=4;
    		}
    	}
    	else if(mode==4 && numcount==jiangge4*1000)
    	{
    		numcount=0;
    		if(S7==1)number--;
    		if(number==255)
    		{
    			number=0;mode=1;
    		}
    	}
    	if(PWM==1)
    	{
    		switch(mode)
    		{
    			case 1:	P2=0x80;P0=mode1_2[number];break;
    			case 2: P2=0x80;P0=mode1_2[number];break;
    			case 3: P2=0x80;P0=mode3_4[number];break;
    			case 4:	P2=0x80;P0=mode3_4[number];break;
    		}
    	}
    	else if(PWM==0)
    	{
    		P2=0x80;P0=0xff;
    	}
    	P2=0xff;P0=reserve;
    }
    void TIM1_isr() interrupt 3
    {
    	static uint shan=0;
    	static uchar ADscan=0;
    	static uchar SEG=0;
    	shan++;ADscan++;SEG++;
    	if(shan==400)
    	{
    		shan=0;bling=!bling;
    	}
    	if(AD_flag==1)
    	{
    			light=PCF8591(0x03);
    			if(light<25)level=1;
    			else if(light<50)level=2;
    			else if(light<75)level=3;
    			else if(light<100)level=4;
    	}
    	if(S6count==1&& flag==1)
    	{
    		switch(modeset)
    		{
    			case 1: jiangge=Read_EEPROM(0x01);flag=0;break;
    			case 2:	jiangge=Read_EEPROM(0x02);flag=0;break;
    			case 3:	jiangge=Read_EEPROM(0x03);flag=0;break;
    			case 4:	jiangge=Read_EEPROM(0x04);flag=0;break;
    		}
    	}
    	if(S6count==3)
    	{
    		
    		switch(modeset)
    		{
    			case 1:	jiangge1=jiangge;Write_EEPROM(0x01,jiangge);break;
    			case 2:	jiangge2=jiangge;Write_EEPROM(0x02,jiangge);break;
    			case 3:	jiangge3=jiangge;Write_EEPROM(0x03,jiangge);break;
    			case 4:	jiangge4=jiangge;Write_EEPROM(0x04,jiangge);break;
    		}
    		S6count=0;
    	}
    	if(1==SEG)		 { P2=0xC0;P0=0x01;P2=0xFF;P0=0xff;P0=tab[yi]; }	
    	else if(SEG==2){ P2=0xC0;P0=0x02;P2=0xFF;P0=0xff;P0=tab[er]; }
    	else if(SEG==3){ P2=0xC0;P0=0x04;P2=0xFF;P0=0xff;P0=tab[san];}
    	else if(SEG==4){ P2=0xC0;P0=0x08;P2=0xFF;P0=0xff;P0=tab[si]; }
    	else if(SEG==5){ P2=0xC0;P0=0x10;P2=0xFF;P0=0xff;P0=tab[wu]; }
    	else if(SEG==6){ P2=0xC0;P0=0x20;P2=0xFF;P0=0xff;P0=tab[liu];}
    	else if(SEG==7){ P2=0xC0;P0=0x40;P2=0xFF;P0=0xff;P0=tab[qi]; }
    	else if(SEG==8){ P2=0xC0;P0=0x80;P2=0xFF;P0=0xff;P0=tab[ba]; }
    	else if(SEG==9){ P2=0xC0;P0=0x80;P2=0xFF;P0=0xff;P0=tab[11]; }
    	if(SEG==9)SEG=0;
    }
    

    IIC.c

    #include "STC15F2K60S2.h"
    #include "iic.h"
    #include "intrins.h"
    
    #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}    
    
    
    #define SlaveAddrW 0xA0
    #define SlaveAddrR 0xA1
    
    //总线引脚定义
    sbit SDA = P2^1;  /* 数据线 */
    sbit SCL = P2^0;  /* 时钟线 */
    
    
    //总线启动条件
    void IIC_Start(void)
    {
    	SDA = 1;
    	SCL = 1;
    	somenop;
    	SDA = 0;
    	somenop;
    	SCL = 0;	
    }
    
    //总线停止条件
    void IIC_Stop(void)
    {
    	SDA = 0;
    	SCL = 1;
    	somenop;
    	SDA = 1;
    }
    
    
    //等待应答
    bit IIC_WaitAck(void)
    {
    	SDA = 1;
    	somenop;
    	SCL = 1;
    	somenop;
    	if(SDA)    
    	{   
    		SCL = 0;
    		IIC_Stop();
    		return 0;
    	}
    	else  
    	{ 
    		SCL = 0;
    		return 1;
    	}
    }
    
    //通过I2C总线发送数据
    void IIC_SendByte(unsigned char byt)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{   
    		if(byt&0x80) 
    		{	
    			SDA = 1;
    		}
    		else 
    		{
    			SDA = 0;
    		}
    		somenop;
    		SCL = 1;
    		byt <<= 1;
    		somenop;
    		SCL = 0;
    	}
    }
    
    //从I2C总线上接收数据
    unsigned char IIC_RecByte(void)
    {
    	unsigned char da;
    	unsigned char i;
    	
    	for(i=0;i<8;i++)
    	{   
    		SCL = 1;
    		somenop;
    		da <<= 1;
    		if(SDA) 
    		da |= 0x01;
    		SCL = 0;
    		somenop;
    	}
    	return da;
    }
    void Write_EEPROM(unsigned char add,unsigned char dat)
    {
    	IIC_Start();
    	IIC_SendByte(0xA0);
    	IIC_WaitAck();
    	IIC_SendByte(add);
    	IIC_WaitAck();
    	IIC_SendByte(dat);
    	IIC_WaitAck();
    	IIC_Stop();
    }
    unsigned char Read_EEPROM(unsigned char add)
    {
    	unsigned char temp;
    	IIC_Start();
    	IIC_SendByte(0xA0);
    	IIC_WaitAck();
    	IIC_SendByte(add);
    	IIC_WaitAck();
    	IIC_Stop();
    	
    	IIC_Start();
    	IIC_SendByte(0xA1);
    	IIC_WaitAck();
    	temp=IIC_RecByte();
    	IIC_Stop();
    	
    	return temp;
    }
    unsigned char PCF8591(unsigned char add)
    {
    	unsigned char temp;
    	IIC_Start();
    	IIC_SendByte(0x90);
    	IIC_WaitAck();
    	IIC_SendByte(add);
    	IIC_WaitAck();
    	IIC_Stop();
    	
    	IIC_Start();
    	IIC_SendByte(0x91);
    	IIC_WaitAck();
    	temp=IIC_RecByte();
    	IIC_Stop();
    	
    	return temp*0.39;
    }
    

    IIC.h

    #ifndef _IIC_H
    #define _IIC_H
    
    //函数声明
    void IIC_Start(void); 
    void IIC_Stop(void);  
    void IIC_SendByte(unsigned char byt); 
    bit IIC_WaitAck(void);  
    unsigned char IIC_RecByte(void); 
    void Write_EEPROM(unsigned char add,unsigned char dat);
    unsigned char Read_EEPROM(unsigned char add);
    unsigned char PCF8591(unsigned char add);
    
    #endif
    
    展开全文
  • 第九届蓝桥杯单片机省赛----程序题

    千次阅读 多人点赞 2021-04-11 20:00:29
    main.c程序 #include<stc15f2k60s2.h> #include "iic.h" #define uchar unsigned char /...uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//数字0~9,“-”,“关” ucha...
  • 蓝桥杯单片机第九届省赛-彩灯控制器基于官方例程完整源码,基本模板用的是国信长天官方例程,逻辑框架参考例程。经过测试满足全部题目要求,没有BUG。
  • 蓝桥杯单片机第九届国赛决赛_多功能测量仪表_工程代码,已实现题目所有要求,压缩包内是完整的工程文件,希望能够帮助到大家。
  • 蓝桥杯单片机国赛 第九届

    千次阅读 2022-04-06 21:07:37
    蓝桥杯国赛第九届 题目 做题思路 首先写上要做的模块,界面,按键细节 一页纸就能让你不用看pdf即可写出整套题 简单示范: 突然就觉得很简单了对不对,笼统看就写几个模块,外加几个界面~ 下面,我就参照我是...
  • 压缩包 : b060a8ea3964df7b76dd6b19084e75.zip 列表题/题/历届决赛...决赛_多功能事件记录器.pdf题/历届决赛/4决赛_智能物料传送系统.pdf题/历届决赛/5.决赛_电压频率采集设备.pdf题/历届省赛/题/...
  • 本作品是蓝桥杯单片机9~12的客观真题 其讲解是引用撞上电子公众号的开源讲解,本作品不做商用。 习题和答案分开方便练习。 整理:重耳
  • 这题做了好久,主要卡在EEPOM那里了。。。 main.c #include "sys.h" #include "iic.h" #include ... } iic.c /* 程序说明: IIC总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(12MHz) 日 ...
  • 本资料为蓝桥杯单片机比赛届蓝桥杯单片机初赛“彩灯控制器”程序设计源码,文件包含所涉及的keil5工程文件。
  • 第九届蓝桥杯决赛单片机工程文件,已实现题目所有要求,压缩包内是完整的工程文件,希望能够帮助到大家。
  •   相信大家一直都在寻找12届蓝桥杯单片机国赛试题跟答案吧,下面小编就展示12届单片机的试题跟个人代码。   此次的国赛,从模块上看,是五大基本模块:按键模块、数码管模块、LED模块、IIC模块、ds1302模块...
  • 蓝桥杯单片机——十二届蓝桥杯单片机第一场省赛 目录蓝桥杯单片机——十二届蓝桥杯单片机第一场省赛一、赛题分析二、问题总结三、代码(完整代码,功能全部实现,附有注释) 一、赛题分析 前两天实验室的学妹把...
  • 13届蓝桥杯单片机

    千次阅读 热门讨论 2022-04-09 14:15:24
    可能感觉这一还挺简单,12点多子就交卷了,等下老师还要问比赛情况,然后现在有点慌。。 main.c #include "sys.h" #include "onewire.h" #include "ds1302.h" bit FLAG_TEMP = 1; //温度刷新开关 uchar FLAG = ...
  • 最简单 #include #include unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6}; unsigned char yi,er,san,si,wu,liu,qi,ba; unsigned char wendu; unsigned char ...
  • 届蓝桥杯单片机省赛----程序题

    千次阅读 多人点赞 2021-03-24 15:29:39
    main.c程序 #include<stc15f2k60s2.h> #include "ds18b20.h" #include <ds1302.h> #define uchar unsigned char //定义无...uchar code tab[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xb...
  • 届蓝桥杯单片机省赛----程序题

    千次阅读 多人点赞 2021-03-24 13:54:20
    注:六届模拟题即届蓝桥杯单片机省赛试题 功能不多,逻辑也非常简单,相信大家一看便很清楚了,直接上程序,里面包含有注释。 main.c程序 #include<stc15f2k60s2.h> #include "ds18b20.h" #define ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,257
精华内容 502
关键字:

第九届蓝桥杯单片机

友情链接: 三种人民币识别.rar