第十二届蓝桥杯单片机省赛程序设计总结

Posted DO_Tonight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二届蓝桥杯单片机省赛程序设计总结相关的知识,希望对你有一定的参考价值。

第十二届蓝桥杯单片机省赛程序设计总结

文章目录


题目你们就自行去网上找,这里就不给出来了。

这里呢主要是给你们总结几个要点:

通用代码

一、要记住基本的锁存器选择代码

void HC138_Init(unsigned char Yn)

    switch(Yn)
    
        case 4:
            P2 = (P2 & 0x1F) | 0x80;break;//8位LED
        case 5:
            P2 = (P2 & 0x1F) | 0xA0;break;//蜂鸣器、继电器
        case 6:
            P2 = (P2 & 0x1F) | 0xC0;break;//数码管位选
        case 7:
            P2 = (P2 & 0x1F) | 0xE0;break;//数码管段选
    

这个是各个基本模块的驱动,比赛的时候是不会给出来的,我建议直接背下来。

二、上电初始化代码

void Power_Init(void)

    HC138_Init(4);
    P0 = 0xFF;//关闭8路LED
    HC138_Init(5);
    P0 = 0x00;//关闭蜂鸣器、继电器

三、矩阵键盘注意

这个你可以事先看好需要用到哪些矩阵键盘,只需要对那几行进行扫描就可以,不许呀浪费额外的时间做一些无用功。

四、数码管的动态显示注意

有些时候你会发现最后一个显示的数码管会会更加的亮一些——那是因为你最后一个数码管点亮的时间是最长的。

解决方法:人为将使用到的数码管位数向后加一位,这样就达到了之前的每个数码管的点亮时间都是一样的。我的代码中都有写,感兴趣的可以看看。

五、整个程序的基本结构

主要分为三个文件夹:

第一个用来存放main.c文件;

第二个CODE文件夹用来存放模块的基本代码,包括软件延时的代码,单独用一个Delay.c文件罗列出来,这样清除明了;

第三个USER文件夹用来存放本次比赛用到的外设驱动代码。

外设代码

这次的题目中主要用到了两个外设:AD/DA转换器,温度传感器。

PCF8591

IIC驱动,对应的iic.c和iic.h文件官方都有给出。我们要书写的就是功能代码:(DAC输出)

因此我们要非常熟悉IIC通信的流程。

void DAC_Init(double dat)//形参是设置输出的DAC的值,范围在0~5V

    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(0x40);
    IIC_WaitAck();
    IIC_SendByte((unsigned char)(dat * 255.0 / 5.0));
    IIC_WaitAck();
	IIC_Stop();

这里解释一下各个的含义:

0x90是PCF8591的地址

A2、A1、A0根据板子的原理图可以看出接的都是0,然后这里是,所以最后一位也是0,因此整个地址就是0x90。



0x40是功能使能代码

我们需要的是DAC输出,因此将第6位设置为1,其他的都是0即可,因此得到0x40。



(unsigned char)(dat * 255.0 / 5.0)

PCF8591是一个8位的DAC,因此范围在0~255,将0-5V平均分。如果我要是想输出0-5V之间的任意一个小数,按照这种计算方法即可。当然最后还要进行类型的强制转换,因为IIC通信的格式都是unsigned char类型的。

DS18B20

onewire总线协议,底层的驱动代码官方都有给出,但是官方的延时代码有问题,需要人为修改一下:

void Delay_OneWire(unsigned char t)

    unsigned char i;
    while(t--)
    
        for (i = 0; i < 12; i++);
    

这样再加上自己书写的功能代码:

unsigned int ds18bs20_read(void)

	unsigned int  low,high,temp;
	
	init_ds18b20();
	Write_DS18B20(0xCC);//跳过序列号
	Write_DS18B20(0x44);//启动温度转换
	init_ds18b20();//再初始化一次
	Write_DS18B20(0xCC);//跳过序列号
	Write_DS18B20(0xBE);//读取温度存储器
	
	low=Read_DS18B20();//低8位
	high=Read_DS18B20();//高8位
	
	temp=high<<8;
	temp+=low;//合成16位数据
	
	return temp;

最终换算成的温度只需要将这个数据乘以0.0625即可。(我这个算法只适合正温度,置于为什么是0.0625建议你们去找找资料,我还不是很清楚)

程序设计思路

首先关注他的上电初始化状态——根据这个先设置好界面标志位,因为以后肯定要进行界面的切换。然后将初始化状态表示出来。

然后分别在每个界面中设置矩阵按键的扫描,用来切换和转换功能。

注意到:这次题目中的DAC模式的切换是任何界面都可以执行的,这点要注意一下。

注意到:这次题目有通过不同的LED显示当前的界面状态和模式状态,因此要设计好一个函数,可以单独开关某一个灯

下面给出我的一个大致的思路:

void main(void)

    //硬件初始化
    while(1)
    
        if (界面状态 == 1)
        
            
        
        else if (界面状态 == 2)
        
            
        
        else if (界面状态 == 3)
        
            
        
        
        switch(DAC模式)
        
            case 0:
                break;
            case 1:
                break;
        
    

博主总结实属不易,点赞三连就是最好的肯定。

详细的代码需要的可以去下面这个连接进行下载,想要咨询的可以加我QQ2537900669。

博主总结实属不易,点赞三连就是最好的肯定。

详细的代码需要的可以去下面这个连接进行下载,想要咨询的可以加我QQ2537900669。

第十二届蓝桥杯单片机参考程序-嵌入式文档类资源-CSDN文库

以上是关于第十二届蓝桥杯单片机省赛程序设计总结的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛

《蓝桥杯真题》:2.第十二届省赛

《蓝桥杯真题》:2021单片机省赛第一场(第十二届第一场)

蓝桥杯嵌入式——第十二届蓝桥杯嵌入式第一场省赛

《蓝桥杯真题》:2021单片机省赛第二场(第十二届第二场)暨第十三届蓝桥杯赛前模拟试题

蓝桥杯第十二届省赛