蓝桥杯单片机学习14——第十三届省赛题

这篇具有很好参考价值的文章主要介绍了蓝桥杯单片机学习14——第十三届省赛题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上期我们学习了NE555方波发生器&频率测量,讲到我会更新之后省赛的题目,那么,他来了。
首先声明:我还没有参加蓝桥杯单片机比赛,也没有拿过奖,所以我写的代码注定不会那么完美,存在BUG是必然的,我写这个系列的目的纯粹是为了记录我的学习…………

任务要求

1.基本要求

蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件

2.竞赛板配置要求

蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件

3.硬件框图

蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件

4.功能描述

关于功能描述,我只想说是真的多,第一次写,花了我快一天的时间,但好在功能大部分已经实现完全了,不说了,看吧…………
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件

蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
看到这里,说明你是一个有耐心的人,那么作为一个有耐心的人,我觉得你一定能继续看下去的,下面,未来讲一下我的代码实现思路。

实现思路

首先我们拿到题目,必须要大概的看一遍,明确用到了那些模块,一些大概的要求什么的,重点要完成哪些部分。
【1】编写一些基本的函数内容,完成相关外设的初始化。
【2】完成数码管显示相关变量的各个页面,
【3】定义变量,实现数码管显示页面和显示内容的改变
【4】 按照任务要求在此基础上不断的修正代码结构框架
【5】检验代码的可行性,不断的DeBug…………

具体代码框架如下:
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件
可能光看这个图会显得有些抽象,不知道在写什么,所以我们来尝试加上代码一起理解。

代码实现

1.main.C

#include <STC15F2K60S2.H>
#include "LS138.h"
#include "Key.h"
#include "ds1302.h"
#include "onewire.h"

unsigned int Mode = 1;
struct Environment
{
    
    unsigned int Tempreature;		//定义温度变量
    unsigned int Tempreature_Set;	//定义温度设置值
    unsigned int Key_Vlaue;			//定义按键值
    unsigned int Time_Show_Mode;	//定义时间显示模式
    unsigned int Control_Mode;		//定义温度/时间控制模式
    unsigned char Relay_Flag;		//定义继电器状态
    unsigned int LED0_Flag ;		//定义LED0/L1状态
    unsigned int LED2_Flag ;		//定义LED1/L2状态
    unsigned long int Tick;			//定义时间值/tick为一天过了多少秒
    
}E1;

void Timer_Init(void)
{
     ET1 = 1;
    TMOD = 0x00;
    TH1 = 0xFC;
    TL1 = 0x18;
    EA = 1;
    TR1 = 1;
}
void Environment_Init(void)
{
    
    E1.Tempreature = 235;
    E1.Tempreature_Set = 230;
    E1.Key_Vlaue = 0;
    E1.Relay_Flag = 0;
    E1.Tick = 3595;
    E1.Time_Show_Mode = 1;
    E1.Control_Mode = 1;
    E1.LED0_Flag = 0;
    E1.LED2_Flag = 0;
    
}
void Init(void)
{
    Environment_Init();
    LS_Init();
    DS1302_Write_Time(E1.Tick);
    Timer_Init();
}
void SEG_Task(void)
{
    switch(Mode)
    {
        case 1: SEG_Page1(E1.Tempreature);
            break;
        case 2: SEG_Page2(E1.Time_Show_Mode,E1.Tick);
            break;
        case 3: SEG_Page3(E1.Tempreature_Set);
        break;
    }
    
}

