bmelz 发表于 2015-9-6 10:03:01

大龄青年学习单片机——笔记

本帖最后由 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:53

还有暑假可以放, 算不上大龄青年吧

bmelz 发表于 2015-9-6 10:10:13

snoopyzz 发表于 2015-9-6 10:05
还有暑假可以放, 算不上大龄青年吧

我是生物方向的老师。。。
快40了,还不大龄!

bmelz 发表于 2015-9-6 10:12:25

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

bmelz 发表于 2015-9-6 10:16:39

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

snoopyzz 发表于 2015-9-6 10:16:43

bmelz 发表于 2015-9-6 10:10
我是生物方向的老师。。。
快40了,还不大龄!

原来是老师, 失敬,
我也30多了, 自我感觉还很年青{:victory:}

bmelz 发表于 2015-9-6 10:18:36

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

mowin 发表于 2015-9-6 10:25:10

楼主竟然是生物老师!

引用一句网上用语表达我的心情,妈妈问我为什么跪着上网

qq开始学单片机 发表于 2015-9-6 10:32:02

不亏是老师,架构层次好鲜明!妈妈为我为什么跪着上网!

DianziABC 发表于 2015-9-6 10:34:21

正常,以前遇到一个搞生化研究的,也搞DSP,ti5000系列
这年头应该说精通本行业+精通一门其它行业的才好混哪

进口小开关 发表于 2015-9-6 10:38:41

楼主位这个图是什么软件画的?

磊磊映画 发表于 2015-9-6 10:43:27

进口小开关 发表于 2015-9-6 10:38
楼主位这个图是什么软件画的?

xmind一款国产绘图软件

bmelz 发表于 2015-9-6 10:59:40

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

cn520 发表于 2015-9-6 11:13:41

这图像怎么这么熟悉呢?

destiny、 发表于 2015-9-6 11:15:42

很有层次感,很规范,建议楼主上一个工程,给大家借鉴一下、、、

duxingkei 发表于 2015-9-6 11:21:34

这个结构图好漂亮哦,用神马软件画的?

bmelz 发表于 2015-9-6 11:24:04

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

bmelz 发表于 2015-9-6 11:25:50

destiny、 发表于 2015-9-6 11:15
很有层次感,很规范,建议楼主上一个工程,给大家借鉴一下、、、

还没有完全整理好,整理好,会上传的。
希望大家给提提意见,新手请多赐教!

bmelz 发表于 2015-9-6 11:26:38

duxingkei 发表于 2015-9-6 11:21
这个结构图好漂亮哦,用神马软件画的?

xmind,一个国产软件。

fuquan_dai 发表于 2015-9-6 11:26:44

bmelz 发表于 2015-9-6 10:10
我是生物方向的老师。。。
快40了,还不大龄!

没考虑找别的方向老师合作一下?对于做电的还说可能你要的东西不难实现。是做生物测试仪器吗?

sanger 发表于 2015-9-6 11:27:52

引用一句网上用语表达我的心情,妈妈问我为什么跪着上网

Excellence 发表于 2015-9-6 11:38:45

不错。
有层次,有条理。

yick 发表于 2015-9-6 12:42:57

楼主层次很分明啊,这才是搞研究的。

bmelz 发表于 2015-9-6 12:55:39

fuquan_dai 发表于 2015-9-6 11:26
没考虑找别的方向老师合作一下?对于做电的还说可能你要的东西不难实现。是做生物测试仪器吗? ...

学校弄个电子设计竞赛,我是负责人!因为,我12年前是学电的,。。。。
所以现在又必须重新学习,唉!

yick 发表于 2015-9-6 12:56:13

楼主层次很分明啊,这才是搞研究的。

fuquan_dai 发表于 2015-9-6 14:29:42

bmelz 发表于 2015-9-6 12:55
学校弄个电子设计竞赛,我是负责人!因为,我12年前是学电的,。。。。
所以现在又必须重新学习,唉! ...

呵呵 这样啊 我还以为自己搞研究呢 没事啊 单片机好学,你肯定很快能捡起来。

fuquan_dai 发表于 2015-9-6 14:31:02

bmelz 发表于 2015-9-6 12:55
学校弄个电子设计竞赛,我是负责人!因为,我12年前是学电的,。。。。
所以现在又必须重新学习,唉! ...

我也是高校老师,不过说实话我更愿意让学生去学STM32。。。

