大龄青年学习单片机——笔记
本帖最后由 bmelz 于 2015-9-6 12:43 编辑大龄青年学习单片机!
上次学习单片机时是12年前,12年后有因工作需要开始重新学习。我现在把暑假期间学习的内容再这里以笔记的形式做个小结。
不对的地方请大侠们不吝赐教,多谢啦!
如有疑问或者建议请和我联系:liangzhen#foxmail.com
单片机:IAP15W4k58S4
开发环境:keil C51 9.54
工程组织结构按照如下来设定:
user/inc : config.h
mcu_cfg.h
drivers_cfg.h
/src: main.c
...
mcu/inc: GPIO.h
UART.h
mytypes.h
exmath.h
...
/src: GPIO.c
uart.c
...
drivers/inc: lcd1602.h
DC_motor.h
/src: lcd1602.c
DC_motor.c
config.h见4楼!
还有暑假可以放, 算不上大龄青年吧 snoopyzz 发表于 2015-9-6 10:05
还有暑假可以放, 算不上大龄青年吧
我是生物方向的老师。。。
快40了,还不大龄! config.h
工程名:Template
路径:..\Template\user\inc
/**********************************
* 系统配置文件
* MCU型号配置
* 主频配置
* 管脚配置
*******************************/
#ifndef __CONFIG_H__
#define __CONFIG_H__
// 选择你系统所用MCU,把不用的注释掉。
#define STC15W4K32S4
//#define AT89S51
#define FOSC12 12000000L // 定义MCU晶振的常用频率
#define FOSC11 11059200L
#define FOSC2424000000L
#define FOSC FOSC12// 选择你所使用的MCU晶振频率。
/***********************************************
* 引脚配置,依据电路图把外设的引脚和MCU的引脚对应起来。
* 注:外设的引脚名称务必和该外设的驱动文件的名称一样,否则无法编译通过。
* 如果不一样,会提示你引脚名称应为xxx,你需要根据提示进行修改。
********************************************/
// I2C 引脚配置
#define I2C_SDAP23
#define I2C_SCLP22
#define DC_MOTOR1_PWMP17// motor1接在PWM7通道,IO口 P17
#endif mcu_cfg.h
工程名:Template
路径:..\Template\user\inc
底层驱动文件。
内容如下:
/************************************************************
* 底层驱动程序
* 主要是MCU自带的功能
* 不需要用的功能,注释掉该包含文件即可。
********************************************************/
#ifndef __MCU_CFG_H__
#define __MCU_CFG_H__
#include "config.h"
// MCU头文件
#if defined(STC15W4K32S4)
#include "STC15W4K32S4.h"
#elif defined(AT89S51)
#include "AT89X51.h"
#endif
// GPIO头文件
#if defined(STC15W4K32S4)
#include "GPIO.h"
#elif defined(AT89S51)
#error "AT89S51 hasn't GPIO.h."
#endif
// 延时头文件
#include "delay.h"
// 模拟低速I2C头文件,
#include "I2C.h"
// 独立通道PWM头文件
#if defined(STC15W4K32S4)
#include "PWM.h"
#elif defined(AT89S51)
#error "AT89S51 hasn't independent PWM channel."
#endif
#endif bmelz 发表于 2015-9-6 10:10
我是生物方向的老师。。。
快40了,还不大龄!
原来是老师, 失敬,
我也30多了, 自我感觉还很年青{:victory:} drivers_cfg.h
工程名:Template
路径:../Template/user/inc
本头文件主要是配置中间层。
把不需要的功能头文件注释掉。本程序没有测试,可能会有错误。
#ifndef __DRIVERS_CFG_H__
#define __DRIVERS_CFG_H__
#include "config.h"
#include "mcu_cfg.h"
直流电机驱动程序
#include "DC_motor.h"
#endif 楼主竟然是生物老师!
引用一句网上用语表达我的心情,妈妈问我为什么跪着上网
不亏是老师,架构层次好鲜明!妈妈为我为什么跪着上网! 正常,以前遇到一个搞生化研究的,也搞DSP,ti5000系列
这年头应该说精通本行业+精通一门其它行业的才好混哪 楼主位这个图是什么软件画的? 进口小开关 发表于 2015-9-6 10:38
楼主位这个图是什么软件画的?
xmind一款国产绘图软件 GPIO.h
/*************************************************************
Copyright (C), 2009-2015, C&IIL
File name: GPIO.h
Description:
NULL
Compiler:
IDE: Keil C51 9.51, 9.52
OS: win8,win8.1
Function List:
NULL
History:
Author: Liang Zhen Version: 0.1 Date: 2015/07/22 Email: liangzhen##foxmail.com
Description: Created
*************************************************************/
#ifndef __GPIO_H__
#define __GPIO_H__
#include "config.h"
#include "exmath.h"
//设置Port端口为上拉准双向口。例如:PORT_PullUp(1) 设置P1口为上拉准双向口。
#define _PORT_PullUp(Port) {P##Port##M1 = 0; P##Port##M0 = 0; }
#define PORT_PullUp(Port) _PORT_PullUp(Port)
//设置Port端口为强推挽输出。例如:PORT_PP(1) 设置P1口为强推挽输出
#define _PORT_PP(Port) {P##Port##M1 = 0; P##Port##M0 = 1; }
#define PORT_PP(Port) _PORT_PP(Port)
//设置Port端口为高阻态。例如:PORT_PP(1) 设置P1口为高阻态
#define _PORT_HighZ(Port) {P##Port##M1 = 1; P##Port##M0 = 0; }
#define PORT_HighZ(Port) _PORT_HighZ(Port)
//设置Port端口为开漏输出。例如:PORT_PP(1) 设置P1口为开漏输出
#define _PORT_OD(Port) {P##Port##M1 = 1; P##Port##M0 = 1; }
#define PORT_OD(Port) _PORT_OD(Port)
//设置Port端口的Pin引脚为上拉准双向口。例如:PIN_PullUp(1,2) 设置P12引脚为上拉准双向口。
#define _PIN_PullUp(Port,Pin) {clrBit(P##Port##M1,Pin);clrBit(P##Port##M0,Pin);}
#define PIN_PullUp(Port,Pin) _PIN_PullUp(Port,Pin)
//设置Port端口的Pin引脚为强推挽输出。例如:PIN_PP(1,2) 设置P12引脚为强推挽输出。
#define _PIN_PP(Port,Pin) {clrBit(P##Port##M1,Pin);setBit(P##Port##M0,Pin);}
#define PIN_PP(Port,Pin) _PIN_PP(Port,Pin)
//设置Port端口的Pin引脚为高阻态。例如:PIN_HighZ(1,2) 设置P12引脚为高阻态。
#define _PIN_HighZ(Port,Pin) {setBit(P##Port##M1,Pin);clrBit(P##Port##M0,Pin);}
#define PIN_HighZ(Port,Pin) _PIN_HighZ(Port,Pin)
//设置Port端口的Pin引脚为开漏输出。例如:PIN_OD(1,2) 设置P12引脚为开漏输出。
#define _PIN_OD(Port,Pin) {setBit(P##Port##M1,Pin);setBit(P##Port##M0,Pin);}
#define PIN_OD(Port,Pin) _PIN_OD(Port,Pin)
#endif 这图像怎么这么熟悉呢? 很有层次感,很规范,建议楼主上一个工程,给大家借鉴一下、、、 这个结构图好漂亮哦,用神马软件画的? mytypes.h
/*************************************************************
Copyright (C), 2009-2015, C&IIL
File name: mytypes.h
Description:
NULL
Compiler:
IDE: Keil C51 9.51, 9.52
OS: win8,win8.1
Function List:
NULL
History:
Author: Liang Zhen Version: 0.1 Date: 2015/06/27
Description: Created
*************************************************************/
#ifndef __MYTYPES_H__
#define __MYTYPES_H__
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef int int16_t;
typedef unsigned int uint16_t;
typedef long int32_t;
typedef unsigned long uint32_t;
#endif destiny、 发表于 2015-9-6 11:15
很有层次感,很规范,建议楼主上一个工程,给大家借鉴一下、、、
还没有完全整理好,整理好,会上传的。
希望大家给提提意见,新手请多赐教! duxingkei 发表于 2015-9-6 11:21
这个结构图好漂亮哦,用神马软件画的?
xmind,一个国产软件。 bmelz 发表于 2015-9-6 10:10
我是生物方向的老师。。。
快40了,还不大龄!
没考虑找别的方向老师合作一下?对于做电的还说可能你要的东西不难实现。是做生物测试仪器吗? 引用一句网上用语表达我的心情,妈妈问我为什么跪着上网 不错。
有层次,有条理。 楼主层次很分明啊,这才是搞研究的。 fuquan_dai 发表于 2015-9-6 11:26
没考虑找别的方向老师合作一下?对于做电的还说可能你要的东西不难实现。是做生物测试仪器吗? ...
学校弄个电子设计竞赛,我是负责人!因为,我12年前是学电的,。。。。
所以现在又必须重新学习,唉! 楼主层次很分明啊,这才是搞研究的。 bmelz 发表于 2015-9-6 12:55
学校弄个电子设计竞赛,我是负责人!因为,我12年前是学电的,。。。。
所以现在又必须重新学习,唉! ...
呵呵 这样啊 我还以为自己搞研究呢 没事啊 单片机好学,你肯定很快能捡起来。 bmelz 发表于 2015-9-6 12:55
学校弄个电子设计竞赛,我是负责人!因为,我12年前是学电的,。。。。
所以现在又必须重新学习,唉! ...
我也是高校老师,不过说实话我更愿意让学生去学STM32。。。 有兴趣,就啥时候都不晚! fuquan_dai 发表于 2015-9-6 14:31
我也是高校老师,不过说实话我更愿意让学生去学STM32。。。
stm32我不会呀!而且stm32上手难度很大。我还是先把51弄透了,在弄的stm32。 fuquan_dai 发表于 2015-9-6 14:29
呵呵 这样啊 我还以为自己搞研究呢 没事啊 单片机好学,你肯定很快能捡起来。 ...
给点建议吧,谢谢,我现在也迷茫! 我倒觉得没有必要这么组织,现在的元件无数种,经常要组合来组合去,放在一起必然臃肿低效。
我是这样做的,每一种元件单独做一个工程,驱动代码模块化,然后有功能的完整演示代码,需要组合的时候把元件的驱动文件放在一起,编程时可根据演示代码裁剪或组合。
这样也方便共享和交流。 要弄透就得上汇编,我一开始玩51就用的汇编,现在看C51有点晕。。。 bmelz 发表于 2015-9-6 16:04
给点建议吧,谢谢,我现在也迷茫!
你不要认为STM32难,它只是功能多,并不是更难。当然学完51在学STM32问题也不大,学会一种另一种很快就能学会。无论学哪种,我的建议都是搞一套开发板,从实践入手,学看懂开发板例程,再适当修改例程(比如将例程中的串口1改成串口2),这样学一两个月基本就会了。 lans0625 发表于 2015-9-6 18:52
要弄透就得上汇编,我一开始玩51就用的汇编,现在看C51有点晕。。。
绝对是歧途啊。。。。我觉得先学会C,想深入了解再去看汇编,甚至很多时候都不要去管汇编。不然学下来没怎么学会,然后倒把兴趣搞没了。 rain73 发表于 2015-9-6 18:49
我倒觉得没有必要这么组织,现在的元件无数种,经常要组合来组合去,放在一起必然臃肿低效。
我是这样做的 ...
我觉得没有我这样方便。不用的东西不加入,一点都不臃肿。功能组合时,只需要更改drivers_cfg.h和mcu_cfg.h即可。
开始我也是这样组织文件的,后来发现还是这种方式好! bmelz 发表于 2015-9-6 21:13
我觉得没有我这样方便。不用的东西不加入,一点都不臃肿。功能组合时,只需要更改drivers_cfg.h和mcu_cfg ...
这样搞工程基本只有你自己懂,换个人接手,或者把驱动给别人用就抓瞎。
部件驱动的独立,和编程上的逻辑层概念,并没有一点冲突,做好模块化即是。 本帖最后由 bmelz 于 2015-9-7 00:22 编辑
rain73 发表于 2015-9-6 22:52
这样搞工程基本只有你自己懂,换个人接手,或者把驱动给别人用就抓瞎。
部件驱动的独立,和编程上的逻辑 ...
目前,我把我写好的驱动给学生用,他们觉得很好用呀,没有觉得困难。换个人接手就很容易了,底层,中间层都已经写好,不需要修改,只要关心应用层就行了。
目前工程模板里,驱动也很独立呀。除非你非要说,驱动程序依赖mytypes.h,delay.h什么的。你想象一下,每个驱动里面都有自带延时函数那是多么的闹心事。
也许,我没有理解你的涵义,能以实例说明吗?在下虚心求教! 上STM32,不要犹豫。否则学生学了也白学,基本上是白折腾人。不要指望生物系的学生在你教的基础上自学CORTEX系列MCU,他们基本上都是在你教的内容上做减法。 跨行老师,牛 {:lol:}毒,德味,,大湿,学习了,,1024,,,{:titter:} 这年头,跨专业,跨行业很流行吗? bmelz 发表于 2015-9-7 00:17
目前,我把我写好的驱动给学生用,他们觉得很好用呀,没有觉得困难。换个人接手就很容易了,底层,中间层 ...
在编程上,没有一个结构或架构是高大全的东西,能适合于任何场合,所以我的单片机编程思路是各种部件或算法都独立做成
工程,编程高度模块化,有完整的功能演示。在做项目时,根据情况复制过来再组合在一起即可,而不是复制一个框架过来再
裁剪。
你所说的驱动都做好了,只拿来用就行,这仅适用于特定的场合,如果要需求要改驱动,如果没有完整单独的驱动演示,别人
改起来没有困难? Azuresky 发表于 2015-9-7 06:49
上STM32,不要犹豫。否则学生学了也白学,基本上是白折腾人。不要指望生物系的学生在你教的基础上自学CORTE ...
为什么上上STM32?而不是高通枭龙系列? 推荐看看论坛中一些教程,比如野火和正点原子的,已经非常详细了,足以满足你的要求。 rain73 发表于 2015-9-7 11:13
在编程上,没有一个结构或架构是高大全的东西,能适合于任何场合,所以我的单片机编程思路是各种部件或算 ...
有些道理,你说的有点高深,我再捉摸捉摸! 层次很清晰,收藏! 一样的大龄青年,咋就学不进去呢,20年前还是很优秀的设计师工程师的。 LZ建议你换头像,你这个头像是ourdev的一个名人的头像 老师你是生物电子系的吧 bmelz 发表于 2015-9-6 16:04
给点建议吧,谢谢,我现在也迷茫!
STM32其实没那么难,下面是我写的一个教程,有时间可以瞧瞧,看看能不能帮上忙。
《如何从51过度到STM32》
talkingbeast 发表于 2015-9-7 12:32
推荐看看论坛中一些教程,比如野火和正点原子的,已经非常详细了,足以满足你的要求。 ...
帮忙看下这个,看看适不适合这个题目
fire 发表于 2015-9-7 13:47
帮忙看下这个,看看适不适合这个题目
我觉得还要讲一下STM32和51架构上的区别。
从51转到STM32,我的感觉是如果对ARM架构不了解,看教程知道怎么做,但是不知道为什么这么做。另外,如果对架构没有一个清晰的认识,看这些细节总感觉 身在此山中 的朦胧感觉。 30不学艺。。。 talkingbeast 发表于 2015-9-7 15:53
我觉得还要讲一下STM32和51架构上的区别。
从51转到STM32,我的感觉是如果对ARM架构不了解,看教程 ...
什么是架构 talkingbeast 发表于 2015-9-7 15:53
我觉得还要讲一下STM32和51架构上的区别。
从51转到STM32,我的感觉是如果对ARM架构不了解,看教程 ...
是不是这两张图
fire 发表于 2015-9-7 13:43
STM32其实没那么难,下面是我写的一个教程,有时间可以瞧瞧,看看能不能帮上忙。
《如何从51过度到STM32 ...
很不错,看了挺有感觉的。
我目前的程序的底层驱动就和stm32的库类似。由于stc程序存储器较小,所以我的底层驱动更多的是用宏来实现的。
rain73不建议这样做,我觉得也挺对的。stc单片机这样玩起来挺累的。
不过,我觉得如果能写为stc单片机写出一个这样的底层库,也算是为国产单片机做出点贡献了。完成这份工作,我就开始的stm32生涯啦! wc261034 发表于 2015-9-7 13:35
老师你是生物电子系的吧
生物医学工程系的 图片收获挺大 Ray______ 发表于 2015-9-8 01:19
图片收获挺大
是的,野火的图文都很赞! bmelz 发表于 2015-9-7 23:27
很不错,看了挺有感觉的。
我目前的程序的底层驱动就和stm32的库类似。由于stc程序存储器较小,所以我的 ...
对,可以给STC写一个库,抛开51的资源不说,这也是对程序的一种锻炼,这样很好,如果学生在学习51的时候,适当的时候可以培养他们自己写一个简单的库 30多岁,年轻人! 活到老,学到老. 我还以为以前的远古大神 花玉良花生大神来了的 很好 学生们碰到这样负责的导师 是一份人生际遇 野火的资料很棒 solojimes 发表于 2015-9-8 12:01
我还以为以前的远古大神 花玉良花生大神来了的
老生出道晚,不认识大神,请赐教! bmelz,关于代码模块化的问题,我发了一个例程,可以参考下,里面的 STC_SPI.C,STC_SPI.H 两个文件,就是我做的结构(其它的都是临时测试代码)。
http://www.amobbs.com/thread-5631649-1-1.html rain73 发表于 2015-9-8 20:53
bmelz,关于代码模块化的问题,我发了一个例程,可以参考下,里面的 STC_SPI.C,STC_SPI.H 两个文件,就是 ...
收到,我来拜读一下,非常感谢您的指导。 真是挑战 同bme系的路过帮顶~
工作以后已经很少用到51&STM32了,很怀念在校的日子~{:shy:}{:shy:} 使用了思维导图工具,不错 rain73 发表于 2015-9-7 11:14
为什么上上STM32?而不是高通枭龙系列?
学生物的又不当电工,哪有这么多时间搞高通?
STM32学习时间在可接受的范围之内,又可以在学习工作中用到,不学它学谁? 工具在于好用即可 Azuresky 发表于 2015-9-9 19:25
学生物的又不当电工,哪有这么多时间搞高通?
STM32学习时间在可接受的范围之内,又可以在学习工作中用到 ...
还是用树梅派Arduino这类更好 实现想法就行 码字的苦力活给别人 51stm32都不用折腾 感谢楼主的分享! 老师好!我也是学生物工程专业的软件程序猿,可我不是老师。还是很相似的(哎呀~不错哦!)。 楼主不像初学的吧,写得比我好啊, huangqi412 发表于 2015-9-12 19:09
还是用树梅派Arduino这类更好 实现想法就行 码字的苦力活给别人
树莓派没用过,不知道。
Arduino很容易上手,但是性能太差,稍复杂一点的任务,用库就搞不掂了,还是得对寄存器编程。折腾下来,还不如学STM32方便快捷。
只有开始就不晚,不要轻易给自己设限。 snowland 发表于 2015-9-15 14:00
楼主这12年干啥了,为啥不做单片机了?
神经生物学呀!
页:
[1]