void Key_Task(void)
{
    E1.Key_Vlaue = KeyScan();
    if(E1.Key_Vlaue == 12)
    {
        Mode++;
        if(Mode >3)
        {
            Mode = 1;
        }
    }
    if(E1.Key_Vlaue == 13)
    {
        E1.Control_Mode ++;
        if(E1.Control_Mode >=3)
        {
            E1.Control_Mode = 1;
        }
    }
    if(E1.Control_Mode == 1)
    {
        if(E1.Tempreature > E1.Tempreature_Set)
        {
            Relay_Control(1);
            E1.LED2_Flag = 1;
        }
        else
        {
            Relay_Control(0);
            E1.LED2_Flag = 0;
        }
    }
    if(E1.Control_Mode == 2)
    {
        if(E1.Tick % 3600 == 0 )
        {
            E1.Relay_Flag = 1;
            E1.LED2_Flag = 1;
        }
        
        if(E1.LED0_Flag == 1)
        {
            LED_Write(0xFE);
        }
        else
        {
            LED_Write(0xFF);
        }
    }
    if(E1.Tick % 3600 == 0 )
    {
        E1.LED0_Flag = 1;
    }
    if(E1.LED0_Flag == 1)
    {
        LED_Write(0xFE);
    }
    if(E1.LED0_Flag == 0)
    {
        LED_Write(0xFF);
    }
    if(Mode == 3)
    {
        if(E1.Key_Vlaue == 16)
        {
            E1.Tempreature_Set = E1.Tempreature_Set + 10;
            if(E1.Tempreature_Set > 999)
            {
                E1.Tempreature_Set = 999;
            }
        }
        if(E1.Key_Vlaue == 17)
        {
            E1.Tempreature_Set = E1.Tempreature_Set - 10;
            if(E1.Tempreature_Set < 100)
            {
                E1.Tempreature_Set = 100;
            }
        }
    }
    if(Mode == 2)
    {
        if(E1.Key_Vlaue == 17)
        {
            E1.Time_Show_Mode++;
        }
    }
    
    
}
void main()
{
    
    
    Init();
    while(1)
    {
        E1.Tempreature = DS_Read_Tempreatur();
        E1.Tick = DS1302_Read_Time(); 
        SEG_Task();
        Key_Task();
    }
}

void Timer0_Handler() interrupt 3
{
    static unsigned int Timer1_Count = 0;
    static unsigned int Relay_Count = 0;
    static unsigned int LED0_Count = 0;
    static unsigned int LED2_Count = 0;
    Timer1_Count++;
    
    if(E1.Control_Mode == 1)
    {
        if(E1.LED0_Flag == 1)
        {
            LED_Write(0xFC);
        }
        else
        {
            LED_Write(0xFD);
        }
        
    }
    if(Timer1_Count % 100 == 0)
    {
        if(E1.LED2_Flag == 1)
        {
            LED2_Count++;
            
            if(LED2_Count%2)
            {
                LED_Write(0xFB);
            }
            else
            {
                LED_Write(0xFF);
            }
        }
        
        
    }
    
    if(Timer1_Count >= 1000)
    {
        Timer1_Count = 0;
        
        if(E1.Relay_Flag == 1)
        {
            Relay_Count++;
            if(Relay_Count < 5)
            {
                Relay_Control(1);
            }
            else
            {
                Relay_Count = 0;
                E1.Relay_Flag = 0;
                E1.LED2_Flag = 0;
                Relay_Control(0);
            }
             
        }
        if(E1.LED0_Flag == 1)
        {
            LED0_Count++;
            
            if(LED0_Count >= 6)
            {
                LED0_Count = 0;
                E1.LED0_Flag = 0;
            }
        }
    }
}

LS138.h

#ifndef _LS138_H_
#define _LS138_H_

#include <STC15F2K60S2.H>


sbit LS_A = P2^5;
sbit LS_B = P2^6;
sbit LS_C = P2^7;




void LS_Init(void);

void LS138_Set(unsigned int dat);

void LS138_Clear(void);

void DelayXms(unsigned int x);

void LED_Control(unsigned int Flag);

void LED_Write(unsigned char dat);

void BEEP_Control(unsigned int Flag);

void Relay_Control(unsigned int Flag);

void SEG_Write(unsigned char pos, unsigned char dat);

void SEG_Page1(unsigned int tempreature);

void SEG_Page2(unsigned int Flag,unsigned long int Tick);

void SEG_Page3(unsigned int tempreature);

#endif

LS138.C

#include "LS138.h"
                             //        0    1     2    3   4    5    6    7    8    9
unsigned char code SEG_Index[25] =  {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                    /* 0.  1.    2.          …………                  9.*/
                                    0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
                                   /*  U    -  */
                                    0xc1,0xbf};