xiaowenwen256 发表于 2015-9-6 14:35:00

有兴趣,就啥时候都不晚!

bmelz 发表于 2015-9-6 16:02:38

fuquan_dai 发表于 2015-9-6 14:31
我也是高校老师,不过说实话我更愿意让学生去学STM32。。。

stm32我不会呀!而且stm32上手难度很大。我还是先把51弄透了,在弄的stm32。

bmelz 发表于 2015-9-6 16:04:33

fuquan_dai 发表于 2015-9-6 14:29
呵呵 这样啊 我还以为自己搞研究呢 没事啊 单片机好学,你肯定很快能捡起来。 ...

给点建议吧,谢谢,我现在也迷茫!

rain73 发表于 2015-9-6 18:49:15

我倒觉得没有必要这么组织,现在的元件无数种,经常要组合来组合去,放在一起必然臃肿低效。
我是这样做的,每一种元件单独做一个工程,驱动代码模块化,然后有功能的完整演示代码,需要组合的时候把元件的驱动文件放在一起,编程时可根据演示代码裁剪或组合。
这样也方便共享和交流。

lans0625 发表于 2015-9-6 18:52:34

要弄透就得上汇编,我一开始玩51就用的汇编,现在看C51有点晕。。。

fuquan_dai 发表于 2015-9-6 18:58:35

bmelz 发表于 2015-9-6 16:04
给点建议吧,谢谢,我现在也迷茫!

你不要认为STM32难,它只是功能多,并不是更难。当然学完51在学STM32问题也不大,学会一种另一种很快就能学会。无论学哪种,我的建议都是搞一套开发板,从实践入手,学看懂开发板例程,再适当修改例程(比如将例程中的串口1改成串口2),这样学一两个月基本就会了。

fuquan_dai 发表于 2015-9-6 19:00:36

lans0625 发表于 2015-9-6 18:52
要弄透就得上汇编,我一开始玩51就用的汇编,现在看C51有点晕。。。

绝对是歧途啊。。。。我觉得先学会C,想深入了解再去看汇编,甚至很多时候都不要去管汇编。不然学下来没怎么学会,然后倒把兴趣搞没了。

bmelz 发表于 2015-9-6 21:13:02

rain73 发表于 2015-9-6 18:49
我倒觉得没有必要这么组织,现在的元件无数种,经常要组合来组合去,放在一起必然臃肿低效。
我是这样做的 ...

我觉得没有我这样方便。不用的东西不加入,一点都不臃肿。功能组合时,只需要更改drivers_cfg.h和mcu_cfg.h即可。
开始我也是这样组织文件的,后来发现还是这种方式好!

rain73 发表于 2015-9-6 22:52:22

bmelz 发表于 2015-9-6 21:13
我觉得没有我这样方便。不用的东西不加入,一点都不臃肿。功能组合时,只需要更改drivers_cfg.h和mcu_cfg ...

这样搞工程基本只有你自己懂,换个人接手,或者把驱动给别人用就抓瞎。
部件驱动的独立,和编程上的逻辑层概念,并没有一点冲突,做好模块化即是。

bmelz 发表于 2015-9-7 00:17:30

本帖最后由 bmelz 于 2015-9-7 00:22 编辑

rain73 发表于 2015-9-6 22:52
这样搞工程基本只有你自己懂,换个人接手,或者把驱动给别人用就抓瞎。
部件驱动的独立,和编程上的逻辑 ...

目前,我把我写好的驱动给学生用,他们觉得很好用呀,没有觉得困难。换个人接手就很容易了,底层,中间层都已经写好,不需要修改,只要关心应用层就行了。
目前工程模板里,驱动也很独立呀。除非你非要说,驱动程序依赖mytypes.h,delay.h什么的。你想象一下,每个驱动里面都有自带延时函数那是多么的闹心事。
也许,我没有理解你的涵义,能以实例说明吗?在下虚心求教!

Azuresky 发表于 2015-9-7 06:49:52

上STM32,不要犹豫。否则学生学了也白学,基本上是白折腾人。不要指望生物系的学生在你教的基础上自学CORTEX系列MCU,他们基本上都是在你教的内容上做减法。

gfy200866 发表于 2015-9-7 07:59:15

跨行老师,牛

wkman 发表于 2015-9-7 08:08:11

{:lol:}毒,德味,,大湿,学习了,,1024,,,{:titter:}

