接上篇帖子,单片机这种东西,如果是用来考试,翻翻书大概就可以了,如果是拿来开发一些小的作品,自学2个月,也不会太难,因为现在开发板也是很多的,资料也很丰富,如果你是想找工作,想独立开发产品,这个,对于一个刚毕业的人来说,就比较难了,很大的原因,是走了弯路,而且沿着弯路一直走了下去。我们希望分享一些有用的东西,实用的东西,让新手少走些弯路,如果每个坑都重踩一遍,这得浪费多少时间啊。
言归正传,单片机是必须要亲自动手敲代码才能学会的,所以从这一章节开始,我们会分享一些例程,并详细解析,希望能给新手带来帮助,还是那句话,本人水平有限,老手轻拍,有错误请指出,有事请留言。
一个经典的例程,点亮你的LED
我以手里的这块STC15W1K16PWM芯片为例来写例子,这块芯片至少还有一些人用来开发产品,学习了至少还有一定实用价值,如果你手里有同类型的芯片,那就更方便学习了,不管干什么,都是从简单到复杂的,比如学计算机,第一句就是“HELLO WORLD”,那么学习单片机,就是点亮你的LED了{:lol:}。先把原理图上传,单片机是软硬结合的东西,硬件为主,软件为辅,所以需要看原理图编程。
新建一个KEIL4工程,把下面代码敲进去,就可以实现LED的闪烁了,但是还是需要解释下一下代码。
/*******************************************************************
* 文件名LED0 500MS闪烁
* 描述: 点亮LED
* 2018-09-17 调试通过
* 功能入门模板
* 作者:大核桃
* 版本号:V1.00(2018.09.17)
********************************************************************/
#include "config.h"
#include "intrins.h"
/*******************************************************************
* 文件名 变量重新定义区域
* 描述:
* 功 能
* 作者:大核桃
* 版本号:V1.00(2018.09.17)
********************************************************************/
typedef unsigned char uint8;//无符号字符型
typedef unsigned intuint16;//无符号整型
typedef unsigned long uint32;//无符号长整型
/*******************************************************************
* 文件名:位重新定义区域 函数前置声明
* 描述:
* 功 能
* 作者:大核桃
* 版本号:V1.00(2018.09.17)
********************************************************************/
void Delay500ms(); //@11.0592MHz
void MCU_Port_Init(void);
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P3^2;
sbit LED6 = P0^0;
sbit LED7 = P0^1;
/*******************************************************************
* 文件名 main函数入口
* 描述:
* 功 能
* 作者:大核桃
* 版本号:V1.00(2018.09.17)
********************************************************************/
void main(void)
{
MCU_Port_Init();//端口模式初始化函数
//上电IO默认是0
LED0 = 1;//输出1
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;//
while(1)
{
P2 = 0XFE;//1111_1110;
Delay500ms();//500ms延时 11.0592MHZ
P2 = 0XFF;//1111_1111;
Delay500ms();//500ms延时 11.0592MHZ
}
}
/*******************************************************************
* 文件名:void MCU_Port_Init(void)
* 描述: MCU端口上电初始化函数
* 功 能
* 作者:大核桃
* 版本号:V1.00(2018.09.17)
********************************************************************/
void MCU_Port_Init(void)
{
//第0 和1位配置推完输出模式,大电流
P0M1 = 0XFC; // 1111_1100
P0M0 = 0X03; // 0000_0011
//第01234位配置推完输出模式,大电流,567配置高阻输入,用于ADC
P1M1 = 0XE0; //1110_0000
P1M0 = 0X1F; //0001_1111
//P2配置位准双向口
P2M1 = 0X00; //0000_0000
P2M0 = 0X00; //0000_0000
P2 = 0XFF;//P2口初始化为1
//P5配置位准双向口
P5M1 = 0X00; //0000_0000
P5M0 = 0X00; //0000_0000
P5 = 0XFF;//P5口初始化为1
//P3 23467推完输出
P3M1 = 0X00; //0000_0000
P3M0 = 0XFC; //1101_1100
P3 = 0X23;//0010_0011
}
/*******************************************************************
* 文件名:void Delay500ms()
* 描述: 通用延时函数
* 功 能
* 作者:大核桃
* 版本号:V1.00(2018.09.17)
********************************************************************/
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
头文件#include "config.h"这个头文件是我们新建的,这里面是STC15W系列的寄存器地址定义等等,就好比学STC89C52RC那样,先包含头文件#include "reg52.h"一样,因为STC15W系列的不是标准的51,所以不能用REG52.H这个头文件,需要我们自己去新建一个,然后把官网的头文件复制过来就好了。
关于函数前置声明
函数如果在MAIN函数前面定义,是不要函数前置声明的,但是如果在MAIN后面定义,那就一定需要了,不然会报错的。
用sbit定义引脚
比如sbit LED0 = P1^0;,P1^0必须要大写而且必须要加一个分号,sbit定义是51单片机独有的,STM32就没有这个东西,直接初始化用就好了。
main入口函数
统一规定的,就这么个写法,第一个void指的是函数没有返回值,第二个void指的是函数没有形参调用,在STM32里面,就不是这样的,int main(void),是一个基本整型的变量作为返回值的。里面是一个while(1)的大循环,这没啥好说的。
关于端口配置
如果是用STC89C52的话,不需要端口配置的,除了P0是开漏输出,其他普通IO都是准双向口,直接赋值即可,但是STC89C52的IO驱动能力是有限的,LED小灯是一个耗电大户,必须要加一个三极管才可以,STC15W则不需要,IO可以配置位4种模式,准双向口,开漏输出,推挽输出,高阻输入4种模式,前2个没什么分别,推挽输出是大电流,可以直接驱动LED,最大可以达到20MA,但是根据使用经验,最好是灌入电流,也就是IO是0的时候,点亮LED,至于拉电流,IO上拉15MA可能就极限了。
程序中的寄存器定义P0M0 P0M1的配置,就是参照这个表格配置出来的,因为好多引脚还用在了别的上面,实现别的功能。请注意,P0M0和P0M1只是设定IO端口的工作类型,至于输出IO是低电平还是高电平,仍然是需要你自己决定的 ,不然达不到你要实现的效果。我们只是想点亮第一组LED的第一个灯,那么选择LED = 1;就可以了,然后在主循环中延时闪烁就好了。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』