那是当年4月的一个早上,一觉醒来,想起一件大事:明天蓝桥杯,心想完蛋了;下午一觉醒来,得到一个“好消息”:蓝桥杯硬件延期了,然后我欣喜若狂的接着睡....
既然时间充足了,我就自己写一点笔记,以便自己复习,备战蓝桥杯单片机的比赛,首先,你要买一块板子,然后得到店铺的零基础教程,然后找到那个“半小时省赛三等奖”程序,就是把所有模块都用一遍,并且精准地背出来,忘了的也能看原理图写出来。(我买的是大科电子的板子和视频,当然我同学也买了什么蚂蚁工厂的...我个人认为大科的代码非常简洁,讲得也非常好)而我接下来写的是基于大科的代码,我自己的理解和应试技巧。
考场熟悉环境:
1.得会添加51型号:上考场后:先开机...打开keil,新建工程,然后如果没有STC15F2K60S2,莫慌!打开烧录软件STC-ISP,右侧:keil仿真设置->添加型单片机型号->选择STC15F2K60S2->添加型号和头文件到keil中(如图1)
(图1)
2.要会改hex文件名:他最后会让你交一个hex,可能是以考试号为名,直接修改文件名称显得十分的low,而且得最后修改容易忘记。这个时候你需要在keil里点左上角那个扳手(Options for Target 'Target 1'),Output -> 勾选Create Hex File ->修改Name of Excutable (如图2)
平时准备:
平时练的时候,重点不在于如何熟练地去记住这些东西,而在于两点:
万一忘了怎么看原理图写出来;
注意每个平时易错的点并且会怎么去找错(以下易错点都写在注解里)
读题思路:
考题实际应用情况———转化为———>单片机显示的现象(没想清楚前不要动笔!!)
不要觉得是个人都有这种阅读理解能力(例:“第3届自动售水机:“S7按下后,售水机持续出水"转化为实际现象———>定时器开)
开写思路:
马上开写:“半小时省赛三等奖”程序,每写一段程序(函数),在上面声明一下,ctrl+S,放主函数里跑一遍,点Translate(如果图标是灰的,那么说明你左侧的工程没有Add Files to Group'...');
先把.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函数
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
☆☆☆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个
或者是
#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
在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里写:
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;
测试一下功能是否可用