Mingrui 发表于 2015-9-7 08:21:04

这年头,跨专业,跨行业很流行吗?

rain73 发表于 2015-9-7 11:13:25

bmelz 发表于 2015-9-7 00:17
目前,我把我写好的驱动给学生用,他们觉得很好用呀,没有觉得困难。换个人接手就很容易了,底层,中间层 ...

在编程上,没有一个结构或架构是高大全的东西,能适合于任何场合,所以我的单片机编程思路是各种部件或算法都独立做成
工程,编程高度模块化,有完整的功能演示。在做项目时,根据情况复制过来再组合在一起即可,而不是复制一个框架过来再
裁剪。
你所说的驱动都做好了,只拿来用就行,这仅适用于特定的场合,如果要需求要改驱动,如果没有完整单独的驱动演示,别人
改起来没有困难?

rain73 发表于 2015-9-7 11:14:38

Azuresky 发表于 2015-9-7 06:49
上STM32,不要犹豫。否则学生学了也白学,基本上是白折腾人。不要指望生物系的学生在你教的基础上自学CORTE ...

为什么上上STM32?而不是高通枭龙系列?

talkingbeast 发表于 2015-9-7 12:32:33

   推荐看看论坛中一些教程,比如野火和正点原子的,已经非常详细了,足以满足你的要求。

bmelz 发表于 2015-9-7 13:05:11

rain73 发表于 2015-9-7 11:13
在编程上,没有一个结构或架构是高大全的东西,能适合于任何场合,所以我的单片机编程思路是各种部件或算 ...

有些道理,你说的有点高深,我再捉摸捉摸!

tianyime 发表于 2015-9-7 13:25:22

层次很清晰,收藏!

ericdai 发表于 2015-9-7 13:31:05

一样的大龄青年,咋就学不进去呢,20年前还是很优秀的设计师工程师的。

RAMILE 发表于 2015-9-7 13:32:44

LZ建议你换头像,你这个头像是ourdev的一个名人的头像

wc261034 发表于 2015-9-7 13:35:36

老师你是生物电子系的吧

fire 发表于 2015-9-7 13:43:12

bmelz 发表于 2015-9-6 16:04
给点建议吧,谢谢,我现在也迷茫!

STM32其实没那么难,下面是我写的一个教程,有时间可以瞧瞧,看看能不能帮上忙。
《如何从51过度到STM32》

fire 发表于 2015-9-7 13:47:13

talkingbeast 发表于 2015-9-7 12:32
推荐看看论坛中一些教程,比如野火和正点原子的,已经非常详细了,足以满足你的要求。 ...

帮忙看下这个,看看适不适合这个题目

talkingbeast 发表于 2015-9-7 15:53:51

fire 发表于 2015-9-7 13:47
帮忙看下这个,看看适不适合这个题目

   我觉得还要讲一下STM32和51架构上的区别。
从51转到STM32,我的感觉是如果对ARM架构不了解,看教程知道怎么做,但是不知道为什么这么做。另外,如果对架构没有一个清晰的认识,看这些细节总感觉 身在此山中 的朦胧感觉。

GoingDown 发表于 2015-9-7 16:54:45

30不学艺。。。

fire 发表于 2015-9-7 18:40:48

talkingbeast 发表于 2015-9-7 15:53
我觉得还要讲一下STM32和51架构上的区别。
从51转到STM32,我的感觉是如果对ARM架构不了解,看教程 ...

什么是架构

fire 发表于 2015-9-7 19:00:27

talkingbeast 发表于 2015-9-7 15:53
我觉得还要讲一下STM32和51架构上的区别。
从51转到STM32,我的感觉是如果对ARM架构不了解,看教程 ...

是不是这两张图

bmelz 发表于 2015-9-7 23:27:20

fire 发表于 2015-9-7 13:43
STM32其实没那么难,下面是我写的一个教程,有时间可以瞧瞧,看看能不能帮上忙。
《如何从51过度到STM32 ...

很不错,看了挺有感觉的。
我目前的程序的底层驱动就和stm32的库类似。由于stc程序存储器较小,所以我的底层驱动更多的是用宏来实现的。
rain73不建议这样做,我觉得也挺对的。stc单片机这样玩起来挺累的。
不过,我觉得如果能写为stc单片机写出一个这样的底层库,也算是为国产单片机做出点贡献了。完成这份工作,我就开始的stm32生涯啦!

