精华内容
下载资源
问答
  • 2022-04-29 01:37:02

    other.c

    #include <other.h>
    
    void Delay2ms(void)
    {
    	unsigned char i, j;
    
    	i = 22;
    	j = 128;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    unsigned char seg_tran(int number)
    {
    	unsigned char date;
    	
    	switch(number)
    	{
    		case	0	:	date = 	0xc0	;	break;
    		case	1	:	date = 	0xf9	;	break;
    		case	2	:	date = 	0xa4	;	break;
    		case	3	:	date = 	0xb0	;	break;
    		case	4	:	date = 	0x99	;	break;
    		case	5	:	date = 	0x92	;	break;
    		case	6	:	date = 	0x82	;	break;
    		case	7	:	date = 	0xf8	;	break;
    		case	8	:	date = 	0x80	;	break;
    		case	9	:	date = 	0x90	;	break;
    		case	10	:	date = 	0xbf	;	break;//-
    		case	11	:	date = 	0xc6	;	break;//c
    		case	12	:	date = 	0x8c	;	break;//p
    		case	13	:	date = 	0x86	;	break;//e
    		case	14	:	date = 	0xc7	;	break;//L
    		case 	15	:	date = 	0xc8	;	break;//a
    		case 	16	:	date = 	0xff	;	break;//kong
    	}
    	
    	return date;
    }
    
    void seg_disp(int adr,int number)
    {
    	unsigned char seg_adr[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    	
    	P2 = P2&0x1f|0xe0;
    	P2 = P2&0x1f;
    	P0 = seg_adr[adr];
    	
    	P2 = P2&0x1f|0xc0;
    	P2 = P2&0x1f;
    	P0 = seg_tran(number);
    	
    	P2 = P2&0x1f|0xe0;
    	P2 = P2&0x1f;
    }
    	
    unsigned char  key_scan(void)
    {
    	unsigned char key_mark;
    	P3 = 0x0f;
    	
    	if(P30 == 0)	key_mark = 7;
    	else if(P31 == 0)	key_mark = 6;
    	else if(P32 == 0)	key_mark = 5;
    	else if(P33 == 0)	key_mark = 4;
    	else key_mark = 0;
    	
    	return key_mark;
    }
    
    void close_perl(void)
    {
    	P0 = 0xff;
    	P2 = P2&0x1f|0x80;
    	P2 = P2&0x1f;
    	
    	P0 = 0x00;
    	P2 = P2&0x1f|0xa0;
    	P2 = P2&0x1f;
    }
    
    void Timer0Init(void)		//10毫秒@12.000MHz
    {
    	AUXR &= 0x7F;		//定时器时钟12T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TL0 = 0xF0;		//设置定时初值
    	TH0 = 0xD8;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0 = 1;
    	EA = 1;
    }
    
    void Timer1Init(void)		//10毫秒@12.000MHz
    {
    	AUXR &= 0xBF;		//定时器时钟12T模式
    	TMOD &= 0x0F;		//设置定时器模式
    	TL1 = 0xF0;		//设置定时初值
    	TH1 = 0xD8;		//设置定时初值
    	TF1 = 0;		//清除TF1标志
    	TR1 = 1;		//定时器1开始计时
    	ET1 = 1;
    	EA = 1;
    }
    
    
    void Delay10us(void)		//@11.0592MHz
    {
    	unsigned char i;
    
    	_nop_();
    	i = 25;
    	while (--i);
    }
    
    void Delay50us(void)		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	_nop_();
    	i = 1;
    	j = 134;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    void Delay250us()		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	_nop_();
    	i = 3;
    	j = 173;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    

    other.h

    #ifndef __OTHER_H_
    #define __OTHER_H_
    
    #include <stc15f2k60s2.h>
    #include <intrins.h>
    
    void Delay2ms(void);
    unsigned char seg_tran(int number);
    void seg_disp(int adr,int number);
    unsigned char  key_scan(void);
    void close_perl(void);
    void Timer0Init(void);
    void Timer1Init(void);
    void Delay10us(void);
    void Delay50us(void);
    void Delay250us(void);
    
    #endif 
    

    iic.c

    unsigned char adc_pcf(void)
    {
    	unsigned char date;
    	IIC_Start();
    	
    	IIC_SendByte(0x90); 
    	IIC_WaitAck();
    	IIC_SendByte(0x43);
    	IIC_WaitAck();
    	
    	IIC_Start();
    	IIC_SendByte(0x91);
    	IIC_WaitAck();
    	date = IIC_RecByte();
    	IIC_WaitAck();
    	
    	IIC_Stop();
    	return date;
    }
    
    void ee_write(unsigned char adress,unsigned char date)
    {
    	EA = 0;
    	
    	IIC_Start();
    	
    	IIC_SendByte(0xa0);
    	IIC_WaitAck();
    	IIC_SendByte(adress);
    	IIC_WaitAck();
    	IIC_SendByte(date);
    	IIC_WaitAck();
    	
    	IIC_Stop();
    	
    	EA = 1;
    }
    
    unsigned char ee_read(unsigned char adress)
    {
    	unsigned char date;
    	
    	EA = 0;
    	
    	IIC_Start();
    	
    	IIC_SendByte(0xa0);
    	IIC_WaitAck();
    	IIC_SendByte(adress);
    	IIC_WaitAck();
    	
    	IIC_Start();
    	
    	IIC_SendByte(0xa1);
    	IIC_WaitAck();
    	date = IIC_RecByte();
    	IIC_WaitAck();
    	
    	IIC_Stop();
    	
    	EA = 1;
    	
    	return date;
    }
    

    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); 
    
    unsigned char adc_pcf(void);
    void ee_write(unsigned char adress,unsigned char date);
    unsigned char ee_read(unsigned char adress);
    
    #endif
    

    main.c

    #include <other.h>
    #include <iic.h>
    
    #define led1 0x01
    #define led2 0x02
    #define led3 0x04
    #define led4 0x08
    #define led5 0x10
    #define led6 0x20
    #define led7 0x40
    #define led8 0x80
    
    unsigned char key_old;
    
    unsigned char adc;
    float adc_f;
    unsigned int adc_100;
    unsigned char led_time = 40;
    int led_stateA = 0;//流转组别
    unsigned char led_stateB = 0;//每个组别的状态
    unsigned char timer0_up;
    unsigned char timer1_up;
    unsigned char State1[8] = {led1,led2,led3,led4,led5,led6,led7,led8};
    unsigned char State2[8] = {led8,led7,led6,led5,led4,led3,led2,led1};
    unsigned char State3[4] = {led1|led8,led2|led7,led3|led6,led4|led5};
    unsigned char State4[4] = {led4|led5,led3|led6,led2|led7,led1|led8};
    unsigned char change_mode;
    unsigned char light_mode;
    
    bit seg_bit;
    bit led_start;
    
    void led_pro(void)
    {
    	P0 = 0xff;
    	if(led_stateA == 0)
    	{
    			P0 = (P0|0xff)&(~State1[led_stateB]);
    			P2 = P2&0x1f|0x80;
    			P2 = P2&0x1f;
    			if(led_stateB == 8)	
    			{
    				led_stateB = 0;
    				led_stateA++;
    			}
    	}
    	else if(led_stateA == 1)
    	{
    			P0 = (P0|0xff)&(~State2[led_stateB]);
    			P2 = P2&0x1f|0x80;
    			P2 = P2&0x1f;
    			if(led_stateB == 8)	
    			{
    				led_stateB = 0;
    				led_stateA++;
    			}
    	}
    	else if(led_stateA == 2)
    	{
    			P0 = (P0|0xff)&(~State3[led_stateB]);
    			P2 = P2&0x1f|0x80;
    			P2 = P2&0x1f;
    			if(led_stateB == 4)	
    			{
    				led_stateB = 0;
    				led_stateA++;
    			}
    	}
    	else if(led_stateA == 3)
    	{
    			P0 = (P0|0xff)&(~State4[led_stateB]);
    			P2 = P2&0x1f|0x80;
    			P2 = P2&0x1f;
    			if(led_stateB == 4)	
    			{
    				led_stateB = 0;
    				led_stateA++;
    			}
    	}
    	switch(light_mode)
    	{
    		case 1:
    			Delay250us();
    		break;
    		
    		case 2:
    			Delay50us();
    		break;
    		
    		case 3:
    			Delay10us();
    		break;
    			
    		case 4:
    			
    		break;
    	}
    	close_perl();
    	switch(light_mode)
    	{
    		case 1:
    			Delay250us();
    		break;
    		
    		case 2:
    			Delay50us();
    		break;
    		
    		case 3:
    			Delay10us();
    		break;
    			
    		case 4:
    			
    		break;
    	}
    	if(led_stateA == 4)
    	{
    		led_stateA = 0;
    	}
    	
    }
    
    void seg_pro(void)
    {
    	adc = adc_pcf();
    	adc_f = (float)adc/255*5;
    	adc_100 = adc_f*100;
    	ee_write(0x01,led_time);
    	if(adc < 64)	light_mode = 1;
    	else if((adc >= 64)&&(adc < 128))	light_mode = 2;
    	else if((adc >= 128)&&(adc < 192))	light_mode = 3;
    	else if(adc > 192)	light_mode = 4;
    	
    	switch(change_mode)
    	{
    		case 0:
    			seg_disp(0,16);Delay2ms();
    			seg_disp(1,16);Delay2ms();
    			seg_disp(2,16);Delay2ms();
    			seg_disp(3,16);Delay2ms();
    			seg_disp(4,16);Delay2ms();
    			seg_disp(5,16);Delay2ms();
    			seg_disp(6,16);Delay2ms();
    			seg_disp(7,16);Delay2ms();
    		break;
    		
    		case 1:
    			seg_disp(0,10);Delay2ms();
    			if(seg_bit == 0)
    			{
    				seg_disp(1,led_stateA+1);Delay2ms();
    			}
    			else 
    			{
    				seg_disp(1,16);Delay2ms();
    			}
    			seg_disp(2,10);Delay2ms();
    			
    			if(led_time >= 100)	seg_disp(4,led_time/100);Delay2ms();
    			seg_disp(5,led_time%100/10);Delay2ms();
    			seg_disp(6,0);Delay2ms();
    			seg_disp(7,0);Delay2ms();
    		break;
    			
    		case 2:
    			seg_disp(0,10);Delay2ms();
    			seg_disp(1,led_stateA+1);Delay2ms();
    			seg_disp(2,10);Delay2ms();
    			
    			if(seg_bit == 0)
    			{
    				if(led_time > 100)	seg_disp(4,led_time/100);Delay2ms();
    				seg_disp(5,led_time%100/10);Delay2ms();
    				seg_disp(6,0);Delay2ms();
    				seg_disp(7,0);Delay2ms();	
    			}
    			else
    			{
    				seg_disp(4,16);Delay2ms();
    				seg_disp(5,16);Delay2ms();
    				seg_disp(6,16);Delay2ms();
    				seg_disp(7,16);Delay2ms();
    			}
    		break;
    	}
    	while((key_scan() == 4)&&(change_mode == 0))
    	{	
    		adc = adc_pcf();
    		if(adc < 64)	light_mode = 1;
    		else if((adc >= 64)&&(adc < 128))	light_mode = 2;
    		else if((adc >= 128)&&(adc < 192))	light_mode = 3;
    		else if(adc > 192)	light_mode = 4;
    		seg_disp(6,10);Delay2ms();
    		seg_disp(7,light_mode);Delay2ms();
    		led_pro();
    	}
    }
    
    void key_pro(void)
    {
    	unsigned char key_vol,key_down;
    	
    	key_vol = key_scan();
    	key_down = key_vol&(key_vol^key_old);
    	key_old = key_vol;
    	
    	switch(key_down)
    	{
    		case 7:
    			ET0 = ~ET0;
    			led_start = 1;
    		break;
    		
    		case 6:
    			change_mode ++;
    			if(change_mode == 3)
    			{
    				change_mode = 0;
    			}
    			led_start = 1;
    		break;
    		
    		case 5:
    			switch(change_mode)
    			{
    				case 1:
    					led_stateA ++;
    					if(led_stateA == 4)	led_stateA = 0;
    				break;
    				
    				case 2:
    					led_time = led_time + 10;
    					if(led_time > 120)	led_time = 40;
    				break;
    			}
    			led_start = 1;
    		break;
    		
    		case 4:
    			switch(change_mode)
    			{
    				case 1:
    					led_stateA --;
    					if(led_stateA < 0)	led_stateA = 3;
    				break;
    				
    				case 2:
    					led_time = led_time - 10;
    					if(led_time < 40)	led_time = 120;
    				break;
    			}
    			led_start = 1;
    		break;
    	}
    }
    
    void main(void)
    {
    	Timer0Init();
    	close_perl();
    	led_time = ee_read(0x01);
    	Timer1Init();
    	while(1)
    	{
    		key_pro();
    		if(led_start == 1)
    		{
    			seg_pro();
    			led_pro();
    		}
    	}
    }
    
    void timer0(void) interrupt 1
    {
    	if(led_start == 1)
    	{
    		timer0_up++;
    		if(timer0_up == led_time)
    		{
    			timer0_up = 0;
    			led_stateB ++;
    		}
    	}
    }
    
    void timer1(void) interrupt 3
    {
    	timer1_up ++;
    	if(timer1_up == 80)
    	{
    		timer1_up = 0;
    		seg_bit = ~seg_bit;
    	}
    }
    
    更多相关内容
  • 第九届蓝桥杯单片机省赛题目解析

    千次阅读 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;
    	}
    }	

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

    展开全文
  • (1) 当MCS-51访问片外的存储器时,其低8位地址由由(P2)口提供,8位数据由(P0)...(2) 当由MCS-51单片机构成的系统正常工作后,在RST引脚上附加一个(高)电平,并至少维持(2)个机器周期可令系统复位,复位后各IO口为(高)电平。
  • 届蓝桥杯单片机省赛题目解析

    千次阅读 2021-08-26 16:13:40
    今天终于有空可以写届省赛的题目解析了,八届(2017)总体也不算难,我们一起来看看吧。 题目 这次题目还是一样用到了三大模块(按键、LED、数码管),还用了实时时钟(DS1302)和DS18B20。其中DS18B...

    今天终于有空可以写第八届省赛的题目解析了,第八届(2017)总体也不算难,我们一起来看看吧。

    题目

    这次题目还是一样用到了三大模块(按键、LED、数码管),还用了实时时钟(DS1302)和DS18B20。其中DS18B20上一届也考过。这里面的单个模块都不难,题目也很好理解,写题目最重要的就是自己的思路和逻辑是否正确了。

    1 数码管显示

    数码管就只有两种模式显示,一种是时钟显示,另一种是闹钟显示,分别通过按键s7,s6来控制。

    2 LED显示

    当时钟和闹钟的值一致时,L1以0.2秒为间隔闪烁持续5秒然后关闭,或者是在闪烁期间按任意键关闭。

    3按键模块

    题目用到的是一个独立按键,s7可以时钟的调整时、分、秒,就可以定义一个变量mode1,当mode1为0显示时钟,为1时钟的时开始以一秒为间隔闪烁,为2分开始以一秒为间隔闪烁,为3秒开始以一秒为间隔闪烁。s6定义一个变量mode2,功能和s7一样。s5、s4就是加减,但是只有在时钟或闹钟的时分秒闪烁时有用。另外s4还有一个功能在时钟显示界面(也就是mode1==0)按下显示温度,松开回到时钟显示界面。

    4 DS18B20

     就是改写底层驱动代码部分(onewire),然后放在定时器里,每隔一段时间去测量一次。

     5 DS1302

    也是改写底层驱动代码部分(SPI),然后放在定时器里,每隔一段时间去测量一次。

    6 代码

    onewire.c

    #include"onewire.h"
    
    sbit DQ = P1^4;  
    
    void Delay_OneWire(unsigned int t) 
    {
    	t*=12;
    	while(t--);
    }
    
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    }
    
    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
      
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		dat >>= 1;
    		DQ = 1;
    		if(DQ)
    		{
    			dat |= 0x80;
    		}	    
    		Delay_OneWire(5);
    	}
    	return dat;
    }
    
    bit init_ds18b20(void)
    {
      	bit initflag = 0;
      	
      	DQ = 1;
      	Delay_OneWire(12);
      	DQ = 0;
      	Delay_OneWire(80);
      	DQ = 1;
      	Delay_OneWire(10); 
        initflag = DQ;     
      	Delay_OneWire(5);
      
      	return initflag;
    }
    
    unsigned int get_temp()
    {
    	unsigned char high,low;
    	unsigned int result;
    	
    	init_ds18b20();
    	Write_DS18B20(0xcc);
    	Write_DS18B20(0x44);
    	
    	init_ds18b20();
    	Write_DS18B20(0xcc);
    	Write_DS18B20(0xbe);
    	
    	low=Read_DS18B20();
    	high=Read_DS18B20();
    	
    	result=(high<<8)|low;
    	result*=6.25;
    	return result;
    }

    onewire.h

    #ifndef _ONEWIRE_H_
    #define _ONEWIRE_H_
    
    #include<stc15f2k60s2.h>
    #include"intrins.h"
    
    void Delay_OneWire(unsigned int t);
    void Write_DS18B20(unsigned char dat);
    unsigned char Read_DS18B20(void);
    bit init_ds18b20(void);
    unsigned int get_temp();
    
    
    #endif

    ds1302.c

    建议读取时钟的数据就放在时钟初始化的数组里,不然如果新建一个数组来放读取时间的数据,就会出现每次在加、减时钟的时分秒后,时钟都会从初始化开始。

    #include"ds1302.h"
    
    unsigned  char Time_Init[]={50,59,23,1,1,1,1};
    
    sbit SCK=P1^7;		
    sbit SDA=P2^3;		
    sbit RST = P1^3;   
    
    
    void Write_Ds1302(unsigned  char temp) 
    {
    	unsigned char i;
    	for (i=0;i<8;i++)     	
    	{ 
    		SCK=0;
    		SDA=temp&0x01;
    		temp>>=1; 
    		SCK=1;
    	}
    }   
    
    void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
    {
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
     	RST=1; 	_nop_();  
     	Write_Ds1302(address);	
     	Write_Ds1302((dat/10<<4)|(dat%10));		
     	RST=0; 
    }
    
    unsigned char Read_Ds1302_Byte ( unsigned char address )
    {
     	unsigned char i,temp=0x00;
    	unsigned char dat1,dat2;
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
     	RST=1;	_nop_();
     	Write_Ds1302(address);
     	for (i=0;i<8;i++) 	
     	{		
    		SCK=0;
    		temp>>=1;	
     		if(SDA)
     		temp|=0x80;	
     		SCK=1;
    	} 
     	RST=0;	_nop_();
     	SCK=0;	_nop_();
    	SCK=1;	_nop_();
    	SDA=0;	_nop_();
    	SDA=1;	_nop_();
    	
    	dat1=temp/16;
    	dat2=temp%16;
    	temp=dat1*10+dat2;
    	
    	return (temp);			
    }
    
    void ds1302_Init(void)
    {
    	unsigned char add=0x80,i=0;
    	Write_Ds1302_Byte( 0x8e,0x00 );
    	for(i=0;i<7;i++)
    	{
    		Write_Ds1302_Byte( add,Time_Init[i] );
    		add+=2;
    	}
    	Write_Ds1302_Byte( 0x8e,0x80 );
    }
    
    void ds1302_Read(void)
    {
    	unsigned char add=0x81,i=0;
    	Write_Ds1302_Byte( 0x8e,0x80 );
    	for(i=0;i<7;i++)
    	{
    		Time_Init[i]=Read_Ds1302_Byte( add );
    		add+=2;
    	}
    	Write_Ds1302_Byte( 0x8e,0x80 );
    }

    ds1302.h

    #ifndef __DS1302_H
    #define __DS1302_H
    
    #include <STC15F2K60S2.h>
    #include <intrins.h>
    
    void Write_Ds1302(unsigned char temp);
    void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
    unsigned char Read_Ds1302_Byte( unsigned char address );
    void ds1302_Init(void);
    void ds1302_Read(void);
    #endif
    

    init.c

    #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
    	
    u8 tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
    u8 seg[]={11,11,11,11,11,11,11,11};
    
    static u8 segadder=0,key_state=0;
    
    extern u8 mode1,mode2,c,d;  // extern表示此变量是在别处定义的,要在此处引用
    
    u8 key_num,num1,key_press;
    
    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 Timer0Init(void)		//1ms的定时器0
    {
    	AUXR |= 0x80;		
    	TMOD &= 0xF0;		
    	TL0 = 0xCD;		
    	TH0 = 0xD4;		
    	TF0 = 0;		
    	TR0 = 1;	
    	ET0 = 1;
    	EA = 1;
    }
    
    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&&c==0&&d==1)   //在时钟显示界面按下显示温度
    					{
    						jm3();
    						d=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&&c==0&&d==0)d=1;	//松开回到时钟显示界面
    			  key_state=state_0;
    			}
    			break;		
    	}
    	num1=key_num;
    	key_num=0;
    	return num1;
    }

    init.h

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

    jm.c

    #include"jm.h"
    #include"init.h"
    #include"onewire.h"
    
    #define u8 unsigned char 
    #define u16 unsigned int 
    	
    extern u8 seg[],mode1,mode2,Time_Init[];    // extern表示此变量是在别处定义的,要在此处引用
    extern u8 mode1_flag,temp_flag,mode2_flag;
    u8 ac[]={0,0,0};  //闹钟的初始值
    u16 temp;
    
    void jm3()  //显示温度
    {
    	if(temp_flag==1)
    	{
    		temp_flag=0;
    		temp=get_temp();
    	}
    		seg[0]=11;
    		seg[1]=11;
    		seg[2]=11;
    		seg[3]=11;
    		seg[4]=11;
    		seg[5]=temp/1000;
    		seg[6]=temp/100%10;
    		seg[7]=12;
    }
    
    void jm4()
    {
    	if(mode1==1)
    	{
    		if(Time_Init[2]==0) Time_Init[2]=23;
    		else Time_Init[2]--;
    	}
    	if(mode1==2)
    	{
    		if(Time_Init[1]==0) Time_Init[1]=59;
    		else Time_Init[1]--;
    	}
    	if(mode1==3)
    	{
    		if(Time_Init[0]==0) Time_Init[0]=59;
    		else Time_Init[0]--;
    	}
      if(mode2==1)
    	{
    		if(ac[2]==0) ac[2]=23;
    		else ac[2]--;
    	}
      if(mode2==2)
    	{
    		if(ac[1]==0) ac[1]=59;
    		else ac[1]--;  
    	}
    	if(mode2==3)
    	{
    		if(ac[0]==0) ac[0]=59;
    		else ac[0]--;
    	}
    }
    
    void jm5()
    {
    	if(mode1==1)
    	{
    		if(Time_Init[2]==23) Time_Init[2]=0;
    		else Time_Init[2]++;
    	}
    	if(mode1==2)
    	{
    		if(Time_Init[1]==59) Time_Init[1]=0;
    		else Time_Init[1]++;
    	}
    	if(mode1==3)
    	{
    		if(Time_Init[0]==0) Time_Init[0]=0;
    		else Time_Init[0]++;
    	}
      if(mode2==1)
    	{
    		if(ac[2]==23) ac[2]=0;
    		else ac[2]++;
    	}
      if(mode2==2)
    	{
    		if(ac[1]==59) ac[1]=0;
    		else ac[1]++;  
    	}
    	if(mode2==3)
    	{
    		if(ac[0]==59) ac[0]=0;
    		else ac[0]++;
    	}
    }
    
    void jm6()
    {
    	if(mode2==0)   //闹钟显示界面
    	{
    		seg[0]=ac[2]/10;
    		seg[1]=ac[2]%10;
    		seg[2]=10;
    		seg[3]=ac[1]/10;
    		seg[4]=ac[1]%10;
    		seg[5]=10;
    		seg[6]=ac[0]/10;
    		seg[7]=ac[0]%10;
    	}
    	if(mode2==1)   //时以一秒为间隔闪烁
    	{
    		if(mode2_flag==1)
    		{
    			seg[0]=11;
    			seg[1]=11;
    		}
    		else
    		{
    			seg[0]=ac[2]/10;
    			seg[1]=ac[2]%10;
    		}
    		seg[2]=10;
    		seg[3]=ac[1]/10;
    		seg[4]=ac[1]%10;
    		seg[5]=10;
    		seg[6]=ac[0]/10;
    		seg[7]=ac[0]%10;
    	}
    	if(mode2==2)   //分以一秒为间隔闪烁
    	{
    		if(mode2_flag==1)
    		{
    			seg[3]=11;
    			seg[4]=11;
    		}
    		else
    		{
    			seg[3]=ac[1]/10;
    			seg[4]=ac[1]%10;
    		}
    		seg[0]=ac[2]/10;
    		seg[1]=ac[2]%10;;
    		seg[2]=10;
    		seg[5]=10;
    		seg[6]=ac[0]/10;
    		seg[7]=ac[0]%10;
    	}
    	if(mode2==3)    //秒以一秒为间隔闪烁
    	{
    		if(mode2_flag==1)
    		{
    			seg[6]=11;
    			seg[7]=11;
    		}
    		else
    		{
    			seg[6]=ac[0]/10;
    			seg[7]=ac[0]%10;	
    		}
    		seg[0]=ac[2]/10;
    		seg[1]=ac[2]%10;
    		seg[2]=10;
    		seg[3]=ac[1]/10;
    		seg[4]=ac[1]%10;
    		seg[5]=10;
    	}
    }
    
    void jm7()
    {
    	if(mode1==0)  //时钟显示界面
    	{
    		seg[0]=Time_Init[2]/10;
    		seg[1]=Time_Init[2]%10;
    		seg[2]=10;
    		seg[3]=Time_Init[1]/10;
    		seg[4]=Time_Init[1]%10;
    		seg[5]=10;
    		seg[6]=Time_Init[0]/10;
    		seg[7]=Time_Init[0]%10;
    	}
    	if(mode1==1)  //时以一秒为间隔闪烁
    	{
    		if(mode1_flag==1)
    		{
    			seg[0]=11;
    			seg[1]=11;
    	  }
    		else
    		{
    			seg[0]=Time_Init[2]/10;
    			seg[1]=Time_Init[2]%10;
    		}
    		seg[2]=10;
    		seg[3]=Time_Init[1]/10;
    		seg[4]=Time_Init[1]%10;
    		seg[5]=10;
    		seg[6]=Time_Init[0]/10;
    		seg[7]=Time_Init[0]%10;
    	}
    	if(mode1==2)  //分以一秒为间隔闪烁
    	{
    		if(mode1_flag==1)
    		{
    			seg[3]=11;
    			seg[4]=11;
    		}
    		else
    		{
    			seg[3]=Time_Init[1]/10;
    			seg[4]=Time_Init[1]%10;
    		}
    		seg[0]=Time_Init[2]/10;
    		seg[1]=Time_Init[2]%10;
    		seg[2]=10;
    		seg[5]=10;
    		seg[6]=Time_Init[0]/10;
    		seg[7]=Time_Init[0]%10;
    	}
    	if(mode1==3)  //秒以一秒为间隔闪烁
    	{
    		if(mode1_flag==1)
    		{
    			seg[6]=11;
    			seg[7]=11;
    		}
    		else
    		{
    			seg[6]=Time_Init[0]/10;
    			seg[7]=Time_Init[0]%10;
    		}
    		seg[0]=Time_Init[2]/10;
    		seg[1]=Time_Init[2]%10;
    		seg[2]=10;
    		seg[3]=Time_Init[1]/10;
    		seg[4]=Time_Init[1]%10;
    		seg[5]=10;
    	}
    }

    jm.h

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

    main.c

    #include"init.h"
    #include"onewire.h"
    #include"ds1302.h"
    #include"jm.h"
    
    #define u8 unsigned char 
    #define u16 unsigned int
    	
    extern u8 ac[],seg[],Time_Init[];   // extern表示此变量是在别处定义的,要在此处引用
    
    u8 num,mode1=0,mode2=0;
    u8 temp_count=0,ac_count=0;
    u8 c,d;
    u8 cd_flag=0,ac_flag=0,mode1_flag=0,mode2_flag=0,temp_flag=0;
    u16 cd_count=0,mode1_count=0,mode2_count=0,time_count=0;
    
    void main()
    {
    	close_init();
    	Timer0Init();
    	ds1302_Init();
    	while(1)
    	{
    		num=read_key();
    		switch(num)
    		{
    			case 4:
    				if(c==1||d==1)  //在时钟界面或者闹钟界面
    				{
    					if((mode1!=0)||(mode2!=0))  //在时钟或者闹钟的时分秒
    					{
    						jm4();
    					  ds1302_Init();
    					}
    				}
    					cd_flag=0;  //当L1闪烁时按任意按键停止闪烁
    				break;
    			case 5:
    				if(c==1||d==1)
    				{
    					if((mode1!=0)||(mode2!=0))
    					{
    						jm5();
    					  ds1302_Init();
    					}
    				}
    					cd_flag=0;    //当L1闪烁时按任意按键停止闪烁
    				break;
    			case 6:
    				if(++mode2==4) mode2=0;
    					c=1,d=0;
    			    cd_flag=0;    //当L1闪烁时按任意按键停止闪烁
    				break;
    			case 7:
    				if(++mode1==4) mode1=0;
    					c=0,d=1;
    			    cd_flag=0;    //当L1闪烁时按任意按键停止闪烁
    				break;
    		}
    		num=0;
    		if(c==1&&d==0)jm6();
    		if(d==1&&c==0)jm7();
    		if((Time_Init[2]==ac[2])&&(Time_Init[1]==ac[1])&&(Time_Init[0]==ac[0]))
    			cd_flag=1;    //当cd_flag为1时L1开始闪烁
    		if(ac_flag==1&&cd_flag==1)
    		{
    			P2=(P2&0x1f)|0x80;P0=0xfe;P2&=0x1f;  //L1亮
    		}
    		else
    		{
    			P2=(P2&0x1f)|0x80;P0=0xff;P2&=0x1f;  //L1灭
    		}
    	}
    }
    
    void Timer0() interrupt 1
    {
    	display();
    	if(++temp_count==200)   //每200ms获取一次温度的值
    	{
    		temp_count=0;
    		temp_flag=1;
    	}
    	
    	if(cd_flag==1)
    	{
    		if(++ac_count==200)   //L1以0.2s开始闪烁
    		{
    			ac_count=0;
    			ac_flag^=1;
    		}
    		if(++cd_count>=5000)   //5s后L1灭
    		{
    			cd_count=0;
    			cd_flag=0;
    		}
    	}
    	
    	if(mode1!=0)  //不在时钟显示界面,时分秒以1s开始闪烁
    	{
    		if(++mode1_count==1000)
    		{
    			mode1_count=0;
    			mode1_flag^=1;
    		}
    	}
    	
    	if(mode2!=0)    //不在闹钟显示界面,时分秒以1s开始闪烁
    	{
    		if(++mode2_count==1000)
    		{
    			mode2_count=0;
    			mode2_flag^=1;
    		}
    	}
    	if(++time_count==1000)   //每秒读取一次时间的值
    	{
    		time_count=0;
    		ds1302_Read();
    	}
    }

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

    展开全文
  • 蓝桥杯电子类单片机 2022年备 南京信息工程大学 代码 注释

    按照之前的模式,我列一下我完成这个省赛的时间表,希望能对你起到帮助!

    分析题目,是否需要数码管和矩阵按键约1分钟
    让数码管显示1234.5678约10分钟
    通过矩阵按键改变数码管的显示内容约15分钟
    阅读题目,理解系统需求约5分钟
    让DS1302时钟芯片运作,初值为题目要求的23时59分50秒(显示数据出错,如何修复我会在代码区注释说明)约15分钟
    针对S5按键,时钟设置,增加1s间隔闪烁功能。(此时数码管出现“影子”,如何修复及其原理文末解释)约20分钟(15分钟修理BUG)
    针对S8,S9按键,完善时钟设置。(不含闹钟)(代码中的写法要学习,因为熟悉这种使用,所以这部分我很快解决)约15分钟
    增加闹钟闪烁(与第七届错误相同,可参考我的上一篇文章,这次出现这个BUG我修理的非常快蓝桥杯单片机省赛 第七届(代码+分析)_tuygre的博客-CSDN博客约10分钟(2分钟修理BUG)
    增加闹钟设置(复制时钟内容,修改参数)约10分钟
    增加温度模块(出现数据无法显示BUG,发现第二次模块忘记初始化,这种错误就不解释了,可以看蓝桥杯单片机模块代码(DS18B20温度测量)(代码+注释)_tuygre的博客-CSDN博客约25分钟(15分钟修理BUG)
    非设置模式按下S8,显示温度(BUG是温度显示后无法返回,是代码段位置错误,我会在代码区注释说明)约15分钟(10分钟修理BUG)
    再次审题,检测修饰功能(比如count=0这样的小细节,使得系统更加精准)约10分钟

    这次的试题很简单,也很难。简单在模块简单,单个功能逻辑简单。难在需要的参量很多,如果各个功能逻辑没有明白,出错了就很难修改,因为完全不知道修改哪里。所以还是那句话,一步步来,做一步烧录一次,如果出错,修改成功的概率非常大。就比如本题的LED闪烁,我也是先让他亮的准,再做到闪烁。也是LED,我意识到完全可以用一个参数,不用让lighten函数到处都是,但是那时已经进入了别的功能的书写,完全不知道从何处开始修改(为此道歉,但完全不影响功能)。希望我的LED经历给你启发。

    本题对于逻辑清晰,书写习惯好的同学是福利。对于逻辑混乱或接触单片机时间非常短的同学,可以说是个难题了,5-10小时的书写完全有可能,但不要灰心。

    既然参量多,我就直接先列表。方便大家理解。【此处依旧默认你是跟着我写的文章一步步学的,模块博客里出现的参数不解释】

    time1[3]setflagtime0tishijishuse
    闹钟时间时钟模式设置闪烁控制,为1对应单元不亮时钟时间为1表示闹钟触发,LED允许闪烁控制闹钟闪烁时长时钟模式设置
    tiaowenducountshancount1time0[3]
    为1灯亮为1显示温度控制时钟设置界面闪烁控制闹钟闪烁间隔控制闹钟设置界面闪烁时钟时间

    下面我们进入代码编程,整体看完后,我在讲讲我BUG的修改思路(函数后有“/*相同*/”代表与之前模块的内容几乎相同【此处默认你是跟着我写的文章一步步学的】。因为自己在写系统时不会看之前的模块,所以参数名字会有区别,其他几乎相同。):

    #include "STC15F2K60S2.H"
    #include "stdio.h"
    #include "ds1302.h"
    #include "onewire.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    u8 org[10],tran[10],wei,old,new,time1[3]={0,0,0},delay,set,flag;
    u8 time0[3]={23,59,50},tishi,se,tiao,low,high,*zhen1,*zhen2,wendu;
    u16 count,jishu,count1,shan,tem;
    
    void lighten(u8 led)/*相同*/
    {
      P0=~led;
      P2=P2&0X1F|0X80;
      P2=P2&0X1F;
    }
      
    void close()/*相同*/
    {
      P0=0;
      P2=P2&0X1F|0XA0;
      P2=P2&0X1F;
      P0=0XFF;
      P2=P2&0X1F|0X80;
      P2=P2&0X1F;
    }
    
    void write()/*相同*/
    {
      u8 mid1;
      Write_Ds1302_Byte(0x8e,0);
      mid1=((time0[0]/10)<<4)+(time0[0]%10);
      Write_Ds1302_Byte(0x84,mid1);
      mid1=((time0[1]/10)<<4)+(time0[1]%10);;
      Write_Ds1302_Byte(0x82,mid1);
      mid1=((time0[2]/10)<<4)+(time0[2]%10);;
      Write_Ds1302_Byte(0x80,mid1);
      Write_Ds1302_Byte(0x8e,0x80);
    }
    
    void open()/*相同*/
    {
      EA=1;
      ET1=1;
    }
    
    void Timer1Init(void)	/*相同*/	//1毫秒@12.000MHz
    {
    	AUXR &= 0xBF;		//定时器时钟12T模式
    	TMOD &= 0x0F;		//设置定时器模式
    	TL1 = 0x18;		//设置定时初值
    	TH1 = 0xFC;		//设置定时初值
    	TF1 = 0;		//清除TF1标志
    	TR1 = 1;		//定时器1开始计时
    }
    
    void translate(u8 org[],u8 tran[])/*相同*/
    {
      u8 k,i,mid;
      for(k=0,i=0;i<8;i++,k++)
      {
        switch(org[k])
    	{
    	  case '0':mid=0xc0;break;
    	  case '1':mid=0xf9;break;
    	  case '2':mid=0xa4;break;
    	  case '3':mid=0xb0;break;
    	  case '4':mid=0x99;break;
    	  case '5':mid=0x92;break;
    	  case '6':mid=0x82;break;
    	  case '7':mid=0xf8;break;
    	  case '8':mid=0x80;break;
    	  case '9':mid=0x90;break;
    	  case '-':mid=0xbf;break;
    	  case 'C':mid=0xc6*;break;
    	  default:mid=0xff;
    	}
    	if(org[k+1]=='.')
    	{
    	  mid&=0x7f;
    	  k++;
    	}
    	tran[i]=mid;
      }
    }
    
    void display(u8 tran[],u8 wei)/*相同*/
    {
      P0=0XFF;
      P2=P2&0X1F|0XE0;
      P2=P2&0X1F;
      P0=1<<wei;
      P2=P2&0X1F|0XC0;
      P2=P2&0X1F;
      P0=tran[wei];
      P2=P2&0X1F|0XE0;
      P2=P2&0X1F;
    }
    
    u8 keytran()/*相同*/
    {
      u16 key;
      u8 retu;
      P44=0;P42=1;P35=1;P34=1;
      key=P3&0X0F;
      P44=1;P42=0;P35=1;P34=1;
      key=(key<<4)|(P3&0X0F);
      P44=1;P42=1;P35=0;P34=1;
      key=(key<<4)|(P3&0X0F);
      P44=1;P42=1;P35=1;P34=0;
      key=(key<<4)|(P3&0X0F);
      switch(~key)
      {
        case 0X8000:retu=4;break;
    	case 0X4000:retu=5;break;
    	case 0X2000:retu=6;break;
    	case 0X1000:retu=7;break;
    	case 0X0800:retu=8;break;
    	case 0X0400:retu=9;break;
    	case 0X0200:retu=10;break;
    	case 0X0100:retu=11;break;
    	case 0X0080:retu=12;break;
    	case 0X0040:retu=13;break;
    	case 0X0020:retu=14;break;
    	case 0X0010:retu=15;break;
    	case 0X0008:retu=16;break;
    	case 0X0004:retu=17;break;
    	case 0X0002:retu=18;break;
    	case 0X0001:retu=19;break;
    	default:retu=0;
      }
      return retu;
    }
    
    void keydo()/*全系统最美的函数*/
    {
      new=keytran();
      if(new!=old&&new!=0)
      {
        switch(new)
    	{
           case 5:if(se==0&&(++set==4)) set=0;count=0;flag=0;tishi=0;lighten(0);shan=0;break;
    /*一定要学会这种写法!if(se==0&&(++set==4)) set=0;保证闹钟设置情况下不会进入时钟设置,并且若
    se!=0,则&&从左至右,不会对++set==4判定!set值就不会改变,就不会对时钟设置有任何影响!其余等于0的参数本质上都是优化,会让系统功能很漂亮,读者可以删除他们体会*/
    	   case 4:if(set==0&&(++se==4)) se=0;count1=0;flag=0;tishi=0;lighten(0);shan=0;break;
    /*与上类似,但是count1与count不可以是一个参数,否则在S4,S5一功能作用时,另一个按钮会影响闪烁,可以自己修改试试!*/
    	   case 8:if(set==1) {if(!time0[0]) time0[0]=23;else time0[0]--;}
    	          if(set==2) {if(!time0[1]) time0[1]=59;else time0[1]--;}
    			  if(set==3) {if(!time0[2]) time0[2]=59;else time0[2]--;}
    			  if(se==1) {if(!time1[0]) time1[0]=23;else time1[0]--;}
    	          if(se==2) {if(!time1[1]) time1[1]=59;else time1[1]--;}
    			  if(se==3) {if(!time1[2]) time1[2]=59;else time1[2]--;}
    			  tishi=0;lighten(0);shan=0;
    			  break;/*修改参数*/
    	   case 9:if(set==1) if(++time0[0]==24) time0[0]=0;
                  if(set==2) if(++time0[1]==60) time0[1]=0;
    			  if(set==3) if(++time0[2]==60) time0[2]=0;
    			  if(se==1) if(++time1[0]==24) time1[0]=0;
                  if(se==2) if(++time1[1]==60) time1[1]=0;
    			  if(se==3) if(++time1[2]==60) time1[2]=0;
    			  tishi=0;lighten(0);shan=0;break;/*修改参数*/
    	}
      }
       if(new==8&&se==0&set==0) wendu=1;
       else wendu=0;/*之前将它放在了if(new!=old&&new!=0)内,那样进入S8就无法通过S8退出温度显示了,可以试试,注意题目哦,松手就要恢复时间显示*/
       old=new;
    }
    
    void read()/*相同*/
    {
      u8 mid2;
      mid2=Read_Ds1302_Byte(0x81);
      time0[2]=(mid2>>4)*10+(mid2&0x0f);/*+的运算优先级高于&,所以()不能省哦*/
      mid2=Read_Ds1302_Byte(0x83);
      time0[1]=(mid2>>4)*10+(mid2&0x0f);
      mid2=Read_Ds1302_Byte(0x85);
      time0[0]=(mid2>>4)*10+(mid2&0x0f);
    }
    
    void main()
    {
      open();
      close();
      zhen1=&low;zhen2=&high;
      rd_temperature(zhen1,zhen2);/*读取温度,读取温度时间长,没有这一步第一次读温度就是初始值*/
      write();/*先将23时59分50秒写入DS1302*/
      Timer1Init();
      while(1)
      {
        if(!delay)/*降速,读取温度函数降速是应为速度慢,不降速会使得其他部分降速。 keydo降速为了防止多次识别按下*/
    	{
    	  delay=1;
    	  translate(org,tran);
    	  keydo();
    	  if(set==0) read();
    	  if(wendu==1)  {rd_temperature(zhen1,zhen2); tem=((high*256+low)/16.0);}
    	}
    	if(time0[0]==time1[0]&&time0[1]==time1[1]&&time0[2]==time1[2]) tishi=1;
    	if(wendu==1)  sprintf(org,"     %2uC",(u16)tem);
    	else if(flag==0&&se==0)  sprintf(org,"%02u-%02u-%02u",(u16)time0[0],(u16)time0[1],(u16)time0[2]);
    	else if(flag==0&&se!=0)	 sprintf(org,"%02u-%02u-%02u",(u16)time1[0],(u16)time1[1],(u16)time1[2]);
    	else if(set==1&&flag==1) {sprintf(org,"  -%02u-%02u",(u16)time0[1],(u16)time0[2]); write();}
    	else if(set==2&&flag==1) {sprintf(org,"%02u-  -%02u",(u16)time0[0],(u16)time0[2]); write();}
    	else if(set==3&&flag==1) {sprintf(org,"%02u-%02u-  ",(u16)time0[0],(u16)time0[1]); write();}
    	else if(se==1&&flag==1) {sprintf(org,"  -%02u-%02u",(u16)time1[1],(u16)time1[2]); }
    	else if(se==2&&flag==1) {sprintf(org,"%02u-  -%02u",(u16)time1[0],(u16)time1[2]); }
    	else if(se==3&&flag==1) {sprintf(org,"%02u-%02u-  ",(u16)time1[0],(u16)time1[1]); }
      /*依据参数决定数码管显示内容,ELSE IF很好地减少了判断次数,减少单片机负担*/
        }
    }
    
    void stop1() interrupt 3
    { 
      if(set) count++;
      if(se) count1++;
      if(tishi) 
      { 
        shan++;
        jishu++;
        if(jishu==5000) {tishi=0;lighten(0);shan=0;}
      }
      else if(!tishi) jishu=0;
      if(shan==200) {shan=0;if(++tiao==2) tiao=0;}
      if(tiao==1) lighten(1);
      if(tiao==0) lighten(0);
      if(count==1000) {count=0;if(++flag==2) flag=0;}
      if(count1==1000) {count1=0;if(++flag==2) flag=0;}
    /*因为闹钟设置时无法进入时钟设置,时钟设置时无法进入闹钟设置,flag可以共用*/
      if(++delay==10) delay=0;
      display(tran,wei);
      if(++wei==8) wei=0;
    }
    

    我解释“让DS1302时钟芯片运作,初值为题目要求的23时59分50秒(显示数据出错,如何修复我会在代码区注释说明)”BUG的修改过程:

    数码管出现影子,一定是没有消影成功,但如蓝桥杯单片机模块代码(数码管)(代码+注释)_tuygre的博客-CSDN博客所说,我写了消隐部分,为何仍然有影子。很奇怪。错误的部分给那看看:

    void display(u8 tran[],u8 wei)/*错误*/
    {
      P0=0XFF;
      P2=P2&0X1F|0XE0;
      P2=P2&0X1F;
      P0=tran[wei];
      P2=P2&0X1F|0XE0;
      P2=P2&0X1F;
      P0=1<<wei;
      P2=P2&0X1F|0XC0;
      P2=P2&0X1F;
    }

    感觉几乎一样吧?再看看?位选段选位置反了,位选就在消影后,数字电路高低电平的那种一个时刻就转换好完全不实际,他其实在很短的时间内仍然有一定电平,为了给足时间,段选在位选后。

    好了,第八届告一段落,读者可以复制代码,修改删除参数部分代码,感受我一些看似无用,实际让系统更加稳定的设置。如果你真正理解了,也可以帮我简化闹钟的LED闪烁。

    时钟模块:蓝桥杯单片机模块代码(DS1302时钟芯片)(代码+注释)_tuygre的博客-CSDN博客_芯片代码 

    头文件onewire有修改,具体看蓝桥杯单片机模块代码(DS18B20温度测量)(代码+注释)_tuygre的博客-CSDN博客

    官方提供的原理图,用户手册等下载地址如下:

    链接:https://pan.baidu.com/s/1y8lRYHxLKojL4_r0PZPYRw 
    提取码:19so

    注释无法插入图片,提到的相关信息读者自己在文件夹中寻找。

    南京信息工程大学本科学生学习笔记,供大家参考。

    如有错误,联系QQ3182097183。

    展开全文
  • 答案仅供参考,有错误欢迎指正,非常感谢!!! 文件较多,代码较长,... // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, //black - H J K ...
  • 蓝桥杯单片机省赛——程序设计题 个人编写,代码仅供参考 如有不足,多多指教 1.题目 2.代码 main.c程序 #include "reg52.h" #include "ds1302.h" #include "onewire.h" #include "intrins.h" ...
  • 届蓝桥杯单片机省赛----程序题

    千次阅读 多人点赞 2021-03-24 17:46:56
    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,0xbf..
  • 蓝桥杯单片机第届省赛

    千次阅读 2022-02-20 11:12:47
    蓝桥杯单片机第届省赛
  • 蓝桥杯电子类单片机 2022年备 南京信息工程大学 代码 注释
  • 答案仅供参考,有错误欢迎指正,非常感谢!!! 文件较多,代码较长,感谢查看!!! 目录 main.h main.c Init.h Init.c ... // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F...
  • 蓝桥杯单片机第十一届省赛

    千次阅读 2022-01-26 13:04:27
    蓝桥杯单片机第十一届省赛
  • 蓝桥杯单片机——十二届省赛题

    千次阅读 2022-04-03 14:47:25
    蓝桥杯——单片机组十二届省赛题目简要分析及代码分享 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import ...
  • 届蓝桥杯单片机省赛题目解析

    千次阅读 2021-08-19 16:37:00
    好了回归主题(2016)省赛的题目总体不算难,我们一起来看看吧。 这次赛题整体还是不难的,做起来除了PWM不是很好理解以外,其他的还是很好理解的,最重要的是编程的逻辑。题目考察了LED显示、按键...
  • 2018_第九届_蓝桥杯_省赛——“彩灯控制器”的程序与调试
  • code uchar tab[] = {0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0xff, 0xc1, 0x8c, 0xc3, 0x88}; //U P L A 11 12 13 14 //初始化为0,一次表示从左至右分别表示S5的参数选择为上限,超声波的连续测量...
  • 自己做的蓝桥杯十三模拟题,师从小蜜蜂,做一些自己的记录吧。 选择题答案不确定就不发了 #include "reg52.h" #include "iic.h" sbit s7 = P3 ^ 0; //* sbit s6 = P3 ^ 1; sbit s5 = P3 ^ 2; ...
  • 蓝桥杯比赛 单片机组 届省赛题目解答(代码加注释)一、题目二、hex文件三、主函数实现四、整个工程文件最后   一、题目   历届的省和国赛的题目我已经在前面的文章里给大家分享了(网盘资源),需要的话,...
  • 最近几天闲着没事干,刷动态的时候,看到了十三的模拟题,然后就去搜了搜,题目来源@电子设计工坊,我是从博主@slow_walker看到的题目,原blog的链接:https://blog.csdn.net/boybs/article/details/123829667 ...
  • 蓝桥杯单片机届省赛

    千次阅读 2021-05-29 10:31:25
    unsigned char duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; //段码 unsigned char write_DS1302_addr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x...
  • 有一个值得注意的地方就是矩阵按键的长按显示问题,这个问题在届省赛——电子钟时也有所考察,当时是对于独立按键的长按显示进行了考察。 而就在去年的二场省,对于独立按键的长按短按时间进行了考察,...
  • 题目为基于单片机的电子钟程序设计与调试 分析 程序如何宏观规划(十分重要) 特点:切换界面多 方法:多个界面时用一个变量display_mode来管理,按键按下后对display_mode赋值,在while(1)每2ms程序里写if...
  • 蓝桥杯单片机设计与开发——第九届省赛客观题

    千次阅读 多人点赞 2019-03-10 22:27:05
    单片机设计与开发项目客观试题(30 分) (1)当MCS-51访问片外的存储器时,其低8位地址由&amp;nbsp;&amp;nbsp;P0&amp;nbsp;&amp;nbsp;口提供,高8位地址由&amp;nbsp; P2&amp;nbsp;&...
  • 第二次写第九届省赛赛题给我的感觉是:写代码的时候一定要保持头脑清晰,这样才能更高效地写代码(毕竟这比赛重逻辑)。好了,废话不多说,我直接贴代码了(全程使用状态机,减少脑髓流失)! #include "STC15F2K60...
  • 蓝桥杯单片机国赛 第九届

    千次阅读 2022-04-06 21:07:37
    蓝桥杯国赛第九届 题目 做题思路 首先写上要做的模块,界面,按键细节 一页纸就能让你不用看pdf即可写出整套题 简单示范: 突然就觉得很简单了对不对,笼统看就写几个模块,外加几个界面~ 下面,我就参照我是...
  • 蓝桥杯比赛 单片机组 届省赛题目解答(代码加注释)一、题目二、hex文件三、主函数实现四、整个工程文件最后   一、题目   历届的省和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源)...
  • 蓝桥杯第届省赛_电子钟】

    千次阅读 2022-01-18 22:46:10
    蓝桥杯单片机第8届省赛_电子钟 基础知识学习来自小蜜蜂老师 yyds 下面代码功能没有完全实现 有误还望大佬指正 总结分析: 八届题目难度从我个人来说明显会比七届难了很多,当然也可能是我自己这方面相关程序...
  • 目录 题目分析 main.h main.c Init.h Init.c SMG.h SMG.c DSQ.h DSQ.c YanShi.h YanShi.c JZKey.h JZKey.c ds1302.h ds1302.c iic.h iic.c LN555.h LN555.c 题目分析 其实这真题每什么难点,居然连LED都没有,就...
  • 蓝桥杯比赛 单片机组 第十届省赛题目解答(代码加注释)一、题目二、hex文件三、主函数实现四、整个工程文件最后   昨天晚上把十一届省赛的题目做完了,乘着省之前赶紧给大家分享出来,另外这次的题目参考了一...
  • 蓝桥杯嵌入式真题

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 233
精华内容 93
关键字:

蓝桥杯第九届单片机省赛试题csdn