void LS_Init(void)
{
    
    BEEP_Control(0);
    Relay_Control(0);
    LED_Control(0);
    LED_Write(0xFF);
}
void LS138_Set(unsigned int dat)
{
    switch(dat)
    {
        case 0:     LS_A = 0; LS_B = 0; LS_C = 0;
            break;
        case 1:
            break;
        case 2:
            break;
        case 3: 
            break;
        case 4:     LS_A = 0; LS_B = 0; LS_C = 1;
            break;
        case 5:     LS_A = 1; LS_B = 0; LS_C = 1;
            break;
        case 6:     LS_A = 0; LS_B = 1; LS_C = 1;
            break;
        case 7:     LS_A = 1; LS_B = 1; LS_C = 1;
            break;
    }
}

void LS138_Clear(void)
{
    LS_A = 0; LS_B = 0; LS_C = 0;
}

void DelayXms(unsigned int x)		//@12.000MHz
{
	unsigned char i, j,k;
    for(k=0;k<x;k++)
    {
        i = 12;
        j = 169;
        do
        {
            while (--j);
        } while (--i);
        
    }
	
}

void LED_Control(unsigned int Flag)
{
    if(Flag == 1)
    {
        LS138_Clear();
        
        LS138_Set(4);
        P0 = 0x00;
        LS138_Clear();
    }
    else
    {
        LS138_Clear();
        LS138_Set(4);
         P0 = 0xFF;
        LS138_Clear();
    }
}

void LED_Write(unsigned char dat)
{
    LS138_Clear();
    
    LS138_Set(4);
    P0 = dat;
    LS138_Clear();
        
}

void BEEP_Control(unsigned int Flag)
{
    if(Flag == 1)
    {
        LS138_Clear();
        
        LS138_Set(5);
        P0 = 0x40;
        LS138_Clear();
    }
    else
    {
        LS138_Clear();
       
        LS138_Set(5);
         P0 = 0x00;
        LS138_Clear();
    }
}

void Relay_Control(unsigned int Flag)
{
    if(Flag == 1)
    {
        LS138_Clear();
        
        LS138_Set(5);
        P0 = 0x10;
        LS138_Clear();
    }
    else
    {
        LS138_Clear();
        
        LS138_Set(5);
        P0 = 0x00;
        LS138_Clear();
    }
}


void SEG_Write(unsigned char pos, unsigned char dat)
{
    LS138_Set(7);
    P0 = SEG_Index[dat];
    LS138_Clear();
    LS138_Set(6);
    P0 = 0x01 << pos;
    LS138_Clear();
    LED_Control(0);
    DelayXms(1);

}

void SEG_Page1(unsigned int tempreature)
{
    SEG_Write(0,20);
    SEG_Write(1,1);
    SEG_Write(5,tempreature/100%10);
    SEG_Write(6,tempreature/10%10 + 10);
    SEG_Write(7,tempreature %10);
}

void SEG_Page2(unsigned int Flag,unsigned long int Tick)
{
    SEG_Write(0,20);
    SEG_Write(1,2);
    SEG_Write(5,21);
    if(Flag % 2)
    {
        
        SEG_Write(3,Tick/3600/10%10);
        SEG_Write(4,Tick/3600%10);
        
        SEG_Write(6,Tick/3600/60/10%10);
        SEG_Write(7,Tick/3600/60%10);
    }
    else
    {
        SEG_Write(3,Tick/3600/60/10%10);
        SEG_Write(4,Tick/3600/60%10);
        
        SEG_Write(6,Tick%60/10%10);
        SEG_Write(7,Tick%60%10);
    }
    
}

void SEG_Page3(unsigned int tempreature)
{
    SEG_Write(0,20);
    SEG_Write(1,3);
    SEG_Write(6,tempreature/100%10);
    SEG_Write(7,tempreature/10%10);
}

Key.C

#include "Key.h"

