蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧

     那是当年4月的一个早上,一觉醒来,想起一件大事:明天蓝桥杯,心想完蛋了;下午一觉醒来,得到一个“好消息”:蓝桥杯硬件延期了,然后我欣喜若狂的接着睡....

    既然时间充足了,我就自己写一点笔记,以便自己复习,备战蓝桥杯单片机的比赛,首先,你要买一块板子,然后得到店铺的零基础教程,然后找到那个“半小时省赛三等奖”程序,就是把所有模块都用一遍,并且精准地背出来,忘了的也能看原理图写出来。(我买的是大科电子的板子和视频,当然我同学也买了什么蚂蚁工厂的...我个人认为大科的代码非常简洁,讲得也非常好)而我接下来写的是基于大科的代码,我自己的理解和应试技巧。

    考场熟悉环境:

    1.得会添加51型号:上考场后:先开机...打开keil,新建工程,然后如果没有STC15F2K60S2,莫慌!打开烧录软件STC-ISP,右侧:keil仿真设置->添加型单片机型号->选择STC15F2K60S2->添加型号和头文件到keil中(如图1)

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第1张图片

(图1)
    2.要会改hex文件名:他最后会让你交一个hex,可能是以考试号为名,直接修改文件名称显得十分的low,而且得最后修改容易忘记。这个时候你需要在keil里点左上角那个扳手(Options for Target 'Target 1'),Output -> 勾选Create Hex File ->修改Name of Excutable  (如图2)

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第2张图片
(图2)

平时准备:   
平时练的时候,重点不在于如何熟练地去记住这些东西,而在于两点:

万一忘了怎么看原理图写出来;

注意每个平时易错的点并且会怎么去找错(以下易错点都写在注解里)

读题思路:
考题实际应用情况———转化为———>单片机显示的现象(没想清楚前不要动笔!!)

不要觉得是个人都有这种阅读理解能力(例:“第3届自动售水机:“S7按下后,售水机持续出水"转化为实际现象———>定时器开)

开写思路:
马上开写:“半小时省赛三等奖”程序,每写一段程序(函数),在上面声明一下,ctrl+S,放主函数里跑一遍,点Translate(如果图标是灰的,那么说明你左侧的工程没有Add Files to Group'...');

“半小时省赛三等奖”程序:

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第3张图片
蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第4张图片

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第5张图片

驱动代码

先把.c,.h文件复制到工程文件夹下,然后再keil左侧工程添加.c,.h文件

在.c文件写总线读写函数后在,记得在.h文件里声明

1.ONEWIRE

如果没给.h文件(第一次参赛,不知道给不给)

自己建一个:(前面两根下划线)

#ifndef  __ONEWIRE_H

#define __ONEWIRE_H

....函数声明.....

#endif

在onewire.c中

如果延时函数是这个(它是89C52的延时)

void Delay_OneWire(unsigned int t)  //STC89C52RC

{while(t--);}

把下面所有的延时扩大10倍

把#include "reg52.h"改成#include

然后写下面这个TempGet函数

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第6张图片
如果延时是这个:

void Delay_OneWire(unsigned int t)  

{

    unsigned char i;

    while(t--)

    {

          for(i=0; i<8; i++);

     }

 }

则改成for(i = 0;i < 10;i++)然后TempGet()中Delay_OneWire(20);

在onewire.h中记得声明onewire.c中所有的函数

在main.c中#include然后在while(1)中写

☆☆☆yi = TempGet()/10;er = TempGet()%10;试一下

2.IIC

如果没给.h文件(第一次参赛,不知道给不给)

自己建一个:

#ifndef _IIC_H

#define _IIC_H

.....声明.....

#endif


两种延时:无论如何你需要40个_nop_()

如果是

#define DELAY_TIME 5

void IIC_Delay(unsigned char i)

{

    do{_nop_();}

    while(i--);        

}

IIC_Delay(DELAY_TIME);

把_nop_()复制出8个

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第7张图片

或者是

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} 

把大括号里的整体复制8次


(1)测AD:

在while(1)里写0x01:光敏电阻;0x03:滑动变阻器

yi = IIC_read(0x01)/100;er = IIC_read(0x01)%100/10;san = IIC_read(0x01)%10;//0x01是光!

yi = IIC_read(0x03)/100;er = IIC_read(0x03)%100/10;san = IIC_read(0x03)%10;//0x03是滑变Rb2

(2)测EEPROM: 

EEPROM_num = EEPROM_read(0x66);

EEPROM_Write(0x66,66);//需要重新开几次

yi = EEPROM_num/100;er = EEPROM_num%100/10;san = EEPROM_num%10;

3.DS1302(记不记无所谓,考到用定时器伪造)

老规矩,把#include 改成#include

在ds1302.c里有_nop_()的地方都复制8次,

在Write_Ds1302_Byte()中把Write_Ds1302(dat);改成Write_Ds1302(((dat/10)<<4)|(dat%10));//十位放高四位(左移)|个位

在Read_Ds1302_Byte()中 return(temp);改成 return ((temp/16)*10+temp%16);

在main.c里写:

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧_第8张图片
记得声明

void DS1302_Init(void);

void DS1302_Get(void);

uint Init_Time[6] = {20,37,18,8,5,22},shijian[6];

//秒,分,时,日,月,年(只能两位)

在while(1)里写上:

yi = shijian[3]/10;er = shijian[3]%10;san = shijian[2]/10;si = shijian[2]%10;wu = shijian[1]/10;liu = shijian[1]%10;qi = shijian[0]/10;ba = shijian[0]%10;

测试一下功能是否可用

你可能感兴趣的:(蓝桥杯单片机,蓝桥杯,单片机,51单片机)