bmelz 发表于 2015-9-7 23:55:24

wc261034 发表于 2015-9-7 13:35
老师你是生物电子系的吧

生物医学工程系的

Ray______ 发表于 2015-9-8 01:19:28

图片收获挺大

bmelz 发表于 2015-9-8 08:25:40

Ray______ 发表于 2015-9-8 01:19
图片收获挺大

是的,野火的图文都很赞!

fire 发表于 2015-9-8 09:35:42

bmelz 发表于 2015-9-7 23:27
很不错,看了挺有感觉的。
我目前的程序的底层驱动就和stm32的库类似。由于stc程序存储器较小,所以我的 ...

对,可以给STC写一个库,抛开51的资源不说,这也是对程序的一种锻炼,这样很好,如果学生在学习51的时候,适当的时候可以培养他们自己写一个简单的库

fengyunyu 发表于 2015-9-8 09:56:09

30多岁,年轻人!

hzpj001 发表于 2015-9-8 11:41:14

活到老,学到老.

solojimes 发表于 2015-9-8 12:01:42

我还以为以前的远古大神 花玉良花生大神来了的

njayk 发表于 2015-9-8 12:15:12

很好   学生们碰到这样负责的导师 是一份人生际遇   野火的资料很棒

bmelz 发表于 2015-9-8 14:04:17

solojimes 发表于 2015-9-8 12:01
我还以为以前的远古大神 花玉良花生大神来了的

老生出道晚,不认识大神,请赐教!

rain73 发表于 2015-9-8 20:53:15

bmelz,关于代码模块化的问题,我发了一个例程,可以参考下,里面的 STC_SPI.C,STC_SPI.H 两个文件,就是我做的结构(其它的都是临时测试代码)。
http://www.amobbs.com/thread-5631649-1-1.html

bmelz 发表于 2015-9-8 22:20:39

rain73 发表于 2015-9-8 20:53
bmelz,关于代码模块化的问题,我发了一个例程,可以参考下,里面的 STC_SPI.C,STC_SPI.H 两个文件,就是 ...

收到,我来拜读一下,非常感谢您的指导。

zbx6020 发表于 2015-9-8 22:22:41

真是挑战

梦起蓝桥 发表于 2015-9-8 22:37:02

同bme系的路过帮顶~
工作以后已经很少用到51&STM32了,很怀念在校的日子~{:shy:}{:shy:}

shwind 发表于 2015-9-8 22:51:55

使用了思维导图工具,不错

Azuresky 发表于 2015-9-9 19:25:51

rain73 发表于 2015-9-7 11:14
为什么上上STM32?而不是高通枭龙系列?

学生物的又不当电工,哪有这么多时间搞高通?
STM32学习时间在可接受的范围之内,又可以在学习工作中用到,不学它学谁?

njayk 发表于 2015-9-10 22:38:09

工具在于好用即可

huangqi412 发表于 2015-9-12 19:09:41

Azuresky 发表于 2015-9-9 19:25
学生物的又不当电工,哪有这么多时间搞高通?
STM32学习时间在可接受的范围之内,又可以在学习工作中用到 ...

还是用树梅派Arduino这类更好   实现想法就行 码字的苦力活给别人

huangqi412 发表于 2015-9-12 19:10:15

51stm32都不用折腾

大超134 发表于 2015-9-12 21:56:09

感谢楼主的分享!

armstrong 发表于 2015-9-12 22:34:04

老师好!我也是学生物工程专业的软件程序猿,可我不是老师。还是很相似的(哎呀~不错哦!)。

liaihua1997 发表于 2015-9-12 23:46:03

楼主不像初学的吧,写得比我好啊,

Azuresky 发表于 2015-9-14 20:58:35

huangqi412 发表于 2015-9-12 19:09
还是用树梅派Arduino这类更好   实现想法就行 码字的苦力活给别人

树莓派没用过,不知道。
Arduino很容易上手,但是性能太差,稍复杂一点的任务,用库就搞不掂了,还是得对寄存器编程。折腾下来,还不如学STM32方便快捷。

micintcnh 发表于 2015-9-15 22:14:58

只有开始就不晚,不要轻易给自己设限。

bmelz 发表于 2015-9-16 07:32:00

snowland 发表于 2015-9-15 14:00
楼主这12年干啥了,为啥不做单片机了?

神经生物学呀!
页: [1]
查看完整版本: 大龄青年学习单片机——笔记