源码:(百度网盘)
链接:https://pan.baidu.com/s/1jdfrQOGCWJaQgSUPEWcfdw?pwd=1234
提取码:1234
说明:
从复习到应用所有学到的东西去做真题,笔者对于之前发过的文章里面的代码有着很多改动,但是原理是一样的,学懂了原理来看这篇文章,会更加得心应手,不过对于这篇文章的代码,看不懂,也要记住,因为比赛的时候,要先把所有模板都默写出来,然后再在基础之上完成题目逻辑,所以,我们能熟练默写模板代码,非常重要,至于如何使用这些模板函数,笔者都是跟着up主学习的,他的空间网址是:biubiu_name个人动态-biubiu_name动态记录-哔哩哔哩视频
(本篇文章会比较长,可以选择性观看)(因为是一路测试过去的,所以红框表示要注意的地方和新增的代码内容)
一、创建项目的习惯
芯片选择
勾选创建hex文件
我们使用stc15f2k60s2这个头文件,是需要添加路径的,不然就会显示无法打开文件的bug而添加路径,需要找到对应的文件夹,到时在电脑上找不到可以问问志愿者,就存放在keil安装的文件夹中。
文件夹分类
虽然不会自动在你的文件夹中自动生成这俩个文件夹,但是在keil中分一下类还是舒服的.
二、开始着手写三大模板(顺序就按笔者这个来)
main
tim
说明:官方数据资源包里面有俩个版本的烧录软件,其中有一个是可以帮你记住中断号的,一般是使用定时器1来实现绝大多数功能。(中断函数就丢到main里面)
tim写好之后就来到main里面写,就可以将基本要使用到的三大函数先把框架写了。
seg
我们创建.h和.c文件可以像下面这样复制粘贴,然后点F2键来一起重命名,到时再把不要的代码删掉,可以节约时间。
这个设备选择函数我们之前的文章都有讲到很多,经常用到,但是有点改动,优化了影响到下一次P2口使用的问题。
LED函数+蜂鸣器关闭
咱们写到这里就可以开始测试LED能不能正常工作了(也能测试定时器有没有写对)
给ucLed赋初值,实验现象就是Led1 3 5 7四个灯亮起。
seg中的转化函数
教你们节约时间,就是先写case :temp=;break;然后复制粘贴十二个,留俩个给特殊字符备用
我们这个模板是直接使用代码来赋值的,一般我们的板子都是共阳极,官方也会提供这个表,到时就像笔者一样,把代码复制到keil里面,再将对应代码复制粘贴到temp=后面,最后将数字补上就行。
seg中的显示函数
我们将所有在seg文件写的函数都在其对应.h文件里面声明之后,就可以来到main里面写了。
实验现象就是数码管显示12|熄灭| 3.4-PC(也就是sprintf里面字符串的内容)
key(3.9号优化版本(含双按))
双按的检测只在key这个文件的函数中进行,来到main中写测试内容。实验现象:按键4和5同时按下可以让ucLed加加,Led灯按照二进制码亮。
key
矩阵
也是可以像这样节约默写时间。
独立
写完key就可以来到main里面开始写测试的内容。实验现象就是一开始在数码管最后俩位显示
00,按键7按下就可以让数字加1。
三、三个底层驱动模板的完善
比赛时一般都会使用到俩个。也是默写好知道怎么用就行,这底层驱动文件里面要写的函数也是基本上固定好的。
下面三个就是官方会提供的三个参考代码。笔者的习惯是在keil中先把文件创建好,再用记事本打开文件,复制粘贴到keil中。
ds1302(时间)
完整第一步就是根据原理图将引脚定义写好。
上面的地址要与数据手册的对应上,比如写时的地址是0x84,同时你在main里面定义时间数组时,顺序也要对的上,这个到你们出bug的那一天会明白的(狗头)
实验现象就是,数码管上显示动态的时间23-59-55,正常进行时间流逝。(这个芯片自己会计算边界,所以超过24时就会全部清零变成00-00-00的时间继续流逝)
onewire(温度)
这个文件是最简单的,而且就这样写就好了,不需要注意什么影响到别的地方,像这样写好之后就可以再main中使用了。
控制字这些可以在数据手册中找到。这个函数的代码逻辑是比较好,所以理解了,记起来就很容易(初始化-》跳过-》开始温度转化-》初始化-》跳过-》读取-》赋值-》返回值)
写完后来到main里面写测试内容,就有一些小地方要注意。
写完下面这步之后就可以烧录看实验现象:按键4按下,数码管显示(温度值)C,捏住温度芯片,温度显示值升高。
iic(数模转化和eeprom写读)
同样是先将官方提供的参考程序的代码复制到我们的文件之中,就可以开始写函数了。(测试的话,等笔者想到会完善的)
AD和DA俩个函数
这里的俩个函数在主函数中是测试不了,至少笔者是不会测试
然后就是,这里有些知识,不懂的话可以去之前的文章先把原理搞懂一点先,
因为跟我之前的文章的代码有些不一样,但是原理是一样的
然后这俩个函数怎么使用,就去看那个第八届那个文章那里看那个up主怎么使用的
void pcf8591_Adc(unsigned char channel)
{
unsigned char temp;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x40|channel);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return temp;
}
void pcf8591_Dac(unsigned char dat)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x41);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
eeprom读函数和写函数
都是通过总线来控制,所以这四个函数代码差不太多的结构,地址和控制字都可以在数据手册中找到。
eeprom函数, 俩个,一个读取一个写入,
参数有:数据数组eeprom char; 存放地址addr; 存放数据个数num
void eeprom_write(unsigned char *eeprom_char,unsigned char addr,unsigned char num)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
while(num--)
{
I2CSendByte(*eeprom_char++);
I2CWaitAck();
I2C_Delay(200);
}
I2CStop();
}
void eeprom_read(unsigned char *eeprom_char,unsigned char addr,unsigned char num)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xA1);
I2CWaitAck();
while(num--)
{
*eeprom_char++ = I2CReceiveByte();
if(num) I2CSendAck(0);
else I2CSendAck(1);
}
I2CStop();
}
写好之后来main写测试内容。实验现象:数码管一开始全部熄灭,按键7按下亮起,(第一次会显示之前存过的数据,你们可以自己想想办法从你开始的数据显示),数码管显示内容,再让按键4按下,就可以让数字加加,再按键7按下,可以切换到第二个数字加加,按键7第四次按下,数码管全部熄灭,数据存进eeprom,断电,在复点,按键7按下,就可以显示你之前加加过的内容了。
最后祝愿读者都能取得一个好成绩!