当前位置:首页 > 单片机 > 单片机
[导读]LED即发光二极管,具有单向导电性。电路图如下,LED与1K电阻串联在5V与0V之间,即可点亮LED,电阻起限流作用。现在我们来学习用单片机的IO(输入输出)引脚来点亮LED,用PC1引脚代替VCC,PC1输出高电平点亮LED,输出

LED即发光二极管,具有单向导电性。电路图如下,LED与1K电阻串联在5V与0V之间,即可点亮LED,电阻起限流作用。现在我们来学习用单片机的IO(输入输出)引脚来点亮LED,用PC1引脚代替VCC,PC1输出高电平点亮LED,输出低电平熄灭LED。

IO即INPUT/OUTPUT,引脚作为输入模式时,可以采集外界高低电平值;作为输出模式时,引脚可以输出高低电平。

一、库函数

DAHUME MINI2017.11.2.rar:http://pan.baidu.com/s/1hsvjq1A

解压DAHUME MINI2017.11.2.rar(2017.11.2指最后修改时间,不定期更新)到当前文件夹。以后编写程序都用这个工程作为模板。编写一个新的工程,先解压此工程,暂不使用实验2中创建工程的方法。

1、打开DAHUME MINI.stw文件;

2、在STVD左侧Workspace窗口Source Files目录下找到main.c,双击打开,可以看到如下代码;

#include "main.h"

void setup(void)

{

delay(10);

CLOCK(_16MHz);

pinMode(PC1, OUTPUT);

//_asm("rim");//rim为打开总中断,sim为关闭总中断

}

main()

{

setup();

while (1)

{

digitalWrite(PC1, HIGH);

delay(500);

digitalWrite(PC1, LOW);

delay(500);

}

}

代码第一行,main.c包含了main.h头文件,这个头文件又包含了很多其他头文件。可以把鼠标移动到main.h处右击选择Open Document “main.h”选项,也可以在Include Files目录下找到main.h,双击打开,来查看总头文件里包含了哪些子头文件。这样,我们就可以在main.c里调用包含头文件里声明过的所有的函数与变量。

函数与变量在***.c里定义,在源文件对应的***.h里声明,其它源文件包含了***.h之后,就可以调用***.h里声明过的函数与变量。

第二段代码是定义一个函数。

void setup(void)

{

******

}

第一个void是函数的类型,调用函数是无返回值。void空格后的英文是函数名字,不能与变量名、参数名和其它函数名重复。后面括号里的void是调用函数时,使用的参数类型,void表示无类型,调用函数时不使用参数。其它类型如下表。

变量类型

数值范围


_Bool

0、1

布尔变量

char、unsigned char

0~255(0~2^8-1)

无符号8位(byte)

signed char

-128~127

有符号8位

unsigned int

0~65535

无符号16位(word)

int、signed int

-32768~32767

有符号16位

unsigned long

0~16777215

无符号32位

long、signed long

-8388608~8388607

有符号32位

例如

void delay(unsigned int time_ms)

{

******

}

调用这个函数时,参数是无符号16位数值或者变量。以上变量类型是C语言关键字,也可作为函数类型和定义变量,例如

char abc(void)

{

char i;

return i;

}

这是一个返回char类型数值的函数,函数内部定义了一个char类型的局部变量,之后返回了这个变量。调用abc函数时,会返回i的数值。

下面我们来看setup函数内部。第一行是

delay(10);

这是调用了延时函数,作用是使单片机当前状态保持10ms。在这里加延时是给所有设备上电或者复位后准备就行。

调用函数最后需要加分号。程序中大括号、中括号、小括号要成对出现。

CLOCK(_16MHz);

这个函数用来设置单片机的主频率,主频是16MHz,这个频率的概念与用处将在后面实验作详细讲解。

pinMode(PC1, OUTPUT);

void pinMode(char pin, char mode);是引脚工作模式设置函数。第一个参数是引脚名,STM8S105K4单片机除了PA1、PA2,其他IO引脚都可在此作为参数。PA1、PA2接上了晶振,用来给单片机提供时钟源,去掉晶振后还可以做IO引脚使用。第二个参数是引脚的工作模式。可设置的工作模式如下表

参数

工作模式

INPUT

输入模式

INPUT_IT

外部中断输入模式

OUTPUT

输出模式

下面是一行//开头的代码,双斜杠的作用是注释本行的内容,在编译器编译程序时,不编译此行内容,内容中可以出现中文。

注释多行内容的方法如下

现在来看主函数main()。单片机上电和复位后运行主函数。

首先调用了setup();函数,接下来是while函数。while是C语言关键字,while是循环语句。小括号里为执行条件,条件为真(成立)或者不等于0时,循环执行后面大括号里的代码;条件为假(不成立)或者等于0时,不执行后面大括号里的代码或者执行最后一遍循环后跳出循环。所以while (1)是一个无限循环或者叫死循环。

digitalWrite(PC1, HIGH);

void digitalWrite(char pin, _Bool value);函数设置输出模式的引脚输出电平值,电平参数value为HIGH输出高电平,为LOW输出低电平。

编写完程序,点击Build编译程序,若下方Build窗口出现红字(错误)如下图,找到#error并双击,会跳转到错误代码处。

