实验3 点亮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引脚先设置工作模式;