unsigned int KeyScan(void)
{
    	static unsigned char    cnt = 0,	//continue value
	                last_trg = 0;	        //last trigger value
	unsigned char   trg = 0,	        //trigger value
            cur = 0,                //current value
            value = 3,             //必须初始化为3
            key_x = 0,
            key_y = 0;

    P3 = 0x0f;
    P4 = 0x00;
    if(!P30)        key_x = 3;          //获取X轴坐标
    else if(!P31)   key_x = 2;
    else if(!P32)   key_x = 1;
    else if(!P33)   key_x = 0;

    P3 = 0xf0;
    P4 = 0xff;
    if(!P34)        key_y = 4;          //获取Y轴坐标
    else if(!P35)   key_y = 3;
    else if(!P42)   key_y = 2;
    else if(!P44)   key_y = 1;

    cur = key_y^0;
    trg = cur^cnt & cur;
    cnt = cur;
    if((last_trg ^ trg & last_trg) && cur)
    {
        //计算矩阵按键的键值
        value = key_x + key_y * 4;
    }
    last_trg = trg;

    return value;    //返回独立按键的键值
    
}
Key.h这里就不写了,里面也没啥,就是一个KeyScan函数的声明

温度读取函数

unsigned int  DS_Read_Tempreatur(void)
{
    unsigned int dat  =0;
    unsigned char HSB,LSB;
    init_ds18b20();
    Write_DS18B20(0xCC);
    Write_DS18B20(0x44);
    
    init_ds18b20();
    Write_DS18B20(0xCC);
    Write_DS18B20(0xBE);
    LSB = Read_DS18B20();
    HSB = Read_DS18B20();
    
    init_ds18b20();
    dat = (HSB << 8) | LSB ;
    if((dat & 0xF800) == 0x0000) 
    {
        dat = (dat >> 4) * 10 ;
        dat  =dat + (LSB & 0x0F) * 0.625 ;
        return dat ;
    }
    return dat ;
}

DS1302时间写入函数

void DS1302_Write_Time(unsigned long int Tick)
{
    unsigned char sec,min,hour;
    sec = Tick % 60;
    sec = (sec/10 * 16) +( sec %10);
    min = Tick / 60;
    min = (min/10 * 16) +( min %10);
    
    hour = Tick / 3600;
    hour = (hour/10* 16) +( hour %10);
    Write_Ds1302_Byte(0x8E,0x00);
    Write_Ds1302_Byte(0x80,sec);
    Write_Ds1302_Byte(0x82,min);
    Write_Ds1302_Byte(0x84,hour);
    Write_Ds1302_Byte(0x8E,0xFF);
    
}

DS1302时间读取函数

unsigned long int DS1302_Read_Time(void)
{
    unsigned long int tick = 0;
    unsigned char sec,min,hour;
    sec = Read_Ds1302_Byte(0x81);
    min = Read_Ds1302_Byte(0x83);
    hour = Read_Ds1302_Byte(0x85);
    sec =(sec /16 * 10) +  sec %16;
    min =(min /16 * 10) +  min %16;
    hour =(hour /16 * 10) +  hour %16;
    tick = hour * 3600 + min * 60 + sec;
    return tick;
}
关于DS1302和DS18B20的底层驱动函数,我就不贴出来了,官方会提供的,我前面几期的博客里面也有,需要的可以自己去看看。

总结

  1. 这一次的省赛题总体来说还算是比较正常的,我也完成了七七八八,但没有完全完成,毕竟我只是个菜鸟,能不能拿奖还是未知呢…………
  2. 通过这次的实践,我也发现了许多的问题,我发现我写的代码存在可优化的地方,许多模块一起使用的话,会存在互相干扰的问题,针对这些问题,我也在想办法,希望在比赛前解决掉这些问题吧。
  3. 不出意外的话,下一期会更新12届省赛题目的代码。

存在的问题

  1. 调用数码管显示函数的时候,LED不受控制,时不时的乱跳,关于这个BUG,我想了好久,但是还是没法解决,所以我只能通过程序控制,把影响尽可能地减小,希望哪位大神来解答一下我的疑惑。
  2. 关于矩阵按键的扫描函数,我用的是我们老师提供的代码,因为我发现我之前写的代码存在使用过程中会影响其他外设正常工作,容易误触发等问题,而且我们老师提供的代码出奇的好用(我们老师就是厉害)。但是我还是没看懂原理,同样希望哪位大佬可以帮我解释一些。

你都看到这里了,说明你是一个很有耐心的人,那么这个有耐心的陌生人,能支持我一下吗?
蓝桥杯单片机学习14——第十三届省赛题,蓝桥杯单片机学习,单片机,蓝桥杯,学习,c语言,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-736064.html