编译无错误,将下载器与单片机下载接口正确连接,点击Debug仿真程序。菜单栏第三行有如下几个按钮,第一个是Run(开始运行程序),第四个是Continue(继续运行程序),第五个是Stop Program(停止运行程序)。点击Run按钮,可以看到程序运行效果。

开发板上PC1引脚的排针与LED1阳极的排针通过跳线帽连接。本例程所实现效果是PC1所接的LED1循环亮0.5秒灭0.5秒。

退出仿真,程序自动运行。若无法运行,硬件(按键)复位也无效,请将单片机重新上电。

二、寄存器

pinMode(PC1, OUTPUT);

用寄存器写即

PC_DDR_1 = 1;

PC_CR1_1 = 1;

或者

PC_DDR = PC_DDR | 0b00000010;

PC_CR1 = PC_CR1 | 0b00000010;

或者

PC_DDR |= 0b00000010;

PC_CR1 |= 0b00000010;

PC即Port C,C端口,PC1至PC7合称C端口,STM8S105K4有A、B、C、D、E、F端口,每个端口有不同个数的引脚,总共25个IO引脚。DDR即data direction register,数据方向寄存器,用于设置IO引脚输入输出模式。CR1即control register 1,控制寄存器1。IO引脚作为输出模式,配置模式如下。本实验PC1引脚作为推挽输出模式。

IO口配置表

配置模式

DDR位

CR1位

CR2位

配置模式

P-Buffer

输出

1

0

0

开漏输出

OFF

1

1

0

推挽输出

ON

1

X

1

输出(最快速度10MHZ)

CR1位决定

X

X

X

真正的开漏输出(特定引脚)

未采用

0b是二进制数前缀,0x是十六进制数前缀。以上寄存器用二进制表示,有8位,最左为最高位(第7位),最右为最低位(第0位)。以PC_DDR寄存器为例,寄存器第x位决定PCx引脚的输入输出工作模式。

=用于赋值,将等号右边的值赋值给等号左边。

|用于二进制按位或运算。&用于二进制按位与运算。按位运算无需进位。

运算表达式

运算结果


运算表达式

运算结果

0 | 0

0

0 & 0

0

0 | 1

1

0 & 1

0

1 | 0

1

1 & 0

0

1 | 1

1

1 & 1

1

digitalWrite(PC1, LOW);

digitalWrite(PC1, HIGH);

用寄存器写即

PC_ODR_1 = 0;

PC_ODR_1 = 1;

或者

PC_ODR = PC_ODR & 0b11111101;

PC_ODR = PC_ODR | 0b00000010;

或者

PC_ODR &= 0b11111101;

PC_ODR |= 0b00000010;

ODR即output data register,输出数据寄存器,用于设置输出引脚输出电平值。

三、练习

1、循环以下步骤:

1)LED1、LED2亮1秒;

2)LED2、LED3亮1秒;

3)LED1、LED2、LED3亮1秒;

4)三个灯全灭2秒。

提示:使用IO引脚先设置工作模式;


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

这篇文章想分享笔者在嵌入式开发过程中常用的库函数,他们的使用方法,使用场景,使用好处以及头文件位置。1#include一般我在写C代码的时候都会包含此头文件,因为一旦包含此文件后,你就可以畅快的使用bool数据类型,而不...

关键字: 库函数

关注、星标公众号,直达精彩内容来源:知乎作者:Clarence这篇文章想分享笔者在嵌入式开发过程中常用的库函数,他们的使用方法,使用场景,使用好处以及头文件位置。1#include一般我在写C代码的时候都会包含此头文件,...

关键字: 库函数

基本概念阐述memcpy和memmove都是C语言的库函数,相比于 strcpy和 strncpy只能针对于字符类型的数组(),这两个函数可以拷贝其他类型的数组,对于 memcpy和 memmove的区别是什么呢?这里,...

关键字: 库函数 ov

在嵌入式Linux的C语言开发中,C语言的基本编程依然是最重要的内容。

关键字: 嵌入式 C语言 库函数

单片机编程软件的使用频率极高,采用单片机编程软件,可制造诸多系统。对于单片机编程软件,小编做过诸多介绍。本文对于单片机编程软件的介绍基于Keil,主要在于介绍该单片机编程软件是如何处理库函数以及寄存器的关系的。

关键字: 单片机编程软件 库函数 指数

杂记asla-lib库函数snd_pcm_open打开流程浅析ac97声卡intel8x0的DMA内存substream->dma_buffer什么时候被赋值浅析ac97声卡intel8x0的r

关键字: playback 库函数

stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。窗口看门狗,所以称之为窗口就是因为

关键字: STM32 库函数 操作寄存器 窗口看门狗

首先,I2C总线由两条线——串行数据(SDA)和串行时钟(SCL),这是同步通信,也是半双工通信,不能同时读写。每个器件都有一个唯一的地址识别,当总线空闲时I2C两条线都是高电平,只有当连接到总线的器件的输出级是

关键字: i2c stm32f429 库函数 读取eeprom

stm32f103最少有2个AD模数转换器,每个ADC都有18个通道,可以测量16个外部和2个内部模拟量。最大转换频率为1Mhz,也就是转换时间为1us(在 ADCCLK = 14Mhz,采样周期为1.5个时钟周期时)。...

关键字: STM32 库函数 操作寄存器 ad模数转换

问题及现象(STM32F103系列:http://www.y-ec.com/cpcp/class/?32.html)使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有...

关键字: STM32 库函数
关闭
关闭