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