到了这里,关于蓝桥杯单片机学习14——第十三届省赛题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【蓝桥杯-单片机学习笔记(十三)】DS18B20温度传感器

    一、温度传感器-DS18B20介绍 DS18B20是单总线数字化温度传感器,测量温度范围是-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。支持3V~5.5V的供电电压范围。DS18B20可以程序设定9~12位的分辨率,精度为±0.5℃。 1.DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度

    2023年04月09日
    浏览(63)
  • 蓝桥杯单片机 第十二届 国赛

    蓝桥杯第十二届,模块都比较常规,感觉都和省赛差不多,主要是麻烦在数据处理上,而我们处理的数据又要在界面中显示出来。 对比之前的第十届,其实题目差不多,并且少了串口收发这一比较难的模块。但是多了max,min,avg三个超声波数据的处理。所以按道理时间方面应该

    2023年04月08日
    浏览(51)
  • 【第十四届蓝桥杯单片机冲刺版】

    明天就是正式比赛啦,今天可以在把各个模块练习一遍,常考的外设相关代码一定要熟练哦。 比赛时拿到资料包了,检查驱动文件,使用到的驱动文件,自己做相应的修改,确保是能够正常使用(驱动修改相关可看之前的文章)。 下面是自己将常考的外设结合一起的练习,

    2023年04月27日
    浏览(53)
  • 第十二届蓝桥杯单片机省赛

    直接复制粘贴然后运行 然后打开stc烧录到开发板上面就能用 程序哪里不懂的话问我,我闲的蛋疼! #include STC15F2K60S2.H #include intrins.h unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xc6,0x8c,0x88}; unsigned char yi,er,san,si,wu,liu,qi,ba; l

    2023年04月09日
    浏览(59)
  • 第十三届蓝桥杯经验分享

    当时报名参加蓝桥杯,是为了以后工作能有个证吧,但苦于大三 没有时间准备 ,就这样轻装上阵, 一点儿没复习 , 真题也没做,练习也没整 , 一篇经验贴也没仔细看 ,结果还拿了个省三,不知道是不是参与奖哈哈。但作为过来人,还是有点经验的,特来分享 ヽ(✿゚▽゚

    2024年02月15日
    浏览(57)
  • 【蓝桥杯单片机】第十二届省赛(含题目和解答代码)

    main.c  iic.c iic.h onewire.c onewire.h      

    2024年02月04日
    浏览(72)
  • 蓝桥杯单片机第十四届省赛题目和程序答案

    目录  1、前言  2、题目 3、程序架构     3.1 display.c    3.2 ds1302.c    3.3 iic.c    3.4 onewire.c    3.5 main.c 主函数文件    3.6 环境配置 4. 历年蓝桥杯单片机试题和答案        抽空复习了一下,拿下单片机省赛一等奖,在此分享一下最新的14届省赛程序设计答案          模

    2024年02月06日
    浏览(163)
  • 第十四届蓝桥杯单片机第二场模拟赛程序

    第十四届蓝桥杯单片机第二场模拟赛程序(少量bug) 题目来源于4T评测网 www.4t.wiki 使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作

    2023年04月14日
    浏览(56)
  • 蓝桥杯单片机14届记录 + 6-13届省赛代码+试题

    客观题 01. 一个 8 位的 DAC 转换器,供电电压为 3.3V,参考电压 2.4V,其 1LSB 产生的输出电 压增量是( )V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094  02. IAP15F2K61S2 单片机支持通过哪些接口进行在线调试( )。 A. SPI B. UART C. I2C D. JTAG  03. 下列电路中属于时序逻辑电路的是( )。 A. 计数

    2024年02月06日
    浏览(52)
  • 第十四届蓝桥杯单片机省赛真题(巨简代码+超级详解)

    相关说明: 开发板:CT107D——IAP15F2K61S2 开发环境: Keil5 涉及题目:第十四届蓝桥杯单片机省赛真题 数码管忘记不足2位左侧补0;采集的湿度无效时,温湿度、采集次数、采集时间不统计,更不参与计算平均值;温度参数有边界条件;在时间回显子界面长按松开后才能清零,

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包