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

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


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

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

通用代码

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

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文库

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DO_Tonight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值